monitor
The Monitor
Live supply-chain watchboard — critical npm & PyPI packages, watched for compromise.
65
watched
25
nominal
0
watch
2
active alerts
38
incidents on record
updated…
npm — by dependents
axios npm DELETION ×2BURST ×4
1.15.0
0.31.0
1.15.1
0.31.1
1.15.2
1.16.0
0.32.0
1.16.1
1.17.0
0.33.0
1.18.0
1.18.1
DELETION
1.14.1 published then removed
high · registry-verified · 2026-03-31 · 3mo ago
DELETION
0.30.4 published then removed
high · registry-verified · 2026-03-31 · 3mo ago
BURST
2 releases in 60m: 1.1.1, 1.1.2
info · registry-verified · 2022-10-07 · 3y ago
BURST
2 releases in 39m: 1.14.1, 0.30.4
info · registry-verified · 2026-03-31 · 3mo ago
BURST
2 releases in 4m: 1.15.1, 0.31.1
info · registry-verified · 2026-04-19 · 2mo ago
BURST
2 releases in 0m: 0.33.0, 1.18.0 · ACTIVE
info · registry-verified · 2026-06-14 · 28d ago
release diff 1.18.0 → 1.18.1
+0 added · -0 removed · ~28 modified
--- +++ @@ -1,2 +1,2 @@-/*! Axios v1.18.0 Copyright (c) 2026 Matt Zabriskie and contributors */+/*! Axios v1.18.1 Copyright (c) 2026 Matt Zabriskie and contributors */ 'use strict';@@ -1355,3 +1355,15 @@ const axiosError = new AxiosError(error.message, code || error.code, config, request, response);- axiosError.cause = error;+ // Match native `Error` `cause` semantics: non-enumerable. The wrapped+ // error often carries circular internals (sockets, requests, agents), so+ // an enumerable `cause` makes structured loggers (pino/winston) and any+ // own-property walk throw "Converting circular structure to JSON".+ // Regression from #6982; see #7205. `__proto__: null` mirrors the+ // `message` descriptor below (prototype-pollution-safe descriptor).+ Object.defineProperty(axiosError, 'cause', {+ __proto__: null,+ value: error,+ writable: true,+ enumerable: false,+ configurable: true+ }); axiosError.name = error.name;@@ -1568,3 +1580,9 @@ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {- return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);+ if (useBlob && typeof _Blob === 'function') {+ return new _Blob([value]);+ }+ if (typeof Buffer !== 'undefined') {+ return Buffer.from(value);+ }+ throw new AxiosError('Blob is not supported. Use a Buffer instead.', AxiosError.ERR_NOT_SUPPORT); }@@ -1700,5 +1718,3 @@ prototype.toString = function toString(encoder) {- const _encode = encoder ? function (value) {- return encoder.call(this, value, encode$1);- } : encode$1;+ const _encode = encoder ? value => encoder.call(this, value, encode$1) : encode$1; return this._pairs.map(function each(pair) {@@ -1733,2 +1749,3 @@ }+ url = url || ''; const _options = utils$1.isFunction(options) ? {@@ -2365,3 +2382,3 @@ -const VERSION = "1.18.0";+const VERSION = "1.18.1"; @@ -2405,3 +2422,3 @@ // Bare `data:,` leaves mime undefined; Blob normalises that to "" per spec.- let mime;+ let mime = ''; if (type) {@@ -2411,3 +2428,3 @@ }- const buffer = Buffer.from(decodeURIComponent(body), encoding);+ const buffer = encoding === 'base64' ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), encoding); if (asBlob) {@@ -3166,2 +3183,32 @@ const tunnelingAgentCacheUser = new WeakMap();+// Minimum minor versions where Node's HTTP Agent supports native proxyEnv+// handling. Checking the selected agent below also covers startup modes such+// as NODE_OPTIONS=--use-env-proxy and --no-use-env-proxy precedence.+const NODE_NATIVE_ENV_PROXY_SUPPORT = {+ 22: 21,+ 24: 5+};+function isNodeNativeEnvProxySupported(nodeVersion = process.versions && process.versions.node) {+ if (!nodeVersion) {+ return false;+ }+ const [major, minor] = nodeVersion.split('.').map(part => Number(part));+ if (!Number.isInteger(major) || !Number.isInteger(minor)) {+ return false;+ }+ if (major > 24) {+ return true;+ }+ return NODE_NATIVE_ENV_PROXY_SUPPORT[major] != null && minor >= NODE_NATIVE_ENV_PROXY_SUPPORT[major];+}+function isNodeEnvProxyEnabled(agent, nodeVersion = process.versions && process.versions.node) {+ if (!isNodeNativeEnvProxySupported(nodeVersion)) {+ return false;+ }+ const agentOptions = agent && agent.options;+ return Boolean(agentOptions && utils$1.hasOwnProp(agentOptions, 'proxyEnv') && agentOptions.proxyEnv != null);+}+function getProxyEnvAgent(options, configHttpAgent, configHttpsAgent) {+ return isHttps.test(options.protocol) ? configHttpsAgent || https.globalAgent : configHttpAgent || http.globalAgent;+} function getTunnelingAgent(agentOptions, userHttpsAgent) {@@ -3273,5 +3320,6 @@ */-function setProxy(options, configProxy, location, isRedirect, configHttpsAgent) {+function setProxy(options, configProxy, location, isRedirect, configHttpsAgent, configHttpAgent) { let proxy = configProxy;- if (!proxy && proxy !== false) {+ const proxyEnvAgent = getProxyEnvAgent(options, configHttpAgent, configHttpsAgent);+ if (!proxy && proxy !== false && !isNodeEnvProxyEnabled(proxyEnvAgent)) { const proxyUrl = getProxyForUrl(location);@@ -3410,3 +3458,3 @@ // the exact same logic as if the redirected request was performed by axios directly.- setProxy(redirectOptions, configProxy, redirectOptions.href, true, configHttpsAgent);+ setProxy(redirectOptions, configProxy, redirectOptions.href, true, configHttpsAgent, configHttpAgent); };@@ -3506,6 +3554,8 @@ let http2Options = own('http2Options');+ const httpAgent = own('httpAgent');+ const httpsAgent = own('httpsAgent');+ const configProxy = own('proxy'); const responseType = own('responseType'); const responseEncoding = own('responseEncoding');- const httpAgent = own('httpAgent');- const httpsAgent = own('httpsAgent');+ const socketPath = own('socketPath'); const method = own('method').toUpperCase();@@ -3603,3 +3653,8 @@ const fullPath = buildFullPath(own('baseURL'), own('url'), own('allowAbsoluteUrls'), config);- const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);+ // Unix-socket requests (own socketPath) commonly pass a path-only url+ // like '/foo'; supply a synthetic base so new URL() can still parse it.+ // Use the own-property value (not config.socketPath) so a polluted+ // prototype cannot influence URL base selection.+ const urlBase = socketPath ? 'http://localhost' : platform.hasBrowserEnv ? platform.origin : undefined;+ const parsed = new URL(fullPath, urlBase); const protocol = parsed.protocol || supportedProtocols[0];@@ -3740,7 +3795,6 @@ } catch (err) {- const customErr = new Error(err.message);- customErr.config = config;- customErr.url = own('url');- customErr.exists = true;- return reject(customErr);+ return reject(AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config, null, null, {+ url: own('url'),+ exists: true+ })); }@@ -3768,3 +3822,2 @@ !utils$1.isUndefined(lookup) && (options.lookup = lookup);- const socketPath = own('socketPath'); if (socketPath) {@@ -3786,3 +3839,3 @@ options.port = parsed.port;- setProxy(options, own('proxy'), protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path, false, httpsAgent);+ setProxy(options, configProxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path, false, httpsAgent, httpAgent); }@@ -3861,2 +3914,6 @@ }++ // Set an explicit maxBodyLength option for transports that inspect it.+ // When maxBodyLength is -1 (default/unlimited), use Infinity so+ // follow-redirects does not fall back to its own 10MB default. if (maxBodyLength > -1) {@@ -3864,3 +3921,2 @@ } else {- // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited options.maxBodyLength = Infinity;@@ -4040,3 +4096,7 @@ // default interval of sending ack packet is 1 minute- socket.setKeepAlive(true, 1000 * 60);+ // proxy agents (e.g. agent-base) may return a generic Duplex stream+ // that doesn't have setKeepAlive, so guard before calling+ if (typeof socket.setKeepAlive === 'function') {+ socket.setKeepAlive(true, 1000 * 60);+ } @@ -4185,3 +4245,7 @@ if (eq !== -1 && cookie.slice(0, eq) === name) {- return decodeURIComponent(cookie.slice(eq + 1));+ try {+ return decodeURIComponent(cookie.slice(eq + 1));+ } catch (e) {+ return cookie.slice(eq + 1);+ } }@@ -4218,2 +4282,3 @@ // eslint-disable-next-line no-param-reassign+ config1 = config1 || {}; config2 = config2 || {};@@ -4354,3 +4419,3 @@ }- Object.entries(formHeaders).forEach(([key, val]) => {+ Object.entries(formHeaders || {}).forEach(([key, val]) => { if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {@@ -4392,3 +4457,7 @@ const password = utils$1.getSafeProp(auth, 'password') || '';- headers.set('Authorization', 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : '')));+ try {+ headers.set('Authorization', 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : '')));+ } catch (e) {+ throw AxiosError.from(e, AxiosError.ERR_BAD_OPTION_VALUE, config);+ } }@@ -4593,2 +4662,3 @@ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));+ done(); return;@@ -4631,3 +4701,5 @@ };- signals.forEach(signal => signal.addEventListener('abort', onabort));+ signals.forEach(signal => signal.addEventListener('abort', onabort, {+ once: true+ })); const {@@ -5081,3 +5153,13 @@ request && (canceledError.request = request);- err !== canceledError && (canceledError.cause = err);+ if (err !== canceledError) {+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(canceledError, 'cause', {+ __proto__: null,+ value: err,+ writable: true,+ enumerable: false,+ configurable: true+ });+ } throw canceledError;@@ -5102,5 +5184,13 @@ if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {- throw Object.assign(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, err && err.response), {- cause: err.cause || err+ const networkError = new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, err && err.response);+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(networkError, 'cause', {+ __proto__: null,+ value: err.cause || err,+ writable: true,+ enumerable: false,+ configurable: true });+ throw networkError; }@@ -5223,3 +5313,3 @@ let s = length ? reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0]) : 'as no adapter specified';- throw new AxiosError(`There is no suitable adapter to dispatch the request ` + s, 'ERR_NOT_SUPPORT');+ throw new AxiosError(`There is no suitable adapter to dispatch the request ` + s, AxiosError.ERR_NOT_SUPPORT); }@@ -5366,3 +5456,3 @@ function assertOptions(options, schema, allowUnknown) {- if (typeof options !== 'object') {+ if (typeof options !== 'object' || options === null) { throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
--- +++ @@ -91,2 +91,49 @@ const tunnelingAgentCacheUser = new WeakMap();+// Minimum minor versions where Node's HTTP Agent supports native proxyEnv+// handling. Checking the selected agent below also covers startup modes such+// as NODE_OPTIONS=--use-env-proxy and --no-use-env-proxy precedence.+const NODE_NATIVE_ENV_PROXY_SUPPORT = {+ 22: 21,+ 24: 5,+};++function isNodeNativeEnvProxySupported(nodeVersion = process.versions && process.versions.node) {+ if (!nodeVersion) {+ return false;+ }++ const [major, minor] = nodeVersion.split('.').map((part) => Number(part));++ if (!Number.isInteger(major) || !Number.isInteger(minor)) {+ return false;+ }++ if (major > 24) {+ return true;+ }++ return (+ NODE_NATIVE_ENV_PROXY_SUPPORT[major] != null && minor >= NODE_NATIVE_ENV_PROXY_SUPPORT[major]+ );+}++function isNodeEnvProxyEnabled(agent, nodeVersion = process.versions && process.versions.node) {+ if (!isNodeNativeEnvProxySupported(nodeVersion)) {+ return false;+ }++ const agentOptions = agent && agent.options;++ return Boolean(+ agentOptions &&+ utils.hasOwnProp(agentOptions, 'proxyEnv') &&+ agentOptions.proxyEnv != null+ );+}++function getProxyEnvAgent(options, configHttpAgent, configHttpsAgent) {+ return isHttps.test(options.protocol)+ ? (configHttpsAgent || https.globalAgent)+ : (configHttpAgent || http.globalAgent);+} @@ -212,5 +259,6 @@ */-function setProxy(options, configProxy, location, isRedirect, configHttpsAgent) {+function setProxy(options, configProxy, location, isRedirect, configHttpsAgent, configHttpAgent) { let proxy = configProxy;- if (!proxy && proxy !== false) {+ const proxyEnvAgent = getProxyEnvAgent(options, configHttpAgent, configHttpsAgent);+ if (!proxy && proxy !== false && !isNodeEnvProxyEnabled(proxyEnvAgent)) { const proxyUrl = getProxyForUrl(location);@@ -365,3 +413,10 @@ // the exact same logic as if the redirected request was performed by axios directly.- setProxy(redirectOptions, configProxy, redirectOptions.href, true, configHttpsAgent);+ setProxy(+ redirectOptions,+ configProxy,+ redirectOptions.href,+ true,+ configHttpsAgent,+ configHttpAgent+ ); };@@ -477,6 +532,8 @@ let http2Options = own('http2Options');+ const httpAgent = own('httpAgent');+ const httpsAgent = own('httpsAgent');+ const configProxy = own('proxy'); const responseType = own('responseType'); const responseEncoding = own('responseEncoding');- const httpAgent = own('httpAgent');- const httpsAgent = own('httpsAgent');+ const socketPath = own('socketPath'); const method = own('method').toUpperCase();@@ -605,3 +662,10 @@ const fullPath = buildFullPath(own('baseURL'), own('url'), own('allowAbsoluteUrls'), config);- const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);+ // Unix-socket requests (own socketPath) commonly pass a path-only url+ // like '/foo'; supply a synthetic base so new URL() can still parse it.+ // Use the own-property value (not config.socketPath) so a polluted+ // prototype cannot influence URL base selection.+ const urlBase = socketPath+ ? 'http://localhost'+ : (platform.hasBrowserEnv ? platform.origin : undefined);+ const parsed = new URL(fullPath, urlBase); const protocol = parsed.protocol || supportedProtocols[0];@@ -812,7 +876,8 @@ } catch (err) {- const customErr = new Error(err.message);- customErr.config = config;- customErr.url = own('url');- customErr.exists = true;- return reject(customErr);+ return reject(+ AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config, null, null, {+ url: own('url'),+ exists: true+ })+ ); }@@ -844,3 +909,2 @@ - const socketPath = own('socketPath'); if (socketPath) {@@ -882,6 +946,7 @@ options,- own('proxy'),+ configProxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path, false,- httpsAgent+ httpsAgent,+ httpAgent );@@ -981,2 +1046,5 @@ + // Set an explicit maxBodyLength option for transports that inspect it.+ // When maxBodyLength is -1 (default/unlimited), use Infinity so+ // follow-redirects does not fall back to its own 10MB default. if (maxBodyLength > -1) {@@ -984,3 +1052,2 @@ } else {- // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited options.maxBodyLength = Infinity;@@ -1207,3 +1274,7 @@ // default interval of sending ack packet is 1 minute- socket.setKeepAlive(true, 1000 * 60);+ // proxy agents (e.g. agent-base) may return a generic Duplex stream+ // that doesn't have setKeepAlive, so guard before calling+ if (typeof socket.setKeepAlive === 'function') {+ socket.setKeepAlive(true, 1000 * 60);+ } @@ -1344,2 +1415,3 @@ export const __setProxy = setProxy;+export const __isNodeEnvProxyEnabled = isNodeEnvProxyEnabled; export const __isSameOriginRedirect = isSameOriginRedirect;
--- +++ @@ -44,3 +44,3 @@ // Bare `data:,` leaves mime undefined; Blob normalises that to "" per spec.- let mime;+ let mime = ''; if (type) {@@ -51,3 +51,5 @@ - const buffer = Buffer.from(decodeURIComponent(body), encoding);+ const buffer = encoding === 'base64'+ ? Buffer.from(body, 'base64')+ : Buffer.from(decodeURIComponent(body), encoding);
--- +++ @@ -1,2 +1,2 @@-/*! Axios v1.18.0 Copyright (c) 2026 Matt Zabriskie and contributors */+/*! Axios v1.18.1 Copyright (c) 2026 Matt Zabriskie and contributors */ (function (global, factory) {@@ -2042,3 +2042,15 @@ var axiosError = new AxiosError(error.message, code || error.code, config, request, response);- axiosError.cause = error;+ // Match native `Error` `cause` semantics: non-enumerable. The wrapped+ // error often carries circular internals (sockets, requests, agents), so+ // an enumerable `cause` makes structured loggers (pino/winston) and any+ // own-property walk throw "Converting circular structure to JSON".+ // Regression from #6982; see #7205. `__proto__: null` mirrors the+ // `message` descriptor below (prototype-pollution-safe descriptor).+ Object.defineProperty(axiosError, 'cause', {+ __proto__: null,+ value: error,+ writable: true,+ enumerable: false,+ configurable: true+ }); axiosError.name = error.name;@@ -2194,3 +2206,9 @@ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {- return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);+ if (useBlob && typeof _Blob === 'function') {+ return new _Blob([value]);+ }+ if (typeof Buffer !== 'undefined') {+ return Buffer.from(value);+ }+ throw new AxiosError('Blob is not supported. Use a Buffer instead.', AxiosError.ERR_NOT_SUPPORT); }@@ -2327,4 +2345,5 @@ prototype.toString = function toString(encoder) {+ var _this = this; var _encode = encoder ? function (value) {- return encoder.call(this, value, encode$1);+ return encoder.call(_this, value, encode$1); } : encode$1;@@ -2360,2 +2379,3 @@ }+ url = url || ''; var _options = utils$1.isFunction(options) ? {@@ -3007,3 +3027,7 @@ if (eq !== -1 && cookie.slice(0, eq) === name) {- return decodeURIComponent(cookie.slice(eq + 1));+ try {+ return decodeURIComponent(cookie.slice(eq + 1));+ } catch (e) {+ return cookie.slice(eq + 1);+ } }@@ -3107,2 +3131,3 @@ // eslint-disable-next-line no-param-reassign+ config1 = config1 || {}; config2 = config2 || {};@@ -3242,3 +3267,3 @@ }- Object.entries(formHeaders).forEach(function (_ref) {+ Object.entries(formHeaders || {}).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2),@@ -3289,3 +3314,7 @@ var password = utils$1.getSafeProp(auth, 'password') || '';- headers.set('Authorization', 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : '')));+ try {+ headers.set('Authorization', 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : '')));+ } catch (e) {+ throw AxiosError.from(e, AxiosError.ERR_BAD_OPTION_VALUE, config);+ } }@@ -3494,2 +3523,3 @@ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));+ done(); return;@@ -3533,3 +3563,5 @@ signals.forEach(function (signal) {- return signal.addEventListener('abort', onabort);+ return signal.addEventListener('abort', onabort, {+ once: true+ }); });@@ -3843,3 +3875,3 @@ - var VERSION = "1.18.0";+ var VERSION = "1.18.1"; @@ -4047,3 +4079,3 @@ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(config) {- var _resolveConfig, url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, _resolveConfig$withCr, withCredentials, fetchOptions, maxContentLength, maxBodyLength, hasMaxContentLength, hasMaxBodyLength, own, _fetch, composedSignal, request, unsubscribe, requestContentLength, pendingBodyError, maxBodyLengthError, auth, configAuth, username, password, parsedURL, urlUsername, urlPassword, estimated, outboundLength, mustEnforceStreamBody, trackRequestStream, _request, contentTypeHeader, _ref5, _ref6, onProgress, flush, isCredentialsSupported, contentType, resolvedOptions, response, responseHeaders, declaredLength, isStreamResponse, options, responseContentLength, _ref7, _ref8, _onProgress, _flush, bytesRead, onChunkProgress, responseData, materializedSize, canceledError, _t3, _t4;+ var _resolveConfig, url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, _resolveConfig$withCr, withCredentials, fetchOptions, maxContentLength, maxBodyLength, hasMaxContentLength, hasMaxBodyLength, own, _fetch, composedSignal, request, unsubscribe, requestContentLength, pendingBodyError, maxBodyLengthError, auth, configAuth, username, password, parsedURL, urlUsername, urlPassword, estimated, outboundLength, mustEnforceStreamBody, trackRequestStream, _request, contentTypeHeader, _ref5, _ref6, onProgress, flush, isCredentialsSupported, contentType, resolvedOptions, response, responseHeaders, declaredLength, isStreamResponse, options, responseContentLength, _ref7, _ref8, _onProgress, _flush, bytesRead, onChunkProgress, responseData, materializedSize, canceledError, networkError, _t3, _t4; return _regenerator().w(function (_context4) {@@ -4319,3 +4351,13 @@ request && (canceledError.request = request);- _t4 !== canceledError && (canceledError.cause = _t4);+ if (_t4 !== canceledError) {+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(canceledError, 'cause', {+ __proto__: null,+ value: _t4,+ writable: true,+ enumerable: false,+ configurable: true+ });+ } throw canceledError;@@ -4340,5 +4382,12 @@ }- throw Object.assign(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, _t4 && _t4.response), {- cause: _t4.cause || _t4+ networkError = new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, _t4 && _t4.response); // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(networkError, 'cause', {+ __proto__: null,+ value: _t4.cause || _t4,+ writable: true,+ enumerable: false,+ configurable: true });+ throw networkError; case 20:@@ -4474,3 +4523,3 @@ var s = length ? reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0]) : 'as no adapter specified';- throw new AxiosError("There is no suitable adapter to dispatch the request " + s, 'ERR_NOT_SUPPORT');+ throw new AxiosError("There is no suitable adapter to dispatch the request " + s, AxiosError.ERR_NOT_SUPPORT); }@@ -4617,3 +4666,3 @@ function assertOptions(options, schema, allowUnknown) {- if (_typeof(options) !== 'object') {+ if (_typeof(options) !== 'object' || options === null) { throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
--- +++ @@ -1,2 +1,2 @@-/*! Axios v1.18.0 Copyright (c) 2026 Matt Zabriskie and contributors */+/*! Axios v1.18.1 Copyright (c) 2026 Matt Zabriskie and contributors */ 'use strict';@@ -1569,3 +1569,15 @@ const axiosError = new AxiosError(error.message, code || error.code, config, request, response);- axiosError.cause = error;+ // Match native `Error` `cause` semantics: non-enumerable. The wrapped+ // error often carries circular internals (sockets, requests, agents), so+ // an enumerable `cause` makes structured loggers (pino/winston) and any+ // own-property walk throw "Converting circular structure to JSON".+ // Regression from #6982; see #7205. `__proto__: null` mirrors the+ // `message` descriptor below (prototype-pollution-safe descriptor).+ Object.defineProperty(axiosError, 'cause', {+ __proto__: null,+ value: error,+ writable: true,+ enumerable: false,+ configurable: true,+ }); axiosError.name = error.name;@@ -1808,3 +1820,9 @@ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {- return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);+ if (useBlob && typeof _Blob === 'function') {+ return new _Blob([value]);+ }+ if (typeof Buffer !== 'undefined') {+ return Buffer.from(value);+ }+ throw new AxiosError('Blob is not supported. Use a Buffer instead.', AxiosError.ERR_NOT_SUPPORT); }@@ -1985,5 +2003,3 @@ const _encode = encoder- ? function (value) {- return encoder.call(this, value, encode$1);- }+ ? (value) => encoder.call(this, value, encode$1) : encode$1;@@ -2026,2 +2042,3 @@ }+ url = url || ''; @@ -2777,3 +2794,7 @@ if (eq !== -1 && cookie.slice(0, eq) === name) {- return decodeURIComponent(cookie.slice(eq + 1));+ try {+ return decodeURIComponent(cookie.slice(eq + 1));+ } catch (e) {+ return cookie.slice(eq + 1);+ } }@@ -2886,2 +2907,3 @@ // eslint-disable-next-line no-param-reassign+ config1 = config1 || {}; config2 = config2 || {};@@ -3035,3 +3057,3 @@ - Object.entries(formHeaders).forEach(([key, val]) => {+ Object.entries(formHeaders || {}).forEach(([key, val]) => { if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {@@ -3085,6 +3107,10 @@ - headers.set(- 'Authorization',- 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : ''))- );+ try {+ headers.set(+ 'Authorization',+ 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : ''))+ );+ } catch (e) {+ throw AxiosError.from(e, AxiosError.ERR_BAD_OPTION_VALUE, config);+ } }@@ -3339,2 +3365,3 @@ );+ done(); return;@@ -3390,3 +3417,3 @@ - signals.forEach((signal) => signal.addEventListener('abort', onabort));+ signals.forEach((signal) => signal.addEventListener('abort', onabort, { once: true })); @@ -3595,3 +3622,3 @@ -const VERSION = "1.18.0";+const VERSION = "1.18.1"; @@ -4139,3 +4166,13 @@ request && (canceledError.request = request);- err !== canceledError && (canceledError.cause = err);+ if (err !== canceledError) {+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(canceledError, 'cause', {+ __proto__: null,+ value: err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ } throw canceledError;@@ -4161,14 +4198,19 @@ if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {- throw Object.assign(- new AxiosError(- 'Network Error',- AxiosError.ERR_NETWORK,- config,- request,- err && err.response- ),- {- cause: err.cause || err,- }+ const networkError = new AxiosError(+ 'Network Error',+ AxiosError.ERR_NETWORK,+ config,+ request,+ err && err.response );+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(networkError, 'cause', {+ __proto__: null,+ value: err.cause || err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ throw networkError; }@@ -4310,3 +4352,3 @@ `There is no suitable adapter to dispatch the request ` + s,- 'ERR_NOT_SUPPORT'+ AxiosError.ERR_NOT_SUPPORT );@@ -4491,3 +4533,3 @@ function assertOptions(options, schema, allowUnknown) {- if (typeof options !== 'object') {+ if (typeof options !== 'object' || options === null) { throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
--- +++ @@ -1,2 +1,2 @@-/*! Axios v1.18.0 Copyright (c) 2026 Matt Zabriskie and contributors */+/*! Axios v1.18.1 Copyright (c) 2026 Matt Zabriskie and contributors */ /**@@ -1567,3 +1567,15 @@ const axiosError = new AxiosError(error.message, code || error.code, config, request, response);- axiosError.cause = error;+ // Match native `Error` `cause` semantics: non-enumerable. The wrapped+ // error often carries circular internals (sockets, requests, agents), so+ // an enumerable `cause` makes structured loggers (pino/winston) and any+ // own-property walk throw "Converting circular structure to JSON".+ // Regression from #6982; see #7205. `__proto__: null` mirrors the+ // `message` descriptor below (prototype-pollution-safe descriptor).+ Object.defineProperty(axiosError, 'cause', {+ __proto__: null,+ value: error,+ writable: true,+ enumerable: false,+ configurable: true,+ }); axiosError.name = error.name;@@ -1806,3 +1818,9 @@ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {- return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);+ if (useBlob && typeof _Blob === 'function') {+ return new _Blob([value]);+ }+ if (typeof Buffer !== 'undefined') {+ return Buffer.from(value);+ }+ throw new AxiosError$1('Blob is not supported. Use a Buffer instead.', AxiosError$1.ERR_NOT_SUPPORT); }@@ -1983,5 +2001,3 @@ const _encode = encoder- ? function (value) {- return encoder.call(this, value, encode$1);- }+ ? (value) => encoder.call(this, value, encode$1) : encode$1;@@ -2024,2 +2040,3 @@ }+ url = url || ''; @@ -2775,3 +2792,7 @@ if (eq !== -1 && cookie.slice(0, eq) === name) {- return decodeURIComponent(cookie.slice(eq + 1));+ try {+ return decodeURIComponent(cookie.slice(eq + 1));+ } catch (e) {+ return cookie.slice(eq + 1);+ } }@@ -2884,2 +2905,3 @@ // eslint-disable-next-line no-param-reassign+ config1 = config1 || {}; config2 = config2 || {};@@ -3033,3 +3055,3 @@ - Object.entries(formHeaders).forEach(([key, val]) => {+ Object.entries(formHeaders || {}).forEach(([key, val]) => { if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {@@ -3083,6 +3105,10 @@ - headers.set(- 'Authorization',- 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : ''))- );+ try {+ headers.set(+ 'Authorization',+ 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : ''))+ );+ } catch (e) {+ throw AxiosError$1.from(e, AxiosError$1.ERR_BAD_OPTION_VALUE, config);+ } }@@ -3337,2 +3363,3 @@ );+ done(); return;@@ -3388,3 +3415,3 @@ - signals.forEach((signal) => signal.addEventListener('abort', onabort));+ signals.forEach((signal) => signal.addEventListener('abort', onabort, { once: true })); @@ -3593,3 +3620,3 @@ -const VERSION$1 = "1.18.0";+const VERSION$1 = "1.18.1"; @@ -4137,3 +4164,13 @@ request && (canceledError.request = request);- err !== canceledError && (canceledError.cause = err);+ if (err !== canceledError) {+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(canceledError, 'cause', {+ __proto__: null,+ value: err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ } throw canceledError;@@ -4159,14 +4196,19 @@ if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {- throw Object.assign(- new AxiosError$1(- 'Network Error',- AxiosError$1.ERR_NETWORK,- config,- request,- err && err.response- ),- {- cause: err.cause || err,- }+ const networkError = new AxiosError$1(+ 'Network Error',+ AxiosError$1.ERR_NETWORK,+ config,+ request,+ err && err.response );+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(networkError, 'cause', {+ __proto__: null,+ value: err.cause || err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ throw networkError; }@@ -4308,3 +4350,3 @@ `There is no suitable adapter to dispatch the request ` + s,- 'ERR_NOT_SUPPORT'+ AxiosError$1.ERR_NOT_SUPPORT );@@ -4489,3 +4531,3 @@ function assertOptions(options, schema, allowUnknown) {- if (typeof options !== 'object') {+ if (typeof options !== 'object' || options === null) { throw new AxiosError$1('options must be an object', AxiosError$1.ERR_BAD_OPTION_VALUE);
--- +++ @@ -33,2 +33,3 @@ set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;+ set(headers?: Iterable<[string, AxiosHeaderValue]>, rewrite?: boolean): AxiosHeaders; @@ -92,2 +93,4 @@ getSetCookie(): string[];++ toString(): string; @@ -235,2 +238,8 @@ NetworkAuthenticationRequired = 511,+ WebServerIsDown = 521,+ ConnectionTimedOut = 522,+ OriginIsUnreachable = 523,+ TimeoutOccurred = 524,+ SslHandshakeFailed = 525,+ InvalidSslCertificate = 526, }@@ -317,2 +326,4 @@ indexes?: boolean | null;+ maxDepth?: number;+ Blob?: { new (...args: any[]): any }; }@@ -540,3 +551,5 @@ export class CanceledError<T> extends AxiosError<T> {+ constructor(message?: string, config?: InternalAxiosRequestConfig, request?: any); readonly name: 'CanceledError';+ __CANCEL__?: boolean; }@@ -566,2 +579,5 @@ throwIfRequested(): void;+ subscribe(listener: (cancel: Cancel | any) => void): void;+ unsubscribe(listener: (cancel: Cancel | any) => void): void;+ toAbortSignal(): AbortSignal; }@@ -718,3 +734,3 @@ export interface AxiosStatic extends AxiosInstance {- Cancel: CancelStatic;+ Cancel: typeof CanceledError; CancelToken: CancelTokenStatic;
--- +++ @@ -109,3 +109,3 @@ `There is no suitable adapter to dispatch the request ` + s,- 'ERR_NOT_SUPPORT'+ AxiosError.ERR_NOT_SUPPORT );
--- +++ @@ -559,3 +559,13 @@ request && (canceledError.request = request);- err !== canceledError && (canceledError.cause = err);+ if (err !== canceledError) {+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(canceledError, 'cause', {+ __proto__: null,+ value: err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ } throw canceledError;@@ -581,14 +591,19 @@ if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {- throw Object.assign(- new AxiosError(- 'Network Error',- AxiosError.ERR_NETWORK,- config,- request,- err && err.response- ),- {- cause: err.cause || err,- }+ const networkError = new AxiosError(+ 'Network Error',+ AxiosError.ERR_NETWORK,+ config,+ request,+ err && err.response );+ // Non-enumerable to match native Error `cause` semantics so loggers+ // don't recurse into circular fetch internals (see #7205).+ Object.defineProperty(networkError, 'cause', {+ __proto__: null,+ value: err.cause || err,+ writable: true,+ enumerable: false,+ configurable: true,+ });+ throw networkError; }
--- +++ @@ -220,2 +220,3 @@ );+ done(); return;
--- +++ @@ -77,3 +77,15 @@ const axiosError = new AxiosError(error.message, code || error.code, config, request, response);- axiosError.cause = error;+ // Match native `Error` `cause` semantics: non-enumerable. The wrapped+ // error often carries circular internals (sockets, requests, agents), so+ // an enumerable `cause` makes structured loggers (pino/winston) and any+ // own-property walk throw "Converting circular structure to JSON".+ // Regression from #6982; see #7205. `__proto__: null` mirrors the+ // `message` descriptor below (prototype-pollution-safe descriptor).+ Object.defineProperty(axiosError, 'cause', {+ __proto__: null,+ value: error,+ writable: true,+ enumerable: false,+ configurable: true,+ }); axiosError.name = error.name;
--- +++ @@ -18,2 +18,3 @@ // eslint-disable-next-line no-param-reassign+ config1 = config1 || {}; config2 = config2 || {};
--- +++ @@ -1 +1 @@-export const VERSION = "1.18.0";+export const VERSION = "1.18.1";
--- +++ @@ -48,5 +48,3 @@ const _encode = encoder- ? function (value) {- return encoder.call(this, value, encode);- }+ ? (value) => encoder.call(this, value, encode) : encode;
--- +++ @@ -34,2 +34,3 @@ }+ url = url || '';
--- +++ @@ -47,3 +47,3 @@ - signals.forEach((signal) => signal.addEventListener('abort', onabort));+ signals.forEach((signal) => signal.addEventListener('abort', onabort, { once: true }));
--- +++ @@ -42,3 +42,7 @@ if (eq !== -1 && cookie.slice(0, eq) === name) {- return decodeURIComponent(cookie.slice(eq + 1));+ try {+ return decodeURIComponent(cookie.slice(eq + 1));+ } catch (e) {+ return cookie.slice(eq + 1);+ } }
--- +++ @@ -2,2 +2,3 @@ import utils from '../utils.js';+import AxiosError from '../core/AxiosError.js'; import isURLSameOrigin from './isURLSameOrigin.js';@@ -17,3 +18,3 @@ - Object.entries(formHeaders).forEach(([key, val]) => {+ Object.entries(formHeaders || {}).forEach(([key, val]) => { if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {@@ -67,6 +68,10 @@ - headers.set(- 'Authorization',- 'Basic ' + btoa(username + ':' + (password ? encodeUTF8(password) : ''))- );+ try {+ headers.set(+ 'Authorization',+ 'Basic ' + btoa(username + ':' + (password ? encodeUTF8(password) : ''))+ );+ } catch (e) {+ throw AxiosError.from(e, AxiosError.ERR_BAD_OPTION_VALUE, config);+ } }
--- +++ @@ -145,3 +145,9 @@ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {- return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);+ if (useBlob && typeof _Blob === 'function') {+ return new _Blob([value]);+ }+ if (typeof Buffer !== 'undefined') {+ return Buffer.from(value);+ }+ throw new AxiosError('Blob is not supported. Use a Buffer instead.', AxiosError.ERR_NOT_SUPPORT); }
--- +++ @@ -81,3 +81,3 @@ function assertOptions(options, schema, allowUnknown) {- if (typeof options !== 'object') {+ if (typeof options !== 'object' || options === null) { throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
--- +++ @@ -2,3 +2,3 @@ "name": "axios",- "version": "1.18.0",+ "version": "1.18.1", "description": "Promise based HTTP client for the browser and node.js",@@ -89,4 +89,4 @@ "Shaan Majid (https://github.com/shaanmajid)",+ "Remco Haszing (https://github.com/remcohaszing)", "Willian Agostini (https://github.com/WillianAgostini)",- "Remco Haszing (https://github.com/remcohaszing)", "Rikki Gibson (https://github.com/RikkiGibson)"
babel-core npm DELETION ×6BURST ×36
6.20.0
6.21.0
6.22.0
6.22.1
6.23.0
6.23.1
6.24.0
6.24.1
6.25.0
6.26.0
6.26.2
6.26.3
DELETION
5.6.0 published then removed
high · registry-verified · 2015-06-20 · 11y ago
DELETION
5.6.8 published then removed
high · registry-verified · 2015-06-25 · 11y ago
DELETION
5.6.9 published then removed
high · registry-verified · 2015-06-25 · 11y ago
DELETION
5.6.17 published then removed
high · registry-verified · 2015-07-09 · 11y ago
DELETION
5.8.4 published then removed
high · registry-verified · 2015-07-24 · 10y ago
DELETION
6.18.1 published then removed
high · registry-verified · 2016-11-01 · 9y ago
BURST
2 releases in 9m: 4.2.0, 4.2.1
info · registry-verified · 2015-02-18 · 11y ago
BURST
2 releases in 8m: 4.4.1, 4.4.2
info · registry-verified · 2015-02-21 · 11y ago
BURST
2 releases in 36m: 4.4.4, 4.4.5
info · registry-verified · 2015-02-22 · 11y ago
BURST
2 releases in 54m: 4.5.0, 4.5.1
info · registry-verified · 2015-02-25 · 11y ago
BURST
3 releases in 18m: 4.5.2, 4.5.3, 4.5.4
info · registry-verified · 2015-02-25 · 11y ago
BURST
2 releases in 53m: 4.7.0, 4.7.1
info · registry-verified · 2015-03-06 · 11y ago
BURST
3 releases in 40m: 4.7.10, 4.7.11, 4.7.12
info · registry-verified · 2015-03-13 · 11y ago
BURST
2 releases in 5m: 4.7.14, 4.7.15
info · registry-verified · 2015-03-18 · 11y ago
BURST
2 releases in 15m: 5.0.0, 5.0.1
info · registry-verified · 2015-04-02 · 11y ago
BURST
2 releases in 6m: 5.0.3, 5.0.4
info · registry-verified · 2015-04-03 · 11y ago
BURST
2 releases in 31m: 5.0.5, 5.0.6
info · registry-verified · 2015-04-03 · 11y ago
BURST
2 releases in 41m: 5.0.11, 5.0.12
info · registry-verified · 2015-04-08 · 11y ago
BURST
2 releases in 8m: 5.0.13, 5.1.0
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 39m: 5.1.1, 5.1.2
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 12m: 5.1.3, 5.1.4
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 32m: 5.1.6, 5.1.7
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 11m: 5.1.12, 5.1.13
info · registry-verified · 2015-04-25 · 11y ago
BURST
2 releases in 13m: 5.2.1, 5.2.2
info · registry-verified · 2015-04-30 · 11y ago
BURST
2 releases in 12m: 5.2.4, 5.2.5
info · registry-verified · 2015-05-01 · 11y ago
BURST
2 releases in 9m: 5.2.10, 5.2.11
info · registry-verified · 2015-05-04 · 11y ago
BURST
2 releases in 29m: 5.2.14, 5.2.15
info · registry-verified · 2015-05-05 · 11y ago
BURST
2 releases in 35m: 5.4.1, 5.4.2
info · registry-verified · 2015-05-15 · 11y ago
BURST
2 releases in 13m: 5.4.6, 5.4.7
info · registry-verified · 2015-05-21 · 11y ago
BURST
2 releases in 17m: 5.5.2, 5.5.3
info · registry-verified · 2015-06-05 · 11y ago
BURST
2 releases in 29m: 5.6.0, 5.6.1
info · registry-verified · 2015-06-20 · 11y ago
BURST
2 releases in 24m: 5.6.8, 5.6.9
info · registry-verified · 2015-06-25 · 11y ago
BURST
3 releases in 22m: 5.8.1, 5.8.2, 5.8.3
info · registry-verified · 2015-07-21 · 10y ago
BURST
2 releases in 28m: 5.8.4, 5.8.5
info · registry-verified · 2015-07-24 · 10y ago
BURST
2 releases in 16m: 5.8.6, 5.8.8
info · registry-verified · 2015-07-26 · 10y ago
BURST
2 releases in 18m: 5.8.31, 5.8.32
info · registry-verified · 2015-10-28 · 10y ago
BURST
3 releases in 15m: 6.0.0, 6.0.1, 6.0.2
info · registry-verified · 2015-10-29 · 10y ago
BURST
2 releases in 21m: 5.8.34, 6.1.5
info · registry-verified · 2015-11-12 · 10y ago
BURST
6 releases in 26m: 6.1.6, 6.1.7, 6.1.8, 6.1.9, 6.1.10, 6.1.11
info · registry-verified · 2015-11-12 · 10y ago
BURST
3 releases in 21m: 6.1.13, 6.1.14, 6.1.15
info · registry-verified · 2015-11-12 · 10y ago
BURST
4 releases in 45m: 6.1.16, 6.1.17, 6.1.18, 6.1.19
info · registry-verified · 2015-11-12 · 10y ago
BURST
2 releases in 14m: 6.18.1, 6.18.2
info · registry-verified · 2016-11-01 · 9y ago
release diff 6.26.2 → 6.26.3
+0 added · -0 removed · ~2 modified
--- +++ @@ -35,7 +35,2 @@ var output = buildMappingData(map);-- if (output.sources.length !== 1) {- throw new Error("Assertion failure - expected a single output file");- }- var defaultSource = output.sources[0]; @@ -62,59 +57,62 @@ - var insertedMappings = new _map2.default();-- eachInputGeneratedRange(input, function (generated, original, source) {- eachOverlappingGeneratedOutputRange(defaultSource, generated, function (item) {- var key = makeMappingKey(item);- if (insertedMappings.has(key)) return;- insertedMappings.set(key, item);-- mergedGenerator.addMapping({- source: source.path,- original: {- line: original.line,- column: original.columnStart- },- generated: {- line: item.line,- column: item.columnStart- },- name: original.name+ if (output.sources.length === 1) {+ var defaultSource = output.sources[0];+ var insertedMappings = new _map2.default();++ eachInputGeneratedRange(input, function (generated, original, source) {+ eachOverlappingGeneratedOutputRange(defaultSource, generated, function (item) {+ var key = makeMappingKey(item);+ if (insertedMappings.has(key)) return;+ insertedMappings.set(key, item);++ mergedGenerator.addMapping({+ source: source.path,+ original: {+ line: original.line,+ column: original.columnStart+ },+ generated: {+ line: item.line,+ column: item.columnStart+ },+ name: original.name+ }); }); });- });-- for (var _iterator2 = insertedMappings.values(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {- var _ref3;-- if (_isArray2) {- if (_i2 >= _iterator2.length) break;- _ref3 = _iterator2[_i2++];- } else {- _i2 = _iterator2.next();- if (_i2.done) break;- _ref3 = _i2.value;- }-- var item = _ref3;-- if (item.columnEnd === Infinity) {- continue;- }-- var clearItem = {- line: item.line,- columnStart: item.columnEnd- };-- var key = makeMappingKey(clearItem);- if (insertedMappings.has(key)) {- continue;- }-- mergedGenerator.addMapping({- generated: {- line: clearItem.line,- column: clearItem.columnStart- }- });++ for (var _iterator2 = insertedMappings.values(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {+ var _ref3;++ if (_isArray2) {+ if (_i2 >= _iterator2.length) break;+ _ref3 = _iterator2[_i2++];+ } else {+ _i2 = _iterator2.next();+ if (_i2.done) break;+ _ref3 = _i2.value;+ }++ var item = _ref3;++ if (item.columnEnd === Infinity) {+ continue;+ }++ var clearItem = {+ line: item.line,+ columnStart: item.columnEnd+ };++ var key = makeMappingKey(clearItem);+ if (insertedMappings.has(key)) {+ continue;+ }++ mergedGenerator.addMapping({+ generated: {+ line: clearItem.line,+ column: clearItem.columnStart+ }+ });+ } }
--- +++ @@ -2,3 +2,3 @@ "name": "babel-core",- "version": "6.26.2",+ "version": "6.26.3", "description": "Babel compiler core.",
babel-eslint npm DELETIONBURST ×12
8.2.1
8.2.2
8.2.3
8.2.4
8.2.5
8.2.6
9.0.0
10.0.0
10.0.1
10.0.2
10.0.3
10.1.0
DELETION
3.1.2 published then removed
high · registry-verified · 2015-05-14 · 11y ago
BURST
3 releases in 21m: 1.0.1, 1.0.2, 1.0.3
info · registry-verified · 2015-02-27 · 11y ago
BURST
3 releases in 18m: 1.0.7, 1.0.8, 1.0.9
info · registry-verified · 2015-02-28 · 11y ago
BURST
2 releases in 34m: 1.0.10, 1.0.11
info · registry-verified · 2015-02-28 · 11y ago
BURST
2 releases in 54m: 3.0.0, 3.0.1
info · registry-verified · 2015-04-14 · 11y ago
BURST
2 releases in 32m: 3.1.12, 3.1.13
info · registry-verified · 2015-06-05 · 11y ago
BURST
2 releases in 15m: 3.1.27, 4.0.0
info · registry-verified · 2015-07-25 · 10y ago
BURST
5 releases in 38m: 4.0.1, 4.0.2, 3.1.28, 4.0.3, 3.1.29
info · registry-verified · 2015-07-27 · 10y ago
BURST
3 releases in 16m: 4.0.4, 3.1.30, 4.0.5
info · registry-verified · 2015-07-27 · 10y ago
BURST
2 releases in 16m: 4.0.9, 4.0.10
info · registry-verified · 2015-08-17 · 10y ago
BURST
2 releases in 6m: 5.0.1, 6.0.0
info · registry-verified · 2016-03-26 · 10y ago
BURST
2 releases in 1m: 5.0.3, 6.0.1
info · registry-verified · 2016-03-31 · 10y ago
BURST
2 releases in 3m: 6.0.2, 5.0.4
info · registry-verified · 2016-03-31 · 10y ago
release diff 10.0.3 → 10.1.0
+0 added · -0 removed · ~3 modified
--- +++ @@ -149,2 +149,6 @@ }+ }++ EnumDeclaration(node) {+ this._createScopeVariable(node, node.id); }
--- +++ @@ -21,3 +21,3 @@ plugins: [- ["flow", { all: true }],+ ["flow", { all: true, enums: true }], "jsx",
--- +++ @@ -2,3 +2,3 @@ "name": "babel-eslint",- "version": "10.0.3",+ "version": "10.1.0", "description": "Custom parser for ESLint",@@ -14,5 +14,5 @@ "@babel/code-frame": "^7.0.0",- "@babel/parser": "^7.0.0",- "@babel/traverse": "^7.0.0",- "@babel/types": "^7.0.0",+ "@babel/parser": "^7.7.0",+ "@babel/traverse": "^7.7.0",+ "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0",
chalk npm DELETIONBURST ×2
5.0.1
5.1.0
5.1.1
5.1.2
5.2.0
5.3.0
5.4.0
5.4.1
5.5.0
5.6.0
5.6.1
5.6.2
DELETION
5.6.1 published then removed
high · registry-verified · 2025-09-08 · 10mo ago
BURST
2 releases in 45m: 1.1.2, 1.1.3
info · registry-verified · 2016-03-28 · 10y ago
BURST
2 releases in 52m: 2.2.2, 2.3.0
info · registry-verified · 2017-10-24 · 8y ago
release diff 5.6.0 → 5.6.2
+0 added · -0 removed · ~1 modified
--- +++ @@ -2,3 +2,3 @@ "name": "chalk",- "version": "5.6.0",+ "version": "5.6.2", "description": "Terminal string styling done right",
@ctrl/tinycolor npm DELETION ×2BURST ×3
3.5.1
3.6.0
3.6.1
4.0.0
4.0.1
4.0.2
4.0.3
4.0.4
4.1.0
4.1.1
4.1.2
4.2.0
DELETION
4.1.1 published then removed
high · registry-verified · 2025-09-15 · 10mo ago
DELETION
4.1.2 published then removed
high · registry-verified · 2025-09-15 · 10mo ago
BURST
3 releases in 29m: 3.0.0, 3.0.1, 3.0.2
info · registry-verified · 2020-04-22 · 6y ago
BURST
2 releases in 50m: 3.6.1, 4.0.0
info · registry-verified · 2023-08-23 · 2y ago
BURST
2 releases in 21m: 4.1.1, 4.1.2
info · registry-verified · 2025-09-15 · 10mo ago
release diff 4.1.0 → 4.2.0
+0 added · -0 removed · ~2 modified
--- +++ @@ -2,3 +2,3 @@ "name": "@ctrl/tinycolor",- "version": "4.1.0",+ "version": "4.2.0", "description": "Fast, small color manipulation and conversion for JavaScript",@@ -6,3 +6,4 @@ "publishConfig": {- "access": "public"+ "access": "public",+ "provenance": true },
eslint npm critical-tier DELETIONBURST ×5
9.39.4
10.0.3
10.1.0
10.2.0
10.2.1
10.3.0
10.4.0
10.4.1
10.5.0
10.6.0
9.39.5
10.7.0
DELETION
0.7.0 published then removed
high · registry-verified · 2014-05-23 · 12y ago
BURST
2 releases in 10m: 0.6.0, 0.6.1
info · registry-verified · 2014-05-17 · 12y ago
BURST
2 releases in 4m: 0.7.0, 0.6.2
info · registry-verified · 2014-05-23 · 12y ago
BURST
2 releases in 36m: 2.5.2, 2.5.3
info · registry-verified · 2016-03-28 · 10y ago
BURST
2 releases in 41m: 3.2.1, 3.2.2
info · registry-verified · 2016-08-01 · 9y ago
BURST
2 releases in 41m: 9.39.5, 10.7.0 · ACTIVE
info · registry-verified · 2026-07-10 · 1d ago
release diff 9.39.5 → 10.7.0
+3 added · -9 removed · ~159 modified
+136 more files not shown
--- +++ @@ -64,2 +64,28 @@ /**+ * Spawns an external command and propagates its exit status.+ * @param {string} command The command to run.+ * @param {string[]} args The command arguments.+ * @throws {Error} If the command cannot be spawned.+ * @returns {void}+ */+function spawnExternalCommand(command, args) {+ const spawn = require("cross-spawn");+ const result = spawn.sync(command, args, {+ encoding: "utf8",+ stdio: "inherit",+ });++ if (result.error) {+ throw result.error;+ }++ if (result.signal) {+ process.kill(process.pid, result.signal);+ return;+ }++ process.exitCode = result.status ?? 0;+}++/** * Get the error message of a given value.@@ -148,8 +174,3 @@ - const spawn = require("cross-spawn");-- spawn.sync("npm", ["init", "@eslint/config@latest"], {- encoding: "utf8",- stdio: "inherit",- });+ spawnExternalCommand("npm", ["init", "@eslint/config@latest"]); return;@@ -163,8 +184,3 @@ - const spawn = require("cross-spawn");-- spawn.sync("npx", ["@eslint/mcp@latest"], {- encoding: "utf8",- stdio: "inherit",- });+ spawnExternalCommand("npx", ["@eslint/mcp@latest"]); return;@@ -176,4 +192,3 @@ process.argv,- process.argv.includes("--stdin") ? await readStdin() : null,- true,+ process.argv.includes("--stdin") ? await readStdin() : void 0, );
--- +++ @@ -146,2 +146,3 @@ SuppressedError: false,+ Temporal: false, };
--- +++ @@ -11,4 +11,3 @@ -const { ESLint, shouldUseFlatConfig } = require("./eslint/eslint");-const { LegacyESLint } = require("./eslint/legacy-eslint");+const { ESLint } = require("./eslint/eslint"); const { Linter } = require("./linter");@@ -22,17 +21,7 @@ /**- * Loads the correct ESLint constructor given the options.- * @param {Object} [options] The options object- * @param {boolean} [options.useFlatConfig] Whether or not to use a flat config- * @returns {Promise<ESLint|LegacyESLint>} The ESLint constructor+ * Loads the correct `ESLint` constructor.+ * @returns {Promise<ESLint>} The ESLint constructor. */-async function loadESLint({ useFlatConfig } = {}) {- /*- * Note: The v8.x version of this function also accepted a `cwd` option, but- * it is not used in this implementation so we silently ignore it.- */-- const shouldESLintUseFlatConfig =- useFlatConfig ?? (await shouldUseFlatConfig());-- return shouldESLintUseFlatConfig ? ESLint : LegacyESLint;+async function loadESLint() {+ return ESLint; }
--- +++ @@ -193,4 +193,4 @@ * Renders text along the template of x problems (x errors, x warnings)- * @param {string} totalErrors Total errors- * @param {string} totalWarnings Total warnings+ * @param {number} totalErrors Total errors+ * @param {number} totalWarnings Total warnings * @returns {string} The formatted string, pluralized where necessary@@ -209,4 +209,4 @@ * Get the color based on whether there are errors/warnings...- * @param {string} totalErrors Total errors- * @param {string} totalWarnings Total warnings+ * @param {number} totalErrors Total errors+ * @param {number} totalWarnings Total warnings * @returns {number} The color code (0 = green, 1 = yellow, 2 = red)
--- +++ @@ -6,4 +6,3 @@ -const chalk = require("chalk"),- util = require("node:util"),+const util = require("node:util"), table = require("../../shared/text-table");@@ -13,2 +12,19 @@ //------------------------------------------------------------------------------++/**+ * Returns a styling function based on the color option.+ * @param {boolean|undefined} color Indicates whether to use colors.+ * @returns {Function} A function that styles text.+ */+function getStyleText(color) {+ if (typeof color === "undefined") {+ return (format, text) =>+ util.styleText(format, text, { validateStream: true });+ }+ if (color) {+ return (format, text) =>+ util.styleText(format, text, { validateStream: false });+ }+ return (_, text) => text;+} @@ -28,3 +44,5 @@ -module.exports = function (results) {+module.exports = function (results, data) {+ const styleText = getStyleText(data?.color);+ let output = "\n",@@ -48,3 +66,3 @@ - output += `${chalk.underline(result.filePath)}\n`;+ output += `${styleText("underline", result.filePath)}\n`; @@ -55,6 +73,6 @@ if (message.fatal || message.severity === 2) {- messageType = chalk.red("error");+ messageType = styleText("red", "error"); summaryColor = "red"; } else {- messageType = chalk.yellow("warning");+ messageType = styleText("yellow", "warning"); }@@ -67,3 +85,3 @@ message.message.replace(/([^ ])\.$/u, "$1"),- chalk.dim(message.ruleId || ""),+ message.ruleId ? styleText("dim", message.ruleId) : "", ];@@ -80,3 +98,3 @@ el.replace(/(\d+)\s+(\d+)/u, (m, p1, p2) =>- chalk.dim(`${p1}:${p2}`),+ styleText("dim", `${p1}:${p2}`), ),@@ -88,30 +106,43 @@ + /*+ * We can't use a single `styleText` call like `styleText([summaryColor, "bold"], text)` here.+ * This is a bug in `util.styleText` in Node.js versions earlier than v22.15.0 (https://github.com/nodejs/node/issues/56717).+ * As a workaround, we use nested `styleText` calls.+ */ if (total > 0) {- output += chalk[summaryColor].bold(- [- "\u2716 ",- total,- pluralize(" problem", total),- " (",- errorCount,- pluralize(" error", errorCount),- ", ",- warningCount,- pluralize(" warning", warningCount),- ")\n",- ].join(""),- );+ output += `${styleText(+ summaryColor,+ styleText(+ "bold",+ [+ "\u2716 ",+ total,+ pluralize(" problem", total),+ " (",+ errorCount,+ pluralize(" error", errorCount),+ ", ",+ warningCount,+ pluralize(" warning", warningCount),+ ")",+ ].join(""),+ ),+ )}\n`; if (fixableErrorCount > 0 || fixableWarningCount > 0) {- output += chalk[summaryColor].bold(- [- " ",- fixableErrorCount,- pluralize(" error", fixableErrorCount),- " and ",- fixableWarningCount,- pluralize(" warning", fixableWarningCount),- " potentially fixable with the `--fix` option.\n",- ].join(""),- );+ output += `${styleText(+ summaryColor,+ styleText(+ "bold",+ [+ " ",+ fixableErrorCount,+ pluralize(" error", fixableErrorCount),+ " and ",+ fixableWarningCount,+ pluralize(" warning", fixableWarningCount),+ " potentially fixable with the `--fix` option.",+ ].join(""),+ ),+ )}\n`; }@@ -120,3 +151,3 @@ // Resets output color, for prevent change on top level- return total > 0 ? chalk.reset(output) : "";+ return total > 0 ? styleText("reset", output) : ""; };
--- +++ @@ -21,8 +21,3 @@ { pathToFileURL } = require("node:url"),- { LegacyESLint } = require("./eslint"),- {- ESLint,- shouldUseFlatConfig,- locateConfigFileToUse,- } = require("./eslint/eslint"),+ { ESLint, locateConfigFileToUse } = require("./eslint/eslint"), createCLIOptions = require("./options"),@@ -78,3 +73,3 @@ `import translateOptions from ${JSON.stringify(translateOptionsFileURL)};\n` +- `export default await translateOptions(${JSON.stringify(options)}, "flat");\n`;+ `export default await translateOptions(${JSON.stringify(options)});\n`; @@ -201,6 +196,5 @@ * @param {string} [text] The text to lint (used for TTY).- * @param {boolean} [allowFlatConfig=true] Whether or not to allow flat config. * @returns {Promise<number>} The exit code for the operation. */- async execute(args, text, allowFlatConfig = true) {+ async execute(args, text) { if (Array.isArray(args)) {@@ -209,20 +203,3 @@ - /*- * Before doing anything, we need to see if we are using a- * flat config file. If so, then we need to change the way command- * line args are parsed. This is temporary, and when we fully- * switch to flat config we can remove this logic.- */-- const usingFlatConfig =- allowFlatConfig && (await shouldUseFlatConfig());-- debug("Using flat config?", usingFlatConfig);-- if (allowFlatConfig && !usingFlatConfig) {- const { WarningService } = require("./services/warning-service");- new WarningService().emitESLintRCWarning();- }-- const CLIOptions = createCLIOptions(usingFlatConfig);+ const CLIOptions = createCLIOptions(); @@ -235,12 +212,3 @@ } catch (error) {- debug("Error parsing CLI options:", error.message);-- let errorMessage = error.message;-- if (usingFlatConfig) {- errorMessage +=- "\nYou're using eslint.config.js, some command line flags are no longer available. Please see https://eslint.org/docs/latest/use/command-line-interface for details.";- }-- log.error(errorMessage);+ log.error(error.message); return 2;@@ -284,5 +252,3 @@ - const engine = usingFlatConfig- ? new ESLint(await translateOptions(options, "flat"))- : new LegacyESLint(await translateOptions(options));+ const engine = new ESLint(await translateOptions(options)); const fileConfig = await engine.calculateConfigForFile(@@ -301,3 +267,3 @@ try {- const flatOptions = await translateOptions(options, "flat");+ const flatOptions = await translateOptions(options); const spawn = require("cross-spawn");@@ -351,3 +317,3 @@ - if (usingFlatConfig && options.ext) {+ if (options.ext) { // Passing `--ext ""` results in `options.ext` being an empty array.@@ -402,8 +368,6 @@ - const ActiveESLint = usingFlatConfig ? ESLint : LegacyESLint;-- /** @type {ESLint|LegacyESLint} */+ /** @type {ESLint} */ let engine; - if (options.concurrency && options.concurrency !== "off") {+ if (options.concurrency !== "off") { const optionsURL = createOptionsModule(options);@@ -411,7 +375,4 @@ } else {- const eslintOptions = await translateOptions(- options,- usingFlatConfig ? "flat" : "eslintrc",- );- engine = new ActiveESLint(eslintOptions);+ const eslintOptions = await translateOptions(options);+ engine = new ESLint(eslintOptions); }@@ -422,5 +383,2 @@ filePath: options.stdinFilename,-- // flatConfig respects CLI flag and constructor warnIgnored, eslintrc forces true for backwards compatibility- warnIgnored: usingFlatConfig ? void 0 : true, });@@ -432,3 +390,3 @@ debug("Fix mode enabled - applying fixes");- await ActiveESLint.outputFixes(results);+ await ESLint.outputFixes(results); }@@ -439,3 +397,4 @@ const suppressionsFileLocation = getCacheFile(- options.suppressionsLocation || "eslint-suppressions.json",+ options.suppressionsLocation ||+ SuppressionsService.DEFAULT_SUPPRESSIONS_FILENAME, process.cwd(),@@ -491,3 +450,3 @@ debug("Quiet mode enabled - filtering out warnings");- resultsToPrint = ActiveESLint.getErrorResults(resultsToPrint);+ resultsToPrint = ESLint.getErrorResults(resultsToPrint); }@@ -498,10 +457,20 @@ resultCounts.warningCount > options.maxWarnings;- const resultsMeta = tooManyWarnings- ? {- maxWarningsExceeded: {- maxWarnings: options.maxWarnings,- foundWarnings: resultCounts.warningCount,- },- }- : {};+ const resultsMeta = /** @type {ResultsMeta} */ ({});++ /*+ * `--color` was set, `options.color` is `true`.+ * `--no-color` was set, `options.color` is `false`.+ * Neither option was provided, `options.color` is omitted, so `undefined`.+ */+ if (options.color !== void 0) {+ debug(`Color setting for output: ${options.color}`);+ resultsMeta.color = options.color;+ }++ if (tooManyWarnings) {+ resultsMeta.maxWarningsExceeded = {+ maxWarnings: options.maxWarnings,+ foundWarnings: resultCounts.warningCount,+ };+ } @@ -533,3 +502,3 @@ log.error(- "There are suppressions left that do not occur anymore. Consider re-running the command with `--prune-suppressions`.",+ "There are suppressions left that do not occur anymore. To resolve this, re-run the command with `--prune-suppressions` to remove unused suppressions. To ignore unused suppressions, use `--pass-on-unpruned-suppressions`.", );
--- +++ @@ -6,3 +6,8 @@ "use strict";-const { defineConfig, globalIgnores } = require("@eslint/config-helpers");++const {+ defineConfig,+ globalIgnores,+ includeIgnoreFile,+} = require("@eslint/config-helpers"); @@ -11,2 +16,3 @@ globalIgnores,+ includeIgnoreFile, };
--- +++ @@ -149,4 +149,7 @@ - // `createJiti` was added in jiti v2.- if (typeof createJiti !== "function") {+ // Ensure the version is at least 2.2.0.+ const [jitiMajor, jitiMinor] = jitiVersion+ .split(".")+ .map(versionPart => Number(versionPart));+ if (jitiMajor < 2 || (jitiMajor === 2 && jitiMinor < 2)) { throw new Error(@@ -163,6 +166,2 @@ };-- if (jitiVersion.startsWith("2.1.")) {- jitiOptions.interopDefault = false;- } @@ -668,149 +667,2 @@ -/**- * Encapsulates the loading and caching of configuration files when looking up- * from the current working directory.- */-class LegacyConfigLoader extends ConfigLoader {- /**- * The options to use when loading configuration files.- * @type {ConfigLoaderOptions}- */- #options;-- /**- * The cached config file path for this instance.- * @type {Promise<{configFilePath:string,basePath:string}|undefined>}- */- #configFilePath;-- /**- * The cached config array for this instance.- * @type {FlatConfigArray|Promise<FlatConfigArray>}- */- #configArray;-- /**- * Creates a new instance.- * @param {ConfigLoaderOptions} options The options to use when loading configuration files.- */- constructor(options) {- const normalizedOptions = options.warningService- ? options- : { ...options, warningService: new WarningService() };- super(normalizedOptions);- this.#options = normalizedOptions;- }-- /**- * Determines which config file to use. This is determined by seeing if an- * override config file was specified, and if so, using it; otherwise, as long- * as override config file is not explicitly set to `false`, it will search- * upwards from the cwd for a file named `eslint.config.js`.- * @returns {Promise<{configFilePath:string|undefined,basePath:string}>} Location information for- * the config file.- */- #locateConfigFileToUse() {- if (!this.#configFilePath) {- this.#configFilePath = ConfigLoader.locateConfigFileToUse({- useConfigFile: this.#options.configFile,- cwd: this.#options.cwd,- });- }-- return this.#configFilePath;- }-- /**- * Calculates the config array for this run based on inputs.- * @param {string} configFilePath The absolute path to the config file to use if not overridden.- * @param {string} basePath The base path to use for relative paths in the config file.- * @returns {Promise<FlatConfigArray>} The config array for `eslint`.- */- async #calculateConfigArray(configFilePath, basePath) {- // check for cached version first- if (this.#configArray) {- return this.#configArray;- }-- // ensure `ConfigLoader.calculateConfigArray` is called only once- this.#configArray = ConfigLoader.calculateConfigArray(- configFilePath,- basePath,- this.#options,- );-- // Unwrap the promise. This is primarily for the sync `getCachedConfigArrayForPath` method.- this.#configArray = await this.#configArray;-- return this.#configArray;- }-- /**- * Returns the config file path for the given directory. This will either use- * the override config file that was specified in the constructor options or- * search for a config file from the directory of the file being linted.- * @param {string} dirPath The directory path to get the config file path for.- * @returns {Promise<string|undefined>} The config file path or `undefined` if not found.- * @throws {Error} If `fileOrDirPath` is not a non-empty string.- * @throws {Error} If `fileOrDirPath` is not an absolute path.- */- async findConfigFileForPath(dirPath) {- assertValidFilePath(dirPath);-- const { configFilePath } = await this.#locateConfigFileToUse();-- return configFilePath;- }-- /**- * Returns a configuration object for the given file based on the CLI options.- * This is the same logic used by the ESLint CLI executable to determine- * configuration for each file it processes.- * @param {string} dirPath The path of the directory to retrieve config for.- * @returns {Promise<FlatConfigArray>} A configuration object for the file.- */- async loadConfigArrayForDirectory(dirPath) {- assertValidFilePath(dirPath);-- debug(`[Legacy]: Calculating config for ${dirPath}`);-- const { configFilePath, basePath } =- await this.#locateConfigFileToUse();-- debug(- `[Legacy]: Using config file ${configFilePath} and base path ${basePath}`,- );- return this.#calculateConfigArray(configFilePath, basePath);- }-- /**- * Returns a configuration array for the given directory based on the CLI options.- * This is a synchronous operation and does not read any files from disk. It's- * intended to be used in locations where we know the config file has already- * been loaded and we just need to get the configuration for a file.- * @param {string} dirPath The path of the directory to retrieve a config object for.- * @returns {FlatConfigArray} A configuration object for the file.- * @throws {Error} If `dirPath` is not a non-empty string.- * @throws {Error} If `dirPath` is not an absolute path.- * @throws {Error} If the config file was not already loaded.- */- getCachedConfigArrayForPath(dirPath) {- assertValidFilePath(dirPath);-- debug(`[Legacy]: Looking up cached config for ${dirPath}`);-- if (!this.#configArray) {- throw new Error(`Could not find config file for ${dirPath}`);- }-- if (typeof this.#configArray.then === "function") {- throw new Error(- `Config array for ${dirPath} has not yet been calculated or an error occurred during the calculation`,- );- }-- return this.#configArray;- }-}--module.exports = { ConfigLoader, LegacyConfigLoader };+module.exports = { ConfigLoader };
--- +++ @@ -228,2 +228,72 @@ };+}++/**+ * Normalizes a language name by replacing the built-in `@/` plugin prefix with `js/`.+ * @param {string} languageName The language name to normalize.+ * @returns {string} The normalized language name.+ */+function normalizeLanguageName(languageName) {+ return languageName.startsWith("@/")+ ? `js/${languageName.slice(2)}`+ : languageName;+}++/**+ * Checks if a rule's `meta.languages` supports the given language.+ * @param {Array<string>|undefined} ruleLangs The rule's `meta.languages` array.+ * @param {string} configLanguageName The normalized language name from the config (e.g., "js/js").+ * @param {Array<string>} validPluginNames The valid plugin name aliases for the config's plugin+ * (normalized plugin name plus its `meta.namespace` if defined).+ * @returns {boolean} True if the rule supports the language, false otherwise.+ */+function doesRuleSupportLanguage(+ ruleLangs,+ configLanguageName,+ validPluginNames,+) {+ // If no languages specified, works with all languages (backward compatible)+ if (!ruleLangs) {+ return true;+ }++ const { objectName: configLangPart } =+ splitPluginIdentifier(configLanguageName);++ for (const langEntry of ruleLangs) {+ // Skip non-string entries+ if (typeof langEntry !== "string") {+ continue;+ }++ // "*" matches any language+ if (langEntry === "*") {+ return true;+ }++ // Direct match+ if (langEntry === configLanguageName) {+ return true;+ }++ const { pluginName: rulePluginPart, objectName: ruleLangPart } =+ splitPluginIdentifier(langEntry);++ // "plugin/*" wildcard - matches any language from that plugin (by name or namespace)+ if (ruleLangPart === "*") {+ if (validPluginNames.includes(rulePluginPart)) {+ return true;+ }+ } else {+ // Match by plugin name or namespace, with exact language part+ if (+ validPluginNames.includes(rulePluginPart) &&+ ruleLangPart === configLangPart+ ) {+ return true;+ }+ }+ }++ return false; }@@ -574,2 +644,3 @@ * @throws {TypeError} If a rule is not found in the plugins.+ * @throws {TypeError} If a rule does not support the current language. */@@ -579,2 +650,19 @@ }++ // Normalize "@/" prefix to "js/" for matching and user-facing messages+ const normalizedLanguageName = normalizeLanguageName(+ this.#languageName,+ );++ // Compute valid plugin name aliases for the config's language plugin once+ const { pluginName: configPluginName } = splitPluginIdentifier(+ normalizedLanguageName,+ );+ const configPlugin =+ this.plugins[configPluginName] ??+ (configPluginName === "js" ? this.plugins["@"] : void 0);+ const validPluginNames = configPlugin?.meta?.namespace+ ? [configPluginName, configPlugin.meta.namespace]+ : [configPluginName];+ const unsupportedLanguageRules = []; @@ -603,2 +691,30 @@ throwRuleNotFoundError(parseRuleId(ruleId), this);+ }++ // Validate meta.languages structure if present (only for enabled rules)+ if (rule.meta?.languages !== void 0) {+ if (!Array.isArray(rule.meta.languages)) {+ throw new TypeError(+ `Key "rules": Key "${ruleId}": Key "meta": Key "languages": Expected an array.`,+ );+ }++ for (const lang of rule.meta.languages) {+ if (typeof lang !== "string") {+ throw new TypeError(+ `Key "rules": Key "${ruleId}": Key "meta": Key "languages": Expected each element to be a string.`,+ );+ }+ }+ }++ // Check if the rule supports the current language+ if (+ !doesRuleSupportLanguage(+ rule.meta?.languages,+ normalizedLanguageName,+ validPluginNames,+ )+ ) {+ unsupportedLanguageRules.push(ruleId); }@@ -636,2 +752,15 @@ }++ if (unsupportedLanguageRules.length > 0) {+ const error = new TypeError(+ `Key "rules": The following rules do not support the language "${normalizedLanguageName}":\n${unsupportedLanguageRules.map(ruleId => `\t- "${ruleId}"`).join("\n")}`,+ );++ error.messageTemplate = "rule-unsupported-language";+ error.messageData = {+ ruleIds: unsupportedLanguageRules,+ language: normalizedLanguageName,+ };+ throw error;+ } }
--- +++ @@ -226,11 +226,12 @@ /**- * Validates that a given string is the form pluginName/objectName.+ * Validates that a given string matches the "pluginName/memberPlaceholder" pattern. * @param {string} value The string to check.+ * @param {string} memberPlaceholder The placeholder for the member portion of the expected format in the error message. * @returns {void}- * @throws {TypeError} If the string isn't in the correct format.- */-function assertIsPluginMemberName(value) {+ * @throws {TypeError} If the string doesn't match the expected pattern.+ */+function assertIsPluginMemberName(value, memberPlaceholder) { if (!/[\w\-@$]+(?:\/[\w\-$]+)+$/iu.test(value)) { throw new TypeError(- `Expected string in the form "pluginName/objectName" but found "${value}".`,+ `Expected string in the form "pluginName/${memberPlaceholder}" but found "${value}".`, );@@ -377,3 +378,5 @@ merge: "replace",- validate: assertIsPluginMemberName,+ validate(value) {+ assertIsPluginMemberName(value, "languageName");+ }, };@@ -432,3 +435,3 @@ if (typeof value === "string") {- assertIsPluginMemberName(value);+ assertIsPluginMemberName(value, "processorName"); } else if (value && typeof value === "object") {
--- +++ @@ -21,5 +21,7 @@ const { getShorthandName } = require("../shared/naming");+const { calculateStatsPerFile } = require("../shared/message-counts"); const LintResultCache = require("../cli-engine/lint-result-cache");-const { ConfigLoader, LegacyConfigLoader } = require("../config/config-loader");+const { ConfigLoader } = require("../config/config-loader"); const createDebug = require("debug");+const { SuppressionsService } = require("../services/suppressions-service.js"); @@ -249,3 +251,3 @@ * as the user inputted them. Used for errors.- * @param {ConfigLoader|LegacyConfigLoader} options.configLoader The config array to use for+ * @param {ConfigLoader} options.configLoader The config array to use for * determining what to ignore.@@ -427,3 +429,3 @@ * A map of absolute path glob patterns to match.- * @param {ConfigLoader|LegacyConfigLoader} options.configLoader The config loader to use for+ * @param {ConfigLoader} options.configLoader The config loader to use for * determining what to ignore.@@ -508,3 +510,3 @@ * @param {string} args.cwd The current working directory to find from.- * @param {ConfigLoader|LegacyConfigLoader} args.configLoader The config loader for the current run.+ * @param {ConfigLoader} args.configLoader The config loader for the current run. * @param {boolean} args.errorOnUnmatchedPattern Determines if an unmatched pattern@@ -710,3 +712,2 @@ message,- nodeType: null, },@@ -720,38 +721,2 @@ };-}--/**- * It will calculate the error and warning count for collection of messages per file- * @param {LintMessage[]} messages Collection of messages- * @returns {Object} Contains the stats- * @private- */-function calculateStatsPerFile(messages) {- const stat = {- errorCount: 0,- fatalErrorCount: 0,- warningCount: 0,- fixableErrorCount: 0,- fixableWarningCount: 0,- };-- for (let i = 0; i < messages.length; i++) {- const message = messages[i];-- if (message.fatal || message.severity === 2) {- stat.errorCount++;- if (message.fatal) {- stat.fatalErrorCount++;- }- if (message.fix) {- stat.fixableErrorCount++;- }- } else {- stat.warningCount++;- if (message.fix) {- stat.fixableWarningCount++;- }- }- }- return stat; }@@ -824,2 +789,4 @@ ruleFilter = () => true,+ applySuppressions = false,+ suppressionsLocation = SuppressionsService.DEFAULT_SUPPRESSIONS_FILENAME, ...unknownOptions@@ -977,2 +944,8 @@ errors.push("'ruleFilter' must be a function.");+ }+ if (typeof applySuppressions !== "boolean") {+ errors.push("'applySuppressions' must be a boolean.");+ }+ if (!isNonEmptyString(suppressionsLocation)) {+ errors.push("'suppressionsLocation' must be a non-empty string."); }@@ -1005,2 +978,4 @@ ruleFilter,+ applySuppressions,+ suppressionsLocation, };@@ -1430,5 +1405,3 @@ - return linter.hasFlag("v10_config_lookup_from_file")- ? new ConfigLoader(configLoaderOptions)- : new LegacyConfigLoader(configLoaderOptions);+ return new ConfigLoader(configLoaderOptions); }@@ -1449,3 +1422,2 @@ isErrorMessage,- calculateStatsPerFile, getPlaceholderPath,
--- +++ @@ -48,2 +48,3 @@ const { WarningService } = require("../services/warning-service");+const { SuppressionsService } = require("../services/suppressions-service"); const { Config } = require("../config/config.js");@@ -70,2 +71,3 @@ /** @typedef {import("../types").ESLint.DeprecatedRuleUse} DeprecatedRuleInfo */+/** @typedef {import("../types").ESLint.Options} ESLintOptions */ /** @typedef {import("../types").ESLint.LintResult} LintResult */@@ -73,30 +75,2 @@ /** @typedef {import("../types").ESLint.ResultsMeta} ResultsMeta */--/**- * The options with which to configure the ESLint instance.- * @typedef {Object} ESLintOptions- * @property {boolean} [allowInlineConfig] Enable or disable inline configuration comments.- * @property {Config|Array<Config>} [baseConfig] Base config, extended by all configs used with this instance- * @property {boolean} [cache] Enable result caching.- * @property {string} [cacheLocation] The cache file to use instead of .eslintcache.- * @property {"metadata" | "content"} [cacheStrategy] The strategy used to detect changed files.- * @property {number | "auto" | "off"} [concurrency] Maximum number of linting threads, "auto" to choose automatically, "off" for no multithreading.- * @property {string} [cwd] The value to use for the current working directory.- * @property {boolean} [errorOnUnmatchedPattern] If `false` then `ESLint#lintFiles()` doesn't throw even if no target files found. Defaults to `true`.- * @property {boolean|Function} [fix] Execute in autofix mode. If a function, should return a boolean.- * @property {string[]} [fixTypes] Array of rule types to apply fixes for.- * @property {string[]} [flags] Array of feature flags to enable.- * @property {boolean} [globInputPaths] Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file.- * @property {boolean} [ignore] False disables all ignore patterns except for the default ones.- * @property {string[]} [ignorePatterns] Ignore file patterns to use in addition to config ignores. These patterns are relative to `cwd`.- * @property {Config|Array<Config>} [overrideConfig] Override config, overrides all configs used with this instance- * @property {boolean|string} [overrideConfigFile] Searches for default config file when falsy;- * doesn't do any config file lookup when `true`; considered to be a config filename- * when a string.- * @property {boolean} [passOnNoPatterns=false] When set to true, missing patterns cause- * the linting operation to short circuit and not report any failures.- * @property {Record<string,Plugin>} [plugins] An array of plugin implementations.- * @property {boolean} [stats] True enables added statistics on lint results.- * @property {boolean} [warnIgnored] Show warnings when the file list includes ignored files- */ @@ -135,2 +109,30 @@ +/**+ * Gets the replacement rule names from a deprecated rule's metadata.+ * @param {RulesMeta} meta The rule metadata.+ * @returns {string[]} Replacement rule names.+ */+function getDeprecatedRuleReplacements(meta) {+ if (typeof meta.deprecated !== "object") {+ return meta.replacedBy || [];+ }++ const { replacedBy } = meta.deprecated;++ if (!Array.isArray(replacedBy)) {+ return [];+ }++ return replacedBy.map(replacement => {+ if (typeof replacement !== "object" || replacement === null) {+ return "";+ }++ const pluginName = replacement.plugin?.name;+ const ruleName = replacement.rule?.name;++ return `${typeof pluginName === "string" ? `${getShorthandName(pluginName, "eslint-plugin")}/` : ""}${typeof ruleName === "string" ? ruleName : ""}`;+ });+}+ /** @type {WeakMap<CalculatedConfig, DeprecatedRuleInfo[]>} */@@ -172,8 +174,3 @@ ruleId,- replacedBy: usesNewFormat- ? (meta.deprecated.replacedBy?.map(- replacement =>- `${replacement.plugin?.name !== void 0 ? `${getShorthandName(replacement.plugin.name, "eslint-plugin")}/` : ""}${replacement.rule?.name ?? ""}`,- ) ?? [])- : meta.replacedBy || [],+ replacedBy: getDeprecatedRuleReplacements(meta), info: usesNewFormat ? meta.deprecated : void 0,@@ -239,3 +236,3 @@ * we will maintain the existing behavior, which is to search up from the cwd.- * @param {ESLintOptions} options The ESLint instance options.+ * @param {{ configFile: string | undefined; cwd: string; }} options Config file location options. * @returns {Promise<{configFilePath:string|undefined;basePath:string}>} Location information for@@ -741,2 +738,16 @@ );++ let suppressionsService = null;+ if (processedOptions.applySuppressions) {+ const suppressionsFilePath = getCacheFile(+ processedOptions.suppressionsLocation,+ processedOptions.cwd,+ { prefix: "suppressions_" },+ );+ suppressionsService = new SuppressionsService({+ filePath: suppressionsFilePath,+ cwd: processedOptions.cwd,+ });+ }+ const defaultConfigs = createDefaultConfigs(options.plugins);@@ -761,2 +772,3 @@ warningService,+ suppressionsService, });@@ -955,2 +967,3 @@ warningService,+ suppressionsService, } = privateMembers.get(this);@@ -1067,5 +1080,15 @@ - const finalResults = results.filter(result => !!result);-- return processLintReport(this, finalResults);+ const unsuppressedResults = results.filter(result => !!result);++ if (!eslintOptions.applySuppressions) {+ return processLintReport(this, unsuppressedResults);+ }++ const { results: suppressedResults } =+ suppressionsService.applySuppressions(+ unsuppressedResults,+ await suppressionsService.load(),+ );++ return processLintReport(this, suppressedResults); }@@ -1120,3 +1143,7 @@ - const { linter, options: eslintOptions } = privateMembers.get(this);+ const {+ linter,+ options: eslintOptions,+ suppressionsService,+ } = privateMembers.get(this); const {@@ -1178,3 +1205,12 @@ - return processLintReport(this, results);+ if (!filePath || !eslintOptions.applySuppressions) {+ return processLintReport(this, results);+ }++ const { results: suppressedResults } =+ suppressionsService.applySuppressions(+ results,+ await suppressionsService.load(),+ );+ return processLintReport(this, suppressedResults); }@@ -1209,2 +1245,3 @@ let formatterPath;+ let isBuiltInFormatter = false; @@ -1230,2 +1267,3 @@ );+ isBuiltInFormatter = true; }@@ -1239,3 +1277,3 @@ // check for formatters that have been removed- if (removedFormatters.has(name)) {+ if (isBuiltInFormatter && removedFormatters.has(name)) { ex.message = `The ${name} formatter is no longer part of core ESLint. Install it manually with \`npm install -D eslint-formatter-${name}\``;@@ -1346,6 +1384,6 @@ * Returns whether flat config should be used.- * @returns {Promise<boolean>} Whether flat config should be used.+ * @returns {Promise<true>} Whether flat config should be used. */ async function shouldUseFlatConfig() {- return process.env.ESLINT_USE_FLAT_CONFIG !== "false";+ return true; }
--- +++ @@ -3,3 +3,2 @@ const { ESLint } = require("./eslint");-const { LegacyESLint } = require("./legacy-eslint"); @@ -7,3 +6,2 @@ ESLint,- LegacyESLint, };
--- +++ @@ -57,2 +57,3 @@ fallback: evk.getKeys,+ jsx: ecmaFeatures.jsx, });@@ -250,3 +251,2 @@ range: true,- raw: true, tokens: true,
--- +++ @@ -10,4 +10,3 @@ -const { isCommentToken } = require("@eslint-community/eslint-utils"),- TokenStore = require("./token-store"),+const TokenStore = require("./token-store"), astUtils = require("../../../shared/ast-utils"),@@ -22,4 +21,3 @@ Directive,- } = require("@eslint/plugin-kit"),- eslintScope = require("eslint-scope");+ } = require("@eslint/plugin-kit"); @@ -31,2 +29,3 @@ /** @typedef {import("eslint-scope").Scope} Scope */+/** @typedef {import("eslint-scope").ScopeManager} ScopeManager */ /** @typedef {import("@eslint/core").SourceCode} ISourceCode */@@ -90,17 +89,2 @@ }-}--/**- * Check to see if its a ES6 export declaration.- * @param {ASTNode} astNode An AST node.- * @returns {boolean} whether the given node represents an export declaration.- * @private- */-function looksLikeExport(astNode) {- return (- astNode.type === "ExportDefaultDeclaration" ||- astNode.type === "ExportNamedDeclaration" ||- astNode.type === "ExportAllDeclaration" ||- astNode.type === "ExportSpecifier"- ); }@@ -182,52 +166,2 @@ /**- * Determines if two nodes or tokens have at least one whitespace character- * between them. Order does not matter. Returns false if the given nodes or- * tokens overlap.- * @param {SourceCode} sourceCode The source code object.- * @param {ASTNode|Token} first The first node or token to check between.- * @param {ASTNode|Token} second The second node or token to check between.- * @param {boolean} checkInsideOfJSXText If `true` is present, check inside of JSXText tokens for backward compatibility.- * @returns {boolean} True if there is a whitespace character between- * any of the tokens found between the two given nodes or tokens.- * @public- */-function isSpaceBetween(sourceCode, first, second, checkInsideOfJSXText) {- if (nodesOrTokensOverlap(first, second)) {- return false;- }-- const [startingNodeOrToken, endingNodeOrToken] =- first.range[1] <= second.range[0] ? [first, second] : [second, first];- const firstToken =- sourceCode.getLastToken(startingNodeOrToken) || startingNodeOrToken;- const finalToken =- sourceCode.getFirstToken(endingNodeOrToken) || endingNodeOrToken;- let currentToken = firstToken;-- while (currentToken !== finalToken) {- const nextToken = sourceCode.getTokenAfter(currentToken, {- includeComments: true,- });-- if (- currentToken.range[1] !== nextToken.range[0] ||- /*- * For backward compatibility, check spaces in JSXText.- * https://github.com/eslint/eslint/issues/12614- */- (checkInsideOfJSXText &&- nextToken !== finalToken &&- nextToken.type === "JSXText" &&- /\s/u.test(nextToken.value))- ) {- return true;- }-- currentToken = nextToken;- }-- return false;-}--/** * Performs binary search to find the line number containing a given character index.@@ -266,3 +200,3 @@ * scope.- * @param {Scope} globalScope The global scope.+ * @param {ScopeManager} scopeManager Scope manager. * @param {Object|undefined} configGlobals The globals declared in configuration@@ -272,93 +206,27 @@ function addDeclaredGlobals(- globalScope,- configGlobals = {},- inlineGlobals = {},+ scopeManager,+ configGlobals = Object.create(null),+ inlineGlobals = Object.create(null), ) {- // Define configured global variables.- for (const id of new Set([- ...Object.keys(configGlobals),- ...Object.keys(inlineGlobals),- ])) {- /*- * `normalizeConfigGlobal` will throw an error if a configured global value is invalid. However, these errors would- * typically be caught when validating a config anyway (validity for inline global comments is checked separately).- */- const configValue =- configGlobals[id] === void 0- ? void 0- : normalizeConfigGlobal(configGlobals[id]);- const commentValue = inlineGlobals[id] && inlineGlobals[id].value;- const value = commentValue || configValue;- const sourceComments = inlineGlobals[id] && inlineGlobals[id].comments;-- if (value === "off") {- continue;- }-- let variable = globalScope.set.get(id);-- if (!variable) {- variable = new eslintScope.Variable(id, globalScope);-- globalScope.variables.push(variable);- globalScope.set.set(id, variable);- }-- variable.eslintImplicitGlobalSetting = configValue;- variable.eslintExplicitGlobal = sourceComments !== void 0;- variable.eslintExplicitGlobalComments = sourceComments;- variable.writeable = value === "writable";- }-- /*- * "through" contains all references which definitions cannot be found.- * Since we augment the global scope using configuration, we need to update- * references and remove the ones that were added by configuration.- */- globalScope.through = globalScope.through.filter(reference => {- const name = reference.identifier.name;+ const finalGlobals = { __proto__: null, ...configGlobals };++ for (const [name, data] of Object.entries(inlineGlobals)) {+ finalGlobals[name] = data.value;+ }++ const names = Object.keys(finalGlobals).filter(+ name => finalGlobals[name] !== "off",+ );++ scopeManager.addGlobals(names);++ const globalScope = scopeManager.scopes[0];++ for (const name of names) { const variable = globalScope.set.get(name); - if (variable) {- /*- * Links the variable and the reference.- * And this reference is removed from `Scope#through`.- */- reference.resolved = variable;- variable.references.push(reference);-- return false;- }-- return true;- });-- /*- * "implicit" contains information about implicit global variables (those created- * implicitly by assigning values to undeclared variables in non-strict code).- * Since we augment the global scope using configuration, we need to remove- * the ones that were added by configuration, as they are either built-in- * or declared elsewhere, therefore not implicit.- * Since the "implicit" property was not documented, first we'll check if it exists- * because it's possible that not all custom scope managers create this property.- * If it exists, we assume it has properties `variables` and `set`. Property- * `left` is considered optional (for example, typescript-eslint's scope manage- * has this property named `leftToBeResolved`).- */- const { implicit } = globalScope;- if (typeof implicit === "object" && implicit !== null) {- implicit.variables = implicit.variables.filter(variable => {- const name = variable.name;- if (globalScope.set.has(name)) {- implicit.set.delete(name);- return false;- }- return true;- });-- if (implicit.left) {- implicit.left = implicit.left.filter(- reference => !globalScope.set.has(reference.identifier.name),- );- }+ variable.eslintImplicitGlobalSetting = configGlobals[name];+ variable.eslintExplicitGlobal = !!inlineGlobals[name];+ variable.eslintExplicitGlobalComments = inlineGlobals[name]?.comments;+ variable.writeable = finalGlobals[name] === "writable"; }@@ -595,83 +463,2 @@ return this.ast.comments;- }-- /**- * Retrieves the JSDoc comment for a given node.- * @param {ASTNode} node The AST node to get the comment for.- * @returns {Token|null} The Block comment token containing the JSDoc comment- * for the given node or null if not found.- * @public- * @deprecated- */- getJSDocComment(node) {- /**- * Checks for the presence of a JSDoc comment for the given node and returns it.- * @param {ASTNode} astNode The AST node to get the comment for.- * @returns {Token|null} The Block comment token containing the JSDoc comment- * for the given node or null if not found.- * @private- */- const findJSDocComment = astNode => {- const tokenBefore = this.getTokenBefore(astNode, {- includeComments: true,- });-- if (- tokenBefore &&- isCommentToken(tokenBefore) &&- tokenBefore.type === "Block" &&- tokenBefore.value.charAt(0) === "*" &&- astNode.loc.start.line - tokenBefore.loc.end.line <= 1- ) {- return tokenBefore;- }-- return null;- };- let parent = node.parent;-- switch (node.type) {
… 121 more lines (truncated)
--- +++ @@ -446,28 +446,2 @@ - /**- * Gets the token that precedes a given node or token in the token stream.- * This is defined for backward compatibility. Use `includeComments` option instead.- * TODO: We have a plan to remove this in a future major version.- * @param {ASTNode|Token|Comment} node The AST node or token.- * @param {number} [skip=0] A number of tokens to skip.- * @returns {Token|null} An object representing the token.- * @deprecated- */- getTokenOrCommentBefore(node, skip) {- return this.getTokenBefore(node, { includeComments: true, skip });- }-- /**- * Gets the token that follows a given node or token in the token stream.- * This is defined for backward compatibility. Use `includeComments` option instead.- * TODO: We have a plan to remove this in a future major version.- * @param {ASTNode|Token|Comment} node The AST node or token.- * @param {number} [skip=0] A number of tokens to skip.- * @returns {Token|null} An object representing the token.- * @deprecated- */- getTokenOrCommentAfter(node, skip) {- return this.getTokenAfter(node, { includeComments: true, skip });- }- //--------------------------------------------------------------------------
--- +++ @@ -7,3 +7,3 @@ //-------------------------------------------------------------------------------// Exports+// Helpers //------------------------------------------------------------------------------@@ -17,3 +17,3 @@ */-exports.search = function search(tokens, location) {+function search(tokens, location) { for (@@ -21,3 +21,2 @@ minIndex <= maxIndex;- ) {@@ -43,3 +42,3 @@ return tokens.length;-};+} @@ -53,3 +52,6 @@ */-exports.getFirstIndex = function getFirstIndex(tokens, indexMap, startLoc) {+function getFirstIndex(tokens, indexMap, startLoc) {+ if (startLoc === -1) {+ return 0;+ } if (startLoc in indexMap) {@@ -75,5 +77,9 @@ }- return 0;-}; + // Program node that doesn't start/end with a token or comment+ if (startLoc === 0) {+ return 0;+ }+ return tokens.length;+} /**@@ -86,3 +92,6 @@ */-exports.getLastIndex = function getLastIndex(tokens, indexMap, endLoc) {+function getLastIndex(tokens, indexMap, endLoc) {+ if (endLoc === -1) {+ return tokens.length - 1;+ } if (endLoc in indexMap) {@@ -108,3 +117,14 @@ }++ // Program node that doesn't start/end with a token or comment+ if (endLoc === 0) {+ return -1;+ } return tokens.length - 1;-};+}++//------------------------------------------------------------------------------+// Exports+//------------------------------------------------------------------------------++module.exports = { search, getFirstIndex, getLastIndex };
--- +++ @@ -430,3 +430,2 @@ options.reportUnusedDisableDirectives === "warn" ? 1 : 2,- nodeType: null, ...(options.disableFixes ? {} : { fix }),
--- +++ @@ -33,3 +33,3 @@ * Checks if a given node appears as the value of a PropertyDefinition node.- * @param {ASTNode} node THe node to check.+ * @param {ASTNode} node The node to check. * @returns {boolean} `true` if the node is a PropertyDefinition value,@@ -79,4 +79,4 @@ /**- * Checks whether or not a given logical expression node goes different path- * between the `true` case and the `false` case.+ * Checks whether a given logical expression node takes different paths for the+ * `true` and `false` cases. * @param {ASTNode} node A node to check.@@ -109,4 +109,4 @@ *- * This is used to detect infinity loops (e.g. `while (true) {}`).- * Statements preceded by an infinity loop are unreachable if the loop didn't+ * This is used to detect infinite loops (e.g. `while (true) {}`).+ * Statements preceded by an infinite loop are unreachable if the loop didn't * have any `break` statement.@@ -223,4 +223,4 @@ /**- * Updates the current segment with empty.- * This is called at the last of functions or the program.+ * Updates the current segment with an empty array.+ * This is called when a code path ends. * @param {CodePathAnalyzer} analyzer The instance.@@ -506,3 +506,3 @@ /*- * Fork if this node is after the 2st node in `cases`.+ * Fork if this node is after the 1st node in `cases`. * It's similar to `else` blocks.@@ -619,3 +619,3 @@ if (isIdentifierReference(node)) {- state.makeFirstThrowablePathInTryBlock();+ state.makeFirstThrowablePathInTryOrCatchBlock(); dontForward = true;@@ -628,4 +628,7 @@ case "NewExpression":+ state.makeFirstThrowablePathInTryOrCatchBlock();+ break;+ case "YieldExpression":- state.makeFirstThrowablePathInTryBlock();+ state.makeYield(); break;@@ -726,3 +729,3 @@ *- * In this case, The ArrowFunctionExpression code path is closed first+ * In this case, the ArrowFunctionExpression code path is closed first, * and then we need to close the code path for the PropertyDefinition
--- +++ @@ -571,7 +571,6 @@ /**- * If the `try` statement has a `finally` block, this affects how a- * `return` statement behaves in the `try` block. Without `finally`,- * `return` behaves as usual and doesn't require a fork; with `finally`,- * `return` forks into the `finally` block, so we need a fork context- * to track it.+ * If the `try` statement has a `finally` block, this affects how return-like+ * leaving paths behave in the `try` block. Without `finally`, they behave as+ * usual and don't require a fork; with `finally`, they fork into the+ * `finally` block, so we need a fork context to track them. * @type {ForkContext|null}@@ -1758,7 +1757,25 @@ /**- * Makes a code path segment from the first throwable node to the `catch`- * block or the `finally` block.- * @returns {void}- */- makeFirstThrowablePathInTryBlock() {+ * Records abrupt resumption paths from a suspended `yield` expression,+ * then splits normal post-`yield` continuation into a fresh segment.+ * @returns {void}+ */+ makeYield() {+ const forkContext = this.forkContext;+ const leavingSegments = forkContext.head;++ if (forkContext.reachable) {+ getReturnContext(this).returnedForkContext.add(leavingSegments);+ getThrowContext(this).thrownForkContext.add(leavingSegments);++ forkContext.replaceHead(forkContext.makeNext(-1, -1));+ }+ }++ /**+ * Makes a code path segment from the first throwable node in a `try` block to the `catch`+ * block or the `finally` block or from the first throwable node in a `catch` block+ * to the `finally` block.+ * @returns {void}+ */+ makeFirstThrowablePathInTryOrCatchBlock() { const forkContext = this.forkContext;@@ -1771,6 +1788,9 @@ + if (context === this || !context.thrownForkContext.empty) {+ return;+ }+ if (- context === this ||- context.position !== "try" ||- !context.thrownForkContext.empty+ context.position !== "try" &&+ (context.position !== "catch" || !context.hasFinalizer) ) {
--- +++ @@ -102,5 +102,6 @@ * such as the last reachable segment in a function that does not have an- * explicit `return` as this implicitly returns `undefined`. For scripts,- * modules, class field initializers, and class static blocks, this means- * all lines of code have been executed.+ * explicit `return` as this implicitly returns `undefined`, as well as+ * return-like exits from suspended `yield` expressions. For scripts, modules,+ * class field initializers, and class static blocks, this means all lines of+ * code have been executed. * These segments are also present in `finalSegments`.@@ -114,3 +115,4 @@ /**- * Final code path segments that represent `throw` statements.+ * Final code path segments that represent `throw` statements and throw-like+ * exits from suspended `yield` expressions. * This is a passthrough to the underlying `CodePathState`.
--- +++ @@ -45,2 +45,11 @@ }+}++/**+ * Escape text for use in a DOT label.+ * @param {string} value The value to escape.+ * @returns {string} The escaped value.+ */+function escapeDotLabelText(value) {+ return value.replace(/\\/gu, String.raw`\\`).replace(/"/gu, String.raw`\"`); }@@ -149,3 +158,5 @@ if (segment.internal.nodes.length > 0) {- text += segment.internal.nodes.join("\\n");+ text += segment.internal.nodes+ .map(escapeDotLabelText)+ .join("\\n"); } else {
--- +++ @@ -34,6 +34,5 @@ - /* c8 ignore start */ if (this.n < 0) { this.n = 1;- } /* c8 ignore stop */+ }
--- +++ @@ -36,16 +36,2 @@ /**- * The parser options for the file being linted.- * @type {Record<string, unknown>}- * @deprecated Use `languageOptions` instead.- */- parserOptions;-- /**- * The path to the parser used to parse this file.- * @type {string}- * @deprecated No longer supported.- */- parserPath;-- /** * The language options used when parsing this file.@@ -68,4 +54,2 @@ * @param {SourceCode} config.sourceCode The source code of the file being linted.- * @param {Record<string, unknown>} config.parserOptions The parser options for the file being linted.- * @param {string} config.parserPath The path to the parser used to parse this file. * @param {Record<string, unknown>} config.languageOptions The language options used when parsing this file.@@ -78,4 +62,2 @@ sourceCode,- parserOptions,- parserPath, languageOptions,@@ -87,4 +69,2 @@ this.sourceCode = sourceCode;- this.parserOptions = parserOptions;- this.parserPath = parserPath; this.languageOptions = languageOptions;@@ -93,38 +73,2 @@ Object.freeze(this);- }-- /**- * Gets the current working directory.- * @returns {string} The current working directory.- * @deprecated Use `cwd` instead.- */- getCwd() {- return this.cwd;- }-- /**- * Gets the filename of the file being linted.- * @returns {string} The filename of the file being linted.- * @deprecated Use `filename` instead.- */- getFilename() {- return this.filename;- }-- /**- * Gets the physical filename of the file being linted.- * @returns {string} The physical filename of the file being linted.- * @deprecated Use `physicalFilename` instead.- */- getPhysicalFilename() {- return this.physicalFilename;- }-- /**- * Gets the source code of the file being linted.- * @returns {SourceCode} The source code of the file being linted.- * @deprecated Use `sourceCode` instead.- */- getSourceCode() {- return this.sourceCode; }
--- +++ @@ -126,3 +126,2 @@ severity,- nodeType: null, };@@ -342,3 +341,2 @@ * @param {(0|1|2)} options.severity Rule severity- * @param {(ASTNode|null)} options.node Node * @param {string} options.message Error message@@ -364,3 +362,2 @@ column: options.loc.start.column + columnOffset,- nodeType: (options.node && options.node.type) || null, };@@ -550,3 +547,2 @@ severity,- node: descriptor.node, message: interpolate(computedMessage, descriptor.data),
eslint-config-prettier npm DELETION ×4BURST ×7
10.1.1
10.1.2
10.1.3
10.1.4
10.1.5
9.1.1
8.10.1
10.1.6
10.1.7
10.1.8
8.10.2
9.1.2
DELETION
9.1.1 published then removed
high · registry-verified · 2025-07-18 · 11mo ago
DELETION
8.10.1 published then removed
high · registry-verified · 2025-07-18 · 11mo ago
DELETION
10.1.6 published then removed
high · registry-verified · 2025-07-18 · 11mo ago
DELETION
10.1.7 published then removed
high · registry-verified · 2025-07-18 · 11mo ago
BURST
2 releases in 5m: 1.0.0, 1.0.1
info · registry-verified · 2017-01-29 · 9y ago
BURST
2 releases in 28m: 3.0.0, 3.0.1
info · registry-verified · 2018-08-13 · 7y ago
BURST
2 releases in 2m: 10.0.0, 10.0.1
info · registry-verified · 2025-01-13 · 1y ago
BURST
2 releases in 22m: 10.0.3, 10.1.0
info · registry-verified · 2025-03-07 · 1y ago
BURST
2 releases in 24m: 10.1.4, 10.1.5
info · registry-verified · 2025-05-09 · 1y ago
BURST
4 releases in 22m: 9.1.1, 8.10.1, 10.1.6, 10.1.7
info · registry-verified · 2025-07-18 · 11mo ago
BURST
3 releases in 39m: 10.1.8, 8.10.2, 9.1.2
info · registry-verified · 2025-07-18 · 11mo ago
release diff 8.10.2 → 9.1.2
+0 added · -0 removed · ~4 modified
--- +++ @@ -10,5 +10,17 @@ // with no local eslint-config-prettier installation.-const { ESLint } = require(require.resolve("eslint", {- paths: [process.cwd(), ...require.resolve.paths("eslint")],-}));+const localRequire = (request) =>+ require(+ require.resolve(request, {+ paths: [process.cwd(), ...require.resolve.paths("eslint")],+ })+ );++let experimentalApi = {};+try {+ experimentalApi = localRequire("eslint/use-at-your-own-risk");+ // eslint-disable-next-line unicorn/prefer-optional-catch-binding+} catch (_error) {}++const { ESLint, FlatESLint = experimentalApi.FlatESLint } =+ localRequire("eslint"); @@ -29,4 +41,23 @@ const eslint = new ESLint();-- Promise.all(args.map((file) => eslint.calculateConfigForFile(file)))+ const flatESLint = FlatESLint === undefined ? undefined : new FlatESLint();++ Promise.all(+ args.map((file) => {+ switch (process.env.ESLINT_USE_FLAT_CONFIG) {+ case "true": {+ return flatESLint.calculateConfigForFile(file);+ }+ case "false": {+ return eslint.calculateConfigForFile(file);+ }+ default: {+ // This turns synchronous errors (such as `.calculateConfigForFile` not existing)+ // and turns them into promise rejections.+ return Promise.resolve()+ .then(() => flatESLint.calculateConfigForFile(file))+ .catch(() => eslint.calculateConfigForFile(file));+ }+ }+ })+ ) .then((configs) => {
--- +++ @@ -50,2 +50,25 @@ + "unicorn/template-indent"({ options }) {+ if (options.length === 0) {+ return false;+ }++ const { comments = [], tags = [] } = options[0] || {};++ return (+ Array.isArray(comments) &&+ Array.isArray(tags) &&+ !(+ comments.includes("GraphQL") ||+ comments.includes("HTML") ||+ tags.includes("css") ||+ tags.includes("graphql") ||+ tags.includes("gql") ||+ tags.includes("html") ||+ tags.includes("markdown") ||+ tags.includes("md")+ )+ );+ },+ "vue/html-self-closing"({ options }) {
--- +++ @@ -3,2 +3,4 @@ const includeDeprecated = !process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED;++const specialRule = 0; @@ -7,78 +9,15 @@ // The following rules can be used in some cases. See the README for more- // information. (These are marked with `0` instead of `"off"` so that a- // script can distinguish them.)- "curly": 0,- "lines-around-comment": 0,- "max-len": 0,- "no-confusing-arrow": 0,- "no-mixed-operators": 0,- "no-tabs": 0,- "no-unexpected-multiline": 0,- "quotes": 0,- "@typescript-eslint/lines-around-comment": 0,- "@typescript-eslint/quotes": 0,- "babel/quotes": 0,- "vue/html-self-closing": 0,- "vue/max-len": 0,+ // information. These are marked with `0` instead of `"off"` so that a+ // script can distinguish them. Note that there are a few more of these+ // in the deprecated section below.+ "curly": specialRule,+ "no-unexpected-multiline": specialRule,+ "@typescript-eslint/lines-around-comment": specialRule,+ "@typescript-eslint/quotes": specialRule,+ "babel/quotes": specialRule,+ "unicorn/template-indent": specialRule,+ "vue/html-self-closing": specialRule,+ "vue/max-len": specialRule, // The rest are rules that you never need to enable when using Prettier.- "array-bracket-newline": "off",- "array-bracket-spacing": "off",- "array-element-newline": "off",- "arrow-parens": "off",- "arrow-spacing": "off",- "block-spacing": "off",- "brace-style": "off",- "comma-dangle": "off",- "comma-spacing": "off",- "comma-style": "off",- "computed-property-spacing": "off",- "dot-location": "off",- "eol-last": "off",- "func-call-spacing": "off",- "function-call-argument-newline": "off",- "function-paren-newline": "off",- "generator-star-spacing": "off",- "implicit-arrow-linebreak": "off",- "indent": "off",- "jsx-quotes": "off",- "key-spacing": "off",- "keyword-spacing": "off",- "linebreak-style": "off",- "max-statements-per-line": "off",- "multiline-ternary": "off",- "newline-per-chained-call": "off",- "new-parens": "off",- "no-extra-parens": "off",- "no-extra-semi": "off",- "no-floating-decimal": "off",- "no-mixed-spaces-and-tabs": "off",- "no-multi-spaces": "off",- "no-multiple-empty-lines": "off",- "no-trailing-spaces": "off",- "no-whitespace-before-property": "off",- "nonblock-statement-body-position": "off",- "object-curly-newline": "off",- "object-curly-spacing": "off",- "object-property-newline": "off",- "one-var-declaration-per-line": "off",- "operator-linebreak": "off",- "padded-blocks": "off",- "quote-props": "off",- "rest-spread-spacing": "off",- "semi": "off",- "semi-spacing": "off",- "semi-style": "off",- "space-before-blocks": "off",- "space-before-function-paren": "off",- "space-in-parens": "off",- "space-infix-ops": "off",- "space-unary-ops": "off",- "switch-colon-spacing": "off",- "template-curly-spacing": "off",- "template-tag-spacing": "off",- "unicode-bom": "off",- "wrap-iife": "off",- "wrap-regex": "off",- "yield-star-spacing": "off", "@babel/object-curly-spacing": "off",@@ -175,5 +114,28 @@ ...(includeDeprecated && {+ // Removed in version 0.10.0.+ // https://eslint.org/docs/latest/rules/space-unary-word-ops+ "space-unary-word-ops": "off",+ // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/generator-star+ // https://github.com/eslint/eslint/issues/1898 "generator-star": "off",+ "no-comma-dangle": "off",+ "no-reserved-keys": "off",+ "no-space-before-semi": "off",+ "no-wrap-func": "off",+ "space-after-function-name": "off",+ "space-before-function-parentheses": "off",+ "space-in-brackets": "off",++ // Removed in version 2.0.0.+ // https://github.com/eslint/eslint/issues/5032+ "no-arrow-condition": "off",+ "space-after-keywords": "off",+ "space-before-keywords": "off",+ "space-return-throw-case": "off",++ // Deprecated since version 3.3.0.+ // https://eslint.org/docs/rules/no-spaced-func+ "no-spaced-func": "off",+ // Deprecated since version 4.0.0.@@ -181,41 +143,70 @@ "indent-legacy": "off",- // Removed in version 2.0.0.- // https://eslint.org/docs/latest/rules/no-arrow-condition- "no-arrow-condition": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/no-comma-dangle- "no-comma-dangle": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/no-reserved-keys- "no-reserved-keys": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/no-space-before-semi- "no-space-before-semi": "off",- // Deprecated since version 3.3.0.- // https://eslint.org/docs/rules/no-spaced-func- "no-spaced-func": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/no-wrap-func- "no-wrap-func": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/space-after-function-name- "space-after-function-name": "off",- // Removed in version 2.0.0.- // https://eslint.org/docs/latest/rules/space-after-keywords- "space-after-keywords": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/space-before-function-parentheses- "space-before-function-parentheses": "off",- // Removed in version 2.0.0.- // https://eslint.org/docs/latest/rules/space-before-keywords- "space-before-keywords": "off",- // Removed in version 1.0.0.- // https://eslint.org/docs/latest/rules/space-in-brackets- "space-in-brackets": "off",- // Removed in version 2.0.0.- // https://eslint.org/docs/latest/rules/space-return-throw-case- "space-return-throw-case": "off",- // Removed in version 0.10.0.- // https://eslint.org/docs/latest/rules/space-unary-word-ops- "space-unary-word-ops": "off",++ // Deprecated since version 8.53.0.+ // https://eslint.org/blog/2023/10/deprecating-formatting-rules/+ "array-bracket-newline": "off",+ "array-bracket-spacing": "off",+ "array-element-newline": "off",+ "arrow-parens": "off",+ "arrow-spacing": "off",+ "block-spacing": "off",+ "brace-style": "off",+ "comma-dangle": "off",+ "comma-spacing": "off",+ "comma-style": "off",+ "computed-property-spacing": "off",+ "dot-location": "off",+ "eol-last": "off",+ "func-call-spacing": "off",+ "function-call-argument-newline": "off",+ "function-paren-newline": "off",+ "generator-star-spacing": "off",+ "implicit-arrow-linebreak": "off",+ "indent": "off",+ "jsx-quotes": "off",+ "key-spacing": "off",+ "keyword-spacing": "off",+ "linebreak-style": "off",+ "lines-around-comment": specialRule,+ "max-len": specialRule,+ "max-statements-per-line": "off",+ "multiline-ternary": "off",+ "new-parens": "off",+ "newline-per-chained-call": "off",+ "no-confusing-arrow": specialRule,+ "no-extra-parens": "off",+ "no-extra-semi": "off",+ "no-floating-decimal": "off",+ "no-mixed-operators": specialRule,+ "no-mixed-spaces-and-tabs": "off",+ "no-multi-spaces": "off",+ "no-multiple-empty-lines": "off",+ "no-tabs": specialRule,+ "no-trailing-spaces": "off",+ "no-whitespace-before-property": "off",+ "nonblock-statement-body-position": "off",+ "object-curly-newline": "off",+ "object-curly-spacing": "off",+ "object-property-newline": "off",+ "one-var-declaration-per-line": "off",+ "operator-linebreak": "off",+ "padded-blocks": "off",+ "quote-props": "off",+ "quotes": specialRule,+ "rest-spread-spacing": "off",+ "semi": "off",+ "semi-spacing": "off",+ "semi-style": "off",+ "space-before-blocks": "off",+ "space-before-function-paren": "off",+ "space-in-parens": "off",+ "space-infix-ops": "off",+ "space-unary-ops": "off",+ "switch-colon-spacing": "off",+ "template-curly-spacing": "off",+ "template-tag-spacing": "off",+ "wrap-iife": "off",+ "wrap-regex": "off",+ "yield-star-spacing": "off",+ // Deprecated since version 7.0.0.
--- +++ @@ -2,3 +2,3 @@ "name": "eslint-config-prettier",- "version": "8.10.2",+ "version": "9.1.2", "license": "MIT",
eslint-plugin-import npm critical-tier DELETION ×4BURST ×6
2.27.1
2.27.2
2.27.3
2.27.4
2.27.5
2.28.0
2.28.1
2.29.0
2.29.1
2.30.0
2.31.0
2.32.0
DELETION
0.7.6 published then removed
high · registry-verified · 2015-07-29 · 10y ago
DELETION
0.12.2 published then removed
high · registry-verified · 2016-02-08 · 10y ago
DELETION
1.10.1 published then removed
high · registry-verified · 2016-07-03 · 10y ago
DELETION
2.4.0 published then removed
high · registry-verified · 2017-06-02 · 9y ago
BURST
2 releases in 28m: 0.3.4, 0.3.5
info · registry-verified · 2015-03-24 · 11y ago
BURST
3 releases in 27m: 0.3.8, 0.3.9, 0.3.10
info · registry-verified · 2015-03-25 · 11y ago
BURST
2 releases in 31m: 0.7.6, 0.7.7
info · registry-verified · 2015-07-29 · 10y ago
BURST
2 releases in 3m: 2.25.0, 2.25.1
info · registry-verified · 2021-10-12 · 4y ago
BURST
2 releases in 9m: 2.27.1, 2.27.2
info · registry-verified · 2023-01-12 · 3y ago
BURST
2 releases in 3m: 2.27.3, 2.27.4
info · registry-verified · 2023-01-12 · 3y ago
release diff 2.31.0 → 2.32.0
+3 added · -1 removed · ~12 modified
--- +++ @@ -16,3 +16,2 @@ -var _fsWalk = require('../core/fsWalk'); var _builder = require('../exportMap/builder');var _builder2 = _interopRequireDefault(_builder);@@ -53,3 +52,3 @@ /**- *+ * Given a FileEnumerator class, instantiate and load the list of files. * @param FileEnumerator the `FileEnumerator` class from `eslint`'s internal api@@ -60,3 +59,21 @@ function listFilesUsingFileEnumerator(FileEnumerator, src, extensions) {- var e = new FileEnumerator({+ // We need to know whether this is being run with flat config in order to+ // determine how to report errors if FileEnumerator throws due to a lack of eslintrc.+ var+ ESLINT_USE_FLAT_CONFIG = process.env.ESLINT_USE_FLAT_CONFIG;++ // This condition is sufficient to test in v8, since the environment variable is necessary to turn on flat config+ var isUsingFlatConfig = ESLINT_USE_FLAT_CONFIG && process.env.ESLINT_USE_FLAT_CONFIG !== 'false';++ // In the case of using v9, we can check the `shouldUseFlatConfig` function+ // If this function is present, then we assume it's v9+ try {var _require3 =+ require('eslint/use-at-your-own-risk'),shouldUseFlatConfig = _require3.shouldUseFlatConfig;+ isUsingFlatConfig = shouldUseFlatConfig && ESLINT_USE_FLAT_CONFIG !== 'false';+ } catch (_) {+ // We don't want to throw here, since we only want to update the+ // boolean if the function is available.+ }++ var enumerator = new FileEnumerator({ extensions: extensions });@@ -64,6 +81,29 @@ - return Array.from(- e.iterateFiles(src),- function (_ref) {var filePath = _ref.filePath,ignored = _ref.ignored;return { filename: filePath, ignored: ignored };});-+ try {+ return Array.from(+ enumerator.iterateFiles(src),+ function (_ref) {var filePath = _ref.filePath,ignored = _ref.ignored;return { filename: filePath, ignored: ignored };});++ } catch (e) {+ // If we're using flat config, and FileEnumerator throws due to a lack of eslintrc,+ // then we want to throw an error so that the user knows about this rule's reliance on+ // the legacy config.+ if (+ isUsingFlatConfig &&+ e.message.includes('No ESLint configuration found'))+ {+ throw new Error('\nDue to the exclusion of certain internal ESLint APIs when using flat config,\nthe import/no-unused-modules rule requires an .eslintrc file to know which\nfiles to ignore (even when using flat config).\nThe .eslintrc file only needs to contain "ignorePatterns", or can be empty if\nyou do not want to ignore any files.\n\nSee https://github.com/import-js/eslint-plugin-import/issues/3079\nfor additional context.\n');++++++++++ }+ // If this isn't the case, then we'll just let the error bubble up+ throw e;+ } }@@ -80,3 +120,3 @@ // eslint/lib/util/glob-util has been moved to eslint/lib/util/glob-utils with version 5.3- var _require3 = require('eslint/lib/util/glob-utils'),originalListFilesToProcess = _require3.listFilesToProcess;+ var _require4 = require('eslint/lib/util/glob-utils'),originalListFilesToProcess = _require4.listFilesToProcess; // Prevent passing invalid options (extensions array) to old versions of the function.@@ -95,5 +135,5 @@ // Last place to try (pre v5.3)- var _require4 =-- require('eslint/lib/util/glob-util'),_originalListFilesToProcess = _require4.listFilesToProcess;+ var _require5 =++ require('eslint/lib/util/glob-util'),_originalListFilesToProcess = _require5.listFilesToProcess; var patterns = src.concat(@@ -107,45 +147,2 @@ }-}--/**- * Given a source root and list of supported extensions, use fsWalk and the- * new `eslint` `context.session` api to build the list of files we want to operate on- * @param {string[]} srcPaths array of source paths (for flat config this should just be a singular root (e.g. cwd))- * @param {string[]} extensions list of supported extensions- * @param {{ isDirectoryIgnored: (path: string) => boolean, isFileIgnored: (path: string) => boolean }} session eslint context session object- * @returns {string[]} list of files to operate on- */-function listFilesWithModernApi(srcPaths, extensions, session) {- /** @type {string[]} */- var files = [];var _loop = function _loop(-- i) {- var src = srcPaths[i];- // Use walkSync along with the new session api to gather the list of files- var entries = (0, _fsWalk.walkSync)(src, {- deepFilter: function () {function deepFilter(entry) {- var fullEntryPath = (0, _path.resolve)(src, entry.path);-- // Include the directory if it's not marked as ignore by eslint- return !session.isDirectoryIgnored(fullEntryPath);- }return deepFilter;}(),- entryFilter: function () {function entryFilter(entry) {- var fullEntryPath = (0, _path.resolve)(src, entry.path);-- // Include the file if it's not marked as ignore by eslint and its extension is included in our list- return (- !session.isFileIgnored(fullEntryPath) &&- extensions.find(function (extension) {return entry.path.endsWith(extension);}));-- }return entryFilter;}() });--- // Filter out directories and map entries to their paths- files.push.apply(files, _toConsumableArray(- entries.- filter(function (entry) {return !entry.dirent.isDirectory();}).- map(function (entry) {return entry.path;})));};for (var i = 0; i < srcPaths.length; i++) {_loop(i);-- }- return files; }@@ -157,18 +154,5 @@ * @param {string[]} extensions - list of supported file extensions- * @param {import('eslint').Rule.RuleContext} context - the eslint context object * @returns {string[] | { filename: string, ignored: boolean }[]} the list of files that this rule will evaluate. */-function listFilesToProcess(src, extensions, context) {- // If the context object has the new session functions, then prefer those- // Otherwise, fallback to using the deprecated `FileEnumerator` for legacy support.- // https://github.com/eslint/eslint/issues/18087- if (- context.session &&- context.session.isFileIgnored &&- context.session.isDirectoryIgnored)- {- return listFilesWithModernApi(src, extensions, context.session);- }-- // Fallback to og FileEnumerator+function listFilesToProcess(src, extensions) { var FileEnumerator = requireFileEnumerator();@@ -297,6 +281,6 @@ - var srcFileList = listFilesToProcess(src, extensions, context);+ var srcFileList = listFilesToProcess(src, extensions); // prepare list of ignored files- var ignoredFilesList = listFilesToProcess(ignoreExports, extensions, context);+ var ignoredFilesList = listFilesToProcess(ignoreExports, extensions); @@ -1087,2 +1071,2 @@ }return create;}() };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlRmlsZUVudW1lcmF0b3IiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJlIiwiY29kZSIsImxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IiLCJzcmMiLCJleHRlbnNpb25zIiwiQXJyYXkiLCJmcm9tIiwiaXRlcmF0ZUZpbGVzIiwiZmlsZVBhdGgiLCJpZ25vcmVkIiwiZmlsZW5hbWUiLCJsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zIiwib3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MiLCJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJwYXR0ZXJucyIsImNvbmNhdCIsInBhdHRlcm4iLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0IiwibGlzdEZpbGVzV2l0aE1vZGVybkFwaSIsInNyY1BhdGhzIiwic2Vzc2lvbiIsImZpbGVzIiwiaSIsImVudHJpZXMiLCJkZWVwRmlsdGVyIiwiZW50cnkiLCJmdWxsRW50cnlQYXRoIiwicGF0aCIsImlzRGlyZWN0b3J5SWdub3JlZCIsImVudHJ5RmlsdGVyIiwiaXNGaWxlSWdub3JlZCIsImZpbmQiLCJlbmRzV2l0aCIsInB1c2giLCJmaWx0ZXIiLCJkaXJlbnQiLCJpc0RpcmVjdG9yeSIsImxlbmd0aCIsImNvbnRleHQiLCJFWFBPUlRfREVGQVVMVF9ERUNMQVJBVElPTiIsIkVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTiIsIkVYUE9SVF9BTExfREVDTEFSQVRJT04iLCJJTVBPUlRfREVDTEFSQVRJT04iLCJJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiIsIklNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiIsIlZBUklBQkxFX0RFQ0xBUkFUSU9OIiwiRlVOQ1RJT05fREVDTEFSQVRJT04iLCJDTEFTU19ERUNMQVJBVElPTiIsIklERU5USUZJRVIiLCJPQkpFQ1RfUEFUVEVSTiIsIkFSUkFZX1BBVFRFUk4iLCJUU19JTlRFUkZBQ0VfREVDTEFSQVRJT04iLCJUU19UWVBFX0FMSUFTX0RFQ0xBUkFUSU9OIiwiVFNfRU5VTV9ERUNMQVJBVElPTiIsIkRFRkFVTFQiLCJmb3JFYWNoRGVjbGFyYXRpb25JZGVudGlmaWVyIiwiZGVjbGFyYXRpb24iLCJjYiIsImlzVHlwZURlY2xhcmF0aW9uIiwidHlwZSIsImlkIiwibmFtZSIsImRlY2xhcmF0aW9ucyIsImZvckVhY2giLCJlbGVtZW50cyIsImltcG9ydExpc3QiLCJNYXAiLCJleHBvcnRMaXN0IiwidmlzaXRvcktleU1hcCIsImlnbm9yZWRGaWxlcyIsIlNldCIsImZpbGVzT3V0c2lkZVNyYyIsImlzTm9kZU1vZHVsZSIsInJlc29sdmVGaWxlcyIsImlnbm9yZUV4cG9ydHMiLCJzZXR0aW5ncyIsInNyY0ZpbGVMaXN0IiwiaWdub3JlZEZpbGVzTGlzdCIsImFkZCIsInJlc29sdmVkRmlsZXMiLCJwcmVwYXJlSW1wb3J0c0FuZEV4cG9ydHMiLCJzcmNGaWxlcyIsImV4cG9ydEFsbCIsImZpbGUiLCJleHBvcnRzIiwiaW1wb3J0cyIsImN1cnJlbnRFeHBvcnRzIiwiRXhwb3J0TWFwQnVpbGRlciIsImdldCIsImRlcGVuZGVuY2llcyIsInJlZXhwb3J0cyIsImxvY2FsSW1wb3J0TGlzdCIsIm5hbWVzcGFjZSIsInZpc2l0b3JLZXlzIiwic2V0IiwiY3VycmVudEV4cG9ydEFsbCIsImdldERlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwidmFsdWUiLCJrZXkiLCJ3aGVyZVVzZWQiLCJyZWV4cG9ydCIsImdldEltcG9ydCIsImxvY2FsSW1wb3J0IiwiY3VycmVudFZhbHVlIiwibG9jYWwiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJzcGVjaWZpZXIiLCJoYXMiLCJ2YWwiLCJjdXJyZW50RXhwb3J0IiwiZGV0ZXJtaW5lVXNhZ2UiLCJsaXN0VmFsdWUiLCJsaXN0S2V5IiwiY3VycmVudEltcG9ydCIsImV4cG9ydFN0YXRlbWVudCIsImdldFNyYyIsInByb2Nlc3MiLCJjd2QiLCJsYXN0UHJlcGFyZUtleSIsImRvUHJlcGFyYXRpb24iLCJwcmVwYXJlS2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsInNvcnQiLCJjbGVhciIsIm5ld05hbWVzcGFjZUltcG9ydEV4aXN0cyIsInNwZWNpZmllcnMiLCJzb21lIiwibmV3RGVmYXVsdEltcG9ydEV4aXN0cyIsImZpbGVJc0luUGtnIiwicGtnIiwiYmFzZVBhdGgiLCJjaGVja1BrZ0ZpZWxkU3RyaW5nIiwicGtnRmllbGQiLCJjaGVja1BrZ0ZpZWxkT2JqZWN0IiwicGtnRmllbGRGaWxlcyIsImNoZWNrUGtnRmllbGQiLCJiaW4iLCJicm93c2VyIiwibWFpbiIsIm1vZHVsZSIsIm1ldGEiLCJkb2NzIiwiY2F0ZWdvcnkiLCJkZXNjcmlwdGlvbiIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwibWluTGVuZ3RoIiwibWlzc2luZ0V4cG9ydHMiLCJ1bnVzZWRFeHBvcnRzIiwiaWdub3JlVW51c2VkVHlwZUV4cG9ydHMiLCJhbnlPZiIsIm1pbkl0ZW1zIiwicmVxdWlyZWQiLCJjcmVhdGUiLCJvcHRpb25zIiwiY2hlY2tFeHBvcnRQcmVzZW5jZSIsIm5vZGUiLCJleHBvcnRDb3VudCIsIm5hbWVzcGFjZUltcG9ydHMiLCJzaXplIiwicmVwb3J0IiwiYm9keSIsImNoZWNrVXNhZ2UiLCJleHBvcnRlZFZhbHVlIiwiaXNUeXBlRXhwb3J0IiwiY29uc29sZSIsImVycm9yIiwiZXhwb3J0c0tleSIsInVwZGF0ZUV4cG9ydFVzYWdlIiwibmV3RXhwb3J0cyIsIm5ld0V4cG9ydElkZW50aWZpZXJzIiwiZXhwb3J0ZWQiLCJ1cGRhdGVJbXBvcnRVc2FnZSIsIm9sZEltcG9ydFBhdGhzIiwib2xkTmFtZXNwYWNlSW1wb3J0cyIsIm5ld05hbWVzcGFjZUltcG9ydHMiLCJvbGRFeHBvcnRBbGwiLCJuZXdFeHBvcnRBbGwiLCJvbGREZWZhdWx0SW1wb3J0cyIsIm5ld0RlZmF1bHRJbXBvcnRzIiwib2xkSW1wb3J0cyIsIm5ld0ltcG9ydHMiLCJwcm9jZXNzRHluYW1pY0ltcG9ydCIsInNvdXJjZSIsInAiLCJJbXBvcnRFeHByZXNzaW9uIiwiY2hpbGQiLCJDYWxsRXhwcmVzc2lvbiIsImNhbGxlZSIsImFyZ3VtZW50cyIsImFzdE5vZGUiLCJyZXNvbHZlZFBhdGgiLCJyYXciLCJyZXBsYWNlIiwiaW1wb3J0ZWQiLCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFNQTtBQUNBO0FBQ0Esc0Q7QUFDQSxrRDtBQUNBO0FBQ0EsMkQ7QUFDQSx1QztBQUNBLCtDO0FBQ0EseUQ7O0FBRUE7QUFDQSwrQztBQUNBLDZEO0FBQ0EscUMsMlVBbkJBOzs7O29YQXFCQTs7Ozs7dVhBTUEsU0FBU0EscUJBQVQsR0FBaUMsQ0FDL0IsSUFBSUMsdUJBQUo7O0FBRUE7QUFDQSxNQUFJO0FBQ29CQyxZQUFRLDZCQUFSLENBRHBCLENBQ0NELGNBREQsWUFDQ0EsY0FERDtBQUVILEdBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJO0FBQ29CRCxjQUFRLHVDQUFSLENBRHBCLENBQ0NELGNBREQsYUFDQ0EsY0FERDtBQUVILEtBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFVBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxjQUFNRCxDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsU0FBT0YsY0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT0EsU0FBU0ksNEJBQVQsQ0FBc0NKLGNBQXRDLEVBQXNESyxHQUF0RCxFQUEyREMsVUFBM0QsRUFBdUU7QUFDckUsTUFBTUosSUFBSSxJQUFJRixjQUFKLENBQW1CO0FBQzNCTSwwQkFEMkIsRUFBbkIsQ0FBVjs7O0FBSUEsU0FBT0MsTUFBTUMsSUFBTjtBQUNMTixJQUFFTyxZQUFGLENBQWVKLEdBQWYsQ0FESztBQUVMLHVCQUFHSyxRQUFILFFBQUdBLFFBQUgsQ0FBYUMsT0FBYixRQUFhQSxPQUFiLFFBQTRCLEVBQUVDLFVBQVVGLFFBQVosRUFBc0JDLGdCQUF0QixFQUE1QixFQUZLLENBQVA7O0FBSUQ7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSw0QkFBVCxDQUFzQ1IsR0FBdEMsRUFBMkNDLFVBQTNDLEVBQXVEO0FBQ3JELE1BQUk7QUFDRjtBQURFLG9CQUV5REwsUUFBUSw0QkFBUixDQUZ6RCxDQUUwQmEsMEJBRjFCLGFBRU1DLGtCQUZOO0FBR0Y7QUFDQTtBQUNBOztBQUVBLFdBQU9ELDJCQUEyQlQsR0FBM0IsRUFBZ0M7QUFDckNDLDRCQURxQyxFQUFoQyxDQUFQOztBQUdELEdBVkQsQ0FVRSxPQUFPSixDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFOVTs7QUFTTkQsWUFBUSwyQkFBUixDQVRNLENBUVlhLDJCQVJaLGFBUVJDLGtCQVJRO0FBVVYsUUFBTUMsV0FBV1gsSUFBSVksTUFBSjtBQUNmO0FBQ0VaLE9BREY7QUFFRSxjQUFDYSxPQUFELFVBQWFaLFdBQVdhLEdBQVgsQ0FBZSxVQUFDQyxTQUFELFVBQWdCLFlBQUQsQ0FBY0MsSUFBZCxDQUFtQkgsT0FBbkIsSUFBOEJBLE9BQTlCLFVBQTJDQSxPQUEzQyxxQkFBMERFLFNBQTFELENBQWYsR0FBZixDQUFiLEVBRkYsQ0FEZSxDQUFqQjs7OztBQU9BLFdBQU9OLDRCQUEyQkUsUUFBM0IsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU00sc0JBQVQsQ0FBZ0NDLFFBQWhDLEVBQTBDakIsVUFBMUMsRUFBc0RrQixPQUF0RCxFQUErRDtBQUM3RDtBQUNBLE1BQU1DLFFBQVEsRUFBZCxDQUY2RDs7QUFJcERDLEdBSm9EO0FBSzNELFFBQU1yQixNQUFNa0IsU0FBU0csQ0FBVCxDQUFaO0FBQ0E7QUFDQSxRQUFNQyxVQUFVLHNCQUFTdEIsR0FBVCxFQUFjO0FBQzVCdUIsZ0JBRDRCLG1DQUNqQkMsS0FEaUIsRUFDVjtBQUNoQixjQUFNQyxnQkFBZ0IsbUJBQVl6QixHQUFaLEVBQWlCd0IsTUFBTUUsSUFBdkIsQ0FBdEI7O0FBRUE7QUFDQSxpQkFBTyxDQUFDUCxRQUFRUSxrQkFBUixDQUEyQkYsYUFBM0IsQ0FBUjtBQUNELFNBTjJCO0FBTzVCRyxpQkFQNEIsb0NBT2hCSixLQVBnQixFQU9UO0FBQ2pCLGNBQU1DLGdCQUFnQixtQkFBWXpCLEdBQVosRUFBaUJ3QixNQUFNRSxJQUF2QixDQUF0Qjs7QUFFQTtBQUNBO0FBQ0UsYUFBQ1AsUUFBUVUsYUFBUixDQUFzQkosYUFBdEIsQ0FBRDtBQUNHeEIsdUJBQVc2QixJQUFYLENBQWdCLFVBQUNmLFNBQUQsVUFBZVMsTUFBTUUsSUFBTixDQUFXSyxRQUFYLENBQW9CaEIsU0FBcEIsQ0FBZixFQUFoQixDQUZMOztBQUlELFNBZjJCLHdCQUFkLENBQWhCOzs7QUFrQkE7QUFDQUssVUFBTVksSUFBTjtBQUNLVjtBQUNBVyxVQURBLENBQ08sVUFBQ1QsS0FBRCxVQUFXLENBQUNBLE1BQU1VLE1BQU4sQ0FBYUMsV0FBYixFQUFaLEVBRFA7QUFFQXJCLE9BRkEsQ0FFSSxVQUFDVSxLQUFELFVBQVdBLE1BQU1FLElBQWpCLEVBRkosQ0FETCxHQTFCMkQsRUFJN0QsS0FBSyxJQUFJTCxJQUFJLENBQWIsRUFBZ0JBLElBQUlILFNBQVNrQixNQUE3QixFQUFxQ2YsR0FBckMsRUFBMEMsT0FBakNBLENBQWlDOztBQTJCekM7QUFDRCxTQUFPRCxLQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU1Ysa0JBQVQsQ0FBNEJWLEdBQTVCLEVBQWlDQyxVQUFqQyxFQUE2Q29DLE9BQTdDLEVBQXNEO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0VBLFVBQVFsQixPQUFSO0FBQ0drQixVQUFRbEIsT0FBUixDQUFnQlUsYUFEbkI7QUFFR1EsVUFBUWxCLE9BQVIsQ0FBZ0JRLGtCQUhyQjtBQUlFO0FBQ0EsV0FBT1YsdUJBQXVCakIsR0FBdkIsRUFBNEJDLFVBQTVCLEVBQXdDb0MsUUFBUWxCLE9BQWhELENBQVA7QUFDRDs7QUFFRDtBQUNBLE1BQU14QixpQkFBaUJELHVCQUF2Qjs7QUFFQTtBQUNBLE1BQUlDLGNBQUosRUFBb0I7QUFDbEIsV0FBT0ksNkJBQTZCSixjQUE3QixFQUE2Q0ssR0FBN0MsRUFBa0RDLFVBQWxELENBQVA7QUFDRDtBQUNEO0FBQ0EsU0FBT08sNkJBQTZCUixHQUE3QixFQUFrQ0MsVUFBbEMsQ0FBUDtBQUNEOztBQUVELElBQU1xQyw2QkFBNkIsMEJBQW5DO0FBQ0EsSUFBTUMsMkJBQTJCLHdCQUFqQztBQUNBLElBQU1DLHlCQUF5QixzQkFBL0I7QUFDQSxJQUFNQyxxQkFBcUIsbUJBQTNCO0FBQ0EsSUFBTUMsNkJBQTZCLDBCQUFuQztBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyx1QkFBdUIscUJBQTdCO0FBQ0EsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLG9CQUFvQixrQkFBMUI7QUFDQSxJQUFNQyxhQUFhLFlBQW5CO0FBQ0EsSUFBTUMsaUJBQWlCLGVBQXZCO0FBQ0EsSUFBTUMsZ0JBQWdCLGNBQXRCO0FBQ0EsSUFBTUMsMkJBQTJCLHdCQUFqQztBQUNBLElBQU1DLDRCQUE0Qix3QkFBbEM7QUFDQSxJQUFNQyxzQkFBc0IsbUJBQTVCO0FBQ0EsSUFBTUMsVUFBVSxTQUFoQjs7QUFFQSxTQUFTQyw0QkFBVCxDQUFzQ0MsV0FBdEMsRUFBbURDLEVBQW5ELEVBQXVEO0FBQ3JELE1BQUlELFdBQUosRUFBaUI7QUFDZixRQUFNRSxvQkFBb0JGLFlBQVlHLElBQVosS0FBcUJSLHdCQUFyQjtBQUNyQkssZ0JBQVlHLElBQVosS0FBcUJQLHlCQURBO0FBRXJCSSxnQkFBWUcsSUFBWixLQUFxQk4sbUJBRjFCOztBQUlBO0FBQ0VHLGdCQUFZRyxJQUFaLEtBQXFCYixvQkFBckI7QUFDR1UsZ0JBQVlHLElBQVosS0FBcUJaLGlCQUR4QjtBQUVHVyxxQkFITDtBQUlFO0FBQ0FELFNBQUdELFlBQVlJLEVBQVosQ0FBZUMsSUFBbEIsRUFBd0JILGlCQUF4QjtBQUNELEtBTkQsTUFNTyxJQUFJRixZQUFZRyxJQUFaLEtBQXFCZCxvQkFBekIsRUFBK0M7QUFDcERXLGtCQUFZTSxZQUFaLENBQXlCQyxPQUF6QixDQUFpQyxpQkFBWSxLQUFUSCxFQUFTLFNBQVRBLEVBQVM7QUFDM0MsWUFBSUEsR0FBR0QsSUFBSCxLQUFZVixjQUFoQixFQUFnQztBQUM5QiwyQ0FBd0JXLEVBQXhCLEVBQTRCLFVBQUM5QyxPQUFELEVBQWE7QUFDdkMsZ0JBQUlBLFFBQVE2QyxJQUFSLEtBQWlCWCxVQUFyQixFQUFpQztBQUMvQlMsaUJBQUczQyxRQUFRK0MsSUFBWCxFQUFpQixLQUFqQjtBQUNEO0FBQ0YsV0FKRDtBQUtELFNBTkQsTUFNTyxJQUFJRCxHQUFHRCxJQUFILEtBQVlULGFBQWhCLEVBQStCO0FBQ3BDVSxhQUFHSSxRQUFILENBQVlELE9BQVosQ0FBb0IsaUJBQWMsS0FBWEYsSUFBVyxTQUFYQSxJQUFXO0FBQ2hDSixlQUFHSSxJQUFILEVBQVMsS0FBVDtBQUNELFdBRkQ7QUFHRCxTQUpNLE1BSUE7QUFDTEosYUFBR0csR0FBR0MsSUFBTixFQUFZLEtBQVo7QUFDRDtBQUNGLE9BZEQ7QUFlRDtBQUNGO0FBQ0Y7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsSUFBTUksYUFBYSxJQUFJQyxHQUFKLEVBQW5COztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLElBQU1DLGFBQWEsSUFBSUQsR0FBSixFQUFuQjs7QUFFQSxJQUFNRSxnQkFBZ0IsSUFBSUYsR0FBSixFQUF0Qjs7QUFFQTtBQUNBLElBQU1HLGVBQWUsSUFBSUMsR0FBSixFQUFyQjtBQUNBLElBQU1DLGtCQUFrQixJQUFJRCxHQUFKLEVBQXhCOztBQUVBLElBQU1FLGVBQWUsU0FBZkEsWUFBZSxDQUFDN0MsSUFBRCxVQUFXLHFCQUFELENBQXVCVixJQUF2QixDQUE0QlUsSUFBNUIsQ0FBVixHQUFyQjs7QUFFQTs7Ozs7O0FBTUEsU0FBUzhDLFlBQVQsQ0FBc0J4RSxHQUF0QixFQUEyQnlFLGFBQTNCLEVBQTBDcEMsT0FBMUMsRUFBbUQ7QUFDakQsTUFBTXBDLGFBQWFDLE1BQU1DLElBQU4sQ0FBVywrQkFBa0JrQyxRQUFRcUMsUUFBMUIsQ0FBWCxDQUFuQjs7QUFFQSxNQUFNQyxjQUFjakUsbUJBQW1CVixHQUFuQixFQUF3QkMsVUFBeEIsRUFBb0NvQyxPQUFwQyxDQUFwQjs7QUFFQTtBQUNBLE1BQU11QyxtQkFBbUJsRSxtQkFBbUIrRCxhQUFuQixFQUFrQ3hFLFVBQWxDLEVBQThDb0MsT0FBOUMsQ0FBekI7O0FBRUE7QUFDQSxNQUFJdUMsaUJBQWlCeEMsTUFBakIsSUFBMkIsT0FBT3dDLGlCQUFpQixDQUFqQixDQUFQLEtBQStCLFFBQTlELEVBQXdFO0FBQ3RFQSxxQkFBaUJkLE9BQWpCLENBQXlCLFVBQUN2RCxRQUFELFVBQWM2RCxhQUFhUyxHQUFiLENBQWlCdEUsUUFBakIsQ0FBZCxFQUF6QjtBQUNELEdBRkQsTUFFTztBQUNMcUUscUJBQWlCZCxPQUFqQixDQUF5QixzQkFBR3ZELFFBQUgsU0FBR0EsUUFBSCxRQUFrQjZELGFBQWFTLEdBQWIsQ0FBaUJ0RSxRQUFqQixDQUFsQixFQUF6QjtBQUNEOztBQUVEO0FBQ0EsTUFBTXVFLGdCQUFnQkgsWUFBWXZDLE1BQVosSUFBc0IsT0FBT3VDLFlBQVksQ0FBWixDQUFQLEtBQTBCLFFBQWhEO0FBQ2xCQSxjQUFZMUMsTUFBWixDQUFtQixVQUFDNUIsUUFBRCxVQUFjLENBQUNrRSxhQUFhbEUsUUFBYixDQUFmLEVBQW5CLENBRGtCO0FBRWxCLG1DQUFRc0UsV0FBUixFQUFxQixzQkFBR3BFLFFBQUgsU0FBR0EsUUFBSCxRQUFrQmdFLGFBQWFoRSxRQUFiLElBQXlCLEVBQXpCLEdBQThCQSxRQUFoRCxFQUFyQixDQUZKOztBQUlBLFNBQU8sSUFBSThELEdBQUosQ0FBUVMsYUFBUixDQUFQO0FBQ0Q7O0FBRUQ7OztBQUdBLElBQU1DLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFFBQUQsRUFBVzNDLE9BQVgsRUFBdUI7QUFDdEQsTUFBTTRDLFlBQVksSUFBSWhCLEdBQUosRUFBbEI7QUFDQWUsV0FBU2xCLE9BQVQsQ0FBaUIsVUFBQ29CLElBQUQsRUFBVTtBQUN6QixRQUFNQyxVQUFVLElBQUlsQixHQUFKLEVBQWhCO0FBQ0EsUUFBTW1CLFVBQVUsSUFBSW5CLEdBQUosRUFBaEI7QUFDQSxRQUFNb0IsaUJBQWlCQyxxQkFBaUJDLEdBQWpCLENBQXFCTCxJQUFyQixFQUEyQjdDLE9BQTNCLENBQXZCO0FBQ0EsUUFBSWdELGNBQUosRUFBb0I7O0FBRWhCRyxrQkFGZ0I7Ozs7O0FBT2RILG9CQVBjLENBRWhCRyxZQUZnQixDQUdoQkMsU0FIZ0IsR0FPZEosY0FQYyxDQUdoQkksU0FIZ0IsQ0FJUEMsZUFKTyxHQU9kTCxjQVBjLENBSWhCRCxPQUpnQixDQUtoQk8sU0FMZ0IsR0FPZE4sY0FQYyxDQUtoQk0sU0FMZ0IsQ0FNaEJDLFdBTmdCLEdBT2RQLGNBUGMsQ0FNaEJPLFdBTmdCOztBQVNsQnpCLG9CQUFjMEIsR0FBZCxDQUFrQlgsSUFBbEIsRUFBd0JVLFdBQXhCO0FBQ0E7QUFDQSxVQUFNRSxtQkFBbUIsSUFBSXpCLEdBQUosRUFBekI7QUFDQW1CLG1CQUFhMUIsT0FBYixDQUFxQixVQUFDaUMsYUFBRCxFQUFtQjtBQUN0QyxZQUFNQyxhQUFhRCxlQUFuQjtBQUNBLFlBQUlDLGVBQWUsSUFBbkIsRUFBeUI7QUFDdkI7QUFDRDs7QUFFREYseUJBQWlCakIsR0FBakIsQ0FBcUJtQixXQUFXdEUsSUFBaEM7QUFDRCxPQVBEO0FBUUF1RCxnQkFBVVksR0FBVixDQUFjWCxJQUFkLEVBQW9CWSxnQkFBcEI7O0FBRUFMLGdCQUFVM0IsT0FBVixDQUFrQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFlBQUlBLFFBQVE3QyxPQUFaLEVBQXFCO0FBQ25COEIsa0JBQVFVLEdBQVIsQ0FBWWxELHdCQUFaLEVBQXNDLEVBQUV3RCxXQUFXLElBQUk5QixHQUFKLEVBQWIsRUFBdEM7QUFDRCxTQUZELE1BRU87QUFDTGMsa0JBQVFVLEdBQVIsQ0FBWUssR0FBWixFQUFpQixFQUFFQyxXQUFXLElBQUk5QixHQUFKLEVBQWIsRUFBakI7QUFDRDtBQUNELFlBQU0rQixXQUFXSCxNQUFNSSxTQUFOLEVBQWpCO0FBQ0EsWUFBSSxDQUFDRCxRQUFMLEVBQWU7QUFDYjtBQUNEO0FBQ0QsWUFBSUUsY0FBY2xCLFFBQVFHLEdBQVIsQ0FBWWEsU0FBUzFFLElBQXJCLENBQWxCO0FBQ0EsWUFBSTZFLHFCQUFKO0FBQ0EsWUFBSU4sTUFBTU8sS0FBTixLQUFnQm5ELE9BQXBCLEVBQTZCO0FBQzNCa0QseUJBQWU1RCx3QkFBZjtBQUNELFNBRkQsTUFFTztBQUNMNEQseUJBQWVOLE1BQU1PLEtBQXJCO0FBQ0Q7QUFDRCxZQUFJLE9BQU9GLFdBQVAsS0FBdUIsV0FBM0IsRUFBd0M7QUFDdENBLHdCQUFjLElBQUlqQyxHQUFKLDhCQUFZaUMsV0FBWixJQUF5QkMsWUFBekIsR0FBZDtBQUNELFNBRkQsTUFFTztBQUNMRCx3QkFBYyxJQUFJakMsR0FBSixDQUFRLENBQUNrQyxZQUFELENBQVIsQ0FBZDtBQUNEO0FBQ0RuQixnQkFBUVMsR0FBUixDQUFZTyxTQUFTMUUsSUFBckIsRUFBMkI0RSxXQUEzQjtBQUNELE9BdkJEOztBQXlCQVosc0JBQWdCNUIsT0FBaEIsQ0FBd0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUN0QyxZQUFJM0IsYUFBYTJCLEdBQWIsQ0FBSixFQUF1QjtBQUNyQjtBQUNEO0FBQ0QsWUFBTUksY0FBY2xCLFFBQVFHLEdBQVIsQ0FBWVcsR0FBWixLQUFvQixJQUFJN0IsR0FBSixFQUF4QztBQUNBNEIsY0FBTXBDLFlBQU4sQ0FBbUJDLE9BQW5CLENBQTJCLGlCQUE0QixLQUF6QjJDLGtCQUF5QixTQUF6QkEsa0JBQXlCO0FBQ3JEQSw2QkFBbUIzQyxPQUFuQixDQUEyQixVQUFDNEMsU0FBRCxFQUFlO0FBQ3hDSix3QkFBWXpCLEdBQVosQ0FBZ0I2QixTQUFoQjtBQUNELFdBRkQ7QUFHRCxTQUpEO0FBS0F0QixnQkFBUVMsR0FBUixDQUFZSyxHQUFaLEVBQWlCSSxXQUFqQjtBQUNELE9BWEQ7QUFZQXRDLGlCQUFXNkIsR0FBWCxDQUFlWCxJQUFmLEVBQXFCRSxPQUFyQjs7QUFFQTtBQUNBLFVBQUloQixhQUFhdUMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDtBQUNEUyxnQkFBVTdCLE9BQVYsQ0FBa0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxZQUFJQSxRQUFRN0MsT0FBWixFQUFxQjtBQUNuQjhCLGtCQUFRVSxHQUFSLENBQVlsRCx3QkFBWixFQUFzQyxFQUFFd0QsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQXRDO0FBQ0QsU0FGRCxNQUVPO0FBQ0xjLGtCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQWpCO0FBQ0Q7QUFDRixPQU5EO0FBT0Q7QUFDRGMsWUFBUVUsR0FBUixDQUFZckQsc0JBQVosRUFBb0MsRUFBRTJELFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFwQztBQUNBYyxZQUFRVSxHQUFSLENBQVluRCwwQkFBWixFQUF3QyxFQUFFeUQsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQXhDO0FBQ0FILGVBQVcyQixHQUFYLENBQWVYLElBQWYsRUFBcUJDLE9BQXJCO0FBQ0QsR0FoRkQ7QUFpRkFGLFlBQVVuQixPQUFWLENBQWtCLFVBQUNtQyxLQUFELEVBQVFDLEdBQVIsRUFBZ0I7QUFDaENELFVBQU1uQyxPQUFOLENBQWMsVUFBQzhDLEdBQUQsRUFBUztBQUNyQixVQUFNdkIsaUJBQWlCbkIsV0FBV3FCLEdBQVgsQ0FBZXFCLEdBQWYsQ0FBdkI7QUFDQSxVQUFJdkIsY0FBSixFQUFvQjtBQUNsQixZQUFNd0IsZ0JBQWdCeEIsZUFBZUUsR0FBZixDQUFtQi9DLHNCQUFuQixDQUF0QjtBQUNBcUUsc0JBQWNWLFNBQWQsQ0FBd0J0QixHQUF4QixDQUE0QnFCLEdBQTVCO0FBQ0Q7QUFDRixLQU5EO0FBT0QsR0FSRDtBQVNELENBNUZEOztBQThGQTs7OztBQUlBLElBQU1ZLGlCQUFpQixTQUFqQkEsY0FBaUIsR0FBTTtBQUMzQjlDLGFBQVdGLE9BQVgsQ0FBbUIsVUFBQ2lELFNBQUQsRUFBWUMsT0FBWixFQUF3QjtBQUN6Q0QsY0FBVWpELE9BQVYsQ0FBa0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxVQUFNZixVQUFVakIsV0FBV3FCLEdBQVgsQ0FBZVcsR0FBZixDQUFoQjtBQUNBLFVBQUksT0FBT2YsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ2MsY0FBTW5DLE9BQU4sQ0FBYyxVQUFDbUQsYUFBRCxFQUFtQjtBQUMvQixjQUFJUCxrQkFBSjtBQUNBLGNBQUlPLGtCQUFrQnZFLDBCQUF0QixFQUFrRDtBQUNoRGdFLHdCQUFZaEUsMEJBQVo7QUFDRCxXQUZELE1BRU8sSUFBSXVFLGtCQUFrQnRFLHdCQUF0QixFQUFnRDtBQUNyRCtELHdCQUFZL0Qsd0JBQVo7QUFDRCxXQUZNLE1BRUE7QUFDTCtELHdCQUFZTyxhQUFaO0FBQ0Q7QUFDRCxjQUFJLE9BQU9QLFNBQVAsS0FBcUIsV0FBekIsRUFBc0M7QUFDcEMsZ0JBQU1RLGtCQUFrQi9CLFFBQVFJLEdBQVIsQ0FBWW1CLFNBQVosQ0FBeEI7QUFDQSxnQkFBSSxPQUFPUSxlQUFQLEtBQTJCLFdBQS9CLEVBQTRDO0FBQ2xDZix1QkFEa0MsR0FDcEJlLGVBRG9CLENBQ2xDZixTQURrQztBQUUxQ0Esd0JBQVV0QixHQUFWLENBQWNtQyxPQUFkO0FBQ0E3QixzQkFBUVUsR0FBUixDQUFZYSxTQUFaLEVBQXVCLEVBQUVQLG9CQUFGLEVBQXZCO0FBQ0Q7QUFDRjtBQUNGLFNBakJEO0FBa0JEO0FBQ0YsS0F0QkQ7QUF1QkQsR0F4QkQ7QUF5QkQsQ0ExQkQ7O0FBNEJBLElBQU1nQixTQUFTLFNBQVRBLE1BQVMsQ0FBQ25ILEdBQUQsRUFBUztBQUN0QixNQUFJQSxHQUFKLEVBQVM7QUFDUCxXQUFPQSxHQUFQO0FBQ0Q7QUFDRCxTQUFPLENBQUNvSCxRQUFRQyxHQUFSLEVBQUQsQ0FBUDtBQUNELENBTEQ7O0FBT0E7Ozs7QUFJQTtBQUNBLElBQUlyQyxpQkFBSjtBQUNBLElBQUlzQyx1QkFBSjtBQUNBLElBQU1DLGdCQUFnQixTQUFoQkEsYUFBZ0IsQ0FBQ3ZILEdBQUQsRUFBTXlFLGFBQU4sRUFBcUJwQyxPQUFyQixFQUFpQztBQUNyRCxNQUFNbUYsYUFBYUMsS0FBS0MsU0FBTCxDQUFlO0FBQ2hDMUgsU0FBSyxDQUFDQSxPQUFPLEVBQVIsRUFBWTJILElBQVosRUFEMkI7QUFFaENsRCxtQkFBZSxDQUFDQSxpQkFBaUIsRUFBbEIsRUFBc0JrRCxJQUF0QixFQUZpQjtBQUdoQzFILGdCQUFZQyxNQUFNQyxJQUFOLENBQVcsK0JBQWtCa0MsUUFBUXFDLFFBQTFCLENBQVgsRUFBZ0RpRCxJQUFoRCxFQUhvQixFQUFmLENBQW5COztBQUtBLE1BQUlILGVBQWVGLGNBQW5CLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUR0RCxhQUFXNEQsS0FBWDtBQUNBMUQsYUFBVzBELEtBQVg7QUFDQXhELGVBQWF3RCxLQUFiO0FBQ0F0RCxrQkFBZ0JzRCxLQUFoQjs7QUFFQTVDLGFBQVdSLGFBQWEyQyxPQUFPbkgsR0FBUCxDQUFiLEVBQTBCeUUsYUFBMUIsRUFBeUNwQyxPQUF6QyxDQUFYO0FBQ0EwQywyQkFBeUJDLFFBQXpCLEVBQW1DM0MsT0FBbkM7QUFDQXlFO0FBQ0FRLG1CQUFpQkUsVUFBakI7QUFDRCxDQW5CRDs7QUFxQkEsSUFBTUssMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsVUFBRCxVQUFnQkEsV0FBV0MsSUFBWCxDQUFnQixzQkFBR3JFLElBQUgsU0FBR0EsSUFBSCxRQUFjQSxTQUFTaEIsMEJBQXZCLEVBQWhCLENBQWhCLEVBQWpDOztBQUVBLElBQU1zRix5QkFBeUIsU0FBekJBLHNCQUF5QixDQUFDRixVQUFELFVBQWdCQSxXQUFXQyxJQUFYLENBQWdCLHNCQUFHckUsSUFBSCxTQUFHQSxJQUFILFFBQWNBLFNBQVNmLHdCQUF2QixFQUFoQixDQUFoQixFQUEvQjs7QUFFQSxJQUFNc0YsY0FBYyxTQUFkQSxXQUFjLENBQUMvQyxJQUFELEVBQVU7QUFDTiw4QkFBVSxFQUFFbUMsS0FBS25DLElBQVAsRUFBVixDQURNLENBQ3BCeEQsSUFEb0IsY0FDcEJBLElBRG9CLENBQ2R3RyxHQURjLGNBQ2RBLEdBRGM7QUFFNUIsTUFBTUMsV0FBVyxtQkFBUXpHLElBQVIsQ0FBakI7O0FBRUEsTUFBTTBHLHNCQUFzQixTQUF0QkEsbUJBQXNCLENBQUNDLFFBQUQsRUFBYztBQUN4QyxRQUFJLGdCQUFLRixRQUFMLEVBQWVFLFFBQWYsTUFBNkJuRCxJQUFqQyxFQUF1QztBQUNyQyxhQUFPLElBQVA7QUFDRDtBQUNGLEdBSkQ7O0FBTUEsTUFBTW9ELHNCQUFzQixTQUF0QkEsbUJBQXNCLENBQUNELFFBQUQsRUFBYztBQUN4QyxRQUFNRSxnQkFBZ0IsaUNBQVEseUJBQU9GLFFBQVAsQ0FBUixFQUEwQixVQUFDcEMsS0FBRCxVQUFXLE9BQU9BLEtBQVAsS0FBaUIsU0FBakIsR0FBNkIsRUFBN0IsR0FBa0MsZ0JBQUtrQyxRQUFMLEVBQWVsQyxLQUFmLENBQTdDLEVBQTFCLENBQXRCOztBQUVBLFFBQUksZ0NBQVNzQyxhQUFULEVBQXdCckQsSUFBeEIsQ0FBSixFQUFtQztBQUNqQyxhQUFPLElBQVA7QUFDRDtBQUNGLEdBTkQ7O0FBUUEsTUFBTXNELGdCQUFnQixTQUFoQkEsYUFBZ0IsQ0FBQ0gsUUFBRCxFQUFjO0FBQ2xDLFFBQUksT0FBT0EsUUFBUCxLQUFvQixRQUF4QixFQUFrQztBQUNoQyxhQUFPRCxvQkFBb0JDLFFBQXBCLENBQVA7QUFDRDs7QUFFRCxRQUFJLFFBQU9BLFFBQVAseUNBQU9BLFFBQVAsT0FBb0IsUUFBeEIsRUFBa0M7QUFDaEMsYUFBT0Msb0JBQW9CRCxRQUFwQixDQUFQO0FBQ0Q7QUFDRixHQVJEOztBQVVBLE1BQUlILG1CQUFnQixJQUFwQixFQUEwQjtBQUN4QixXQUFPLEtBQVA7QUFDRDs7QUFFRCxNQUFJQSxJQUFJTyxHQUFSLEVBQWE7QUFDWCxRQUFJRCxjQUFjTixJQUFJTyxHQUFsQixDQUFKLEVBQTRCO0FBQzFCLGFBQU8sSUFBUDtBQUNEO0FBQ0Y7O0FBRUQsTUFBSVAsSUFBSVEsT0FBUixFQUFpQjtBQUNmLFFBQUlGLGNBQWNOLElBQUlRLE9BQWxCLENBQUosRUFBZ0M7QUFDOUIsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxNQUFJUixJQUFJUyxJQUFSLEVBQWM7QUFDWixRQUFJUCxvQkFBb0JGLElBQUlTLElBQXhCLENBQUosRUFBbUM7QUFDakMsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLEtBQVA7QUFDRCxDQW5ERDs7QUFxREFDLE9BQU96RCxPQUFQLEdBQWlCO0FBQ2YwRCxRQUFNO0FBQ0puRixVQUFNLFlBREY7QUFFSm9GLFVBQU07QUFDSkMsZ0JBQVUsa0JBRE47QUFFSkMsbUJBQWEsdUZBRlQ7QUFHSkMsV0FBSywwQkFBUSxtQkFBUixDQUhELEVBRkY7O0FBT0pDLFlBQVEsQ0FBQztBQUNQQyxrQkFBWTtBQUNWbkosYUFBSztBQUNIZ0osdUJBQWEsc0RBRFY7QUFFSHRGLGdCQUFNLE9BRkg7QUFHSDBGLHVCQUFhLElBSFY7QUFJSEMsaUJBQU87QUFDTDNGLGtCQUFNLFFBREQ7QUFFTDRGLHVCQUFXLENBRk4sRUFKSixFQURLOzs7QUFVVjdFLHVCQUFlO0FBQ2J1RSx1QkFBYSxxRkFEQTtBQUVidEYsZ0JBQU0sT0FGTztBQUdiMEYsdUJBQWEsSUFIQTtBQUliQyxpQkFBTztBQUNMM0Ysa0JBQU0sUUFERDtBQUVMNEYsdUJBQVcsQ0FGTixFQUpNLEVBVkw7OztBQW1CVkMsd0JBQWdCO0FBQ2RQLHVCQUFhLG9DQURDO0FBRWR0RixnQkFBTSxTQUZRLEVBbkJOOztBQXVCVjhGLHVCQUFlO0FBQ2JSLHVCQUFhLGtDQURBO0FBRWJ0RixnQkFBTSxTQUZPLEVBdkJMOztBQTJCVitGLGlDQUF5QjtBQUN2QlQsdUJBQWEsdUNBRFU7QUFFdkJ0RixnQkFBTSxTQUZpQixFQTNCZixFQURMOzs7QUFpQ1BnRyxhQUFPO0FBQ0w7QUFDRVAsb0JBQVk7QUFDVksseUJBQWUsRUFBRSxRQUFNLENBQUMsSUFBRCxDQUFSLEVBREw7QUFFVnhKLGVBQUs7QUFDSDJKLHNCQUFVLENBRFAsRUFGSyxFQURkOzs7QUFPRUMsa0JBQVUsQ0FBQyxlQUFELENBUFosRUFESzs7QUFVTDtBQUNFVCxvQkFBWTtBQUNWSSwwQkFBZ0IsRUFBRSxRQUFNLENBQUMsSUFBRCxDQUFSLEVBRE4sRUFEZDs7QUFJRUssa0JBQVUsQ0FBQyxnQkFBRCxDQUpaLEVBVkssQ0FqQ0EsRUFBRCxDQVBKLEVBRFM7Ozs7OztBQTZEZkMsUUE3RGUsK0JBNkRSeEgsT0E3RFEsRUE2REM7Ozs7Ozs7QUFPVkEsY0FBUXlILE9BQVIsQ0FBZ0IsQ0FBaEIsS0FBc0IsRUFQWixDQUVaOUosR0FGWSxTQUVaQSxHQUZZLDZCQUdaeUUsYUFIWSxDQUdaQSxhQUhZLHVDQUdJLEVBSEosdUJBSVo4RSxjQUpZLFNBSVpBLGNBSlksQ0FLWkMsYUFMWSxTQUtaQSxhQUxZLENBTVpDLHVCQU5ZLFNBTVpBLHVCQU5ZOztBQVNkLFVBQUlELGFBQUosRUFBbUI7QUFDakJqQyxzQkFBY3ZILEdBQWQsRUFBbUJ5RSxhQUFuQixFQUFrQ3BDLE9BQWxDO0FBQ0Q7O0FBRUQsVUFBTTZDLE9BQU8sd0NBQW9CN0MsT0FBcEIsQ0FBYjs7QUFFQSxVQUFNMEgsbUNBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0MsSUFBRCxFQUFVO0FBQ3BDLGNBQUksQ0FBQ1QsY0FBTCxFQUFxQjtBQUNuQjtBQUNEOztBQUVELGNBQUluRixhQUFhdUMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFNK0UsY0FBYy9GLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBcEI7QUFDQSxjQUFNRCxZQUFZZ0YsWUFBWTFFLEdBQVosQ0FBZ0IvQyxzQkFBaEIsQ0FBbEI7QUFDQSxjQUFNMEgsbUJBQW1CRCxZQUFZMUUsR0FBWixDQUFnQjdDLDBCQUFoQixDQUF6Qjs7QUFFQXVILGdDQUFtQnpILHNCQUFuQjtBQUNBeUgsZ0NBQW1CdkgsMEJBQW5CO0FBQ0EsY0FBSXVILFlBQVlFLElBQVosR0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEI7QUFDQTtBQUNBOUgsb0JBQVErSCxNQUFSLENBQWVKLEtBQUtLLElBQUwsQ0FBVSxDQUFWLElBQWVMLEtBQUtLLElBQUwsQ0FBVSxDQUFWLENBQWYsR0FBOEJMLElBQTdDLEVBQW1ELGtCQUFuRDtBQUNEO0FBQ0RDLHNCQUFZcEUsR0FBWixDQUFnQnJELHNCQUFoQixFQUF3Q3lDLFNBQXhDO0FBQ0FnRixzQkFBWXBFLEdBQVosQ0FBZ0JuRCwwQkFBaEIsRUFBNEN3SCxnQkFBNUM7QUFDRCxTQXRCSyw4QkFBTjs7QUF3QkEsVUFBTUksMEJBQWEsU0FBYkEsVUFBYSxDQUFDTixJQUFELEVBQU9PLGFBQVAsRUFBc0JDLFlBQXRCLEVBQXVDO0FBQ3hELGNBQUksQ0FBQ2hCLGFBQUwsRUFBb0I7QUFDbEI7QUFDRDs7QUFFRCxjQUFJZ0IsZ0JBQWdCZix1QkFBcEIsRUFBNkM7QUFDM0M7QUFDRDs7QUFFRCxjQUFJckYsYUFBYXVDLEdBQWIsQ0FBaUJ6QixJQUFqQixDQUFKLEVBQTRCO0FBQzFCO0FBQ0Q7O0FBRUQsY0FBSStDLFlBQVkvQyxJQUFaLENBQUosRUFBdUI7QUFDckI7QUFDRDs7QUFFRCxjQUFJWixnQkFBZ0JxQyxHQUFoQixDQUFvQnpCLElBQXBCLENBQUosRUFBK0I7QUFDN0I7QUFDRDs7QUFFRDtBQUNBLGNBQUksQ0FBQ0YsU0FBUzJCLEdBQVQsQ0FBYXpCLElBQWIsQ0FBTCxFQUF5QjtBQUN2QkYsdUJBQVdSLGFBQWEyQyxPQUFPbkgsR0FBUCxDQUFiLEVBQTBCeUUsYUFBMUIsRUFBeUNwQyxPQUF6QyxDQUFYO0FBQ0EsZ0JBQUksQ0FBQzJDLFNBQVMyQixHQUFULENBQWF6QixJQUFiLENBQUwsRUFBeUI7QUFDdkJaLDhCQUFnQk8sR0FBaEIsQ0FBb0JLLElBQXBCO0FBQ0E7QUFDRDtBQUNGOztBQUVEQyxvQkFBVWpCLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBVjs7QUFFQSxjQUFJLENBQUNDLE9BQUwsRUFBYztBQUNac0Ysb0JBQVFDLEtBQVIsbUJBQXdCeEYsSUFBeEI7QUFDRDs7QUFFRDtBQUNBLGNBQU1ELFlBQVlFLFFBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWxCO0FBQ0EsY0FBSSxPQUFPeUMsU0FBUCxLQUFxQixXQUFyQixJQUFvQ3NGLGtCQUFrQjVILHdCQUExRCxFQUFvRjtBQUNsRixnQkFBSXNDLFVBQVVrQixTQUFWLENBQW9CZ0UsSUFBcEIsR0FBMkIsQ0FBL0IsRUFBa0M7QUFDaEM7QUFDRDtBQUNGOztBQUVEO0FBQ0EsY0FBTUQsbUJBQW1CL0UsUUFBUUksR0FBUixDQUFZN0MsMEJBQVosQ0FBekI7QUFDQSxjQUFJLE9BQU93SCxnQkFBUCxLQUE0QixXQUFoQyxFQUE2QztBQUMzQyxnQkFBSUEsaUJBQWlCL0QsU0FBakIsQ0FBMkJnRSxJQUEzQixHQUFrQyxDQUF0QyxFQUF5QztBQUN2QztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxjQUFNUSxhQUFhSixrQkFBa0JsSCxPQUFsQixHQUE0QlYsd0JBQTVCLEdBQXVENEgsYUFBMUU7O0FBRUEsY0FBTXJELGtCQUFrQi9CLFFBQVFJLEdBQVIsQ0FBWW9GLFVBQVosQ0FBeEI7O0FBRUEsY0FBTTFFLFFBQVEwRSxlQUFlaEksd0JBQWYsR0FBMENVLE9BQTFDLEdBQW9Ec0gsVUFBbEU7O0FBRUEsY0FBSSxPQUFPekQsZUFBUCxLQUEyQixXQUEvQixFQUE0QztBQUMxQyxnQkFBSUEsZ0JBQWdCZixTQUFoQixDQUEwQmdFLElBQTFCLEdBQWlDLENBQXJDLEVBQXdDO0FBQ3RDOUgsc0JBQVErSCxNQUFSO0FBQ0VKLGtCQURGO0FBRTJCL0QsbUJBRjNCOztBQUlEO0FBQ0YsV0FQRCxNQU9PO0FBQ0w1RCxvQkFBUStILE1BQVI7QUFDRUosZ0JBREY7QUFFMkIvRCxpQkFGM0I7O0FBSUQ7QUFDRixTQXhFSyxxQkFBTjs7QUEwRUE7Ozs7O0FBS0EsVUFBTTJFLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNaLElBQUQsRUFBVTtBQUNsQyxjQUFJNUYsYUFBYXVDLEdBQWIsQ0FBaUJ6QixJQUFqQixDQUFKLEVBQTRCO0FBQzFCO0FBQ0Q7O0FBRUQsY0FBSUMsVUFBVWpCLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBZDs7QUFFQTtBQUNBO0FBQ0EsY0FBSSxPQUFPQyxPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDQSxzQkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0Q7O0FBRUQsY0FBTTRHLGFBQWEsSUFBSTVHLEdBQUosRUFBbkI7QUFDQSxjQUFNNkcsdUJBQXVCLElBQUl6RyxHQUFKLEVBQTdCOztBQUVBMkYsZUFBS0ssSUFBTCxDQUFVdkcsT0FBVixDQUFrQixrQkFBdUMsS0FBcENKLElBQW9DLFVBQXBDQSxJQUFvQyxDQUE5QkgsV0FBOEIsVUFBOUJBLFdBQThCLENBQWpCdUUsVUFBaUIsVUFBakJBLFVBQWlCO0FBQ3ZELGdCQUFJcEUsU0FBU3BCLDBCQUFiLEVBQXlDO0FBQ3ZDd0ksbUNBQXFCakcsR0FBckIsQ0FBeUJsQyx3QkFBekI7QUFDRDtBQUNELGdCQUFJZSxTQUFTbkIsd0JBQWIsRUFBdUM7QUFDckMsa0JBQUl1RixXQUFXMUYsTUFBWCxHQUFvQixDQUF4QixFQUEyQjtBQUN6QjBGLDJCQUFXaEUsT0FBWCxDQUFtQixVQUFDNEMsU0FBRCxFQUFlO0FBQ2hDLHNCQUFJQSxVQUFVcUUsUUFBZCxFQUF3QjtBQUN0QkQseUNBQXFCakcsR0FBckIsQ0FBeUI2QixVQUFVcUUsUUFBVixDQUFtQm5ILElBQW5CLElBQTJCOEMsVUFBVXFFLFFBQVYsQ0FBbUI5RSxLQUF2RTtBQUNEO0FBQ0YsaUJBSkQ7QUFLRDtBQUNEM0MsMkNBQTZCQyxXQUE3QixFQUEwQyxVQUFDSyxJQUFELEVBQVU7QUFDbERrSCxxQ0FBcUJqRyxHQUFyQixDQUF5QmpCLElBQXpCO0FBQ0QsZUFGRDtBQUdEO0FBQ0YsV0FoQkQ7O0FBa0JBO0FBQ0F1QixrQkFBUXJCLE9BQVIsQ0FBZ0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUM5QixnQkFBSTRFLHFCQUFxQm5FLEdBQXJCLENBQXlCVCxHQUF6QixDQUFKLEVBQW1DO0FBQ2pDMkUseUJBQVdoRixHQUFYLENBQWVLLEdBQWYsRUFBb0JELEtBQXBCO0FBQ0Q7QUFDRixXQUpEOztBQU1BO0FBQ0E2RSwrQkFBcUJoSCxPQUFyQixDQUE2QixVQUFDb0MsR0FBRCxFQUFTO0FBQ3BDLGdCQUFJLENBQUNmLFFBQVF3QixHQUFSLENBQVlULEdBQVosQ0FBTCxFQUF1QjtBQUNyQjJFLHlCQUFXaEYsR0FBWCxDQUFlSyxHQUFmLEVBQW9CLEVBQUVDLFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFwQjtBQUNEO0FBQ0YsV0FKRDs7QUFNQTtBQUNBLGNBQU1ZLFlBQVlFLFFBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWxCO0FBQ0EsY0FBSTBILG1CQUFtQi9FLFFBQVFJLEdBQVIsQ0FBWTdDLDBCQUFaLENBQXZCOztBQUVBLGNBQUksT0FBT3dILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDQSwrQkFBbUIsRUFBRS9ELFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFuQjtBQUNEOztBQUVEd0cscUJBQVdoRixHQUFYLENBQWVyRCxzQkFBZixFQUF1Q3lDLFNBQXZDO0FBQ0E0RixxQkFBV2hGLEdBQVgsQ0FBZW5ELDBCQUFmLEVBQTJDd0gsZ0JBQTNDO0FBQ0FoRyxxQkFBVzJCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQjJGLFVBQXJCO0FBQ0QsU0EzREssNEJBQU47O0FBNkRBOzs7OztBQUtBLFVBQU1HLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNoQixJQUFELEVBQVU7QUFDbEMsY0FBSSxDQUFDUixhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsY0FBSXlCLGlCQUFpQmpILFdBQVd1QixHQUFYLENBQWVMLElBQWYsQ0FBckI7QUFDQSxjQUFJLE9BQU8rRixjQUFQLEtBQTBCLFdBQTlCLEVBQTJDO0FBQ3pDQSw2QkFBaUIsSUFBSWhILEdBQUosRUFBakI7QUFDRDs7QUFFRCxjQUFNaUgsc0JBQXNCLElBQUk3RyxHQUFKLEVBQTVCO0FBQ0EsY0FBTThHLHNCQUFzQixJQUFJOUcsR0FBSixFQUE1Qjs7QUFFQSxjQUFNK0csZUFBZSxJQUFJL0csR0FBSixFQUFyQjtBQUNBLGNBQU1nSCxlQUFlLElBQUloSCxHQUFKLEVBQXJCOztBQUVBLGNBQU1pSCxvQkFBb0IsSUFBSWpILEdBQUosRUFBMUI7QUFDQSxjQUFNa0gsb0JBQW9CLElBQUlsSCxHQUFKLEVBQTFCOztBQUVBLGNBQU1tSCxhQUFhLElBQUl2SCxHQUFKLEVBQW5CO0FBQ0EsY0FBTXdILGFBQWEsSUFBSXhILEdBQUosRUFBbkI7QUFDQWdILHlCQUFlbkgsT0FBZixDQUF1QixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3JDLGdCQUFJRCxNQUFNVSxHQUFOLENBQVVuRSxzQkFBVixDQUFKLEVBQXVDO0FBQ3JDNEksMkJBQWF2RyxHQUFiLENBQWlCcUIsR0FBakI7QUFDRDtBQUNELGdCQUFJRCxNQUFNVSxHQUFOLENBQVVqRSwwQkFBVixDQUFKLEVBQTJDO0FBQ3pDd0ksa0NBQW9CckcsR0FBcEIsQ0FBd0JxQixHQUF4QjtBQUNEO0FBQ0QsZ0JBQUlELE1BQU1VLEdBQU4sQ0FBVWhFLHdCQUFWLENBQUosRUFBeUM7QUFDdkMySSxnQ0FBa0J6RyxHQUFsQixDQUFzQnFCLEdBQXRCO0FBQ0Q7QUFDREQsa0JBQU1uQyxPQUFOLENBQWMsVUFBQzhDLEdBQUQsRUFBUztBQUNyQjtBQUNFQSxzQkFBUWxFLDBCQUFSO0FBQ0drRSxzQkFBUWpFLHdCQUZiO0FBR0U7QUFDQTZJLDJCQUFXM0YsR0FBWCxDQUFlZSxHQUFmLEVBQW9CVixHQUFwQjtBQUNEO0FBQ0YsYUFQRDtBQVFELFdBbEJEOztBQW9CQSxtQkFBU3dGLG9CQUFULENBQThCQyxNQUE5QixFQUFzQztBQUNwQyxnQkFBSUEsT0FBT2pJLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDN0IscUJBQU8sSUFBUDtBQUNEO0FBQ0QsZ0JBQU1rSSxJQUFJLDBCQUFRRCxPQUFPMUYsS0FBZixFQUFzQjVELE9BQXRCLENBQVY7QUFDQSxnQkFBSXVKLEtBQUssSUFBVCxFQUFlO0FBQ2IscUJBQU8sSUFBUDtBQUNEO0FBQ0RULGdDQUFvQnRHLEdBQXBCLENBQXdCK0csQ0FBeEI7QUFDRDs7QUFFRCxrQ0FBTTVCLElBQU4sRUFBWTdGLGNBQWNvQixHQUFkLENBQWtCTCxJQUFsQixDQUFaLEVBQXFDO0FBQ25DMkcsNEJBRG1DLHlDQUNsQkMsS0FEa0IsRUFDWDtBQUN0QkoscUNBQXFCSSxNQUFNSCxNQUEzQjtBQUNELGVBSGtDO0FBSW5DSSwwQkFKbUMsdUNBSXBCRCxLQUpvQixFQUliO0FBQ3BCLG9CQUFJQSxNQUFNRSxNQUFOLENBQWF0SSxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDZ0ksdUNBQXFCSSxNQUFNRyxTQUFOLENBQWdCLENBQWhCLENBQXJCO0FBQ0Q7QUFDRixlQVJrQywyQkFBckM7OztBQVdBakMsZUFBS0ssSUFBTCxDQUFVdkcsT0FBVixDQUFrQixVQUFDb0ksT0FBRCxFQUFhO0FBQzdCLGdCQUFJQyxxQkFBSjs7QUFFQTtBQUNBLGdCQUFJRCxRQUFReEksSUFBUixLQUFpQm5CLHdCQUFyQixFQUErQztBQUM3QyxrQkFBSTJKLFFBQVFQLE1BQVosRUFBb0I7QUFDbEJRLCtCQUFlLDBCQUFRRCxRQUFRUCxNQUFSLENBQWVTLEdBQWYsQ0FBbUJDLE9BQW5CLENBQTJCLFFBQTNCLEVBQXFDLEVBQXJDLENBQVIsRUFBa0RoSyxPQUFsRCxDQUFmO0FBQ0E2Six3QkFBUXBFLFVBQVIsQ0FBbUJoRSxPQUFuQixDQUEyQixVQUFDNEMsU0FBRCxFQUFlO0FBQ3hDLHNCQUFNOUMsT0FBTzhDLFVBQVVGLEtBQVYsQ0FBZ0I1QyxJQUFoQixJQUF3QjhDLFVBQVVGLEtBQVYsQ0FBZ0JQLEtBQXJEO0FBQ0Esc0JBQUlyQyxTQUFTUCxPQUFiLEVBQXNCO0FBQ3BCa0ksc0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNELG1CQUZELE1BRU87QUFDTFYsK0JBQVc1RixHQUFYLENBQWVqQyxJQUFmLEVBQXFCdUksWUFBckI7QUFDRDtBQUNGLGlCQVBEO0FBUUQ7QUFDRjs7QUFFRCxnQkFBSUQsUUFBUXhJLElBQVIsS0FBaUJsQixzQkFBckIsRUFBNkM7QUFDM0MySiw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEaEssT0FBbEQsQ0FBZjtBQUNBZ0osMkJBQWF4RyxHQUFiLENBQWlCc0gsWUFBakI7QUFDRDs7QUFFRCxnQkFBSUQsUUFBUXhJLElBQVIsS0FBaUJqQixrQkFBckIsRUFBeUM7QUFDdkMwSiw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEaEssT0FBbEQsQ0FBZjtBQUNBLGtCQUFJLENBQUM4SixZQUFMLEVBQW1CO0FBQ2pCO0FBQ0Q7O0FBRUQsa0JBQUk1SCxhQUFhNEgsWUFBYixDQUFKLEVBQWdDO0FBQzlCO0FBQ0Q7O0FBRUQsa0JBQUl0RSx5QkFBeUJxRSxRQUFRcEUsVUFBakMsQ0FBSixFQUFrRDtBQUNoRHFELG9DQUFvQnRHLEdBQXBCLENBQXdCc0gsWUFBeEI7QUFDRDs7QUFFRCxrQkFBSW5FLHVCQUF1QmtFLFFBQVFwRSxVQUEvQixDQUFKLEVBQWdEO0FBQzlDeUQsa0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNEOztBQUVERCxzQkFBUXBFLFVBQVI7QUFDRzdGLG9CQURILENBQ1UsVUFBQ3lFLFNBQUQsVUFBZUEsVUFBVWhELElBQVYsS0FBbUJmLHdCQUFuQixJQUErQytELFVBQVVoRCxJQUFWLEtBQW1CaEIsMEJBQWpGLEVBRFY7QUFFR29CLHFCQUZILENBRVcsVUFBQzRDLFNBQUQsRUFBZTtBQUN0QitFLDJCQUFXNUYsR0FBWCxDQUFlYSxVQUFVNEYsUUFBVixDQUFtQjFJLElBQW5CLElBQTJCOEMsVUFBVTRGLFFBQVYsQ0FBbUJyRyxLQUE3RCxFQUFvRWtHLFlBQXBFO0FBQ0QsZUFKSDtBQUtEO0FBQ0YsV0EvQ0Q7O0FBaURBZCx1QkFBYXZILE9BQWIsQ0FBcUIsVUFBQ21DLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDbUYsYUFBYXpFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQUliLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlyQyxzQkFBWjtBQUNBeUksNkJBQWVwRixHQUFmLENBQW1CSSxLQUFuQixFQUEwQmIsT0FBMUI7O0FBRUEsa0JBQUlELFdBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWQ7QUFDQSxrQkFBSVksc0JBQUo7QUFDQSxrQkFBSSxPQUFPMUIsUUFBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQzBCLGdDQUFnQjFCLFNBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wyQywyQkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0FDLDJCQUFXMkIsR0FBWCxDQUFlSSxLQUFmLEVBQXNCZCxRQUF0QjtBQUNEOztBQUVELGtCQUFJLE9BQU8wQixhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSw4QkFBY1YsU0FBZCxDQUF3QnRCLEdBQXhCLENBQTRCSyxJQUE1QjtBQUNELGVBRkQsTUFFTztBQUNMLG9CQUFNaUIsWUFBWSxJQUFJOUIsR0FBSixFQUFsQjtBQUNBOEIsMEJBQVV0QixHQUFWLENBQWNLLElBQWQ7QUFDQUMseUJBQVFVLEdBQVIsQ0FBWXJELHNCQUFaLEVBQW9DLEVBQUUyRCxvQkFBRixFQUFwQztBQUNEO0FBQ0Y7QUFDRixXQTFCRDs7QUE0QkFpRix1QkFBYXRILE9BQWIsQ0FBcUIsVUFBQ21DLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDb0YsYUFBYTFFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQU1iLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWU1QyxzQkFBZjs7QUFFQSxrQkFBTTJDLFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT3FFLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEOztBQWVBcUcsNEJBQWtCekgsT0FBbEIsQ0FBMEIsVUFBQ21DLEtBQUQsRUFBVztBQUNuQyxnQkFBSSxDQUFDcUYsa0JBQWtCM0UsR0FBbEIsQ0FBc0JWLEtBQXRCLENBQUwsRUFBbUM7QUFDakMsa0JBQUliLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlsQyx3QkFBWjtBQUNBc0ksNkJBQWVwRixHQUFmLENBQW1CSSxLQUFuQixFQUEwQmIsT0FBMUI7O0FBRUEsa0JBQUlELFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWQ7QUFDQSxrQkFBSVksc0JBQUo7QUFDQSxrQkFBSSxPQUFPMUIsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQzBCLGdDQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWTVDLHdCQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0x3Qyw0QkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0FDLDJCQUFXMkIsR0FBWCxDQUFlSSxLQUFmLEVBQXNCZCxTQUF0QjtBQUNEOztBQUVELGtCQUFJLE9BQU8wQixhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSw4QkFBY1YsU0FBZCxDQUF3QnRCLEdBQXhCLENBQTRCSyxJQUE1QjtBQUNELGVBRkQsTUFFTztBQUNMLG9CQUFNaUIsWUFBWSxJQUFJOUIsR0FBSixFQUFsQjtBQUNBOEIsMEJBQVV0QixHQUFWLENBQWNLLElBQWQ7QUFDQUMsMEJBQVFVLEdBQVIsQ0FBWWxELHdCQUFaLEVBQXNDLEVBQUV3RCxvQkFBRixFQUF0QztBQUNEO0FBQ0Y7QUFDRixXQTFCRDs7QUE0QkFtRiw0QkFBa0J4SCxPQUFsQixDQUEwQixVQUFDbUMsS0FBRCxFQUFXO0FBQ25DLGdCQUFJLENBQUNzRixrQkFBa0I1RSxHQUFsQixDQUFzQlYsS0FBdEIsQ0FBTCxFQUFtQztBQUNqQyxrQkFBTWIsVUFBVTZGLGVBQWUxRixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZXpDLHdCQUFmOztBQUVBLGtCQUFNd0MsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZNUMsd0JBQVosQ0FBdEI7QUFDQSxvQkFBSSxPQUFPa0UsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7O0FBZUFpRyw4QkFBb0JySCxPQUFwQixDQUE0QixVQUFDbUMsS0FBRCxFQUFXO0FBQ3JDLGdCQUFJLENBQUNpRixvQkFBb0J2RSxHQUFwQixDQUF3QlYsS0FBeEIsQ0FBTCxFQUFxQztBQUNuQyxrQkFBSWIsVUFBVTZGLGVBQWUxRixHQUFmLENBQW1CVSxLQUFuQixDQUFkO0FBQ0Esa0JBQUksT0FBT2IsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ0EsMEJBQVUsSUFBSWYsR0FBSixFQUFWO0FBQ0Q7QUFDRGUsc0JBQVFQLEdBQVIsQ0FBWW5DLDBCQUFaO0FBQ0F1SSw2QkFBZXBGLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZN0MsMEJBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTHlDLDRCQUFVLElBQUlsQixHQUFKLEVBQVY7QUFDQUMsMkJBQVcyQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdEIsR0FBeEIsQ0FBNEJLLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUk5QixHQUFKLEVBQWxCO0FBQ0E4QiwwQkFBVXRCLEdBQVYsQ0FBY0ssSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZbkQsMEJBQVosRUFBd0MsRUFBRXlELG9CQUFGLEVBQXhDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQStFLDhCQUFvQnBILE9BQXBCLENBQTRCLFVBQUNtQyxLQUFELEVBQVc7QUFDckMsZ0JBQUksQ0FBQ2tGLG9CQUFvQnhFLEdBQXBCLENBQXdCVixLQUF4QixDQUFMLEVBQXFDO0FBQ25DLGtCQUFNYixVQUFVNkYsZUFBZTFGLEdBQWYsQ0FBbUJVLEtBQW5CLENBQWhCO0FBQ0FiLGdDQUFlMUMsMEJBQWY7O0FBRUEsa0JBQU15QyxZQUFVakIsV0FBV3FCLEdBQVgsQ0FBZVUsS0FBZixDQUFoQjtBQUNBLGtCQUFJLE9BQU9kLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMsb0JBQU0wQixnQkFBZ0IxQixVQUFRSSxHQUFSLENBQVk3QywwQkFBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU9tRSxhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSxnQ0FBY1YsU0FBZCxXQUErQmpCLElBQS9CO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsV0FiRDs7QUFlQXVHLHFCQUFXM0gsT0FBWCxDQUFtQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUNzRixXQUFXN0UsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQUlkLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlxQixHQUFaO0FBQ0ErRSw2QkFBZXBGLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZVyxHQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0xmLDRCQUFVLElBQUlsQixHQUFKLEVBQVY7QUFDQUMsMkJBQVcyQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdEIsR0FBeEIsQ0FBNEJLLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUk5QixHQUFKLEVBQWxCO0FBQ0E4QiwwQkFBVXRCLEdBQVYsQ0FBY0ssSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZSyxHQUFaLEVBQWlCLEVBQUVDLG9CQUFGLEVBQWpCO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQXFGLHFCQUFXMUgsT0FBWCxDQUFtQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUN1RixXQUFXOUUsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQU1kLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWVjLEdBQWY7O0FBRUEsa0JBQU1mLFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWVcsR0FBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU9XLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEO0FBY0QsU0EzUkssNEJBQU47O0FBNlJBLGFBQU87QUFDTCxzQkFESyxvQ0FDVThFLElBRFYsRUFDZ0I7QUFDbkJZLDhCQUFrQlosSUFBbEI7QUFDQWdCLDhCQUFrQmhCLElBQWxCO0FBQ0FELGdDQUFvQkMsSUFBcEI7QUFDRCxXQUxJO0FBTUx1QyxnQ0FOSyxpREFNb0J2QyxJQU5wQixFQU0wQjtBQUM3Qk0sdUJBQVdOLElBQVgsRUFBaUJySCx3QkFBakIsRUFBMkMsS0FBM0M7QUFDRCxXQVJJO0FBU0w2Siw4QkFUSywrQ0FTa0J4QyxJQVRsQixFQVN3QjtBQUMzQkEsaUJBQUtsQyxVQUFMLENBQWdCaEUsT0FBaEIsQ0FBd0IsVUFBQzRDLFNBQUQsRUFBZTtBQUNyQzRELHlCQUFXNUQsU0FBWCxFQUFzQkEsVUFBVXFFLFFBQVYsQ0FBbUJuSCxJQUFuQixJQUEyQjhDLFVBQVVxRSxRQUFWLENBQW1COUUsS0FBcEUsRUFBMkUsS0FBM0U7QUFDRCxhQUZEO0FBR0EzQyx5Q0FBNkIwRyxLQUFLekcsV0FBbEMsRUFBK0MsVUFBQ0ssSUFBRCxFQUFPNEcsWUFBUCxFQUF3QjtBQUNyRUYseUJBQVdOLElBQVgsRUFBaUJwRyxJQUFqQixFQUF1QjRHLFlBQXZCO0FBQ0QsYUFGRDtBQUdELFdBaEJJLG1DQUFQOztBQWtCRCxLQXBpQmMsbUJBQWpCIiwiZmlsZSI6Im5vLXVudXNlZC1tb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEVuc3VyZXMgdGhhdCBtb2R1bGVzIGNvbnRhaW4gZXhwb3J0cyBhbmQvb3IgYWxsXG4gKiBtb2R1bGVzIGFyZSBjb25zdW1lZCB3aXRoaW4gb3RoZXIgbW9kdWxlcy5cbiAqIEBhdXRob3IgUmVuw6kgRmVybWFublxuICovXG5cbmltcG9ydCB7IGdldFBoeXNpY2FsRmlsZW5hbWUgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2NvbnRleHRDb21wYXQnO1xuaW1wb3J0IHsgZ2V0RmlsZUV4dGVuc2lvbnMgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2lnbm9yZSc7XG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnO1xuaW1wb3J0IHZpc2l0IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvdmlzaXQnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSBhcyByZXNvbHZlUGF0aCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlYWRQa2dVcCBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3JlYWRQa2dVcCc7XG5pbXBvcnQgdmFsdWVzIGZyb20gJ29iamVjdC52YWx1ZXMnO1xuaW1wb3J0IGluY2x1ZGVzIGZyb20gJ2FycmF5LWluY2x1ZGVzJztcbmltcG9ydCBmbGF0TWFwIGZyb20gJ2FycmF5LnByb3RvdHlwZS5mbGF0bWFwJztcblxuaW1wb3J0IHsgd2Fsa1N5bmMgfSBmcm9tICcuLi9jb3JlL2ZzV2Fsayc7XG5pbXBvcnQgRXhwb3J0TWFwQnVpbGRlciBmcm9tICcuLi9leHBvcnRNYXAvYnVpbGRlcic7XG5pbXBvcnQgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUgZnJvbSAnLi4vZXhwb3J0TWFwL3BhdHRlcm5DYXB0dXJlJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG4vKipcbiAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgaW50ZXJuYWwgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcywgd2hpY2ggaGFzIGV4aXN0ZWQgaW4gYSBjb3VwbGVcbiAqIG9mIGRpZmZlcmVudCBwbGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBgZXNsaW50YC4gIFRyeSByZXF1aXJpbmcgaXQgZnJvbSBib3RoXG4gKiBsb2NhdGlvbnMuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBgRmlsZUVudW1lcmF0b3JgIGNsYXNzIGlmIGl0cyByZXF1aXJhYmxlLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVGaWxlRW51bWVyYXRvcigpIHtcbiAgbGV0IEZpbGVFbnVtZXJhdG9yO1xuXG4gIC8vIFRyeSBnZXR0aW5nIGl0IGZyb20gdGhlIGVzbGludCBwcml2YXRlIC8gZGVwcmVjYXRlZCBhcGlcbiAgdHJ5IHtcbiAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L3VzZS1hdC15b3VyLW93bi1yaXNrJykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQWJzb3JiIHRoaXMgaWYgaXQncyBNT0RVTEVfTk9UX0ZPVU5EXG4gICAgaWYgKGUuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCB0aGVyZSwgdGhlbiB0cnkgZ2V0dGluZyBpdCBmcm9tIGVzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3IgKG1vdmVkIHRoZXJlIGluIHY2KVxuICAgIHRyeSB7XG4gICAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi9jbGktZW5naW5lL2ZpbGUtZW51bWVyYXRvcicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gRmlsZUVudW1lcmF0b3I7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBGaWxlRW51bWVyYXRvciB0aGUgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcyBmcm9tIGBlc2xpbnRgJ3MgaW50ZXJuYWwgYXBpXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIHBhdGggdG8gdGhlIHNyYyByb290XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEByZXR1cm5zIHt7IGZpbGVuYW1lOiBzdHJpbmcsIGlnbm9yZWQ6IGJvb2xlYW4gfVtdfSBsaXN0IG9mIGZpbGVzIHRvIG9wZXJhdGUgb25cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzVXNpbmdGaWxlRW51bWVyYXRvcihGaWxlRW51bWVyYXRvciwgc3JjLCBleHRlbnNpb25zKSB7XG4gIGNvbnN0IGUgPSBuZXcgRmlsZUVudW1lcmF0b3Ioe1xuICAgIGV4dGVuc2lvbnMsXG4gIH0pO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGUuaXRlcmF0ZUZpbGVzKHNyYyksXG4gICAgKHsgZmlsZVBhdGgsIGlnbm9yZWQgfSkgPT4gKHsgZmlsZW5hbWU6IGZpbGVQYXRoLCBpZ25vcmVkIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVxdWlyZSBvbGQgdmVyc2lvbnMgb2YgdGhlIGZpbGUgZW51bWVyYXRpb24gY2FwYWJpbGl0eSBmcm9tIHY2IGBlc2xpbnRgIGFuZCBlYXJsaWVyLCBhbmQgdXNlXG4gKiB0aG9zZSBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUgbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIHBhdGggdG8gdGhlIHNyYyByb290XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1dpdGhMZWdhY3lGdW5jdGlvbnMoc3JjLCBleHRlbnNpb25zKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbCBoYXMgYmVlbiBtb3ZlZCB0byBlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlscyB3aXRoIHZlcnNpb24gNS4zXG4gICAgY29uc3QgeyBsaXN0RmlsZXNUb1Byb2Nlc3M6IG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzIH0gPSByZXF1aXJlKCdlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlscycpO1xuICAgIC8vIFByZXZlbnQgcGFzc2luZyBpbnZhbGlkIG9wdGlvbnMgKGV4dGVuc2lvbnMgYXJyYXkpIHRvIG9sZCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi92NS4xNi4wL2xpYi91dGlsL2dsb2ItdXRpbHMuanMjTDE3OC1MMjgwXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi92NS4yLjAvbGliL3V0aWwvZ2xvYi11dGlsLmpzI0wxNzQtTDI2OVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywge1xuICAgICAgZXh0ZW5zaW9ucyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEFic29yYiB0aGlzIGlmIGl0J3MgTU9EVUxFX05PVF9GT1VORFxuICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICAvLyBMYXN0IHBsYWNlIHRvIHRyeSAocHJlIHY1LjMpXG4gICAgY29uc3Qge1xuICAgICAgbGlzdEZpbGVzVG9Qcm9jZXNzOiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyxcbiAgICB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbCcpO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gc3JjLmNvbmNhdChcbiAgICAgIGZsYXRNYXAoXG4gICAgICAgIHNyYyxcbiAgICAgICAgKHBhdHRlcm4pID0+IGV4dGVuc2lvbnMubWFwKChleHRlbnNpb24pID0+ICgvXFwqXFwqfFxcKlxcLi8pLnRlc3QocGF0dGVybikgPyBwYXR0ZXJuIDogYCR7cGF0dGVybn0vKiovKiR7ZXh0ZW5zaW9ufWApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzKHBhdHRlcm5zKTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgc291cmNlIHJvb3QgYW5kIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnMsIHVzZSBmc1dhbGsgYW5kIHRoZVxuICogbmV3IGBlc2xpbnRgIGBjb250ZXh0LnNlc3Npb25gIGFwaSB0byBidWlsZCB0aGUgbGlzdCBvZiBmaWxlcyB3ZSB3YW50IHRvIG9wZXJhdGUgb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHNyY1BhdGhzIGFycmF5IG9mIHNvdXJjZSBwYXRocyAoZm9yIGZsYXQgY29uZmlnIHRoaXMgc2hvdWxkIGp1c3QgYmUgYSBzaW5ndWxhciByb290IChlLmcuIGN3ZCkpXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEBwYXJhbSB7eyBpc0RpcmVjdG9yeUlnbm9yZWQ6IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4sIGlzRmlsZUlnbm9yZWQ6IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4gfX0gc2Vzc2lvbiBlc2xpbnQgY29udGV4dCBzZXNzaW9uIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ1tdfSBsaXN0IG9mIGZpbGVzIHRvIG9wZXJhdGUgb25cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzV2l0aE1vZGVybkFwaShzcmNQYXRocywgZXh0ZW5zaW9ucywgc2Vzc2lvbikge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjUGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzcmMgPSBzcmNQYXRoc1tpXTtcbiAgICAvLyBVc2Ugd2Fsa1N5bmMgYWxvbmcgd2l0aCB0aGUgbmV3IHNlc3Npb24gYXBpIHRvIGdhdGhlciB0aGUgbGlzdCBvZiBmaWxlc1xuICAgIGNvbnN0IGVudHJpZXMgPSB3YWxrU3luYyhzcmMsIHtcbiAgICAgIGRlZXBGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgY29uc3QgZnVsbEVudHJ5UGF0aCA9IHJlc29sdmVQYXRoKHNyYywgZW50cnkucGF0aCk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgZGlyZWN0b3J5IGlmIGl0J3Mgbm90IG1hcmtlZCBhcyBpZ25vcmUgYnkgZXNsaW50XG4gICAgICAgIHJldHVybiAhc2Vzc2lvbi5pc0RpcmVjdG9yeUlnbm9yZWQoZnVsbEVudHJ5UGF0aCk7XG4gICAgICB9LFxuICAgICAgZW50cnlGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgY29uc3QgZnVsbEVudHJ5UGF0aCA9IHJlc29sdmVQYXRoKHNyYywgZW50cnkucGF0aCk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBpZiBpdCdzIG5vdCBtYXJrZWQgYXMgaWdub3JlIGJ5IGVzbGludCBhbmQgaXRzIGV4dGVuc2lvbiBpcyBpbmNsdWRlZCBpbiBvdXIgbGlzdFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFzZXNzaW9uLmlzRmlsZUlnbm9yZWQoZnVsbEVudHJ5UGF0aClcbiAgICAgICAgICAmJiBleHRlbnNpb25zLmZpbmQoKGV4dGVuc2lvbikgPT4gZW50cnkucGF0aC5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgZGlyZWN0b3JpZXMgYW5kIG1hcCBlbnRyaWVzIHRvIHRoZWlyIHBhdGhzXG4gICAgZmlsZXMucHVzaChcbiAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBhdGgpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgc3JjIHBhdHRlcm4gYW5kIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnMsIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2Vzc1xuICogd2l0aCB0aGlzIHJ1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gZmlsZSwgZGlyZWN0b3J5LCBvciBnbG9iIHBhdHRlcm4gb2YgZmlsZXMgdG8gYWN0IG9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIC0gbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dH0gY29udGV4dCAtIHRoZSBlc2xpbnQgY29udGV4dCBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmdbXSB8IHsgZmlsZW5hbWU6IHN0cmluZywgaWdub3JlZDogYm9vbGVhbiB9W119IHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgdGhpcyBydWxlIHdpbGwgZXZhbHVhdGUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1RvUHJvY2VzcyhzcmMsIGV4dGVuc2lvbnMsIGNvbnRleHQpIHtcbiAgLy8gSWYgdGhlIGNvbnRleHQgb2JqZWN0IGhhcyB0aGUgbmV3IHNlc3Npb24gZnVuY3Rpb25zLCB0aGVuIHByZWZlciB0aG9zZVxuICAvLyBPdGhlcndpc2UsIGZhbGxiYWNrIHRvIHVzaW5nIHRoZSBkZXByZWNhdGVkIGBGaWxlRW51bWVyYXRvcmAgZm9yIGxlZ2FjeSBzdXBwb3J0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMTgwODdcbiAgaWYgKFxuICAgIGNvbnRleHQuc2Vzc2lvblxuICAgICYmIGNvbnRleHQuc2Vzc2lvbi5pc0ZpbGVJZ25vcmVkXG4gICAgJiYgY29udGV4dC5zZXNzaW9uLmlzRGlyZWN0b3J5SWdub3JlZFxuICApIHtcbiAgICByZXR1cm4gbGlzdEZpbGVzV2l0aE1vZGVybkFwaShzcmMsIGV4dGVuc2lvbnMsIGNvbnRleHQuc2Vzc2lvbik7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBvZyBGaWxlRW51bWVyYXRvclxuICBjb25zdCBGaWxlRW51bWVyYXRvciA9IHJlcXVpcmVGaWxlRW51bWVyYXRvcigpO1xuXG4gIC8vIElmIHdlIGdvdCB0aGUgRmlsZUVudW1lcmF0b3IsIHRoZW4gbGV0J3MgZ28gd2l0aCB0aGF0XG4gIGlmIChGaWxlRW51bWVyYXRvcikge1xuICAgIHJldHVybiBsaXN0RmlsZXNVc2luZ0ZpbGVFbnVtZXJhdG9yKEZpbGVFbnVtZXJhdG9yLCBzcmMsIGV4dGVuc2lvbnMpO1xuICB9XG4gIC8vIElmIG5vdCwgdGhlbiB3ZSBjYW4gdHJ5IGV2ZW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IChsaXN0RmlsZXNUb1Byb2Nlc3MpXG4gIHJldHVybiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucyk7XG59XG5cbmNvbnN0IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfTkFNRURfREVDTEFSQVRJT04gPSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJztcbmNvbnN0IElNUE9SVF9ERUNMQVJBVElPTiA9ICdJbXBvcnREZWNsYXJhdGlvbic7XG5jb25zdCBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiA9ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInO1xuY29uc3QgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInO1xuY29uc3QgVkFSSUFCTEVfREVDTEFSQVRJT04gPSAnVmFyaWFibGVEZWNsYXJhdGlvbic7XG5jb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9ICdGdW5jdGlvbkRlY2xhcmF0aW9uJztcbmNvbnN0IENMQVNTX0RFQ0xBUkFUSU9OID0gJ0NsYXNzRGVjbGFyYXRpb24nO1xuY29uc3QgSURFTlRJRklFUiA9ICdJZGVudGlmaWVyJztcbmNvbnN0IE9CSkVDVF9QQVRURVJOID0gJ09iamVjdFBhdHRlcm4nO1xuY29uc3QgQVJSQVlfUEFUVEVSTiA9ICdBcnJheVBhdHRlcm4nO1xuY29uc3QgVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OID0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nO1xuY29uc3QgVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiA9ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJztcbmNvbnN0IFRTX0VOVU1fREVDTEFSQVRJT04gPSAnVFNFbnVtRGVjbGFyYXRpb24nO1xuY29uc3QgREVGQVVMVCA9ICdkZWZhdWx0JztcblxuZnVuY3Rpb24gZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllcihkZWNsYXJhdGlvbiwgY2IpIHtcbiAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgY29uc3QgaXNUeXBlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi50eXBlID09PSBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX0VOVU1fREVDTEFSQVRJT047XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBGVU5DVElPTl9ERUNMQVJBVElPTlxuICAgICAgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gQ0xBU1NfREVDTEFSQVRJT05cbiAgICAgIHx8IGlzVHlwZURlY2xhcmF0aW9uXG4gICAgKSB7XG4gICAgICBjYihkZWNsYXJhdGlvbi5pZC5uYW1lLCBpc1R5cGVEZWNsYXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKHsgaWQgfSkgPT4ge1xuICAgICAgICBpZiAoaWQudHlwZSA9PT0gT0JKRUNUX1BBVFRFUk4pIHtcbiAgICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShpZCwgKHBhdHRlcm4pID0+IHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgY2IocGF0dGVybi5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQudHlwZSA9PT0gQVJSQVlfUEFUVEVSTikge1xuICAgICAgICAgIGlkLmVsZW1lbnRzLmZvckVhY2goKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBjYihuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IoaWQubmFtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGltcG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGEgU2V0IG9mIGlkZW50aWZpZXJzLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgaW1wb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBmaWxlcyB3aGljaCBhcmUgYmVpbmcgaW1wb3J0ZWRcbiAqIGZyb20uIExhc3RseSwgdGhlIFNldCBvZiBpZGVudGlmaWVycyBjb250YWlucyBlaXRoZXIgbmFtZXMgYmVpbmcgaW1wb3J0ZWRcbiAqIG9yIGEgc3BlY2lhbCBBU1Qgbm9kZSBuYW1lIGxpc3RlZCBhYm92ZSAoZS5nIEltcG9ydERlZmF1bHRTcGVjaWZpZXIpLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZzpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdmb28uanMnID0+IE1hcCB7ICdiYXIuanMnID0+IFNldCB7ICdvMicgfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+Pn1cbiAqL1xuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBMaXN0IG9mIGV4cG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGFuIG9iamVjdCBvZiBtZXRhZGF0YS4gVGhlIHVwcGVyLWxldmVsIE1hcFxuICoga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlIGV4cG9ydHMsIHdoaWxlIHRoZVxuICogbG93ZXItbGV2ZWwgTWFwIGtleXMgYXJlIHRoZSBzcGVjaWZpYyBpZGVudGlmaWVycyBvciBzcGVjaWFsIEFTVCBub2RlIG5hbWVzXG4gKiBiZWluZyBleHBvcnRlZC4gVGhlIGxlYWYtbGV2ZWwgbWV0YWRhdGEgb2JqZWN0IGF0IHRoZSBtb21lbnQgb25seSBjb250YWlucyBhXG4gKiBgd2hlcmVVc2VkYCBwcm9wZXJ0eSwgd2hpY2ggY29udGFpbnMgYSBTZXQgb2YgcGF0aHMgdG8gbW9kdWxlcyB0aGF0IGltcG9ydFxuICogdGhlIG5hbWUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBmaWxlIG5hbWVkIGJhci5qcyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhwb3J0czpcbiAqXG4gKiAgIGNvbnN0IG8yID0gJ2Jhcic7XG4gKiAgIGV4cG9ydCB7IG8yIH07XG4gKlxuICogQW5kIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGltcG9ydDpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdiYXIuanMnID0+IE1hcCB7ICdvMicgPT4geyB3aGVyZVVzZWQ6IFNldCB7ICdmb28uanMnIH0gfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgb2JqZWN0Pj59XG4gKi9cbmNvbnN0IGV4cG9ydExpc3QgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHZpc2l0b3JLZXlNYXAgPSBuZXcgTWFwKCk7XG5cbi8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBpZ25vcmVkRmlsZXMgPSBuZXcgU2V0KCk7XG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IGlzTm9kZU1vZHVsZSA9IChwYXRoKSA9PiAoL1xcLyhub2RlX21vZHVsZXMpXFwvLykudGVzdChwYXRoKTtcblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKiBAdHlwZSB7KHNyYzogc3RyaW5nLCBpZ25vcmVFeHBvcnRzOiBzdHJpbmcsIGNvbnRleHQ6IGltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dCkgPT4gU2V0PHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWxlcyhzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpO1xuXG4gIGNvbnN0IHNyY0ZpbGVMaXN0ID0gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucywgY29udGV4dCk7XG5cbiAgLy8gcHJlcGFyZSBsaXN0IG9mIGlnbm9yZWQgZmlsZXNcbiAgY29uc3QgaWdub3JlZEZpbGVzTGlzdCA9IGxpc3RGaWxlc1RvUHJvY2VzcyhpZ25vcmVFeHBvcnRzLCBleHRlbnNpb25zLCBjb250ZXh0KTtcblxuICAvLyBUaGUgbW9kZXJuIGFwaSB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZSBwYXRocywgcmF0aGVyIHRoYW4gYW4gb2JqZWN0XG4gIGlmIChpZ25vcmVkRmlsZXNMaXN0Lmxlbmd0aCAmJiB0eXBlb2YgaWdub3JlZEZpbGVzTGlzdFswXSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZ25vcmVkRmlsZXNMaXN0LmZvckVhY2goKGZpbGVuYW1lKSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgaWdub3JlZEZpbGVzTGlzdC5mb3JFYWNoKCh7IGZpbGVuYW1lIH0pID0+IGlnbm9yZWRGaWxlcy5hZGQoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBzb3VyY2UgZmlsZXMsIGRvbid0IGNvbnNpZGVyIGZpbGVzIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBzcmNGaWxlTGlzdC5sZW5ndGggJiYgdHlwZW9mIHNyY0ZpbGVMaXN0WzBdID09PSAnc3RyaW5nJ1xuICAgID8gc3JjRmlsZUxpc3QuZmlsdGVyKChmaWxlUGF0aCkgPT4gIWlzTm9kZU1vZHVsZShmaWxlUGF0aCkpXG4gICAgOiBmbGF0TWFwKHNyY0ZpbGVMaXN0LCAoeyBmaWxlbmFtZSB9KSA9PiBpc05vZGVNb2R1bGUoZmlsZW5hbWUpID8gW10gOiBmaWxlbmFtZSk7XG5cbiAgcmV0dXJuIG5ldyBTZXQocmVzb2x2ZWRGaWxlcyk7XG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKTtcbiAgc3JjRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBjdXJyZW50RXhwb3J0cyA9IEV4cG9ydE1hcEJ1aWxkZXIuZ2V0KGZpbGUsIGNvbnRleHQpO1xuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlZXhwb3J0cyxcbiAgICAgICAgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZpc2l0b3JLZXlzLFxuICAgICAgfSA9IGN1cnJlbnRFeHBvcnRzO1xuXG4gICAgICB2aXNpdG9yS2V5TWFwLnNldChmaWxlLCB2aXNpdG9yS2V5cyk7XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KCk7XG4gICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoZ2V0RGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpO1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRFeHBvcnRBbGwuYWRkKGRlcGVuZGVuY3kucGF0aCk7XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEFsbC5zZXQoZmlsZSwgY3VycmVudEV4cG9ydEFsbCk7XG5cbiAgICAgIHJlZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZXhwb3J0ID0gdmFsdWUuZ2V0SW1wb3J0KCk7XG4gICAgICAgIGlmICghcmVleHBvcnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsSW1wb3J0ID0gaW1wb3J0cy5nZXQocmVleHBvcnQucGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZS5sb2NhbCA9PT0gREVGQVVMVCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2YWx1ZS5sb2NhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbY3VycmVudFZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaW1wb3J0cy5zZXQocmVleHBvcnQucGF0aCwgbG9jYWxJbXBvcnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGxvY2FsSW1wb3J0TGlzdC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc05vZGVNb2R1bGUoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KGtleSkgfHwgbmV3IFNldCgpO1xuICAgICAgICB2YWx1ZS5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoeyBpbXBvcnRlZFNwZWNpZmllcnMgfSkgPT4ge1xuICAgICAgICAgIGltcG9ydGVkU3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgIGxvY2FsSW1wb3J0LmFkZChzcGVjaWZpZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaW1wb3J0cy5zZXQoa2V5LCBsb2NhbEltcG9ydCk7XG4gICAgICB9KTtcbiAgICAgIGltcG9ydExpc3Quc2V0KGZpbGUsIGltcG9ydHMpO1xuXG4gICAgICAvLyBidWlsZCB1cCBleHBvcnQgbGlzdCBvbmx5LCBpZiBmaWxlIGlzIG5vdCBpZ25vcmVkXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuYW1lc3BhY2UuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0TGlzdC5zZXQoZmlsZSwgZXhwb3J0cyk7XG4gIH0pO1xuICBleHBvcnRBbGwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHZhbHVlLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWwpO1xuICAgICAgaWYgKGN1cnJlbnRFeHBvcnRzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnQgPSBjdXJyZW50RXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogdHJhdmVyc2UgdGhyb3VnaCBhbGwgaW1wb3J0cyBhbmQgYWRkIHRoZSByZXNwZWN0aXZlIHBhdGggdG8gdGhlIHdoZXJlVXNlZC1saXN0XG4gKiBvZiB0aGUgY29ycmVzcG9uZGluZyBleHBvcnRcbiAqL1xuY29uc3QgZGV0ZXJtaW5lVXNhZ2UgPSAoKSA9PiB7XG4gIGltcG9ydExpc3QuZm9yRWFjaCgobGlzdFZhbHVlLCBsaXN0S2V5KSA9PiB7XG4gICAgbGlzdFZhbHVlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChjdXJyZW50SW1wb3J0KSA9PiB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllcjtcbiAgICAgICAgICBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgICAgICBzcGVjaWZpZXIgPSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IGN1cnJlbnRJbXBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0U3RhdGVtZW50ID0gZXhwb3J0cy5nZXQoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjb25zdCB7IHdoZXJlVXNlZCB9ID0gZXhwb3J0U3RhdGVtZW50O1xuICAgICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGxpc3RLZXkpO1xuICAgICAgICAgICAgICBleHBvcnRzLnNldChzcGVjaWZpZXIsIHsgd2hlcmVVc2VkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0U3JjID0gKHNyYykgPT4ge1xuICBpZiAoc3JjKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuICByZXR1cm4gW3Byb2Nlc3MuY3dkKCldO1xufTtcblxuLyoqXG4gKiBwcmVwYXJlIHRoZSBsaXN0cyBvZiBleGlzdGluZyBpbXBvcnRzIGFuZCBleHBvcnRzIC0gc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhdFxuICogdGhlIHN0YXJ0IG9mIGEgbmV3IGVzbGludCBydW5cbiAqL1xuLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmxldCBzcmNGaWxlcztcbmxldCBsYXN0UHJlcGFyZUtleTtcbmNvbnN0IGRvUHJlcGFyYXRpb24gPSAoc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHByZXBhcmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgc3JjOiAoc3JjIHx8IFtdKS5zb3J0KCksXG4gICAgaWdub3JlRXhwb3J0czogKGlnbm9yZUV4cG9ydHMgfHwgW10pLnNvcnQoKSxcbiAgICBleHRlbnNpb25zOiBBcnJheS5mcm9tKGdldEZpbGVFeHRlbnNpb25zKGNvbnRleHQuc2V0dGluZ3MpKS5zb3J0KCksXG4gIH0pO1xuICBpZiAocHJlcGFyZUtleSA9PT0gbGFzdFByZXBhcmVLZXkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbXBvcnRMaXN0LmNsZWFyKCk7XG4gIGV4cG9ydExpc3QuY2xlYXIoKTtcbiAgaWdub3JlZEZpbGVzLmNsZWFyKCk7XG4gIGZpbGVzT3V0c2lkZVNyYy5jbGVhcigpO1xuXG4gIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzKHNyY0ZpbGVzLCBjb250ZXh0KTtcbiAgZGV0ZXJtaW5lVXNhZ2UoKTtcbiAgbGFzdFByZXBhcmVLZXkgPSBwcmVwYXJlS2V5O1xufTtcblxuY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzID0gKHNwZWNpZmllcnMpID0+IHNwZWNpZmllcnMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuY29uc3QgbmV3RGVmYXVsdEltcG9ydEV4aXN0cyA9IChzcGVjaWZpZXJzKSA9PiBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuXG5jb25zdCBmaWxlSXNJblBrZyA9IChmaWxlKSA9PiB7XG4gIGNvbnN0IHsgcGF0aCwgcGtnIH0gPSByZWFkUGtnVXAoeyBjd2Q6IGZpbGUgfSk7XG4gIGNvbnN0IGJhc2VQYXRoID0gZGlybmFtZShwYXRoKTtcblxuICBjb25zdCBjaGVja1BrZ0ZpZWxkU3RyaW5nID0gKHBrZ0ZpZWxkKSA9PiB7XG4gICAgaWYgKGpvaW4oYmFzZVBhdGgsIHBrZ0ZpZWxkKSA9PT0gZmlsZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGRPYmplY3QgPSAocGtnRmllbGQpID0+IHtcbiAgICBjb25zdCBwa2dGaWVsZEZpbGVzID0gZmxhdE1hcCh2YWx1ZXMocGtnRmllbGQpLCAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gW10gOiBqb2luKGJhc2VQYXRoLCB2YWx1ZSkpO1xuXG4gICAgaWYgKGluY2x1ZGVzKHBrZ0ZpZWxkRmlsZXMsIGZpbGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZCA9IChwa2dGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGtnRmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY2hlY2tQa2dGaWVsZFN0cmluZyhwa2dGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkT2JqZWN0KHBrZ0ZpZWxkKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKHBrZy5wcml2YXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBrZy5iaW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYmluKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5icm93c2VyKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJyb3dzZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLm1haW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZFN0cmluZyhwa2cubWFpbikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnSGVscGZ1bCB3YXJuaW5ncycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvcmJpZCBtb2R1bGVzIHdpdGhvdXQgZXhwb3J0cywgb3IgZXhwb3J0cyB3aXRob3V0IG1hdGNoaW5nIGltcG9ydCBpbiBhbm90aGVyIG1vZHVsZS4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCduby11bnVzZWQtbW9kdWxlcycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBzcmM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIHRvIGJlIGFuYWx5emVkIChvbmx5IGZvciB1bnVzZWQgZXhwb3J0cyknLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZUV4cG9ydHM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIGZvciB3aGljaCB1bnVzZWQgZXhwb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCAoZS5nIG1vZHVsZSBlbnRyeSBwb2ludHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAncmVwb3J0IG1vZHVsZXMgd2l0aG91dCBhbnkgZXhwb3J0cycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB1bnVzZWRFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnaWdub3JlIHR5cGUgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgICAgc3JjOiB7XG4gICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VudXNlZEV4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1pc3NpbmdFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfV0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzcmMsXG4gICAgICBpZ25vcmVFeHBvcnRzID0gW10sXG4gICAgICBtaXNzaW5nRXhwb3J0cyxcbiAgICAgIHVudXNlZEV4cG9ydHMsXG4gICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9O1xuXG4gICAgaWYgKHVudXNlZEV4cG9ydHMpIHtcbiAgICAgIGRvUHJlcGFyYXRpb24oc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZ2V0UGh5c2ljYWxGaWxlbmFtZShjb250ZXh0KTtcblxuICAgIGNvbnN0IGNoZWNrRXhwb3J0UHJlc2VuY2UgPSAobm9kZSkgPT4ge1xuICAgICAgaWYgKCFtaXNzaW5nRXhwb3J0cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0Q291bnQgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydENvdW50LmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydHMgPSBleHBvcnRDb3VudC5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuICAgICAgaWYgKGV4cG9ydENvdW50LnNpemUgPCAxKSB7XG4gICAgICAgIC8vIG5vZGUuYm9keVswXSA9PT0gJ3VuZGVmaW5lZCcgb25seSBoYXBwZW5zLCBpZiBldmVyeXRoaW5nIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIGZpbGVcbiAgICAgICAgLy8gYmVpbmcgbGludGVkXG4gICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUuYm9keVswXSA/IG5vZGUuYm9keVswXSA6IG5vZGUsICdObyBleHBvcnRzIGZvdW5kJyk7XG4gICAgICB9XG4gICAgICBleHBvcnRDb3VudC5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgZXhwb3J0QWxsKTtcbiAgICAgIGV4cG9ydENvdW50LnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNoZWNrVXNhZ2UgPSAobm9kZSwgZXhwb3J0ZWRWYWx1ZSwgaXNUeXBlRXhwb3J0KSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlRXhwb3J0ICYmIGlnbm9yZVVudXNlZFR5cGVFeHBvcnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUlzSW5Qa2coZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNPdXRzaWRlU3JjLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIHRvIGJlIGxpbnRlZCBpcyBpbmNsdWRlZCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcmNGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlc091dHNpZGVTcmMuYWRkKGZpbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSk7XG5cbiAgICAgIGlmICghZXhwb3J0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmaWxlIFxcYCR7ZmlsZX1cXGAgaGFzIG5vIGV4cG9ydHMuIFBsZWFzZSB1cGRhdGUgdG8gdGhlIGxhdGVzdCwgYW5kIGlmIGl0IHN0aWxsIGhhcHBlbnMsIHJlcG9ydCB0aGlzIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9pbXBvcnQtanMvZXNsaW50LXBsdWdpbi1pbXBvcnQvaXNzdWVzLzI4NjYhYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogZXhwb3J0ICogZnJvbVxuICAgICAgY29uc3QgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBpZiAodHlwZW9mIGV4cG9ydEFsbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgIGlmIChleHBvcnRBbGwud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbmFtZXNwYWNlIGltcG9ydFxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydHMud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9ydHNMaXN0IHdpbGwgYWx3YXlzIG1hcCBhbnkgaW1wb3J0ZWQgdmFsdWUgb2YgJ2RlZmF1bHQnIHRvICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJ1xuICAgICAgY29uc3QgZXhwb3J0c0tleSA9IGV4cG9ydGVkVmFsdWUgPT09IERFRkFVTFQgPyBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgOiBleHBvcnRlZFZhbHVlO1xuXG4gICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChleHBvcnRzS2V5KTtcblxuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRzS2V5ID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgPyBERUZBVUxUIDogZXhwb3J0c0tleTtcblxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChleHBvcnRTdGF0ZW1lbnQud2hlcmVVc2VkLnNpemUgPCAxKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBvbmx5IHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSB2c2NvZGUtZXNsaW50XG4gICAgICpcbiAgICAgKiB1cGRhdGUgbGlzdHMgb2YgZXhpc3RpbmcgZXhwb3J0cyBkdXJpbmcgcnVudGltZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUV4cG9ydFVzYWdlID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcblxuICAgICAgLy8gbmV3IG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkIGR1cmluZyBydW50aW1lXG4gICAgICAvLyBpbmNsdWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdFeHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0SWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKCh7IHR5cGUsIGRlY2xhcmF0aW9uLCBzcGVjaWZpZXJzIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNwZWNpZmllcnMuZm9yRWFjaCgoc3BlY2lmaWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgfHwgc3BlY2lmaWVyLmV4cG9ydGVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQobmFtZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbmV3IGV4cG9ydCBpZGVudGlmaWVycyBhZGRlZDogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICghZXhwb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBjb25zdCBleHBvcnRBbGwgPSBleHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUltcG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5hbWVzcGFjZUltcG9ydHMgPSB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH07XG4gICAgICB9XG5cbiAgICAgIG5ld0V4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIGV4cG9ydEFsbCk7XG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgICBleHBvcnRMaXN0LnNldChmaWxlLCBuZXdFeHBvcnRzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IChub2RlKSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGlmICh0eXBlb2Ygb2xkSW1wb3J0UGF0aHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9sZEltcG9ydFBhdGhzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGROYW1lc3BhY2VJbXBvcnRzID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKTtcblxuICAgICAgY29uc3Qgb2xkRXhwb3J0QWxsID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0QWxsID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG5ld0RlZmF1bHRJbXBvcnRzID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGRJbXBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgIG9sZEltcG9ydFBhdGhzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmhhcyhFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSkge1xuICAgICAgICAgIG9sZEV4cG9ydEFsbC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaGFzKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKSkge1xuICAgICAgICAgIG9sZE5hbWVzcGFjZUltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUlxuICAgICAgICAgICAgJiYgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09ICdMaXRlcmFsJykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSByZXNvbHZlKHNvdXJjZS52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgdmlzaXQobm9kZSwgdmlzaXRvcktleU1hcC5nZXQoZmlsZSksIHtcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbihjaGlsZCkge1xuICAgICAgICAgIHByb2Nlc3NEeW5hbWljSW1wb3J0KGNoaWxkLnNvdXJjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIENhbGxFeHByZXNzaW9uKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmNhbGxlZS50eXBlID09PSAnSW1wb3J0Jykge1xuICAgICAgICAgICAgcHJvY2Vzc0R5bmFtaWNJbXBvcnQoY2hpbGQuYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbm9kZS5ib2R5LmZvckVhY2goKGFzdE5vZGUpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aDtcblxuICAgICAgICAvLyBzdXBwb3J0IGZvciBleHBvcnQgeyB2YWx1ZSB9IGZyb20gJ21vZHVsZSdcbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgaWYgKGFzdE5vZGUuc291cmNlKSB7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlKGFzdE5vZGUuc291cmNlLnJhdy5yZXBsYWNlKC8oJ3xcIikvZywgJycpLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNwZWNpZmllci5sb2NhbC5uYW1lIHx8IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChuYW1lLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXN0Tm9kZS50eXBlID09PSBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgbmV3RXhwb3J0QWxsLmFkZChyZXNvbHZlZFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNOb2RlTW9kdWxlKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzKGFzdE5vZGUuc3BlY2lmaWVycykpIHtcbiAgICAgICAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld0RlZmF1bHRJbXBvcnRFeGlzdHMoYXN0Tm9kZS5zcGVjaWZpZXJzKSkge1xuICAgICAgICAgICAgbmV3RGVmYXVsdEltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXN0Tm9kZS5zcGVjaWZpZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChzcGVjaWZpZXIpID0+IHNwZWNpZmllci50eXBlICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgJiYgc3BlY2lmaWVyLnR5cGUgIT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuaW1wb3J0ZWQudmFsdWUsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0V4cG9ydEFsbC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEV4cG9ydEFsbC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cyk7XG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydDtcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRXhwb3J0QWxsLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghbmV3RXhwb3J0QWxsLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbmV3RGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFvbGREZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKTtcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpO1xuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFuZXdEZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghb2xkTmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkTmFtZXNwYWNlSW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW5ld05hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0ltcG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEltcG9ydHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBsZXQgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoa2V5KTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBvbGRJbXBvcnRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFuZXdJbXBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoa2V5KTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW06ZXhpdCcobm9kZSkge1xuICAgICAgICB1cGRhdGVFeHBvcnRVc2FnZShub2RlKTtcbiAgICAgICAgdXBkYXRlSW1wb3J0VXNhZ2Uobm9kZSk7XG4gICAgICAgIGNoZWNrRXhwb3J0UHJlc2VuY2Uobm9kZSk7XG4gICAgICB9LFxuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY2hlY2tVc2FnZShub2RlLCBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uoc3BlY2lmaWVyLCBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQudmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIobm9kZS5kZWNsYXJhdGlvbiwgKG5hbWUsIGlzVHlwZUV4cG9ydCkgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgbmFtZSwgaXNUeXBlRXhwb3J0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlRmlsZUVudW1lcmF0b3IiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJlIiwiY29kZSIsImxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IiLCJzcmMiLCJleHRlbnNpb25zIiwiRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyIsInByb2Nlc3MiLCJlbnYiLCJpc1VzaW5nRmxhdENvbmZpZyIsInNob3VsZFVzZUZsYXRDb25maWciLCJfIiwiZW51bWVyYXRvciIsIkFycmF5IiwiZnJvbSIsIml0ZXJhdGVGaWxlcyIsImZpbGVQYXRoIiwiaWdub3JlZCIsImZpbGVuYW1lIiwibWVzc2FnZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zIiwib3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MiLCJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJwYXR0ZXJucyIsImNvbmNhdCIsInBhdHRlcm4iLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0IiwiRVhQT1JUX0RFRkFVTFRfREVDTEFSQVRJT04iLCJFWFBPUlRfTkFNRURfREVDTEFSQVRJT04iLCJFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OIiwiSU1QT1JUX0RFQ0xBUkFUSU9OIiwiSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIiLCJJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIiLCJWQVJJQUJMRV9ERUNMQVJBVElPTiIsIkZVTkNUSU9OX0RFQ0xBUkFUSU9OIiwiQ0xBU1NfREVDTEFSQVRJT04iLCJJREVOVElGSUVSIiwiT0JKRUNUX1BBVFRFUk4iLCJBUlJBWV9QQVRURVJOIiwiVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OIiwiVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiIsIlRTX0VOVU1fREVDTEFSQVRJT04iLCJERUZBVUxUIiwiZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllciIsImRlY2xhcmF0aW9uIiwiY2IiLCJpc1R5cGVEZWNsYXJhdGlvbiIsInR5cGUiLCJpZCIsIm5hbWUiLCJkZWNsYXJhdGlvbnMiLCJmb3JFYWNoIiwiZWxlbWVudHMiLCJpbXBvcnRMaXN0IiwiTWFwIiwiZXhwb3J0TGlzdCIsInZpc2l0b3JLZXlNYXAiLCJpZ25vcmVkRmlsZXMiLCJTZXQiLCJmaWxlc091dHNpZGVTcmMiLCJpc05vZGVNb2R1bGUiLCJwYXRoIiwicmVzb2x2ZUZpbGVzIiwiaWdub3JlRXhwb3J0cyIsImNvbnRleHQiLCJzZXR0aW5ncyIsInNyY0ZpbGVMaXN0IiwiaWdub3JlZEZpbGVzTGlzdCIsImxlbmd0aCIsImFkZCIsInJlc29sdmVkRmlsZXMiLCJmaWx0ZXIiLCJwcmVwYXJlSW1wb3J0c0FuZEV4cG9ydHMiLCJzcmNGaWxlcyIsImV4cG9ydEFsbCIsImZpbGUiLCJleHBvcnRzIiwiaW1wb3J0cyIsImN1cnJlbnRFeHBvcnRzIiwiRXhwb3J0TWFwQnVpbGRlciIsImdldCIsImRlcGVuZGVuY2llcyIsInJlZXhwb3J0cyIsImxvY2FsSW1wb3J0TGlzdCIsIm5hbWVzcGFjZSIsInZpc2l0b3JLZXlzIiwic2V0IiwiY3VycmVudEV4cG9ydEFsbCIsImdldERlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwidmFsdWUiLCJrZXkiLCJ3aGVyZVVzZWQiLCJyZWV4cG9ydCIsImdldEltcG9ydCIsImxvY2FsSW1wb3J0IiwiY3VycmVudFZhbHVlIiwibG9jYWwiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJzcGVjaWZpZXIiLCJoYXMiLCJ2YWwiLCJjdXJyZW50RXhwb3J0IiwiZGV0ZXJtaW5lVXNhZ2UiLCJsaXN0VmFsdWUiLCJsaXN0S2V5IiwiY3VycmVudEltcG9ydCIsImV4cG9ydFN0YXRlbWVudCIsImdldFNyYyIsImN3ZCIsImxhc3RQcmVwYXJlS2V5IiwiZG9QcmVwYXJhdGlvbiIsInByZXBhcmVLZXkiLCJKU09OIiwic3RyaW5naWZ5Iiwic29ydCIsImNsZWFyIiwibmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzIiwic3BlY2lmaWVycyIsInNvbWUiLCJuZXdEZWZhdWx0SW1wb3J0RXhpc3RzIiwiZmlsZUlzSW5Qa2ciLCJwa2ciLCJiYXNlUGF0aCIsImNoZWNrUGtnRmllbGRTdHJpbmciLCJwa2dGaWVsZCIsImNoZWNrUGtnRmllbGRPYmplY3QiLCJwa2dGaWVsZEZpbGVzIiwiY2hlY2tQa2dGaWVsZCIsImJpbiIsImJyb3dzZXIiLCJtYWluIiwibW9kdWxlIiwibWV0YSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwic2NoZW1hIiwicHJvcGVydGllcyIsInVuaXF1ZUl0ZW1zIiwiaXRlbXMiLCJtaW5MZW5ndGgiLCJtaXNzaW5nRXhwb3J0cyIsInVudXNlZEV4cG9ydHMiLCJpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyIsImFueU9mIiwibWluSXRlbXMiLCJyZXF1aXJlZCIsImNyZWF0ZSIsIm9wdGlvbnMiLCJjaGVja0V4cG9ydFByZXNlbmNlIiwibm9kZSIsImV4cG9ydENvdW50IiwibmFtZXNwYWNlSW1wb3J0cyIsInNpemUiLCJyZXBvcnQiLCJib2R5IiwiY2hlY2tVc2FnZSIsImV4cG9ydGVkVmFsdWUiLCJpc1R5cGVFeHBvcnQiLCJjb25zb2xlIiwiZXJyb3IiLCJleHBvcnRzS2V5IiwidXBkYXRlRXhwb3J0VXNhZ2UiLCJuZXdFeHBvcnRzIiwibmV3RXhwb3J0SWRlbnRpZmllcnMiLCJleHBvcnRlZCIsInVwZGF0ZUltcG9ydFVzYWdlIiwib2xkSW1wb3J0UGF0aHMiLCJvbGROYW1lc3BhY2VJbXBvcnRzIiwibmV3TmFtZXNwYWNlSW1wb3J0cyIsIm9sZEV4cG9ydEFsbCIsIm5ld0V4cG9ydEFsbCIsIm9sZERlZmF1bHRJbXBvcnRzIiwibmV3RGVmYXVsdEltcG9ydHMiLCJvbGRJbXBvcnRzIiwibmV3SW1wb3J0cyIsInByb2Nlc3NEeW5hbWljSW1wb3J0Iiwic291cmNlIiwicCIsIkltcG9ydEV4cHJlc3Npb24iLCJjaGlsZCIsIkNhbGxFeHByZXNzaW9uIiwiY2FsbGVlIiwiYXJndW1lbnRzIiwiYXN0Tm9kZSIsInJlc29sdmVkUGF0aCIsInJhdyIsInJlcGxhY2UiLCJpbXBvcnRlZCIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7OztBQU1BO0FBQ0E7QUFDQSxzRDtBQUNBLGtEO0FBQ0E7QUFDQSwyRDtBQUNBLHVDO0FBQ0EsK0M7QUFDQSx5RDs7QUFFQSwrQztBQUNBLDZEO0FBQ0EscUMsMlVBbEJBOzs7O29YQW9CQTs7Ozs7dVhBTUEsU0FBU0EscUJBQVQsR0FBaUMsQ0FDL0IsSUFBSUMsdUJBQUo7O0FBRUE7QUFDQSxNQUFJO0FBQ29CQyxZQUFRLDZCQUFSLENBRHBCLENBQ0NELGNBREQsWUFDQ0EsY0FERDtBQUVILEdBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJO0FBQ29CRCxjQUFRLHVDQUFSLENBRHBCLENBQ0NELGNBREQsYUFDQ0EsY0FERDtBQUVILEtBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFVBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxjQUFNRCxDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsU0FBT0YsY0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT0EsU0FBU0ksNEJBQVQsQ0FBc0NKLGNBQXRDLEVBQXNESyxHQUF0RCxFQUEyREMsVUFBM0QsRUFBdUU7QUFDckU7QUFDQTtBQUZxRTtBQUk3REMsd0JBSjZELEdBSWxDQyxRQUFRQyxHQUowQixDQUk3REYsc0JBSjZEOztBQU1yRTtBQUNBLE1BQUlHLG9CQUFvQkgsMEJBQTBCQyxRQUFRQyxHQUFSLENBQVlGLHNCQUFaLEtBQXVDLE9BQXpGOztBQUVBO0FBQ0E7QUFDQSxNQUFJO0FBQzhCTixZQUFRLDZCQUFSLENBRDlCLENBQ01VLG1CQUROLGFBQ01BLG1CQUROO0FBRUZELHdCQUFvQkMsdUJBQXVCSiwyQkFBMkIsT0FBdEU7QUFDRCxHQUhELENBR0UsT0FBT0ssQ0FBUCxFQUFVO0FBQ1Y7QUFDQTtBQUNEOztBQUVELE1BQU1DLGFBQWEsSUFBSWIsY0FBSixDQUFtQjtBQUNwQ00sMEJBRG9DLEVBQW5CLENBQW5COzs7QUFJQSxNQUFJO0FBQ0YsV0FBT1EsTUFBTUMsSUFBTjtBQUNMRixlQUFXRyxZQUFYLENBQXdCWCxHQUF4QixDQURLO0FBRUwseUJBQUdZLFFBQUgsUUFBR0EsUUFBSCxDQUFhQyxPQUFiLFFBQWFBLE9BQWIsUUFBNEIsRUFBRUMsVUFBVUYsUUFBWixFQUFzQkMsZ0JBQXRCLEVBQTVCLEVBRkssQ0FBUDs7QUFJRCxHQUxELENBS0UsT0FBT2hCLENBQVAsRUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0VRO0FBQ0dSLE1BQUVrQixPQUFGLENBQVVDLFFBQVYsQ0FBbUIsK0JBQW5CLENBRkw7QUFHRTtBQUNBLFlBQU0sSUFBSUMsS0FBSixtYUFBTjs7Ozs7Ozs7OztBQVVEO0FBQ0Q7QUFDQSxVQUFNcEIsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTcUIsNEJBQVQsQ0FBc0NsQixHQUF0QyxFQUEyQ0MsVUFBM0MsRUFBdUQ7QUFDckQsTUFBSTtBQUNGO0FBREUsb0JBRXlETCxRQUFRLDRCQUFSLENBRnpELENBRTBCdUIsMEJBRjFCLGFBRU1DLGtCQUZOO0FBR0Y7QUFDQTtBQUNBOztBQUVBLFdBQU9ELDJCQUEyQm5CLEdBQTNCLEVBQWdDO0FBQ3JDQyw0QkFEcUMsRUFBaEMsQ0FBUDs7QUFHRCxHQVZELENBVUUsT0FBT0osQ0FBUCxFQUFVO0FBQ1Y7QUFDQSxRQUFJQSxFQUFFQyxJQUFGLEtBQVcsa0JBQWYsRUFBbUM7QUFDakMsWUFBTUQsQ0FBTjtBQUNEOztBQUVEO0FBTlU7O0FBU05ELFlBQVEsMkJBQVIsQ0FUTSxDQVFZdUIsMkJBUlosYUFRUkMsa0JBUlE7QUFVVixRQUFNQyxXQUFXckIsSUFBSXNCLE1BQUo7QUFDZjtBQUNFdEIsT0FERjtBQUVFLGNBQUN1QixPQUFELFVBQWF0QixXQUFXdUIsR0FBWCxDQUFlLFVBQUNDLFNBQUQsVUFBZ0IsWUFBRCxDQUFjQyxJQUFkLENBQW1CSCxPQUFuQixJQUE4QkEsT0FBOUIsVUFBMkNBLE9BQTNDLHFCQUEwREUsU0FBMUQsQ0FBZixHQUFmLENBQWIsRUFGRixDQURlLENBQWpCOzs7O0FBT0EsV0FBT04sNEJBQTJCRSxRQUEzQixDQUFQO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7OztBQU9BLFNBQVNELGtCQUFULENBQTRCcEIsR0FBNUIsRUFBaUNDLFVBQWpDLEVBQTZDO0FBQzNDLE1BQU1OLGlCQUFpQkQsdUJBQXZCOztBQUVBO0FBQ0EsTUFBSUMsY0FBSixFQUFvQjtBQUNsQixXQUFPSSw2QkFBNkJKLGNBQTdCLEVBQTZDSyxHQUE3QyxFQUFrREMsVUFBbEQsQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxTQUFPaUIsNkJBQTZCbEIsR0FBN0IsRUFBa0NDLFVBQWxDLENBQVA7QUFDRDs7QUFFRCxJQUFNMEIsNkJBQTZCLDBCQUFuQztBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyx5QkFBeUIsc0JBQS9CO0FBQ0EsSUFBTUMscUJBQXFCLG1CQUEzQjtBQUNBLElBQU1DLDZCQUE2QiwwQkFBbkM7QUFDQSxJQUFNQywyQkFBMkIsd0JBQWpDO0FBQ0EsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLHVCQUF1QixxQkFBN0I7QUFDQSxJQUFNQyxvQkFBb0Isa0JBQTFCO0FBQ0EsSUFBTUMsYUFBYSxZQUFuQjtBQUNBLElBQU1DLGlCQUFpQixlQUF2QjtBQUNBLElBQU1DLGdCQUFnQixjQUF0QjtBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyw0QkFBNEIsd0JBQWxDO0FBQ0EsSUFBTUMsc0JBQXNCLG1CQUE1QjtBQUNBLElBQU1DLFVBQVUsU0FBaEI7O0FBRUEsU0FBU0MsNEJBQVQsQ0FBc0NDLFdBQXRDLEVBQW1EQyxFQUFuRCxFQUF1RDtBQUNyRCxNQUFJRCxXQUFKLEVBQWlCO0FBQ2YsUUFBTUUsb0JBQW9CRixZQUFZRyxJQUFaLEtBQXFCUix3QkFBckI7QUFDckJLLGdCQUFZRyxJQUFaLEtBQXFCUCx5QkFEQTtBQUVyQkksZ0JBQVlHLElBQVosS0FBcUJOLG1CQUYxQjs7QUFJQTtBQUNFRyxnQkFBWUcsSUFBWixLQUFxQmIsb0JBQXJCO0FBQ0dVLGdCQUFZRyxJQUFaLEtBQXFCWixpQkFEeEI7QUFFR1cscUJBSEw7QUFJRTtBQUNBRCxTQUFHRCxZQUFZSSxFQUFaLENBQWVDLElBQWxCLEVBQXdCSCxpQkFBeEI7QUFDRCxLQU5ELE1BTU8sSUFBSUYsWUFBWUcsSUFBWixLQUFxQmQsb0JBQXpCLEVBQStDO0FBQ3BEVyxrQkFBWU0sWUFBWixDQUF5QkMsT0FBekIsQ0FBaUMsaUJBQVksS0FBVEgsRUFBUyxTQUFUQSxFQUFTO0FBQzNDLFlBQUlBLEdBQUdELElBQUgsS0FBWVYsY0FBaEIsRUFBZ0M7QUFDOUIsMkNBQXdCVyxFQUF4QixFQUE0QixVQUFDekIsT0FBRCxFQUFhO0FBQ3ZDLGdCQUFJQSxRQUFRd0IsSUFBUixLQUFpQlgsVUFBckIsRUFBaUM7QUFDL0JTLGlCQUFHdEIsUUFBUTBCLElBQVgsRUFBaUIsS0FBakI7QUFDRDtBQUNGLFdBSkQ7QUFLRCxTQU5ELE1BTU8sSUFBSUQsR0FBR0QsSUFBSCxLQUFZVCxhQUFoQixFQUErQjtBQUNwQ1UsYUFBR0ksUUFBSCxDQUFZRCxPQUFaLENBQW9CLGlCQUFjLEtBQVhGLElBQVcsU0FBWEEsSUFBVztBQUNoQ0osZUFBR0ksSUFBSCxFQUFTLEtBQVQ7QUFDRCxXQUZEO0FBR0QsU0FKTSxNQUlBO0FBQ0xKLGFBQUdHLEdBQUdDLElBQU4sRUFBWSxLQUFaO0FBQ0Q7QUFDRixPQWREO0FBZUQ7QUFDRjtBQUNGOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLElBQU1JLGFBQWEsSUFBSUMsR0FBSixFQUFuQjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxJQUFNQyxhQUFhLElBQUlELEdBQUosRUFBbkI7O0FBRUEsSUFBTUUsZ0JBQWdCLElBQUlGLEdBQUosRUFBdEI7O0FBRUE7QUFDQSxJQUFNRyxlQUFlLElBQUlDLEdBQUosRUFBckI7QUFDQSxJQUFNQyxrQkFBa0IsSUFBSUQsR0FBSixFQUF4Qjs7QUFFQSxJQUFNRSxlQUFlLFNBQWZBLFlBQWUsQ0FBQ0MsSUFBRCxVQUFXLHFCQUFELENBQXVCbkMsSUFBdkIsQ0FBNEJtQyxJQUE1QixDQUFWLEdBQXJCOztBQUVBOzs7Ozs7QUFNQSxTQUFTQyxZQUFULENBQXNCOUQsR0FBdEIsRUFBMkIrRCxhQUEzQixFQUEwQ0MsT0FBMUMsRUFBbUQ7QUFDakQsTUFBTS9ELGFBQWFRLE1BQU1DLElBQU4sQ0FBVywrQkFBa0JzRCxRQUFRQyxRQUExQixDQUFYLENBQW5COztBQUVBLE1BQU1DLGNBQWM5QyxtQkFBbUJwQixHQUFuQixFQUF3QkMsVUFBeEIsQ0FBcEI7O0FBRUE7QUFDQSxNQUFNa0UsbUJBQW1CL0MsbUJBQW1CMkMsYUFBbkIsRUFBa0M5RCxVQUFsQyxDQUF6Qjs7QUFFQTtBQUNBLE1BQUlrRSxpQkFBaUJDLE1BQWpCLElBQTJCLE9BQU9ELGlCQUFpQixDQUFqQixDQUFQLEtBQStCLFFBQTlELEVBQXdFO0FBQ3RFQSxxQkFBaUJoQixPQUFqQixDQUF5QixVQUFDckMsUUFBRCxVQUFjMkMsYUFBYVksR0FBYixDQUFpQnZELFFBQWpCLENBQWQsRUFBekI7QUFDRCxHQUZELE1BRU87QUFDTHFELHFCQUFpQmhCLE9BQWpCLENBQXlCLHNCQUFHckMsUUFBSCxTQUFHQSxRQUFILFFBQWtCMkMsYUFBYVksR0FBYixDQUFpQnZELFFBQWpCLENBQWxCLEVBQXpCO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFNd0QsZ0JBQWdCSixZQUFZRSxNQUFaLElBQXNCLE9BQU9GLFlBQVksQ0FBWixDQUFQLEtBQTBCLFFBQWhEO0FBQ2xCQSxjQUFZSyxNQUFaLENBQW1CLFVBQUMzRCxRQUFELFVBQWMsQ0FBQ2dELGFBQWFoRCxRQUFiLENBQWYsRUFBbkIsQ0FEa0I7QUFFbEIsbUNBQVFzRCxXQUFSLEVBQXFCLHNCQUFHcEQsUUFBSCxTQUFHQSxRQUFILFFBQWtCOEMsYUFBYTlDLFFBQWIsSUFBeUIsRUFBekIsR0FBOEJBLFFBQWhELEVBQXJCLENBRko7O0FBSUEsU0FBTyxJQUFJNEMsR0FBSixDQUFRWSxhQUFSLENBQVA7QUFDRDs7QUFFRDs7O0FBR0EsSUFBTUUsMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsUUFBRCxFQUFXVCxPQUFYLEVBQXVCO0FBQ3RELE1BQU1VLFlBQVksSUFBSXBCLEdBQUosRUFBbEI7QUFDQW1CLFdBQVN0QixPQUFULENBQWlCLFVBQUN3QixJQUFELEVBQVU7QUFDekIsUUFBTUMsVUFBVSxJQUFJdEIsR0FBSixFQUFoQjtBQUNBLFFBQU11QixVQUFVLElBQUl2QixHQUFKLEVBQWhCO0FBQ0EsUUFBTXdCLGlCQUFpQkMscUJBQWlCQyxHQUFqQixDQUFxQkwsSUFBckIsRUFBMkJYLE9BQTNCLENBQXZCO0FBQ0EsUUFBSWMsY0FBSixFQUFvQjs7QUFFaEJHLGtCQUZnQjs7Ozs7QUFPZEgsb0JBUGMsQ0FFaEJHLFlBRmdCLENBR2hCQyxTQUhnQixHQU9kSixjQVBjLENBR2hCSSxTQUhnQixDQUlQQyxlQUpPLEdBT2RMLGNBUGMsQ0FJaEJELE9BSmdCLENBS2hCTyxTQUxnQixHQU9kTixjQVBjLENBS2hCTSxTQUxnQixDQU1oQkMsV0FOZ0IsR0FPZFAsY0FQYyxDQU1oQk8sV0FOZ0I7O0FBU2xCN0Isb0JBQWM4QixHQUFkLENBQWtCWCxJQUFsQixFQUF3QlUsV0FBeEI7QUFDQTtBQUNBLFVBQU1FLG1CQUFtQixJQUFJN0IsR0FBSixFQUF6QjtBQUNBdUIsbUJBQWE5QixPQUFiLENBQXFCLFVBQUNxQyxhQUFELEVBQW1CO0FBQ3RDLFlBQU1DLGFBQWFELGVBQW5CO0FBQ0EsWUFBSUMsZUFBZSxJQUFuQixFQUF5QjtBQUN2QjtBQUNEOztBQUVERix5QkFBaUJsQixHQUFqQixDQUFxQm9CLFdBQVc1QixJQUFoQztBQUNELE9BUEQ7QUFRQWEsZ0JBQVVZLEdBQVYsQ0FBY1gsSUFBZCxFQUFvQlksZ0JBQXBCOztBQUVBTCxnQkFBVS9CLE9BQVYsQ0FBa0IsVUFBQ3VDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxZQUFJQSxRQUFRakQsT0FBWixFQUFxQjtBQUNuQmtDLGtCQUFRVSxHQUFSLENBQVl0RCx3QkFBWixFQUFzQyxFQUFFNEQsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQXRDO0FBQ0QsU0FGRCxNQUVPO0FBQ0xrQixrQkFBUVUsR0FBUixDQUFZSyxHQUFaLEVBQWlCLEVBQUVDLFdBQVcsSUFBSWxDLEdBQUosRUFBYixFQUFqQjtBQUNEO0FBQ0QsWUFBTW1DLFdBQVdILE1BQU1JLFNBQU4sRUFBakI7QUFDQSxZQUFJLENBQUNELFFBQUwsRUFBZTtBQUNiO0FBQ0Q7QUFDRCxZQUFJRSxjQUFjbEIsUUFBUUcsR0FBUixDQUFZYSxTQUFTaEMsSUFBckIsQ0FBbEI7QUFDQSxZQUFJbUMscUJBQUo7QUFDQSxZQUFJTixNQUFNTyxLQUFOLEtBQWdCdkQsT0FBcEIsRUFBNkI7QUFDM0JzRCx5QkFBZWhFLHdCQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xnRSx5QkFBZU4sTUFBTU8sS0FBckI7QUFDRDtBQUNELFlBQUksT0FBT0YsV0FBUCxLQUF1QixXQUEzQixFQUF3QztBQUN0Q0Esd0JBQWMsSUFBSXJDLEdBQUosOEJBQVlxQyxXQUFaLElBQXlCQyxZQUF6QixHQUFkO0FBQ0QsU0FGRCxNQUVPO0FBQ0xELHdCQUFjLElBQUlyQyxHQUFKLENBQVEsQ0FBQ3NDLFlBQUQsQ0FBUixDQUFkO0FBQ0Q7QUFDRG5CLGdCQUFRUyxHQUFSLENBQVlPLFNBQVNoQyxJQUFyQixFQUEyQmtDLFdBQTNCO0FBQ0QsT0F2QkQ7O0FBeUJBWixzQkFBZ0JoQyxPQUFoQixDQUF3QixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3RDLFlBQUkvQixhQUFhK0IsR0FBYixDQUFKLEVBQXVCO0FBQ3JCO0FBQ0Q7QUFDRCxZQUFNSSxjQUFjbEIsUUFBUUcsR0FBUixDQUFZVyxHQUFaLEtBQW9CLElBQUlqQyxHQUFKLEVBQXhDO0FBQ0FnQyxjQUFNeEMsWUFBTixDQUFtQkMsT0FBbkIsQ0FBMkIsaUJBQTRCLEtBQXpCK0Msa0JBQXlCLFNBQXpCQSxrQkFBeUI7QUFDckRBLDZCQUFtQi9DLE9BQW5CLENBQTJCLFVBQUNnRCxTQUFELEVBQWU7QUFDeENKLHdCQUFZMUIsR0FBWixDQUFnQjhCLFNBQWhCO0FBQ0QsV0FGRDtBQUdELFNBSkQ7QUFLQXRCLGdCQUFRUyxHQUFSLENBQVlLLEdBQVosRUFBaUJJLFdBQWpCO0FBQ0QsT0FYRDtBQVlBMUMsaUJBQVdpQyxHQUFYLENBQWVYLElBQWYsRUFBcUJFLE9BQXJCOztBQUVBO0FBQ0EsVUFBSXBCLGFBQWEyQyxHQUFiLENBQWlCekIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQjtBQUNEO0FBQ0RTLGdCQUFVakMsT0FBVixDQUFrQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFlBQUlBLFFBQVFqRCxPQUFaLEVBQXFCO0FBQ25Ca0Msa0JBQVFVLEdBQVIsQ0FBWXRELHdCQUFaLEVBQXNDLEVBQUU0RCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBdEM7QUFDRCxTQUZELE1BRU87QUFDTGtCLGtCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQWpCO0FBQ0Q7QUFDRixPQU5EO0FBT0Q7QUFDRGtCLFlBQVFVLEdBQVIsQ0FBWXpELHNCQUFaLEVBQW9DLEVBQUUrRCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBcEM7QUFDQWtCLFlBQVFVLEdBQVIsQ0FBWXZELDBCQUFaLEVBQXdDLEVBQUU2RCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBeEM7QUFDQUgsZUFBVytCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQkMsT0FBckI7QUFDRCxHQWhGRDtBQWlGQUYsWUFBVXZCLE9BQVYsQ0FBa0IsVUFBQ3VDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQ0QsVUFBTXZDLE9BQU4sQ0FBYyxVQUFDa0QsR0FBRCxFQUFTO0FBQ3JCLFVBQU12QixpQkFBaUJ2QixXQUFXeUIsR0FBWCxDQUFlcUIsR0FBZixDQUF2QjtBQUNBLFVBQUl2QixjQUFKLEVBQW9CO0FBQ2xCLFlBQU13QixnQkFBZ0J4QixlQUFlRSxHQUFmLENBQW1CbkQsc0JBQW5CLENBQXRCO0FBQ0F5RSxzQkFBY1YsU0FBZCxDQUF3QnZCLEdBQXhCLENBQTRCc0IsR0FBNUI7QUFDRDtBQUNGLEtBTkQ7QUFPRCxHQVJEO0FBU0QsQ0E1RkQ7O0FBOEZBOzs7O0FBSUEsSUFBTVksaUJBQWlCLFNBQWpCQSxjQUFpQixHQUFNO0FBQzNCbEQsYUFBV0YsT0FBWCxDQUFtQixVQUFDcUQsU0FBRCxFQUFZQyxPQUFaLEVBQXdCO0FBQ3pDRCxjQUFVckQsT0FBVixDQUFrQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFVBQU1mLFVBQVVyQixXQUFXeUIsR0FBWCxDQUFlVyxHQUFmLENBQWhCO0FBQ0EsVUFBSSxPQUFPZixPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDYyxjQUFNdkMsT0FBTixDQUFjLFVBQUN1RCxhQUFELEVBQW1CO0FBQy9CLGNBQUlQLGtCQUFKO0FBQ0EsY0FBSU8sa0JBQWtCM0UsMEJBQXRCLEVBQWtEO0FBQ2hEb0Usd0JBQVlwRSwwQkFBWjtBQUNELFdBRkQsTUFFTyxJQUFJMkUsa0JBQWtCMUUsd0JBQXRCLEVBQWdEO0FBQ3JEbUUsd0JBQVluRSx3QkFBWjtBQUNELFdBRk0sTUFFQTtBQUNMbUUsd0JBQVlPLGFBQVo7QUFDRDtBQUNELGNBQUksT0FBT1AsU0FBUCxLQUFxQixXQUF6QixFQUFzQztBQUNwQyxnQkFBTVEsa0JBQWtCL0IsUUFBUUksR0FBUixDQUFZbUIsU0FBWixDQUF4QjtBQUNBLGdCQUFJLE9BQU9RLGVBQVAsS0FBMkIsV0FBL0IsRUFBNEM7QUFDbENmLHVCQURrQyxHQUNwQmUsZUFEb0IsQ0FDbENmLFNBRGtDO0FBRTFDQSx3QkFBVXZCLEdBQVYsQ0FBY29DLE9BQWQ7QUFDQTdCLHNCQUFRVSxHQUFSLENBQVlhLFNBQVosRUFBdUIsRUFBRVAsb0JBQUYsRUFBdkI7QUFDRDtBQUNGO0FBQ0YsU0FqQkQ7QUFrQkQ7QUFDRixLQXRCRDtBQXVCRCxHQXhCRDtBQXlCRCxDQTFCRDs7QUE0QkEsSUFBTWdCLFNBQVMsU0FBVEEsTUFBUyxDQUFDNUcsR0FBRCxFQUFTO0FBQ3RCLE1BQUlBLEdBQUosRUFBUztBQUNQLFdBQU9BLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQ0csUUFBUTBHLEdBQVIsRUFBRCxDQUFQO0FBQ0QsQ0FMRDs7QUFPQTs7OztBQUlBO0FBQ0EsSUFBSXBDLGlCQUFKO0FBQ0EsSUFBSXFDLHVCQUFKO0FBQ0EsSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDL0csR0FBRCxFQUFNK0QsYUFBTixFQUFxQkMsT0FBckIsRUFBaUM7QUFDckQsTUFBTWdELGFBQWFDLEtBQUtDLFNBQUwsQ0FBZTtBQUNoQ2xILFNBQUssQ0FBQ0EsT0FBTyxFQUFSLEVBQVltSCxJQUFaLEVBRDJCO0FBRWhDcEQsbUJBQWUsQ0FBQ0EsaUJBQWlCLEVBQWxCLEVBQXNCb0QsSUFBdEIsRUFGaUI7QUFHaENsSCxnQkFBWVEsTUFBTUMsSUFBTixDQUFXLCtCQUFrQnNELFFBQVFDLFFBQTFCLENBQVgsRUFBZ0RrRCxJQUFoRCxFQUhvQixFQUFmLENBQW5COztBQUtBLE1BQUlILGVBQWVGLGNBQW5CLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUR6RCxhQUFXK0QsS0FBWDtBQUNBN0QsYUFBVzZELEtBQVg7QUFDQTNELGVBQWEyRCxLQUFiO0FBQ0F6RCxrQkFBZ0J5RCxLQUFoQjs7QUFFQTNDLGFBQVdYLGFBQWE4QyxPQUFPNUcsR0FBUCxDQUFiLEVBQTBCK0QsYUFBMUIsRUFBeUNDLE9BQXpDLENBQVg7QUFDQVEsMkJBQXlCQyxRQUF6QixFQUFtQ1QsT0FBbkM7QUFDQXVDO0FBQ0FPLG1CQUFpQkUsVUFBakI7QUFDRCxDQW5CRDs7QUFxQkEsSUFBTUssMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsVUFBRCxVQUFnQkEsV0FBV0MsSUFBWCxDQUFnQixzQkFBR3hFLElBQUgsU0FBR0EsSUFBSCxRQUFjQSxTQUFTaEIsMEJBQXZCLEVBQWhCLENBQWhCLEVBQWpDOztBQUVBLElBQU15Rix5QkFBeUIsU0FBekJBLHNCQUF5QixDQUFDRixVQUFELFVBQWdCQSxXQUFXQyxJQUFYLENBQWdCLHNCQUFHeEUsSUFBSCxTQUFHQSxJQUFILFFBQWNBLFNBQVNmLHdCQUF2QixFQUFoQixDQUFoQixFQUEvQjs7QUFFQSxJQUFNeUYsY0FBYyxTQUFkQSxXQUFjLENBQUM5QyxJQUFELEVBQVU7QUFDTiw4QkFBVSxFQUFFa0MsS0FBS2xDLElBQVAsRUFBVixDQURNLENBQ3BCZCxJQURvQixjQUNwQkEsSUFEb0IsQ0FDZDZELEdBRGMsY0FDZEEsR0FEYztBQUU1QixNQUFNQyxXQUFXLG1CQUFROUQsSUFBUixDQUFqQjs7QUFFQSxNQUFNK0Qsc0JBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0MsUUFBRCxFQUFjO0FBQ3hDLFFBQUksZ0JBQUtGLFFBQUwsRUFBZUUsUUFBZixNQUE2QmxELElBQWpDLEVBQXVDO0FBQ3JDLGFBQU8sSUFBUDtBQUNEO0FBQ0YsR0FKRDs7QUFNQSxNQUFNbUQsc0JBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0QsUUFBRCxFQUFjO0FBQ3hDLFFBQU1FLGdCQUFnQixpQ0FBUSx5QkFBT0YsUUFBUCxDQUFSLEVBQTBCLFVBQUNuQyxLQUFELFVBQVcsT0FBT0EsS0FBUCxLQUFpQixTQUFqQixHQUE2QixFQUE3QixHQUFrQyxnQkFBS2lDLFFBQUwsRUFBZWpDLEtBQWYsQ0FBN0MsRUFBMUIsQ0FBdEI7O0FBRUEsUUFBSSxnQ0FBU3FDLGFBQVQsRUFBd0JwRCxJQUF4QixDQUFKLEVBQW1DO0FBQ2pDLGFBQU8sSUFBUDtBQUNEO0FBQ0YsR0FORDs7QUFRQSxNQUFNcUQsZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDSCxRQUFELEVBQWM7QUFDbEMsUUFBSSxPQUFPQSxRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQ2hDLGFBQU9ELG9CQUFvQkMsUUFBcEIsQ0FBUDtBQUNEOztBQUVELFFBQUksUUFBT0EsUUFBUCx5Q0FBT0EsUUFBUCxPQUFvQixRQUF4QixFQUFrQztBQUNoQyxhQUFPQyxvQkFBb0JELFFBQXBCLENBQVA7QUFDRDtBQUNGLEdBUkQ7O0FBVUEsTUFBSUgsbUJBQWdCLElBQXBCLEVBQTBCO0FBQ3hCLFdBQU8sS0FBUDtBQUNEOztBQUVELE1BQUlBLElBQUlPLEdBQVIsRUFBYTtBQUNYLFFBQUlELGNBQWNOLElBQUlPLEdBQWxCLENBQUosRUFBNEI7QUFDMUIsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxNQUFJUCxJQUFJUSxPQUFSLEVBQWlCO0FBQ2YsUUFBSUYsY0FBY04sSUFBSVEsT0FBbEIsQ0FBSixFQUFnQztBQUM5QixhQUFPLElBQVA7QUFDRDtBQUNGOztBQUVELE1BQUlSLElBQUlTLElBQVIsRUFBYztBQUNaLFFBQUlQLG9CQUFvQkYsSUFBSVMsSUFBeEIsQ0FBSixFQUFtQztBQUNqQyxhQUFPLElBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sS0FBUDtBQUNELENBbkREOztBQXFEQUMsT0FBT3hELE9BQVAsR0FBaUI7QUFDZnlELFFBQU07QUFDSnRGLFVBQU0sWUFERjtBQUVKdUYsVUFBTTtBQUNKQyxnQkFBVSxrQkFETjtBQUVKQyxtQkFBYSx1RkFGVDtBQUdKQyxXQUFLLDBCQUFRLG1CQUFSLENBSEQsRUFGRjs7QUFPSkMsWUFBUSxDQUFDO0FBQ1BDLGtCQUFZO0FBQ1YzSSxhQUFLO0FBQ0h3SSx1QkFBYSxzREFEVjtBQUVIekYsZ0JBQU0sT0FGSDtBQUdINkYsdUJBQWEsSUFIVjtBQUlIQyxpQkFBTztBQUNMOUYsa0JBQU0sUUFERDtBQUVMK0YsdUJBQVcsQ0FGTixFQUpKLEVBREs7OztBQVVWL0UsdUJBQWU7QUFDYnlFLHVCQUFhLHFGQURBO0FBRWJ6RixnQkFBTSxPQUZPO0FBR2I2Rix1QkFBYSxJQUhBO0FBSWJDLGlCQUFPO0FBQ0w5RixrQkFBTSxRQUREO0FBRUwrRix1QkFBVyxDQUZOLEVBSk0sRUFWTDs7O0FBbUJWQyx3QkFBZ0I7QUFDZFAsdUJBQWEsb0NBREM7QUFFZHpGLGdCQUFNLFNBRlEsRUFuQk47O0FBdUJWaUcsdUJBQWU7QUFDYlIsdUJBQWEsa0NBREE7QUFFYnpGLGdCQUFNLFNBRk8sRUF2Qkw7O0FBMkJWa0csaUNBQXlCO0FBQ3ZCVCx1QkFBYSx1Q0FEVTtBQUV2QnpGLGdCQUFNLFNBRmlCLEVBM0JmLEVBREw7OztBQWlDUG1HLGFBQU87QUFDTDtBQUNFUCxvQkFBWTtBQUNWSyx5QkFBZSxFQUFFLFFBQU0sQ0FBQyxJQUFELENBQVIsRUFETDtBQUVWaEosZUFBSztBQUNIbUosc0JBQVUsQ0FEUCxFQUZLLEVBRGQ7OztBQU9FQyxrQkFBVSxDQUFDLGVBQUQsQ0FQWixFQURLOztBQVVMO0FBQ0VULG9CQUFZO0FBQ1ZJLDBCQUFnQixFQUFFLFFBQU0sQ0FBQyxJQUFELENBQVIsRUFETixFQURkOztBQUlFSyxrQkFBVSxDQUFDLGdCQUFELENBSlosRUFWSyxDQWpDQSxFQUFELENBUEosRUFEUzs7Ozs7O0FBNkRmQyxRQTdEZSwrQkE2RFJyRixPQTdEUSxFQTZEQzs7Ozs7OztBQU9WQSxjQUFRc0YsT0FBUixDQUFnQixDQUFoQixLQUFzQixFQVBaLENBRVp0SixHQUZZLFNBRVpBLEdBRlksNkJBR1orRCxhQUhZLENBR1pBLGFBSFksdUNBR0ksRUFISix1QkFJWmdGLGNBSlksU0FJWkEsY0FKWSxDQUtaQyxhQUxZLFNBS1pBLGFBTFksQ0FNWkMsdUJBTlksU0FNWkEsdUJBTlk7O0FBU2QsVUFBSUQsYUFBSixFQUFtQjtBQUNqQmpDLHNCQUFjL0csR0FBZCxFQUFtQitELGFBQW5CLEVBQWtDQyxPQUFsQztBQUNEOztBQUVELFVBQU1XLE9BQU8sd0NBQW9CWCxPQUFwQixDQUFiOztBQUVBLFVBQU11RixtQ0FBc0IsU0FBdEJBLG1CQUFzQixDQUFDQyxJQUFELEVBQVU7QUFDcEMsY0FBSSxDQUFDVCxjQUFMLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBRUQsY0FBSXRGLGFBQWEyQyxHQUFiLENBQWlCekIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQjtBQUNEOztBQUVELGNBQU04RSxjQUFjbEcsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFwQjtBQUNBLGNBQU1ELFlBQVkrRSxZQUFZekUsR0FBWixDQUFnQm5ELHNCQUFoQixDQUFsQjtBQUNBLGNBQU02SCxtQkFBbUJELFlBQVl6RSxHQUFaLENBQWdCakQsMEJBQWhCLENBQXpCOztBQUVBMEgsZ0NBQW1CNUgsc0JBQW5CO0FBQ0E0SCxnQ0FBbUIxSCwwQkFBbkI7QUFDQSxjQUFJMEgsWUFBWUUsSUFBWixHQUFtQixDQUF2QixFQUEwQjtBQUN4QjtBQUNBO0FBQ0EzRixvQkFBUTRGLE1BQVIsQ0FBZUosS0FBS0ssSUFBTCxDQUFVLENBQVYsSUFBZUwsS0FBS0ssSUFBTCxDQUFVLENBQVYsQ0FBZixHQUE4QkwsSUFBN0MsRUFBbUQsa0JBQW5EO0FBQ0Q7QUFDREMsc0JBQVluRSxHQUFaLENBQWdCekQsc0JBQWhCLEVBQXdDNkMsU0FBeEM7QUFDQStFLHNCQUFZbkUsR0FBWixDQUFnQnZELDBCQUFoQixFQUE0QzJILGdCQUE1QztBQUNELFNBdEJLLDhCQUFOOztBQXdCQSxVQUFNSSwwQkFBYSxTQUFiQSxVQUFhLENBQUNOLElBQUQsRUFBT08sYUFBUCxFQUFzQkMsWUFBdEIsRUFBdUM7QUFDeEQsY0FBSSxDQUFDaEIsYUFBTCxFQUFvQjtBQUNsQjtBQUNEOztBQUVELGNBQUlnQixnQkFBZ0JmLHVCQUFwQixFQUE2QztBQUMzQztBQUNEOztBQUVELGNBQUl4RixhQUFhMkMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFJOEMsWUFBWTlDLElBQVosQ0FBSixFQUF1QjtBQUNyQjtBQUNEOztBQUVELGNBQUloQixnQkFBZ0J5QyxHQUFoQixDQUFvQnpCLElBQXBCLENBQUosRUFBK0I7QUFDN0I7QUFDRDs7QUFFRDtBQUNBLGNBQUksQ0FBQ0YsU0FBUzJCLEdBQVQsQ0FBYXpCLElBQWIsQ0FBTCxFQUF5QjtBQUN2QkYsdUJBQVdYLGFBQWE4QyxPQUFPNUcsR0FBUCxDQUFiLEVBQTBCK0QsYUFBMUIsRUFBeUNDLE9BQXpDLENBQVg7QUFDQSxnQkFBSSxDQUFDUyxTQUFTMkIsR0FBVCxDQUFhekIsSUFBYixDQUFMLEVBQXlCO0FBQ3ZCaEIsOEJBQWdCVSxHQUFoQixDQUFvQk0sSUFBcEI7QUFDQTtBQUNEO0FBQ0Y7O0FBRURDLG9CQUFVckIsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFWOztBQUVBLGNBQUksQ0FBQ0MsT0FBTCxFQUFjO0FBQ1pxRixvQkFBUUMsS0FBUixtQkFBd0J2RixJQUF4QjtBQUNEOztBQUVEO0FBQ0EsY0FBTUQsWUFBWUUsUUFBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBbEI7QUFDQSxjQUFJLE9BQU82QyxTQUFQLEtBQXFCLFdBQXJCLElBQW9DcUYsa0JBQWtCL0gsd0JBQTFELEVBQW9GO0FBQ2xGLGdCQUFJMEMsVUFBVWtCLFNBQVYsQ0FBb0IrRCxJQUFwQixHQUEyQixDQUEvQixFQUFrQztBQUNoQztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxjQUFNRCxtQkFBbUI5RSxRQUFRSSxHQUFSLENBQVlqRCwwQkFBWixDQUF6QjtBQUNBLGNBQUksT0FBTzJILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDLGdCQUFJQSxpQkFBaUI5RCxTQUFqQixDQUEyQitELElBQTNCLEdBQWtDLENBQXRDLEVBQXlDO0FBQ3ZDO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLGNBQU1RLGFBQWFKLGtCQUFrQnJILE9BQWxCLEdBQTRCVix3QkFBNUIsR0FBdUQrSCxhQUExRTs7QUFFQSxjQUFNcEQsa0JBQWtCL0IsUUFBUUksR0FBUixDQUFZbUYsVUFBWixDQUF4Qjs7QUFFQSxjQUFNekUsUUFBUXlFLGVBQWVuSSx3QkFBZixHQUEwQ1UsT0FBMUMsR0FBb0R5SCxVQUFsRTs7QUFFQSxjQUFJLE9BQU94RCxlQUFQLEtBQTJCLFdBQS9CLEVBQTRDO0FBQzFDLGdCQUFJQSxnQkFBZ0JmLFNBQWhCLENBQTBCK0QsSUFBMUIsR0FBaUMsQ0FBckMsRUFBd0M7QUFDdEMzRixzQkFBUTRGLE1BQVI7QUFDRUosa0JBREY7QUFFMkI5RCxtQkFGM0I7O0FBSUQ7QUFDRixXQVBELE1BT087QUFDTDFCLG9CQUFRNEYsTUFBUjtBQUNFSixnQkFERjtBQUUyQjlELGlCQUYzQjs7QUFJRDtBQUNGLFNBeEVLLHFCQUFOOztBQTBFQTs7Ozs7QUFLQSxVQUFNMEUsaUNBQW9CLFNBQXBCQSxpQkFBb0IsQ0FBQ1osSUFBRCxFQUFVO0FBQ2xDLGNBQUkvRixhQUFhMkMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFJQyxVQUFVckIsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFkOztBQUVBO0FBQ0E7QUFDQSxjQUFJLE9BQU9DLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLHNCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDRDs7QUFFRCxjQUFNK0csYUFBYSxJQUFJL0csR0FBSixFQUFuQjtBQUNBLGNBQU1nSCx1QkFBdUIsSUFBSTVHLEdBQUosRUFBN0I7O0FBRUE4RixlQUFLSyxJQUFMLENBQVUxRyxPQUFWLENBQWtCLGtCQUF1QyxLQUFwQ0osSUFBb0MsVUFBcENBLElBQW9DLENBQTlCSCxXQUE4QixVQUE5QkEsV0FBOEIsQ0FBakIwRSxVQUFpQixVQUFqQkEsVUFBaUI7QUFDdkQsZ0JBQUl2RSxTQUFTcEIsMEJBQWIsRUFBeUM7QUFDdkMySSxtQ0FBcUJqRyxHQUFyQixDQUF5QnJDLHdCQUF6QjtBQUNEO0FBQ0QsZ0JBQUllLFNBQVNuQix3QkFBYixFQUF1QztBQUNyQyxrQkFBSTBGLFdBQVdsRCxNQUFYLEdBQW9CLENBQXhCLEVBQTJCO0FBQ3pCa0QsMkJBQVduRSxPQUFYLENBQW1CLFVBQUNnRCxTQUFELEVBQWU7QUFDaEMsc0JBQUlBLFVBQVVvRSxRQUFkLEVBQXdCO0FBQ3RCRCx5Q0FBcUJqRyxHQUFyQixDQUF5QjhCLFVBQVVvRSxRQUFWLENBQW1CdEgsSUFBbkIsSUFBMkJrRCxVQUFVb0UsUUFBVixDQUFtQjdFLEtBQXZFO0FBQ0Q7QUFDRixpQkFKRDtBQUtEO0FBQ0QvQywyQ0FBNkJDLFdBQTdCLEVBQTBDLFVBQUNLLElBQUQsRUFBVTtBQUNsRHFILHFDQUFxQmpHLEdBQXJCLENBQXlCcEIsSUFBekI7QUFDRCxlQUZEO0FBR0Q7QUFDRixXQWhCRDs7QUFrQkE7QUFDQTJCLGtCQUFRekIsT0FBUixDQUFnQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQzlCLGdCQUFJMkUscUJBQXFCbEUsR0FBckIsQ0FBeUJULEdBQXpCLENBQUosRUFBbUM7QUFDakMwRSx5QkFBVy9FLEdBQVgsQ0FBZUssR0FBZixFQUFvQkQsS0FBcEI7QUFDRDtBQUNGLFdBSkQ7O0FBTUE7QUFDQTRFLCtCQUFxQm5ILE9BQXJCLENBQTZCLFVBQUN3QyxHQUFELEVBQVM7QUFDcEMsZ0JBQUksQ0FBQ2YsUUFBUXdCLEdBQVIsQ0FBWVQsR0FBWixDQUFMLEVBQXVCO0FBQ3JCMEUseUJBQVcvRSxHQUFYLENBQWVLLEdBQWYsRUFBb0IsRUFBRUMsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQXBCO0FBQ0Q7QUFDRixXQUpEOztBQU1BO0FBQ0EsY0FBTWdCLFlBQVlFLFFBQVFJLEdBQVIsQ0FBWW5ELHNCQUFaLENBQWxCO0FBQ0EsY0FBSTZILG1CQUFtQjlFLFFBQVFJLEdBQVIsQ0FBWWpELDBCQUFaLENBQXZCOztBQUVBLGNBQUksT0FBTzJILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDQSwrQkFBbUIsRUFBRTlELFdBQVcsSUFBSWxDLEdBQUosRUFBYixFQUFuQjtBQUNEOztBQUVEMkcscUJBQVcvRSxHQUFYLENBQWV6RCxzQkFBZixFQUF1QzZDLFNBQXZDO0FBQ0EyRixxQkFBVy9FLEdBQVgsQ0FBZXZELDBCQUFmLEVBQTJDMkgsZ0JBQTNDO0FBQ0FuRyxxQkFBVytCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQjBGLFVBQXJCO0FBQ0QsU0EzREssNEJBQU47O0FBNkRBOzs7OztBQUtBLFVBQU1HLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNoQixJQUFELEVBQVU7QUFDbEMsY0FBSSxDQUFDUixhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsY0FBSXlCLGlCQUFpQnBILFdBQVcyQixHQUFYLENBQWVMLElBQWYsQ0FBckI7QUFDQSxjQUFJLE9BQU84RixjQUFQLEtBQTBCLFdBQTlCLEVBQTJDO0FBQ3pDQSw2QkFBaUIsSUFBSW5ILEdBQUosRUFBakI7QUFDRDs7QUFFRCxjQUFNb0gsc0JBQXNCLElBQUloSCxHQUFKLEVBQTVCO0FBQ0EsY0FBTWlILHNCQUFzQixJQUFJakgsR0FBSixFQUE1Qjs7QUFFQSxjQUFNa0gsZUFBZSxJQUFJbEgsR0FBSixFQUFyQjtBQUNBLGNBQU1tSCxlQUFlLElBQUluSCxHQUFKLEVBQXJCOztBQUVBLGNBQU1vSCxvQkFBb0IsSUFBSXBILEdBQUosRUFBMUI7QUFDQSxjQUFNcUgsb0JBQW9CLElBQUlySCxHQUFKLEVBQTFCOztBQUVBLGNBQU1zSCxhQUFhLElBQUkxSCxHQUFKLEVBQW5CO0FBQ0EsY0FBTTJILGFBQWEsSUFBSTNILEdBQUosRUFBbkI7QUFDQW1ILHlCQUFldEgsT0FBZixDQUF1QixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3JDLGdCQUFJRCxNQUFNVSxHQUFOLENBQVV2RSxzQkFBVixDQUFKLEVBQXVDO0FBQ3JDK0ksMkJBQWF2RyxHQUFiLENBQWlCc0IsR0FBakI7QUFDRDtBQUNELGdCQUFJRCxNQUFNVSxHQUFOLENBQVVyRSwwQkFBVixDQUFKLEVBQTJDO0FBQ3pDMkksa0NBQW9CckcsR0FBcEIsQ0FBd0JzQixHQUF4QjtBQUNEO0FBQ0QsZ0JBQUlELE1BQU1VLEdBQU4sQ0FBVXBFLHdCQUFWLENBQUosRUFBeUM7QUFDdkM4SSxnQ0FBa0J6RyxHQUFsQixDQUFzQnNCLEdBQXRCO0FBQ0Q7QUFDREQsa0JBQU12QyxPQUFOLENBQWMsVUFBQ2tELEdBQUQsRUFBUztBQUNyQjtBQUNFQSxzQkFBUXRFLDBCQUFSO0FBQ0dzRSxzQkFBUXJFLHdCQUZiO0FBR0U7QUFDQWdKLDJCQUFXMUYsR0FBWCxDQUFlZSxHQUFmLEVBQW9CVixHQUFwQjtBQUNEO0FBQ0YsYUFQRDtBQVFELFdBbEJEOztBQW9CQSxtQkFBU3VGLG9CQUFULENBQThCQyxNQUE5QixFQUFzQztBQUNwQyxnQkFBSUEsT0FBT3BJLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDN0IscUJBQU8sSUFBUDtBQUNEO0FBQ0QsZ0JBQU1xSSxJQUFJLDBCQUFRRCxPQUFPekYsS0FBZixFQUFzQjFCLE9BQXRCLENBQVY7QUFDQSxnQkFBSW9ILEtBQUssSUFBVCxFQUFlO0FBQ2IscUJBQU8sSUFBUDtBQUNEO0FBQ0RULGdDQUFvQnRHLEdBQXBCLENBQXdCK0csQ0FBeEI7QUFDRDs7QUFFRCxrQ0FBTTVCLElBQU4sRUFBWWhHLGNBQWN3QixHQUFkLENBQWtCTCxJQUFsQixDQUFaLEVBQXFDO0FBQ25DMEcsNEJBRG1DLHlDQUNsQkMsS0FEa0IsRUFDWDtBQUN0QkoscUNBQXFCSSxNQUFNSCxNQUEzQjtBQUNELGVBSGtDO0FBSW5DSSwwQkFKbUMsdUNBSXBCRCxLQUpvQixFQUliO0FBQ3BCLG9CQUFJQSxNQUFNRSxNQUFOLENBQWF6SSxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDbUksdUNBQXFCSSxNQUFNRyxTQUFOLENBQWdCLENBQWhCLENBQXJCO0FBQ0Q7QUFDRixlQVJrQywyQkFBckM7OztBQVdBakMsZUFBS0ssSUFBTCxDQUFVMUcsT0FBVixDQUFrQixVQUFDdUksT0FBRCxFQUFhO0FBQzdCLGdCQUFJQyxxQkFBSjs7QUFFQTtBQUNBLGdCQUFJRCxRQUFRM0ksSUFBUixLQUFpQm5CLHdCQUFyQixFQUErQztBQUM3QyxrQkFBSThKLFFBQVFQLE1BQVosRUFBb0I7QUFDbEJRLCtCQUFlLDBCQUFRRCxRQUFRUCxNQUFSLENBQWVTLEdBQWYsQ0FBbUJDLE9BQW5CLENBQTJCLFFBQTNCLEVBQXFDLEVBQXJDLENBQVIsRUFBa0Q3SCxPQUFsRCxDQUFmO0FBQ0EwSCx3QkFBUXBFLFVBQVIsQ0FBbUJuRSxPQUFuQixDQUEyQixVQUFDZ0QsU0FBRCxFQUFlO0FBQ3hDLHNCQUFNbEQsT0FBT2tELFVBQVVGLEtBQVYsQ0FBZ0JoRCxJQUFoQixJQUF3QmtELFVBQVVGLEtBQVYsQ0FBZ0JQLEtBQXJEO0FBQ0Esc0JBQUl6QyxTQUFTUCxPQUFiLEVBQXNCO0FBQ3BCcUksc0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNELG1CQUZELE1BRU87QUFDTFYsK0JBQVczRixHQUFYLENBQWVyQyxJQUFmLEVBQXFCMEksWUFBckI7QUFDRDtBQUNGLGlCQVBEO0FBUUQ7QUFDRjs7QUFFRCxnQkFBSUQsUUFBUTNJLElBQVIsS0FBaUJsQixzQkFBckIsRUFBNkM7QUFDM0M4Siw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEN0gsT0FBbEQsQ0FBZjtBQUNBNkcsMkJBQWF4RyxHQUFiLENBQWlCc0gsWUFBakI7QUFDRDs7QUFFRCxnQkFBSUQsUUFBUTNJLElBQVIsS0FBaUJqQixrQkFBckIsRUFBeUM7QUFDdkM2Siw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEN0gsT0FBbEQsQ0FBZjtBQUNBLGtCQUFJLENBQUMySCxZQUFMLEVBQW1CO0FBQ2pCO0FBQ0Q7O0FBRUQsa0JBQUkvSCxhQUFhK0gsWUFBYixDQUFKLEVBQWdDO0FBQzlCO0FBQ0Q7O0FBRUQsa0JBQUl0RSx5QkFBeUJxRSxRQUFRcEUsVUFBakMsQ0FBSixFQUFrRDtBQUNoRHFELG9DQUFvQnRHLEdBQXBCLENBQXdCc0gsWUFBeEI7QUFDRDs7QUFFRCxrQkFBSW5FLHVCQUF1QmtFLFFBQVFwRSxVQUEvQixDQUFKLEVBQWdEO0FBQzlDeUQsa0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNEOztBQUVERCxzQkFBUXBFLFVBQVI7QUFDRy9DLG9CQURILENBQ1UsVUFBQzRCLFNBQUQsVUFBZUEsVUFBVXBELElBQVYsS0FBbUJmLHdCQUFuQixJQUErQ21FLFVBQVVwRCxJQUFWLEtBQW1CaEIsMEJBQWpGLEVBRFY7QUFFR29CLHFCQUZILENBRVcsVUFBQ2dELFNBQUQsRUFBZTtBQUN0QjhFLDJCQUFXM0YsR0FBWCxDQUFlYSxVQUFVMkYsUUFBVixDQUFtQjdJLElBQW5CLElBQTJCa0QsVUFBVTJGLFFBQVYsQ0FBbUJwRyxLQUE3RCxFQUFvRWlHLFlBQXBFO0FBQ0QsZUFKSDtBQUtEO0FBQ0YsV0EvQ0Q7O0FBaURBZCx1QkFBYTFILE9BQWIsQ0FBcUIsVUFBQ3VDLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDa0YsYUFBYXhFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQUliLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXhDLHNCQUFaO0FBQ0E0SSw2QkFBZW5GLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsV0FBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixRQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsU0FBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTCtDLDJCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDQUMsMkJBQVcrQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFFBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdkIsR0FBeEIsQ0FBNEJNLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUlsQyxHQUFKLEVBQWxCO0FBQ0FrQywwQkFBVXZCLEdBQVYsQ0FBY00sSUFBZDtBQUNBQyx5QkFBUVUsR0FBUixDQUFZekQsc0JBQVosRUFBb0MsRUFBRStELG9CQUFGLEVBQXBDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQWdGLHVCQUFhekgsT0FBYixDQUFxQixVQUFDdUMsS0FBRCxFQUFXO0FBQzlCLGdCQUFJLENBQUNtRixhQUFhekUsR0FBYixDQUFpQlYsS0FBakIsQ0FBTCxFQUE4QjtBQUM1QixrQkFBTWIsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZWhELHNCQUFmOztBQUVBLGtCQUFNK0MsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBdEI7QUFDQSxvQkFBSSxPQUFPeUUsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7O0FBZUFvRyw0QkFBa0I1SCxPQUFsQixDQUEwQixVQUFDdUMsS0FBRCxFQUFXO0FBQ25DLGdCQUFJLENBQUNvRixrQkFBa0IxRSxHQUFsQixDQUFzQlYsS0FBdEIsQ0FBTCxFQUFtQztBQUNqQyxrQkFBSWIsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFkO0FBQ0Esa0JBQUksT0FBT2IsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ0EsMEJBQVUsSUFBSW5CLEdBQUosRUFBVjtBQUNEO0FBQ0RtQixzQkFBUVIsR0FBUixDQUFZckMsd0JBQVo7QUFDQXlJLDZCQUFlbkYsR0FBZixDQUFtQkksS0FBbkIsRUFBMEJiLE9BQTFCOztBQUVBLGtCQUFJRCxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFkO0FBQ0Esa0JBQUlZLHNCQUFKO0FBQ0Esa0JBQUksT0FBTzFCLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMwQixnQ0FBZ0IxQixVQUFRSSxHQUFSLENBQVloRCx3QkFBWixDQUFoQjtBQUNELGVBRkQsTUFFTztBQUNMNEMsNEJBQVUsSUFBSXRCLEdBQUosRUFBVjtBQUNBQywyQkFBVytCLEdBQVgsQ0FBZUksS0FBZixFQUFzQmQsU0FBdEI7QUFDRDs7QUFFRCxrQkFBSSxPQUFPMEIsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsOEJBQWNWLFNBQWQsQ0FBd0J2QixHQUF4QixDQUE0Qk0sSUFBNUI7QUFDRCxlQUZELE1BRU87QUFDTCxvQkFBTWlCLFlBQVksSUFBSWxDLEdBQUosRUFBbEI7QUFDQWtDLDBCQUFVdkIsR0FBVixDQUFjTSxJQUFkO0FBQ0FDLDBCQUFRVSxHQUFSLENBQVl0RCx3QkFBWixFQUFzQyxFQUFFNEQsb0JBQUYsRUFBdEM7QUFDRDtBQUNGO0FBQ0YsV0ExQkQ7O0FBNEJBa0YsNEJBQWtCM0gsT0FBbEIsQ0FBMEIsVUFBQ3VDLEtBQUQsRUFBVztBQUNuQyxnQkFBSSxDQUFDcUYsa0JBQWtCM0UsR0FBbEIsQ0FBc0JWLEtBQXRCLENBQUwsRUFBbUM7QUFDakMsa0JBQU1iLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWU3Qyx3QkFBZjs7QUFFQSxrQkFBTTRDLFlBQVVyQixXQUFXeUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWWhELHdCQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT3NFLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEOztBQWVBZ0csOEJBQW9CeEgsT0FBcEIsQ0FBNEIsVUFBQ3VDLEtBQUQsRUFBVztBQUNyQyxnQkFBSSxDQUFDZ0Ysb0JBQW9CdEUsR0FBcEIsQ0FBd0JWLEtBQXhCLENBQUwsRUFBcUM7QUFDbkMsa0JBQUliLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXRDLDBCQUFaO0FBQ0EwSSw2QkFBZW5GLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZakQsMEJBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTDZDLDRCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDQUMsMkJBQVcrQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdkIsR0FBeEIsQ0FBNEJNLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUlsQyxHQUFKLEVBQWxCO0FBQ0FrQywwQkFBVXZCLEdBQVYsQ0FBY00sSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZdkQsMEJBQVosRUFBd0MsRUFBRTZELG9CQUFGLEVBQXhDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQThFLDhCQUFvQnZILE9BQXBCLENBQTRCLFVBQUN1QyxLQUFELEVBQVc7QUFDckMsZ0JBQUksQ0FBQ2lGLG9CQUFvQnZFLEdBQXBCLENBQXdCVixLQUF4QixDQUFMLEVBQXFDO0FBQ25DLGtCQUFNYixVQUFVNEYsZUFBZXpGLEdBQWYsQ0FBbUJVLEtBQW5CLENBQWhCO0FBQ0FiLGdDQUFlOUMsMEJBQWY7O0FBRUEsa0JBQU02QyxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFoQjtBQUNBLGtCQUFJLE9BQU9kLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMsb0JBQU0wQixnQkFBZ0IxQixVQUFRSSxHQUFSLENBQVlqRCwwQkFBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU91RSxhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSxnQ0FBY1YsU0FBZCxXQUErQmpCLElBQS9CO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsV0FiRDs7QUFlQXNHLHFCQUFXOUgsT0FBWCxDQUFtQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUNxRixXQUFXNUUsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQUlkLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXNCLEdBQVo7QUFDQThFLDZCQUFlbkYsR0FBZixDQUFtQkksS0FBbkIsRUFBMEJiLE9BQTFCOztBQUVBLGtCQUFJRCxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFkO0FBQ0Esa0JBQUlZLHNCQUFKO0FBQ0Esa0JBQUksT0FBTzFCLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMwQixnQ0FBZ0IxQixVQUFRSSxHQUFSLENBQVlXLEdBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTGYsNEJBQVUsSUFBSXRCLEdBQUosRUFBVjtBQUNBQywyQkFBVytCLEdBQVgsQ0FBZUksS0FBZixFQUFzQmQsU0FBdEI7QUFDRDs7QUFFRCxrQkFBSSxPQUFPMEIsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsOEJBQWNWLFNBQWQsQ0FBd0J2QixHQUF4QixDQUE0Qk0sSUFBNUI7QUFDRCxlQUZELE1BRU87QUFDTCxvQkFBTWlCLFlBQVksSUFBSWxDLEdBQUosRUFBbEI7QUFDQWtDLDBCQUFVdkIsR0FBVixDQUFjTSxJQUFkO0FBQ0FDLDBCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsb0JBQUYsRUFBakI7QUFDRDtBQUNGO0FBQ0YsV0ExQkQ7O0FBNEJBb0YscUJBQVc3SCxPQUFYLENBQW1CLFVBQUN1QyxLQUFELEVBQVFDLEdBQVIsRUFBZ0I7QUFDakMsZ0JBQUksQ0FBQ3NGLFdBQVc3RSxHQUFYLENBQWVULEdBQWYsQ0FBTCxFQUEwQjtBQUN4QixrQkFBTWQsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZWMsR0FBZjs7QUFFQSxrQkFBTWYsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZVyxHQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT1csYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7QUFjRCxTQTNSSyw0QkFBTjs7QUE2UkEsYUFBTztBQUNMLHNCQURLLG9DQUNVNkUsSUFEVixFQUNnQjtBQUNuQlksOEJBQWtCWixJQUFsQjtBQUNBZ0IsOEJBQWtCaEIsSUFBbEI7QUFDQUQsZ0NBQW9CQyxJQUFwQjtBQUNELFdBTEk7QUFNTHVDLGdDQU5LLGlEQU1vQnZDLElBTnBCLEVBTTBCO0FBQzdCTSx1QkFBV04sSUFBWCxFQUFpQnhILHdCQUFqQixFQUEyQyxLQUEzQztBQUNELFdBUkk7QUFTTGdLLDhCQVRLLCtDQVNrQnhDLElBVGxCLEVBU3dCO0FBQzNCQSxpQkFBS2xDLFVBQUwsQ0FBZ0JuRSxPQUFoQixDQUF3QixVQUFDZ0QsU0FBRCxFQUFlO0FBQ3JDMkQseUJBQVczRCxTQUFYLEVBQXNCQSxVQUFVb0UsUUFBVixDQUFtQnRILElBQW5CLElBQTJCa0QsVUFBVW9FLFFBQVYsQ0FBbUI3RSxLQUFwRSxFQUEyRSxLQUEzRTtBQUNELGFBRkQ7QUFHQS9DLHlDQUE2QjZHLEtBQUs1RyxXQUFsQyxFQUErQyxVQUFDSyxJQUFELEVBQU8rRyxZQUFQLEVBQXdCO0FBQ3JFRix5QkFBV04sSUFBWCxFQUFpQnZHLElBQWpCLEVBQXVCK0csWUFBdkI7QUFDRCxhQUZEO0FBR0QsV0FoQkksbUNBQVA7O0FBa0JELEtBcGlCYyxtQkFBakIiLCJmaWxlIjoibm8tdW51c2VkLW1vZHVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRW5zdXJlcyB0aGF0IG1vZHVsZXMgY29udGFpbiBleHBvcnRzIGFuZC9vciBhbGxcbiAqIG1vZHVsZXMgYXJlIGNvbnN1bWVkIHdpdGhpbiBvdGhlciBtb2R1bGVzLlxuICogQGF1dGhvciBSZW7DqSBGZXJtYW5uXG4gKi9cblxuaW1wb3J0IHsgZ2V0UGh5c2ljYWxGaWxlbmFtZSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvY29udGV4dENvbXBhdCc7XG5pbXBvcnQgeyBnZXRGaWxlRXh0ZW5zaW9ucyB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvaWdub3JlJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSc7XG5pbXBvcnQgdmlzaXQgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy92aXNpdCc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgcmVhZFBrZ1VwIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVhZFBrZ1VwJztcbmltcG9ydCB2YWx1ZXMgZnJvbSAnb2JqZWN0LnZhbHVlcyc7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnO1xuaW1wb3J0IGZsYXRNYXAgZnJvbSAnYXJyYXkucHJvdG90eXBlLmZsYXRtYXAnO1xuXG5pbXBvcnQgRXhwb3J0TWFwQnVpbGRlciBmcm9tICcuLi9leHBvcnRNYXAvYnVpbGRlcic7XG5pbXBvcnQgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUgZnJvbSAnLi4vZXhwb3J0TWFwL3BhdHRlcm5DYXB0dXJlJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG4vKipcbiAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgaW50ZXJuYWwgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcywgd2hpY2ggaGFzIGV4aXN0ZWQgaW4gYSBjb3VwbGVcbiAqIG9mIGRpZmZlcmVudCBwbGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBgZXNsaW50YC4gIFRyeSByZXF1aXJpbmcgaXQgZnJvbSBib3RoXG4gKiBsb2NhdGlvbnMuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBgRmlsZUVudW1lcmF0b3JgIGNsYXNzIGlmIGl0cyByZXF1aXJhYmxlLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVGaWxlRW51bWVyYXRvcigpIHtcbiAgbGV0IEZpbGVFbnVtZXJhdG9yO1xuXG4gIC8vIFRyeSBnZXR0aW5nIGl0IGZyb20gdGhlIGVzbGludCBwcml2YXRlIC8gZGVwcmVjYXRlZCBhcGlcbiAgdHJ5IHtcbiAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L3VzZS1hdC15b3VyLW93bi1yaXNrJykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQWJzb3JiIHRoaXMgaWYgaXQncyBNT0RVTEVfTk9UX0ZPVU5EXG4gICAgaWYgKGUuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCB0aGVyZSwgdGhlbiB0cnkgZ2V0dGluZyBpdCBmcm9tIGVzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3IgKG1vdmVkIHRoZXJlIGluIHY2KVxuICAgIHRyeSB7XG4gICAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi9jbGktZW5naW5lL2ZpbGUtZW51bWVyYXRvcicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gRmlsZUVudW1lcmF0b3I7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBGaWxlRW51bWVyYXRvciBjbGFzcywgaW5zdGFudGlhdGUgYW5kIGxvYWQgdGhlIGxpc3Qgb2YgZmlsZXMuXG4gKiBAcGFyYW0gRmlsZUVudW1lcmF0b3IgdGhlIGBGaWxlRW51bWVyYXRvcmAgY2xhc3MgZnJvbSBgZXNsaW50YCdzIGludGVybmFsIGFwaVxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBzcmMgcm9vdFxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gKiBAcmV0dXJucyB7eyBmaWxlbmFtZTogc3RyaW5nLCBpZ25vcmVkOiBib29sZWFuIH1bXX0gbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IoRmlsZUVudW1lcmF0b3IsIHNyYywgZXh0ZW5zaW9ucykge1xuICAvLyBXZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGJlaW5nIHJ1biB3aXRoIGZsYXQgY29uZmlnIGluIG9yZGVyIHRvXG4gIC8vIGRldGVybWluZSBob3cgdG8gcmVwb3J0IGVycm9ycyBpZiBGaWxlRW51bWVyYXRvciB0aHJvd3MgZHVlIHRvIGEgbGFjayBvZiBlc2xpbnRyYy5cblxuICBjb25zdCB7IEVTTElOVF9VU0VfRkxBVF9DT05GSUcgfSA9IHByb2Nlc3MuZW52O1xuXG4gIC8vIFRoaXMgY29uZGl0aW9uIGlzIHN1ZmZpY2llbnQgdG8gdGVzdCBpbiB2OCwgc2luY2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lY2Vzc2FyeSB0byB0dXJuIG9uIGZsYXQgY29uZmlnXG4gIGxldCBpc1VzaW5nRmxhdENvbmZpZyA9IEVTTElOVF9VU0VfRkxBVF9DT05GSUcgJiYgcHJvY2Vzcy5lbnYuRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyAhPT0gJ2ZhbHNlJztcblxuICAvLyBJbiB0aGUgY2FzZSBvZiB1c2luZyB2OSwgd2UgY2FuIGNoZWNrIHRoZSBgc2hvdWxkVXNlRmxhdENvbmZpZ2AgZnVuY3Rpb25cbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBwcmVzZW50LCB0aGVuIHdlIGFzc3VtZSBpdCdzIHY5XG4gIHRyeSB7XG4gICAgY29uc3QgeyBzaG91bGRVc2VGbGF0Q29uZmlnIH0gPSByZXF1aXJlKCdlc2xpbnQvdXNlLWF0LXlvdXItb3duLXJpc2snKTtcbiAgICBpc1VzaW5nRmxhdENvbmZpZyA9IHNob3VsZFVzZUZsYXRDb25maWcgJiYgRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyAhPT0gJ2ZhbHNlJztcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdGhyb3cgaGVyZSwgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBib29sZWFuIGlmIHRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUuXG4gIH1cblxuICBjb25zdCBlbnVtZXJhdG9yID0gbmV3IEZpbGVFbnVtZXJhdG9yKHtcbiAgICBleHRlbnNpb25zLFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgZW51bWVyYXRvci5pdGVyYXRlRmlsZXMoc3JjKSxcbiAgICAgICh7IGZpbGVQYXRoLCBpZ25vcmVkIH0pID0+ICh7IGZpbGVuYW1lOiBmaWxlUGF0aCwgaWdub3JlZCB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgd2UncmUgdXNpbmcgZmxhdCBjb25maWcsIGFuZCBGaWxlRW51bWVyYXRvciB0aHJvd3MgZHVlIHRvIGEgbGFjayBvZiBlc2xpbnRyYyxcbiAgICAvLyB0aGVuIHdlIHdhbnQgdG8gdGhyb3cgYW4gZXJyb3Igc28gdGhhdCB0aGUgdXNlciBrbm93cyBhYm91dCB0aGlzIHJ1bGUncyByZWxpYW5jZSBvblxuICAgIC8vIHRoZSBsZWdhY3kgY29uZmlnLlxuICAgIGlmIChcbiAgICAgIGlzVXNpbmdGbGF0Q29uZmlnXG4gICAgICAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG5EdWUgdG8gdGhlIGV4Y2x1c2lvbiBvZiBjZXJ0YWluIGludGVybmFsIEVTTGludCBBUElzIHdoZW4gdXNpbmcgZmxhdCBjb25maWcsXG50aGUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzIHJ1bGUgcmVxdWlyZXMgYW4gLmVzbGludHJjIGZpbGUgdG8ga25vdyB3aGljaFxuZmlsZXMgdG8gaWdub3JlIChldmVuIHdoZW4gdXNpbmcgZmxhdCBjb25maWcpLlxuVGhlIC5lc2xpbnRyYyBmaWxlIG9ubHkgbmVlZHMgdG8gY29udGFpbiBcImlnbm9yZVBhdHRlcm5zXCIsIG9yIGNhbiBiZSBlbXB0eSBpZlxueW91IGRvIG5vdCB3YW50IHRvIGlnbm9yZSBhbnkgZmlsZXMuXG5cblNlZSBodHRwczovL2dpdGh1Yi5jb20vaW1wb3J0LWpzL2VzbGludC1wbHVnaW4taW1wb3J0L2lzc3Vlcy8zMDc5XG5mb3IgYWRkaXRpb25hbCBjb250ZXh0LlxuYCk7XG4gICAgfVxuICAgIC8vIElmIHRoaXMgaXNuJ3QgdGhlIGNhc2UsIHRoZW4gd2UnbGwganVzdCBsZXQgdGhlIGVycm9yIGJ1YmJsZSB1cFxuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlcXVpcmUgb2xkIHZlcnNpb25zIG9mIHRoZSBmaWxlIGVudW1lcmF0aW9uIGNhcGFiaWxpdHkgZnJvbSB2NiBgZXNsaW50YCBhbmQgZWFybGllciwgYW5kIHVzZVxuICogdGhvc2UgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gb3BlcmF0ZSBvblxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBzcmMgcm9vdFxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IGxpc3Qgb2YgZmlsZXMgdG8gb3BlcmF0ZSBvblxuICovXG5mdW5jdGlvbiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucykge1xuICB0cnkge1xuICAgIC8vIGVzbGludC9saWIvdXRpbC9nbG9iLXV0aWwgaGFzIGJlZW4gbW92ZWQgdG8gZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMgd2l0aCB2ZXJzaW9uIDUuM1xuICAgIGNvbnN0IHsgbGlzdEZpbGVzVG9Qcm9jZXNzOiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMnKTtcbiAgICAvLyBQcmV2ZW50IHBhc3NpbmcgaW52YWxpZCBvcHRpb25zIChleHRlbnNpb25zIGFycmF5KSB0byBvbGQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvdjUuMTYuMC9saWIvdXRpbC9nbG9iLXV0aWxzLmpzI0wxNzgtTDI4MFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvdjUuMi4wL2xpYi91dGlsL2dsb2ItdXRpbC5qcyNMMTc0LUwyNjlcblxuICAgIHJldHVybiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyhzcmMsIHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICBpZiAoZS5jb2RlICE9PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gTGFzdCBwbGFjZSB0byB0cnkgKHByZSB2NS4zKVxuICAgIGNvbnN0IHtcbiAgICAgIGxpc3RGaWxlc1RvUHJvY2Vzczogb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MsXG4gICAgfSA9IHJlcXVpcmUoJ2VzbGludC9saWIvdXRpbC9nbG9iLXV0aWwnKTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHNyYy5jb25jYXQoXG4gICAgICBmbGF0TWFwKFxuICAgICAgICBzcmMsXG4gICAgICAgIChwYXR0ZXJuKSA9PiBleHRlbnNpb25zLm1hcCgoZXh0ZW5zaW9uKSA9PiAoL1xcKlxcKnxcXCpcXC4vKS50ZXN0KHBhdHRlcm4pID8gcGF0dGVybiA6IGAke3BhdHRlcm59LyoqLyoke2V4dGVuc2lvbn1gKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyhwYXR0ZXJucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIHNyYyBwYXR0ZXJuIGFuZCBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zLCByZXR1cm4gYSBsaXN0IG9mIGZpbGVzIHRvIHByb2Nlc3NcbiAqIHdpdGggdGhpcyBydWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIGZpbGUsIGRpcmVjdG9yeSwgb3IgZ2xvYiBwYXR0ZXJuIG9mIGZpbGVzIHRvIGFjdCBvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyAtIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uc1xuICogQHJldHVybnMge3N0cmluZ1tdIHwgeyBmaWxlbmFtZTogc3RyaW5nLCBpZ25vcmVkOiBib29sZWFuIH1bXX0gdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCB0aGlzIHJ1bGUgd2lsbCBldmFsdWF0ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucykge1xuICBjb25zdCBGaWxlRW51bWVyYXRvciA9IHJlcXVpcmVGaWxlRW51bWVyYXRvcigpO1xuXG4gIC8vIElmIHdlIGdvdCB0aGUgRmlsZUVudW1lcmF0b3IsIHRoZW4gbGV0J3MgZ28gd2l0aCB0aGF0XG4gIGlmIChGaWxlRW51bWVyYXRvcikge1xuICAgIHJldHVybiBsaXN0RmlsZXNVc2luZ0ZpbGVFbnVtZXJhdG9yKEZpbGVFbnVtZXJhdG9yLCBzcmMsIGV4dGVuc2lvbnMpO1xuICB9XG4gIC8vIElmIG5vdCwgdGhlbiB3ZSBjYW4gdHJ5IGV2ZW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IChsaXN0RmlsZXNUb1Byb2Nlc3MpXG4gIHJldHVybiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucyk7XG59XG5cbmNvbnN0IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfTkFNRURfREVDTEFSQVRJT04gPSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJztcbmNvbnN0IElNUE9SVF9ERUNMQVJBVElPTiA9ICdJbXBvcnREZWNsYXJhdGlvbic7XG5jb25zdCBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiA9ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInO1xuY29uc3QgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInO1xuY29uc3QgVkFSSUFCTEVfREVDTEFSQVRJT04gPSAnVmFyaWFibGVEZWNsYXJhdGlvbic7XG5jb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9ICdGdW5jdGlvbkRlY2xhcmF0aW9uJztcbmNvbnN0IENMQVNTX0RFQ0xBUkFUSU9OID0gJ0NsYXNzRGVjbGFyYXRpb24nO1xuY29uc3QgSURFTlRJRklFUiA9ICdJZGVudGlmaWVyJztcbmNvbnN0IE9CSkVDVF9QQVRURVJOID0gJ09iamVjdFBhdHRlcm4nO1xuY29uc3QgQVJSQVlfUEFUVEVSTiA9ICdBcnJheVBhdHRlcm4nO1xuY29uc3QgVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OID0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nO1xuY29uc3QgVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiA9ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJztcbmNvbnN0IFRTX0VOVU1fREVDTEFSQVRJT04gPSAnVFNFbnVtRGVjbGFyYXRpb24nO1xuY29uc3QgREVGQVVMVCA9ICdkZWZhdWx0JztcblxuZnVuY3Rpb24gZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllcihkZWNsYXJhdGlvbiwgY2IpIHtcbiAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgY29uc3QgaXNUeXBlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi50eXBlID09PSBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX0VOVU1fREVDTEFSQVRJT047XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBGVU5DVElPTl9ERUNMQVJBVElPTlxuICAgICAgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gQ0xBU1NfREVDTEFSQVRJT05cbiAgICAgIHx8IGlzVHlwZURlY2xhcmF0aW9uXG4gICAgKSB7XG4gICAgICBjYihkZWNsYXJhdGlvbi5pZC5uYW1lLCBpc1R5cGVEZWNsYXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKHsgaWQgfSkgPT4ge1xuICAgICAgICBpZiAoaWQudHlwZSA9PT0gT0JKRUNUX1BBVFRFUk4pIHtcbiAgICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShpZCwgKHBhdHRlcm4pID0+IHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgY2IocGF0dGVybi5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQudHlwZSA9PT0gQVJSQVlfUEFUVEVSTikge1xuICAgICAgICAgIGlkLmVsZW1lbnRzLmZvckVhY2goKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBjYihuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IoaWQubmFtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGltcG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGEgU2V0IG9mIGlkZW50aWZpZXJzLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgaW1wb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBmaWxlcyB3aGljaCBhcmUgYmVpbmcgaW1wb3J0ZWRcbiAqIGZyb20uIExhc3RseSwgdGhlIFNldCBvZiBpZGVudGlmaWVycyBjb250YWlucyBlaXRoZXIgbmFtZXMgYmVpbmcgaW1wb3J0ZWRcbiAqIG9yIGEgc3BlY2lhbCBBU1Qgbm9kZSBuYW1lIGxpc3RlZCBhYm92ZSAoZS5nIEltcG9ydERlZmF1bHRTcGVjaWZpZXIpLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZzpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdmb28uanMnID0+IE1hcCB7ICdiYXIuanMnID0+IFNldCB7ICdvMicgfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+Pn1cbiAqL1xuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBMaXN0IG9mIGV4cG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGFuIG9iamVjdCBvZiBtZXRhZGF0YS4gVGhlIHVwcGVyLWxldmVsIE1hcFxuICoga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlIGV4cG9ydHMsIHdoaWxlIHRoZVxuICogbG93ZXItbGV2ZWwgTWFwIGtleXMgYXJlIHRoZSBzcGVjaWZpYyBpZGVudGlmaWVycyBvciBzcGVjaWFsIEFTVCBub2RlIG5hbWVzXG4gKiBiZWluZyBleHBvcnRlZC4gVGhlIGxlYWYtbGV2ZWwgbWV0YWRhdGEgb2JqZWN0IGF0IHRoZSBtb21lbnQgb25seSBjb250YWlucyBhXG4gKiBgd2hlcmVVc2VkYCBwcm9wZXJ0eSwgd2hpY2ggY29udGFpbnMgYSBTZXQgb2YgcGF0aHMgdG8gbW9kdWxlcyB0aGF0IGltcG9ydFxuICogdGhlIG5hbWUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBmaWxlIG5hbWVkIGJhci5qcyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhwb3J0czpcbiAqXG4gKiAgIGNvbnN0IG8yID0gJ2Jhcic7XG4gKiAgIGV4cG9ydCB7IG8yIH07XG4gKlxuICogQW5kIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGltcG9ydDpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdiYXIuanMnID0+IE1hcCB7ICdvMicgPT4geyB3aGVyZVVzZWQ6IFNldCB7ICdmb28uanMnIH0gfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgb2JqZWN0Pj59XG4gKi9cbmNvbnN0IGV4cG9ydExpc3QgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHZpc2l0b3JLZXlNYXAgPSBuZXcgTWFwKCk7XG5cbi8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBpZ25vcmVkRmlsZXMgPSBuZXcgU2V0KCk7XG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IGlzTm9kZU1vZHVsZSA9IChwYXRoKSA9PiAoL1xcLyhub2RlX21vZHVsZXMpXFwvLykudGVzdChwYXRoKTtcblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKiBAdHlwZSB7KHNyYzogc3RyaW5nLCBpZ25vcmVFeHBvcnRzOiBzdHJpbmcsIGNvbnRleHQ6IGltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dCkgPT4gU2V0PHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWxlcyhzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpO1xuXG4gIGNvbnN0IHNyY0ZpbGVMaXN0ID0gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucyk7XG5cbiAgLy8gcHJlcGFyZSBsaXN0IG9mIGlnbm9yZWQgZmlsZXNcbiAgY29uc3QgaWdub3JlZEZpbGVzTGlzdCA9IGxpc3RGaWxlc1RvUHJvY2VzcyhpZ25vcmVFeHBvcnRzLCBleHRlbnNpb25zKTtcblxuICAvLyBUaGUgbW9kZXJuIGFwaSB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZSBwYXRocywgcmF0aGVyIHRoYW4gYW4gb2JqZWN0XG4gIGlmIChpZ25vcmVkRmlsZXNMaXN0Lmxlbmd0aCAmJiB0eXBlb2YgaWdub3JlZEZpbGVzTGlzdFswXSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZ25vcmVkRmlsZXNMaXN0LmZvckVhY2goKGZpbGVuYW1lKSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgaWdub3JlZEZpbGVzTGlzdC5mb3JFYWNoKCh7IGZpbGVuYW1lIH0pID0+IGlnbm9yZWRGaWxlcy5hZGQoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBzb3VyY2UgZmlsZXMsIGRvbid0IGNvbnNpZGVyIGZpbGVzIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBzcmNGaWxlTGlzdC5sZW5ndGggJiYgdHlwZW9mIHNyY0ZpbGVMaXN0WzBdID09PSAnc3RyaW5nJ1xuICAgID8gc3JjRmlsZUxpc3QuZmlsdGVyKChmaWxlUGF0aCkgPT4gIWlzTm9kZU1vZHVsZShmaWxlUGF0aCkpXG4gICAgOiBmbGF0TWFwKHNyY0ZpbGVMaXN0LCAoeyBmaWxlbmFtZSB9KSA9PiBpc05vZGVNb2R1bGUoZmlsZW5hbWUpID8gW10gOiBmaWxlbmFtZSk7XG5cbiAgcmV0dXJuIG5ldyBTZXQocmVzb2x2ZWRGaWxlcyk7XG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKTtcbiAgc3JjRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBjdXJyZW50RXhwb3J0cyA9IEV4cG9ydE1hcEJ1aWxkZXIuZ2V0KGZpbGUsIGNvbnRleHQpO1xuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlZXhwb3J0cyxcbiAgICAgICAgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZpc2l0b3JLZXlzLFxuICAgICAgfSA9IGN1cnJlbnRFeHBvcnRzO1xuXG4gICAgICB2aXNpdG9yS2V5TWFwLnNldChmaWxlLCB2aXNpdG9yS2V5cyk7XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KCk7XG4gICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoZ2V0RGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpO1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRFeHBvcnRBbGwuYWRkKGRlcGVuZGVuY3kucGF0aCk7XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEFsbC5zZXQoZmlsZSwgY3VycmVudEV4cG9ydEFsbCk7XG5cbiAgICAgIHJlZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZXhwb3J0ID0gdmFsdWUuZ2V0SW1wb3J0KCk7XG4gICAgICAgIGlmICghcmVleHBvcnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsSW1wb3J0ID0gaW1wb3J0cy5nZXQocmVleHBvcnQucGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZS5sb2NhbCA9PT0gREVGQVVMVCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2YWx1ZS5sb2NhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbY3VycmVudFZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaW1wb3J0cy5zZXQocmVleHBvcnQucGF0aCwgbG9jYWxJbXBvcnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGxvY2FsSW1wb3J0TGlzdC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc05vZGVNb2R1bGUoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KGtleSkgfHwgbmV3IFNldCgpO1xuICAgICAgICB2YWx1ZS5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoeyBpbXBvcnRlZFNwZWNpZmllcnMgfSkgPT4ge1xuICAgICAgICAgIGltcG9ydGVkU3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgIGxvY2FsSW1wb3J0LmFkZChzcGVjaWZpZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaW1wb3J0cy5zZXQoa2V5LCBsb2NhbEltcG9ydCk7XG4gICAgICB9KTtcbiAgICAgIGltcG9ydExpc3Quc2V0KGZpbGUsIGltcG9ydHMpO1xuXG4gICAgICAvLyBidWlsZCB1cCBleHBvcnQgbGlzdCBvbmx5LCBpZiBmaWxlIGlzIG5vdCBpZ25vcmVkXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuYW1lc3BhY2UuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0TGlzdC5zZXQoZmlsZSwgZXhwb3J0cyk7XG4gIH0pO1xuICBleHBvcnRBbGwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHZhbHVlLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWwpO1xuICAgICAgaWYgKGN1cnJlbnRFeHBvcnRzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnQgPSBjdXJyZW50RXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogdHJhdmVyc2UgdGhyb3VnaCBhbGwgaW1wb3J0cyBhbmQgYWRkIHRoZSByZXNwZWN0aXZlIHBhdGggdG8gdGhlIHdoZXJlVXNlZC1saXN0XG4gKiBvZiB0aGUgY29ycmVzcG9uZGluZyBleHBvcnRcbiAqL1xuY29uc3QgZGV0ZXJtaW5lVXNhZ2UgPSAoKSA9PiB7XG4gIGltcG9ydExpc3QuZm9yRWFjaCgobGlzdFZhbHVlLCBsaXN0S2V5KSA9PiB7XG4gICAgbGlzdFZhbHVlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChjdXJyZW50SW1wb3J0KSA9PiB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllcjtcbiAgICAgICAgICBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgICAgICBzcGVjaWZpZXIgPSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IGN1cnJlbnRJbXBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0U3RhdGVtZW50ID0gZXhwb3J0cy5nZXQoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjb25zdCB7IHdoZXJlVXNlZCB9ID0gZXhwb3J0U3RhdGVtZW50O1xuICAgICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGxpc3RLZXkpO1xuICAgICAgICAgICAgICBleHBvcnRzLnNldChzcGVjaWZpZXIsIHsgd2hlcmVVc2VkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0U3JjID0gKHNyYykgPT4ge1xuICBpZiAoc3JjKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuICByZXR1cm4gW3Byb2Nlc3MuY3dkKCldO1xufTtcblxuLyoqXG4gKiBwcmVwYXJlIHRoZSBsaXN0cyBvZiBleGlzdGluZyBpbXBvcnRzIGFuZCBleHBvcnRzIC0gc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhdFxuICogdGhlIHN0YXJ0IG9mIGEgbmV3IGVzbGludCBydW5cbiAqL1xuLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmxldCBzcmNGaWxlcztcbmxldCBsYXN0UHJlcGFyZUtleTtcbmNvbnN0IGRvUHJlcGFyYXRpb24gPSAoc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHByZXBhcmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgc3JjOiAoc3JjIHx8IFtdKS5zb3J0KCksXG4gICAgaWdub3JlRXhwb3J0czogKGlnbm9yZUV4cG9ydHMgfHwgW10pLnNvcnQoKSxcbiAgICBleHRlbnNpb25zOiBBcnJheS5mcm9tKGdldEZpbGVFeHRlbnNpb25zKGNvbnRleHQuc2V0dGluZ3MpKS5zb3J0KCksXG4gIH0pO1xuICBpZiAocHJlcGFyZUtleSA9PT0gbGFzdFByZXBhcmVLZXkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbXBvcnRMaXN0LmNsZWFyKCk7XG4gIGV4cG9ydExpc3QuY2xlYXIoKTtcbiAgaWdub3JlZEZpbGVzLmNsZWFyKCk7XG4gIGZpbGVzT3V0c2lkZVNyYy5jbGVhcigpO1xuXG4gIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzKHNyY0ZpbGVzLCBjb250ZXh0KTtcbiAgZGV0ZXJtaW5lVXNhZ2UoKTtcbiAgbGFzdFByZXBhcmVLZXkgPSBwcmVwYXJlS2V5O1xufTtcblxuY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzID0gKHNwZWNpZmllcnMpID0+IHNwZWNpZmllcnMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuY29uc3QgbmV3RGVmYXVsdEltcG9ydEV4aXN0cyA9IChzcGVjaWZpZXJzKSA9PiBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuXG5jb25zdCBmaWxlSXNJblBrZyA9IChmaWxlKSA9PiB7XG4gIGNvbnN0IHsgcGF0aCwgcGtnIH0gPSByZWFkUGtnVXAoeyBjd2Q6IGZpbGUgfSk7XG4gIGNvbnN0IGJhc2VQYXRoID0gZGlybmFtZShwYXRoKTtcblxuICBjb25zdCBjaGVja1BrZ0ZpZWxkU3RyaW5nID0gKHBrZ0ZpZWxkKSA9PiB7XG4gICAgaWYgKGpvaW4oYmFzZVBhdGgsIHBrZ0ZpZWxkKSA9PT0gZmlsZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGRPYmplY3QgPSAocGtnRmllbGQpID0+IHtcbiAgICBjb25zdCBwa2dGaWVsZEZpbGVzID0gZmxhdE1hcCh2YWx1ZXMocGtnRmllbGQpLCAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gW10gOiBqb2luKGJhc2VQYXRoLCB2YWx1ZSkpO1xuXG4gICAgaWYgKGluY2x1ZGVzKHBrZ0ZpZWxkRmlsZXMsIGZpbGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZCA9IChwa2dGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGtnRmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY2hlY2tQa2dGaWVsZFN0cmluZyhwa2dGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkT2JqZWN0KHBrZ0ZpZWxkKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKHBrZy5wcml2YXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBrZy5iaW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYmluKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5icm93c2VyKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJyb3dzZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLm1haW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZFN0cmluZyhwa2cubWFpbikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnSGVscGZ1bCB3YXJuaW5ncycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvcmJpZCBtb2R1bGVzIHdpdGhvdXQgZXhwb3J0cywgb3IgZXhwb3J0cyB3aXRob3V0IG1hdGNoaW5nIGltcG9ydCBpbiBhbm90aGVyIG1vZHVsZS4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCduby11bnVzZWQtbW9kdWxlcycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBzcmM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIHRvIGJlIGFuYWx5emVkIChvbmx5IGZvciB1bnVzZWQgZXhwb3J0cyknLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZUV4cG9ydHM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIGZvciB3aGljaCB1bnVzZWQgZXhwb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCAoZS5nIG1vZHVsZSBlbnRyeSBwb2ludHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAncmVwb3J0IG1vZHVsZXMgd2l0aG91dCBhbnkgZXhwb3J0cycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB1bnVzZWRFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnaWdub3JlIHR5cGUgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgICAgc3JjOiB7XG4gICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VudXNlZEV4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1pc3NpbmdFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfV0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzcmMsXG4gICAgICBpZ25vcmVFeHBvcnRzID0gW10sXG4gICAgICBtaXNzaW5nRXhwb3J0cyxcbiAgICAgIHVudXNlZEV4cG9ydHMsXG4gICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9O1xuXG4gICAgaWYgKHVudXNlZEV4cG9ydHMpIHtcbiAgICAgIGRvUHJlcGFyYXRpb24oc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZ2V0UGh5c2ljYWxGaWxlbmFtZShjb250ZXh0KTtcblxuICAgIGNvbnN0IGNoZWNrRXhwb3J0UHJlc2VuY2UgPSAobm9kZSkgPT4ge1xuICAgICAgaWYgKCFtaXNzaW5nRXhwb3J0cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0Q291bnQgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydENvdW50LmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydHMgPSBleHBvcnRDb3VudC5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuICAgICAgaWYgKGV4cG9ydENvdW50LnNpemUgPCAxKSB7XG4gICAgICAgIC8vIG5vZGUuYm9keVswXSA9PT0gJ3VuZGVmaW5lZCcgb25seSBoYXBwZW5zLCBpZiBldmVyeXRoaW5nIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIGZpbGVcbiAgICAgICAgLy8gYmVpbmcgbGludGVkXG4gICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUuYm9keVswXSA/IG5vZGUuYm9keVswXSA6IG5vZGUsICdObyBleHBvcnRzIGZvdW5kJyk7XG4gICAgICB9XG4gICAgICBleHBvcnRDb3VudC5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgZXhwb3J0QWxsKTtcbiAgICAgIGV4cG9ydENvdW50LnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNoZWNrVXNhZ2UgPSAobm9kZSwgZXhwb3J0ZWRWYWx1ZSwgaXNUeXBlRXhwb3J0KSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlRXhwb3J0ICYmIGlnbm9yZVVudXNlZFR5cGVFeHBvcnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUlzSW5Qa2coZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNPdXRzaWRlU3JjLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIHRvIGJlIGxpbnRlZCBpcyBpbmNsdWRlZCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcmNGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlc091dHNpZGVTcmMuYWRkKGZpbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSk7XG5cbiAgICAgIGlmICghZXhwb3J0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmaWxlIFxcYCR7ZmlsZX1cXGAgaGFzIG5vIGV4cG9ydHMuIFBsZWFzZSB1cGRhdGUgdG8gdGhlIGxhdGVzdCwgYW5kIGlmIGl0IHN0aWxsIGhhcHBlbnMsIHJlcG9ydCB0aGlzIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9pbXBvcnQtanMvZXNsaW50LXBsdWdpbi1pbXBvcnQvaXNzdWVzLzI4NjYhYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogZXhwb3J0ICogZnJvbVxuICAgICAgY29uc3QgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBpZiAodHlwZW9mIGV4cG9ydEFsbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgIGlmIChleHBvcnRBbGwud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbmFtZXNwYWNlIGltcG9ydFxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydHMud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9ydHNMaXN0IHdpbGwgYWx3YXlzIG1hcCBhbnkgaW1wb3J0ZWQgdmFsdWUgb2YgJ2RlZmF1bHQnIHRvICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJ1xuICAgICAgY29uc3QgZXhwb3J0c0tleSA9IGV4cG9ydGVkVmFsdWUgPT09IERFRkFVTFQgPyBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgOiBleHBvcnRlZFZhbHVlO1xuXG4gICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChleHBvcnRzS2V5KTtcblxuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRzS2V5ID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgPyBERUZBVUxUIDogZXhwb3J0c0tleTtcblxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChleHBvcnRTdGF0ZW1lbnQud2hlcmVVc2VkLnNpemUgPCAxKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBvbmx5IHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSB2c2NvZGUtZXNsaW50XG4gICAgICpcbiAgICAgKiB1cGRhdGUgbGlzdHMgb2YgZXhpc3RpbmcgZXhwb3J0cyBkdXJpbmcgcnVudGltZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUV4cG9ydFVzYWdlID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcblxuICAgICAgLy8gbmV3IG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkIGR1cmluZyBydW50aW1lXG4gICAgICAvLyBpbmNsdWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdFeHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0SWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKCh7IHR5cGUsIGRlY2xhcmF0aW9uLCBzcGVjaWZpZXJzIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNwZWNpZmllcnMuZm9yRWFjaCgoc3BlY2lmaWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgfHwgc3BlY2lmaWVyLmV4cG9ydGVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQobmFtZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbmV3IGV4cG9ydCBpZGVudGlmaWVycyBhZGRlZDogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICghZXhwb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBjb25zdCBleHBvcnRBbGwgPSBleHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUltcG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5hbWVzcGFjZUltcG9ydHMgPSB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH07XG4gICAgICB9XG5cbiAgICAgIG5ld0V4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIGV4cG9ydEFsbCk7XG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgICBleHBvcnRMaXN0LnNldChmaWxlLCBuZXdFeHBvcnRzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IChub2RlKSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGlmICh0eXBlb2Ygb2xkSW1wb3J0UGF0aHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9sZEltcG9ydFBhdGhzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGROYW1lc3BhY2VJbXBvcnRzID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKTtcblxuICAgICAgY29uc3Qgb2xkRXhwb3J0QWxsID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0QWxsID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG5ld0RlZmF1bHRJbXBvcnRzID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGRJbXBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgIG9sZEltcG9ydFBhdGhzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmhhcyhFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSkge1xuICAgICAgICAgIG9sZEV4cG9ydEFsbC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaGFzKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKSkge1xuICAgICAgICAgIG9sZE5hbWVzcGFjZUltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUlxuICAgICAgICAgICAgJiYgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09ICdMaXRlcmFsJykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSByZXNvbHZlKHNvdXJjZS52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgdmlzaXQobm9kZSwgdmlzaXRvcktleU1hcC5nZXQoZmlsZSksIHtcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbihjaGlsZCkge1xuICAgICAgICAgIHByb2Nlc3NEeW5hbWljSW1wb3J0KGNoaWxkLnNvdXJjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIENhbGxFeHByZXNzaW9uKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmNhbGxlZS50eXBlID09PSAnSW1wb3J0Jykge1xuICAgICAgICAgICAgcHJvY2Vzc0R5bmFtaWNJbXBvcnQoY2hpbGQuYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbm9kZS5ib2R5LmZvckVhY2goKGFzdE5vZGUpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aDtcblxuICAgICAgICAvLyBzdXBwb3J0IGZvciBleHBvcnQgeyB2YWx1ZSB9IGZyb20gJ21vZHVsZSdcbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgaWYgKGFzdE5vZGUuc291cmNlKSB7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlKGFzdE5vZGUuc291cmNlLnJhdy5yZXBsYWNlKC8oJ3xcIikvZywgJycpLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNwZWNpZmllci5sb2NhbC5uYW1lIHx8IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChuYW1lLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXN0Tm9kZS50eXBlID09PSBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgbmV3RXhwb3J0QWxsLmFkZChyZXNvbHZlZFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNOb2RlTW9kdWxlKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzKGFzdE5vZGUuc3BlY2lmaWVycykpIHtcbiAgICAgICAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld0RlZmF1bHRJbXBvcnRFeGlzdHMoYXN0Tm9kZS5zcGVjaWZpZXJzKSkge1xuICAgICAgICAgICAgbmV3RGVmYXVsdEltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXN0Tm9kZS5zcGVjaWZpZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChzcGVjaWZpZXIpID0+IHNwZWNpZmllci50eXBlICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgJiYgc3BlY2lmaWVyLnR5cGUgIT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuaW1wb3J0ZWQudmFsdWUsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0V4cG9ydEFsbC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEV4cG9ydEFsbC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cyk7XG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydDtcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRXhwb3J0QWxsLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghbmV3RXhwb3J0QWxsLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbmV3RGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFvbGREZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKTtcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpO1xuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFuZXdEZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghb2xkTmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkTmFtZXNwYWNlSW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW5ld05hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0ltcG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEltcG9ydHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBsZXQgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoa2V5KTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBvbGRJbXBvcnRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFuZXdJbXBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoa2V5KTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW06ZXhpdCcobm9kZSkge1xuICAgICAgICB1cGRhdGVFeHBvcnRVc2FnZShub2RlKTtcbiAgICAgICAgdXBkYXRlSW1wb3J0VXNhZ2Uobm9kZSk7XG4gICAgICAgIGNoZWNrRXhwb3J0UHJlc2VuY2Uobm9kZSk7XG4gICAgICB9LFxuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY2hlY2tVc2FnZShub2RlLCBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uoc3BlY2lmaWVyLCBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQudmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIobm9kZS5kZWNsYXJhdGlvbiwgKG5hbWUsIGlzVHlwZUV4cG9ydCkgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgbmFtZSwgaXNUeXBlRXhwb3J0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19
--- +++ @@ -0,0 +1,33 @@+import { ESLint, Linter, Rule } from 'eslint';++declare const plugin: ESLint.Plugin & {+ meta: {+ name: string;+ version: string;+ };+ configs: {+ 'recommended': Linter.LegacyConfig;+ 'errors': Linter.LegacyConfig;+ 'warnings': Linter.LegacyConfig;+ 'stage-0': Linter.LegacyConfig;+ 'react': Linter.LegacyConfig;+ 'react-native': Linter.LegacyConfig;+ 'electron': Linter.LegacyConfig;+ 'typescript': Linter.LegacyConfig;+ };+ flatConfigs: {+ 'recommended': Linter.FlatConfig;+ 'errors': Linter.FlatConfig;+ 'warnings': Linter.FlatConfig;+ 'stage-0': Linter.FlatConfig;+ 'react': Linter.FlatConfig;+ 'react-native': Linter.FlatConfig;+ 'electron': Linter.FlatConfig;+ 'typescript': Linter.FlatConfig;+ };+ rules: {+ [key: string]: Rule.RuleModule;+ };+};++export = plugin;
--- +++ @@ -47,2 +47,3 @@ 'no-empty-named-blocks': require('./rules/no-empty-named-blocks'),+ 'enforce-node-protocol-usage': require('./rules/enforce-node-protocol-usage'), @@ -97,6 +98,6 @@ // useful stuff for folks using various environments- react: require('../config/flat/react'),- 'react-native': configs['react-native'],- electron: configs.electron,- typescript: configs.typescript };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJuYW1lZCIsIm5hbWVzcGFjZSIsImV4dGVuc2lvbnMiLCJmaXJzdCIsIm9yZGVyIiwidW5hbWJpZ3VvdXMiLCJjb25maWdzIiwicmVjb21tZW5kZWQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsInJlYWN0IiwiZWxlY3Ryb24iLCJ0eXBlc2NyaXB0IiwiaW1wb3J0UGx1Z2luIiwibWV0YSIsIm5hbWUiLCJ2ZXJzaW9uIiwiY3JlYXRlRmxhdENvbmZpZyIsImJhc2VDb25maWciLCJjb25maWdOYW1lIiwicGx1Z2lucyIsImZsYXRDb25maWdzIl0sIm1hcHBpbmdzIjoiNklBQUE7O0FBRU8sSUFBTUEsd0JBQVE7QUFDbkIsbUJBQWlCQyxRQUFRLHVCQUFSLENBREU7QUFFbkJDLFNBQU9ELFFBQVEsZUFBUixDQUZZO0FBR25CLGFBQVNBLFFBQVEsaUJBQVIsQ0FIVTtBQUluQkUsYUFBV0YsUUFBUSxtQkFBUixDQUpRO0FBS25CLGtCQUFnQkEsUUFBUSxzQkFBUixDQUxHO0FBTW5CLFlBQVFBLFFBQVEsZ0JBQVIsQ0FOVztBQU9uQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0FQSDtBQVFuQkcsY0FBWUgsUUFBUSxvQkFBUixDQVJPO0FBU25CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVRKO0FBVW5CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVZKO0FBV25CLG1CQUFpQkEsUUFBUSx1QkFBUixDQVhFO0FBWW5CLDBCQUF3QkEsUUFBUSw4QkFBUixDQVpMO0FBYW5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQWJYO0FBY25CLHFDQUFtQ0EsUUFBUSx5Q0FBUixDQWRoQjs7QUFnQm5CLG9CQUFrQkEsUUFBUSx3QkFBUixDQWhCQztBQWlCbkIsY0FBWUEsUUFBUSxrQkFBUixDQWpCTztBQWtCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBbEJEO0FBbUJuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FuQko7QUFvQm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQXBCWDtBQXFCbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBckJaO0FBc0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0F0QkY7O0FBd0JuQixpQkFBZUEsUUFBUSxxQkFBUixDQXhCSTtBQXlCbkIsWUFBVUEsUUFBUSxnQkFBUixDQXpCUztBQTBCbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBMUJFO0FBMkJuQkksU0FBT0osUUFBUSxlQUFSLENBM0JZO0FBNEJuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0E1QkQ7QUE2Qm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQTdCWDtBQThCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBOUJEO0FBK0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0EvQkY7QUFnQ25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQWhDVDtBQWlDbkJLLFNBQU9MLFFBQVEsZUFBUixDQWpDWTtBQWtDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBbENMO0FBbUNuQiwyQkFBeUJBLFFBQVEsK0JBQVIsQ0FuQ047QUFvQ25CLHVCQUFxQkEsUUFBUSwyQkFBUixDQXBDRjtBQXFDbkIscUJBQW1CQSxRQUFRLHlCQUFSLENBckNBO0FBc0NuQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0F0Q0g7QUF1Q25CTSxlQUFhTixRQUFRLHFCQUFSLENBdkNNO0FBd0NuQiwwQkFBd0JBLFFBQVEsOEJBQVIsQ0F4Q0w7QUF5Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXpDVDtBQTBDbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBMUNUO0FBMkNuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0EzQ1Q7QUE0Q25CLDJCQUF5QkEsUUFBUSwrQkFBUixDQTVDTjs7QUE4Q25CO0FBQ0Esa0JBQWdCQSxRQUFRLHNCQUFSLENBL0NHOztBQWlEbkI7QUFDQSxtQkFBaUJBLFFBQVEsdUJBQVIsQ0FsREU7O0FBb0RuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUixDQXJERSxFQUFkOzs7QUF3REEsSUFBTU8sNEJBQVU7QUFDckJDLGVBQWFSLFFBQVEsdUJBQVIsQ0FEUTs7QUFHckJTLFVBQVFULFFBQVEsa0JBQVIsQ0FIYTtBQUlyQlUsWUFBVVYsUUFBUSxvQkFBUixDQUpXOztBQU1yQjtBQUNBLGFBQVdBLFFBQVEsbUJBQVIsQ0FQVTs7QUFTckI7QUFDQVcsU0FBT1gsUUFBUSxpQkFBUixDQVZjO0FBV3JCLGtCQUFnQkEsUUFBUSx3QkFBUixDQVhLO0FBWXJCWSxZQUFVWixRQUFRLG9CQUFSLENBWlc7QUFhckJhLGNBQVliLFFBQVEsc0JBQVIsQ0FiUyxFQUFoQjs7O0FBZ0JQO0FBQ0EsSUFBTWMsZUFBZTtBQUNuQkMsUUFBTSxFQUFFQyxtQkFBRixFQUFRQyx5QkFBUixFQURhO0FBRW5CbEIsY0FGbUIsRUFBckI7OztBQUtBO0FBQ0EsSUFBTW1CLG1CQUFtQixTQUFuQkEsZ0JBQW1CLENBQUNDLFVBQUQsRUFBYUMsVUFBYjtBQUNwQkQsWUFEb0I7QUFFdkJILDZCQUFnQkksVUFBaEIsQ0FGdUI7QUFHdkJDLGFBQVMsRUFBRSxVQUFRUCxZQUFWLEVBSGMsS0FBekI7OztBQU1PLElBQU1RLG9DQUFjO0FBQ3pCZCxlQUFhVTtBQUNYbEIsVUFBUSw0QkFBUixDQURXO0FBRVgsZUFGVyxDQURZOzs7QUFNekJTLFVBQVFTLGlCQUFpQmxCLFFBQVEsdUJBQVIsQ0FBakIsRUFBbUQsUUFBbkQsQ0FOaUI7QUFPekJVLFlBQVVRLGlCQUFpQmxCLFFBQVEseUJBQVIsQ0FBakIsRUFBcUQsVUFBckQsQ0FQZTs7QUFTekI7QUFDQVcsU0FBT1gsUUFBUSxzQkFBUixDQVZrQjtBQVd6QixrQkFBZ0JPLFFBQVEsY0FBUixDQVhTO0FBWXpCSyxZQUFVTCxRQUFRSyxRQVpPO0FBYXpCQyxjQUFZTixRQUFRTSxVQWJLLEVBQXBCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgJ25vLXVucmVzb2x2ZWQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXVucmVzb2x2ZWQnKSxcbiAgbmFtZWQ6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgZGVmYXVsdDogcmVxdWlyZSgnLi9ydWxlcy9kZWZhdWx0JyksXG4gIG5hbWVzcGFjZTogcmVxdWlyZSgnLi9ydWxlcy9uYW1lc3BhY2UnKSxcbiAgJ25vLW5hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZXNwYWNlJyksXG4gIGV4cG9ydDogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gIGV4dGVuc2lvbnM6IHJlcXVpcmUoJy4vcnVsZXMvZXh0ZW5zaW9ucycpLFxuICAnbm8tcmVzdHJpY3RlZC1wYXRocyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVzdHJpY3RlZC1wYXRocycpLFxuICAnbm8taW50ZXJuYWwtbW9kdWxlcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8taW50ZXJuYWwtbW9kdWxlcycpLFxuICAnZ3JvdXAtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvZ3JvdXAtZXhwb3J0cycpLFxuICAnbm8tcmVsYXRpdmUtcGFja2FnZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLXJlbGF0aXZlLXBhY2thZ2VzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcbiAgJ2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnOiByZXF1aXJlKCcuL3J1bGVzL2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gIGZpcnN0OiByZXF1aXJlKCcuL3J1bGVzL2ZpcnN0JyksXG4gICdtYXgtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzJyksXG4gICduby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWFic29sdXRlLXBhdGgnOiByZXF1aXJlKCcuL3J1bGVzL25vLWFic29sdXRlLXBhdGgnKSxcbiAgJ25vLW5vZGVqcy1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1ub2RlanMtbW9kdWxlcycpLFxuICAnbm8td2VicGFjay1sb2FkZXItc3ludGF4JzogcmVxdWlyZSgnLi9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXgnKSxcbiAgb3JkZXI6IHJlcXVpcmUoJy4vcnVsZXMvb3JkZXInKSxcbiAgJ25ld2xpbmUtYWZ0ZXItaW1wb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydCcpLFxuICAncHJlZmVyLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydCcpLFxuICAnbm8tbmFtZWQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1leHBvcnQnKSxcbiAgJ25vLWR5bmFtaWMtcmVxdWlyZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZHluYW1pYy1yZXF1aXJlJyksXG4gIHVuYW1iaWd1b3VzOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuICAnbm8taW1wb3J0LW1vZHVsZS1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbXBvcnQtbW9kdWxlLWV4cG9ydHMnKSxcbiAgJ25vLWVtcHR5LW5hbWVkLWJsb2Nrcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZW1wdHktbmFtZWQtYmxvY2tzJyksXG5cbiAgLy8gZXhwb3J0XG4gICdleHBvcnRzLWxhc3QnOiByZXF1aXJlKCcuL3J1bGVzL2V4cG9ydHMtbGFzdCcpLFxuXG4gIC8vIG1ldGFkYXRhLWJhc2VkXG4gICduby1kZXByZWNhdGVkJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZXByZWNhdGVkJyksXG5cbiAgLy8gZGVwcmVjYXRlZCBhbGlhc2VzIHRvIHJ1bGVzXG4gICdpbXBvcnRzLWZpcnN0JzogcmVxdWlyZSgnLi9ydWxlcy9pbXBvcnRzLWZpcnN0JyksXG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlncyA9IHtcbiAgcmVjb21tZW5kZWQ6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWNvbW1lbmRlZCcpLFxuXG4gIGVycm9yczogcmVxdWlyZSgnLi4vY29uZmlnL2Vycm9ycycpLFxuICB3YXJuaW5nczogcmVxdWlyZSgnLi4vY29uZmlnL3dhcm5pbmdzJyksXG5cbiAgLy8gc2hoaGguLi4gd29yayBpbiBwcm9ncmVzcyBcInNlY3JldFwiIHJ1bGVzXG4gICdzdGFnZS0wJzogcmVxdWlyZSgnLi4vY29uZmlnL3N0YWdlLTAnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gIHJlYWN0OiByZXF1aXJlKCcuLi9jb25maWcvcmVhY3QnKSxcbiAgJ3JlYWN0LW5hdGl2ZSc6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWFjdC1uYXRpdmUnKSxcbiAgZWxlY3Ryb246IHJlcXVpcmUoJy4uL2NvbmZpZy9lbGVjdHJvbicpLFxuICB0eXBlc2NyaXB0OiByZXF1aXJlKCcuLi9jb25maWcvdHlwZXNjcmlwdCcpLFxufTtcblxuLy8gQmFzZSBQbHVnaW4gT2JqZWN0XG5jb25zdCBpbXBvcnRQbHVnaW4gPSB7XG4gIG1ldGE6IHsgbmFtZSwgdmVyc2lvbiB9LFxuICBydWxlcyxcbn07XG5cbi8vIENyZWF0ZSBmbGF0IGNvbmZpZ3MgKE9ubHkgb25lcyB0aGF0IGRlY2xhcmUgcGx1Z2lucyBhbmQgcGFyc2VyIG9wdGlvbnMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVnYWN5IGNvbmZpZylcbmNvbnN0IGNyZWF0ZUZsYXRDb25maWcgPSAoYmFzZUNvbmZpZywgY29uZmlnTmFtZSkgPT4gKHtcbiAgLi4uYmFzZUNvbmZpZyxcbiAgbmFtZTogYGltcG9ydC8ke2NvbmZpZ05hbWV9YCxcbiAgcGx1Z2luczogeyBpbXBvcnQ6IGltcG9ydFBsdWdpbiB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBmbGF0Q29uZmlncyA9IHtcbiAgcmVjb21tZW5kZWQ6IGNyZWF0ZUZsYXRDb25maWcoXG4gICAgcmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvcmVjb21tZW5kZWQnKSxcbiAgICAncmVjb21tZW5kZWQnLFxuICApLFxuXG4gIGVycm9yczogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC9lcnJvcnMnKSwgJ2Vycm9ycycpLFxuICB3YXJuaW5nczogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC93YXJuaW5ncycpLCAnd2FybmluZ3MnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gIHJlYWN0OiByZXF1aXJlKCcuLi9jb25maWcvZmxhdC9yZWFjdCcpLFxuICAncmVhY3QtbmF0aXZlJzogY29uZmlnc1sncmVhY3QtbmF0aXZlJ10sXG4gIGVsZWN0cm9uOiBjb25maWdzLmVsZWN0cm9uLFxuICB0eXBlc2NyaXB0OiBjb25maWdzLnR5cGVzY3JpcHQsXG59O1xuIl19+ react: createFlatConfig(require('../config/flat/react'), 'react'),+ 'react-native': createFlatConfig(configs['react-native'], 'react-native'),+ electron: createFlatConfig(configs.electron, 'electron'),+ typescript: createFlatConfig(configs.typescript, 'typescript') };+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJuYW1lZCIsIm5hbWVzcGFjZSIsImV4dGVuc2lvbnMiLCJmaXJzdCIsIm9yZGVyIiwidW5hbWJpZ3VvdXMiLCJjb25maWdzIiwicmVjb21tZW5kZWQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsInJlYWN0IiwiZWxlY3Ryb24iLCJ0eXBlc2NyaXB0IiwiaW1wb3J0UGx1Z2luIiwibWV0YSIsIm5hbWUiLCJ2ZXJzaW9uIiwiY3JlYXRlRmxhdENvbmZpZyIsImJhc2VDb25maWciLCJjb25maWdOYW1lIiwicGx1Z2lucyIsImZsYXRDb25maWdzIl0sIm1hcHBpbmdzIjoiNklBQUE7O0FBRU8sSUFBTUEsd0JBQVE7QUFDbkIsbUJBQWlCQyxRQUFRLHVCQUFSLENBREU7QUFFbkJDLFNBQU9ELFFBQVEsZUFBUixDQUZZO0FBR25CLGFBQVNBLFFBQVEsaUJBQVIsQ0FIVTtBQUluQkUsYUFBV0YsUUFBUSxtQkFBUixDQUpRO0FBS25CLGtCQUFnQkEsUUFBUSxzQkFBUixDQUxHO0FBTW5CLFlBQVFBLFFBQVEsZ0JBQVIsQ0FOVztBQU9uQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0FQSDtBQVFuQkcsY0FBWUgsUUFBUSxvQkFBUixDQVJPO0FBU25CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVRKO0FBVW5CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVZKO0FBV25CLG1CQUFpQkEsUUFBUSx1QkFBUixDQVhFO0FBWW5CLDBCQUF3QkEsUUFBUSw4QkFBUixDQVpMO0FBYW5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQWJYO0FBY25CLHFDQUFtQ0EsUUFBUSx5Q0FBUixDQWRoQjs7QUFnQm5CLG9CQUFrQkEsUUFBUSx3QkFBUixDQWhCQztBQWlCbkIsY0FBWUEsUUFBUSxrQkFBUixDQWpCTztBQWtCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBbEJEO0FBbUJuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FuQko7QUFvQm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQXBCWDtBQXFCbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBckJaO0FBc0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0F0QkY7O0FBd0JuQixpQkFBZUEsUUFBUSxxQkFBUixDQXhCSTtBQXlCbkIsWUFBVUEsUUFBUSxnQkFBUixDQXpCUztBQTBCbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBMUJFO0FBMkJuQkksU0FBT0osUUFBUSxlQUFSLENBM0JZO0FBNEJuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0E1QkQ7QUE2Qm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQTdCWDtBQThCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBOUJEO0FBK0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0EvQkY7QUFnQ25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQWhDVDtBQWlDbkJLLFNBQU9MLFFBQVEsZUFBUixDQWpDWTtBQWtDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBbENMO0FBbUNuQiwyQkFBeUJBLFFBQVEsK0JBQVIsQ0FuQ047QUFvQ25CLHVCQUFxQkEsUUFBUSwyQkFBUixDQXBDRjtBQXFDbkIscUJBQW1CQSxRQUFRLHlCQUFSLENBckNBO0FBc0NuQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0F0Q0g7QUF1Q25CTSxlQUFhTixRQUFRLHFCQUFSLENBdkNNO0FBd0NuQiwwQkFBd0JBLFFBQVEsOEJBQVIsQ0F4Q0w7QUF5Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXpDVDtBQTBDbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBMUNUO0FBMkNuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0EzQ1Q7QUE0Q25CLDJCQUF5QkEsUUFBUSwrQkFBUixDQTVDTjtBQTZDbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBN0NaOztBQStDbkI7QUFDQSxrQkFBZ0JBLFFBQVEsc0JBQVIsQ0FoREc7O0FBa0RuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUixDQW5ERTs7QUFxRG5CO0FBQ0EsbUJBQWlCQSxRQUFRLHVCQUFSLENBdERFLEVBQWQ7OztBQXlEQSxJQUFNTyw0QkFBVTtBQUNyQkMsZUFBYVIsUUFBUSx1QkFBUixDQURROztBQUdyQlMsVUFBUVQsUUFBUSxrQkFBUixDQUhhO0FBSXJCVSxZQUFVVixRQUFRLG9CQUFSLENBSlc7O0FBTXJCO0FBQ0EsYUFBV0EsUUFBUSxtQkFBUixDQVBVOztBQVNyQjtBQUNBVyxTQUFPWCxRQUFRLGlCQUFSLENBVmM7QUFXckIsa0JBQWdCQSxRQUFRLHdCQUFSLENBWEs7QUFZckJZLFlBQVVaLFFBQVEsb0JBQVIsQ0FaVztBQWFyQmEsY0FBWWIsUUFBUSxzQkFBUixDQWJTLEVBQWhCOzs7QUFnQlA7QUFDQSxJQUFNYyxlQUFlO0FBQ25CQyxRQUFNLEVBQUVDLG1CQUFGLEVBQVFDLHlCQUFSLEVBRGE7QUFFbkJsQixjQUZtQixFQUFyQjs7O0FBS0E7QUFDQSxJQUFNbUIsbUJBQW1CLFNBQW5CQSxnQkFBbUIsQ0FBQ0MsVUFBRCxFQUFhQyxVQUFiO0FBQ3BCRCxZQURvQjtBQUV2QkgsNkJBQWdCSSxVQUFoQixDQUZ1QjtBQUd2QkMsYUFBUyxFQUFFLFVBQVFQLFlBQVYsRUFIYyxLQUF6Qjs7O0FBTU8sSUFBTVEsb0NBQWM7QUFDekJkLGVBQWFVO0FBQ1hsQixVQUFRLDRCQUFSLENBRFc7QUFFWCxlQUZXLENBRFk7OztBQU16QlMsVUFBUVMsaUJBQWlCbEIsUUFBUSx1QkFBUixDQUFqQixFQUFtRCxRQUFuRCxDQU5pQjtBQU96QlUsWUFBVVEsaUJBQWlCbEIsUUFBUSx5QkFBUixDQUFqQixFQUFxRCxVQUFyRCxDQVBlOztBQVN6QjtBQUNBVyxTQUFPTyxpQkFBaUJsQixRQUFRLHNCQUFSLENBQWpCLEVBQWtELE9BQWxELENBVmtCO0FBV3pCLGtCQUFnQmtCLGlCQUFpQlgsUUFBUSxjQUFSLENBQWpCLEVBQTBDLGNBQTFDLENBWFM7QUFZekJLLFlBQVVNLGlCQUFpQlgsUUFBUUssUUFBekIsRUFBbUMsVUFBbkMsQ0FaZTtBQWF6QkMsY0FBWUssaUJBQWlCWCxRQUFRTSxVQUF6QixFQUFxQyxZQUFyQyxDQWJhLEVBQXBCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgJ25vLXVucmVzb2x2ZWQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXVucmVzb2x2ZWQnKSxcbiAgbmFtZWQ6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgZGVmYXVsdDogcmVxdWlyZSgnLi9ydWxlcy9kZWZhdWx0JyksXG4gIG5hbWVzcGFjZTogcmVxdWlyZSgnLi9ydWxlcy9uYW1lc3BhY2UnKSxcbiAgJ25vLW5hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZXNwYWNlJyksXG4gIGV4cG9ydDogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gIGV4dGVuc2lvbnM6IHJlcXVpcmUoJy4vcnVsZXMvZXh0ZW5zaW9ucycpLFxuICAnbm8tcmVzdHJpY3RlZC1wYXRocyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVzdHJpY3RlZC1wYXRocycpLFxuICAnbm8taW50ZXJuYWwtbW9kdWxlcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8taW50ZXJuYWwtbW9kdWxlcycpLFxuICAnZ3JvdXAtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvZ3JvdXAtZXhwb3J0cycpLFxuICAnbm8tcmVsYXRpdmUtcGFja2FnZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLXJlbGF0aXZlLXBhY2thZ2VzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcbiAgJ2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnOiByZXF1aXJlKCcuL3J1bGVzL2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gIGZpcnN0OiByZXF1aXJlKCcuL3J1bGVzL2ZpcnN0JyksXG4gICdtYXgtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzJyksXG4gICduby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWFic29sdXRlLXBhdGgnOiByZXF1aXJlKCcuL3J1bGVzL25vLWFic29sdXRlLXBhdGgnKSxcbiAgJ25vLW5vZGVqcy1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1ub2RlanMtbW9kdWxlcycpLFxuICAnbm8td2VicGFjay1sb2FkZXItc3ludGF4JzogcmVxdWlyZSgnLi9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXgnKSxcbiAgb3JkZXI6IHJlcXVpcmUoJy4vcnVsZXMvb3JkZXInKSxcbiAgJ25ld2xpbmUtYWZ0ZXItaW1wb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydCcpLFxuICAncHJlZmVyLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydCcpLFxuICAnbm8tbmFtZWQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1leHBvcnQnKSxcbiAgJ25vLWR5bmFtaWMtcmVxdWlyZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZHluYW1pYy1yZXF1aXJlJyksXG4gIHVuYW1iaWd1b3VzOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuICAnbm8taW1wb3J0LW1vZHVsZS1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbXBvcnQtbW9kdWxlLWV4cG9ydHMnKSxcbiAgJ25vLWVtcHR5LW5hbWVkLWJsb2Nrcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZW1wdHktbmFtZWQtYmxvY2tzJyksXG4gICdlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UnOiByZXF1aXJlKCcuL3J1bGVzL2VuZm9yY2Utbm9kZS1wcm90b2NvbC11c2FnZScpLFxuXG4gIC8vIGV4cG9ydFxuICAnZXhwb3J0cy1sYXN0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnRzLWxhc3QnKSxcblxuICAvLyBtZXRhZGF0YS1iYXNlZFxuICAnbm8tZGVwcmVjYXRlZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVwcmVjYXRlZCcpLFxuXG4gIC8vIGRlcHJlY2F0ZWQgYWxpYXNlcyB0byBydWxlc1xuICAnaW1wb3J0cy1maXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvaW1wb3J0cy1maXJzdCcpLFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpZ3MgPSB7XG4gIHJlY29tbWVuZGVkOiByZXF1aXJlKCcuLi9jb25maWcvcmVjb21tZW5kZWQnKSxcblxuICBlcnJvcnM6IHJlcXVpcmUoJy4uL2NvbmZpZy9lcnJvcnMnKSxcbiAgd2FybmluZ3M6IHJlcXVpcmUoJy4uL2NvbmZpZy93YXJuaW5ncycpLFxuXG4gIC8vIHNoaGhoLi4uIHdvcmsgaW4gcHJvZ3Jlc3MgXCJzZWNyZXRcIiBydWxlc1xuICAnc3RhZ2UtMCc6IHJlcXVpcmUoJy4uL2NvbmZpZy9zdGFnZS0wJyksXG5cbiAgLy8gdXNlZnVsIHN0dWZmIGZvciBmb2xrcyB1c2luZyB2YXJpb3VzIGVudmlyb25tZW50c1xuICByZWFjdDogcmVxdWlyZSgnLi4vY29uZmlnL3JlYWN0JyksXG4gICdyZWFjdC1uYXRpdmUnOiByZXF1aXJlKCcuLi9jb25maWcvcmVhY3QtbmF0aXZlJyksXG4gIGVsZWN0cm9uOiByZXF1aXJlKCcuLi9jb25maWcvZWxlY3Ryb24nKSxcbiAgdHlwZXNjcmlwdDogcmVxdWlyZSgnLi4vY29uZmlnL3R5cGVzY3JpcHQnKSxcbn07XG5cbi8vIEJhc2UgUGx1Z2luIE9iamVjdFxuY29uc3QgaW1wb3J0UGx1Z2luID0ge1xuICBtZXRhOiB7IG5hbWUsIHZlcnNpb24gfSxcbiAgcnVsZXMsXG59O1xuXG4vLyBDcmVhdGUgZmxhdCBjb25maWdzIChPbmx5IG9uZXMgdGhhdCBkZWNsYXJlIHBsdWdpbnMgYW5kIHBhcnNlciBvcHRpb25zIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlZ2FjeSBjb25maWcpXG5jb25zdCBjcmVhdGVGbGF0Q29uZmlnID0gKGJhc2VDb25maWcsIGNvbmZpZ05hbWUpID0+ICh7XG4gIC4uLmJhc2VDb25maWcsXG4gIG5hbWU6IGBpbXBvcnQvJHtjb25maWdOYW1lfWAsXG4gIHBsdWdpbnM6IHsgaW1wb3J0OiBpbXBvcnRQbHVnaW4gfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZmxhdENvbmZpZ3MgPSB7XG4gIHJlY29tbWVuZGVkOiBjcmVhdGVGbGF0Q29uZmlnKFxuICAgIHJlcXVpcmUoJy4uL2NvbmZpZy9mbGF0L3JlY29tbWVuZGVkJyksXG4gICAgJ3JlY29tbWVuZGVkJyxcbiAgKSxcblxuICBlcnJvcnM6IGNyZWF0ZUZsYXRDb25maWcocmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvZXJyb3JzJyksICdlcnJvcnMnKSxcbiAgd2FybmluZ3M6IGNyZWF0ZUZsYXRDb25maWcocmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvd2FybmluZ3MnKSwgJ3dhcm5pbmdzJyksXG5cbiAgLy8gdXNlZnVsIHN0dWZmIGZvciBmb2xrcyB1c2luZyB2YXJpb3VzIGVudmlyb25tZW50c1xuICByZWFjdDogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC9yZWFjdCcpLCAncmVhY3QnKSxcbiAgJ3JlYWN0LW5hdGl2ZSc6IGNyZWF0ZUZsYXRDb25maWcoY29uZmlnc1sncmVhY3QtbmF0aXZlJ10sICdyZWFjdC1uYXRpdmUnKSxcbiAgZWxlY3Ryb246IGNyZWF0ZUZsYXRDb25maWcoY29uZmlncy5lbGVjdHJvbiwgJ2VsZWN0cm9uJyksXG4gIHR5cGVzY3JpcHQ6IGNyZWF0ZUZsYXRDb25maWcoY29uZmlncy50eXBlc2NyaXB0LCAndHlwZXNjcmlwdCcpLFxufTtcbiJdfQ==
--- +++ @@ -0,0 +1,147 @@+'use strict';var _messages;function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}++var isCoreModule = require('is-core-module');var _require =+require('../docsUrl'),docsUrl = _require['default'];++var DO_PREFER_MESSAGE_ID = 'requireNodeProtocol';+var NEVER_PREFER_MESSAGE_ID = 'forbidNodeProtocol';+var messages = (_messages = {}, _defineProperty(_messages,+DO_PREFER_MESSAGE_ID, 'Prefer `node:{{moduleName}}` over `{{moduleName}}`.'), _defineProperty(_messages,+NEVER_PREFER_MESSAGE_ID, 'Prefer `{{moduleName}}` over `node:{{moduleName}}`.'), _messages);+++function replaceStringLiteral(+fixer,+node,+text,+relativeRangeStart,+relativeRangeEnd)+{+ var firstCharacterIndex = node.range[0] + 1;+ var start = Number.isInteger(relativeRangeEnd) ?+ relativeRangeStart + firstCharacterIndex :+ firstCharacterIndex;+ var end = Number.isInteger(relativeRangeEnd) ?+ relativeRangeEnd + firstCharacterIndex :+ node.range[1] - 1;++ return fixer.replaceTextRange([start, end], text);+}++function isStringLiteral(node) {+ return node && node.type === 'Literal' && typeof node.value === 'string';+}++function isStaticRequireWith1Param(node) {+ return !node.optional &&+ node.callee.type === 'Identifier' &&+ node.callee.name === 'require'+ // check for only 1 argument+ && node.arguments.length === 1 &&+ node.arguments[0] &&+ isStringLiteral(node.arguments[0]);+}++function checkAndReport(src, context) {+ // TODO use src.quasis[0].value.raw+ if (!src || src.type === 'TemplateLiteral') {return;}+ var moduleName = 'value' in src ? src.value : src.name;+ if (typeof moduleName !== 'string') {console.log(src, moduleName);}var+ settings = context.settings;+ var nodeVersion = settings && settings['import/node-version'];+ if (+ typeof nodeVersion !== 'undefined' && (++ typeof nodeVersion !== 'string' ||+ !/^[0-9]+\.[0-9]+\.[0-9]+$/.test(nodeVersion)))++ {+ throw new TypeError('`import/node-version` setting must be a string in the format "10.23.45" (a semver version, with no leading zero)');+ }++ if (context.options[0] === 'never') {+ if (!moduleName.startsWith('node:')) {return;}++ var actualModuleName = moduleName.slice(5);+ if (!isCoreModule(actualModuleName, nodeVersion || undefined)) {return;}++ context.report({+ node: src,+ message: messages[NEVER_PREFER_MESSAGE_ID],+ data: { moduleName: actualModuleName },+ /** @param {import('eslint').Rule.RuleFixer} fixer */+ fix: function () {function fix(fixer) {+ return replaceStringLiteral(fixer, src, '', 0, 5);+ }return fix;}() });++ } else if (context.options[0] === 'always') {+ if (+ moduleName.startsWith('node:') ||+ !isCoreModule(moduleName, nodeVersion || undefined) ||+ !isCoreModule('node:' + String(moduleName), nodeVersion || undefined))+ {+ return;+ }++ context.report({+ node: src,+ message: messages[DO_PREFER_MESSAGE_ID],+ data: { moduleName: moduleName },+ /** @param {import('eslint').Rule.RuleFixer} fixer */+ fix: function () {function fix(fixer) {+ return replaceStringLiteral(fixer, src, 'node:', 0, 0);+ }return fix;}() });++ } else if (typeof context.options[0] === 'undefined') {+ throw new Error('Missing option');+ } else {+ throw new Error('Unexpected option: ' + String(context.options[0]));+ }+}++/** @type {import('eslint').Rule.RuleModule} */+module.exports = {+ meta: {+ type: 'suggestion',+ docs: {+ description: 'Enforce either using, or omitting, the `node:` protocol when importing Node.js builtin modules.',+ recommended: true,+ category: 'Static analysis',+ url: docsUrl('enforce-node-protocol-usage') },++ fixable: 'code',+ schema: {+ type: 'array',+ minItems: 1,+ maxItems: 1,+ items: [+ {+ 'enum': ['always', 'never'] }] },++++ messages: messages },++ create: function () {function create(context) {+ return {+ CallExpression: function () {function CallExpression(node) {+ if (!isStaticRequireWith1Param(node)) {return;}++ var arg = node.arguments[0];++ return checkAndReport(arg, context);+ }return CallExpression;}(),+ ExportNamedDeclaration: function () {function ExportNamedDeclaration(node) {+ return checkAndReport(node.source, context);+ }return ExportNamedDeclaration;}(),+ ImportDeclaration: function () {function ImportDeclaration(node) {+ return checkAndReport(node.source, context);+ }return ImportDeclaration;}(),+ ImportExpression: function () {function ImportExpression(node) {+ if (!isStringLiteral(node.source)) {return;}++ return checkAndReport(node.source, context);+ }return ImportExpression;}() };++ }return create;}() };+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9lbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UuanMiXSwibmFtZXMiOlsiaXNDb3JlTW9kdWxlIiwicmVxdWlyZSIsImRvY3NVcmwiLCJET19QUkVGRVJfTUVTU0FHRV9JRCIsIk5FVkVSX1BSRUZFUl9NRVNTQUdFX0lEIiwibWVzc2FnZXMiLCJyZXBsYWNlU3RyaW5nTGl0ZXJhbCIsImZpeGVyIiwibm9kZSIsInRleHQiLCJyZWxhdGl2ZVJhbmdlU3RhcnQiLCJyZWxhdGl2ZVJhbmdlRW5kIiwiZmlyc3RDaGFyYWN0ZXJJbmRleCIsInJhbmdlIiwic3RhcnQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJlbmQiLCJyZXBsYWNlVGV4dFJhbmdlIiwiaXNTdHJpbmdMaXRlcmFsIiwidHlwZSIsInZhbHVlIiwiaXNTdGF0aWNSZXF1aXJlV2l0aDFQYXJhbSIsIm9wdGlvbmFsIiwiY2FsbGVlIiwibmFtZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsImNoZWNrQW5kUmVwb3J0Iiwic3JjIiwiY29udGV4dCIsIm1vZHVsZU5hbWUiLCJjb25zb2xlIiwibG9nIiwic2V0dGluZ3MiLCJub2RlVmVyc2lvbiIsInRlc3QiLCJUeXBlRXJyb3IiLCJvcHRpb25zIiwic3RhcnRzV2l0aCIsImFjdHVhbE1vZHVsZU5hbWUiLCJzbGljZSIsInVuZGVmaW5lZCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJkYXRhIiwiZml4IiwiRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJkZXNjcmlwdGlvbiIsInJlY29tbWVuZGVkIiwiY2F0ZWdvcnkiLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsIml0ZW1zIiwiY3JlYXRlIiwiQ2FsbEV4cHJlc3Npb24iLCJhcmciLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwic291cmNlIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJJbXBvcnRFeHByZXNzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxhOztBQUVBLElBQU1BLGVBQWVDLFFBQVEsZ0JBQVIsQ0FBckIsQztBQUM2QkEsUUFBUSxZQUFSLEMsQ0FBWkMsTzs7QUFFakIsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLDBCQUEwQixvQkFBaEM7QUFDQSxJQUFNQztBQUNIRixvQkFERyxFQUNvQixxREFEcEI7QUFFSEMsdUJBRkcsRUFFdUIscURBRnZCLGFBQU47OztBQUtBLFNBQVNFLG9CQUFUO0FBQ0VDLEtBREY7QUFFRUMsSUFGRjtBQUdFQyxJQUhGO0FBSUVDLGtCQUpGO0FBS0VDLGdCQUxGO0FBTUU7QUFDQSxNQUFNQyxzQkFBc0JKLEtBQUtLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLENBQTVDO0FBQ0EsTUFBTUMsUUFBUUMsT0FBT0MsU0FBUCxDQUFpQkwsZ0JBQWpCO0FBQ1ZELHVCQUFxQkUsbUJBRFg7QUFFVkEscUJBRko7QUFHQSxNQUFNSyxNQUFNRixPQUFPQyxTQUFQLENBQWlCTCxnQkFBakI7QUFDUkEscUJBQW1CQyxtQkFEWDtBQUVSSixPQUFLSyxLQUFMLENBQVcsQ0FBWCxJQUFnQixDQUZwQjs7QUFJQSxTQUFPTixNQUFNVyxnQkFBTixDQUF1QixDQUFDSixLQUFELEVBQVFHLEdBQVIsQ0FBdkIsRUFBcUNSLElBQXJDLENBQVA7QUFDRDs7QUFFRCxTQUFTVSxlQUFULENBQXlCWCxJQUF6QixFQUErQjtBQUM3QixTQUFPQSxRQUFRQSxLQUFLWSxJQUFMLEtBQWMsU0FBdEIsSUFBbUMsT0FBT1osS0FBS2EsS0FBWixLQUFzQixRQUFoRTtBQUNEOztBQUVELFNBQVNDLHlCQUFULENBQW1DZCxJQUFuQyxFQUF5QztBQUN2QyxTQUFPLENBQUNBLEtBQUtlLFFBQU47QUFDRmYsT0FBS2dCLE1BQUwsQ0FBWUosSUFBWixLQUFxQixZQURuQjtBQUVGWixPQUFLZ0IsTUFBTCxDQUFZQyxJQUFaLEtBQXFCO0FBQ3hCO0FBSEssS0FJRmpCLEtBQUtrQixTQUFMLENBQWVDLE1BQWYsS0FBMEIsQ0FKeEI7QUFLRm5CLE9BQUtrQixTQUFMLENBQWUsQ0FBZixDQUxFO0FBTUZQLGtCQUFnQlgsS0FBS2tCLFNBQUwsQ0FBZSxDQUFmLENBQWhCLENBTkw7QUFPRDs7QUFFRCxTQUFTRSxjQUFULENBQXdCQyxHQUF4QixFQUE2QkMsT0FBN0IsRUFBc0M7QUFDcEM7QUFDQSxNQUFJLENBQUNELEdBQUQsSUFBUUEsSUFBSVQsSUFBSixLQUFhLGlCQUF6QixFQUE0QyxDQUFFLE9BQVM7QUFDdkQsTUFBTVcsYUFBYSxXQUFXRixHQUFYLEdBQWlCQSxJQUFJUixLQUFyQixHQUE2QlEsSUFBSUosSUFBcEQ7QUFDQSxNQUFJLE9BQU9NLFVBQVAsS0FBc0IsUUFBMUIsRUFBb0MsQ0FBRUMsUUFBUUMsR0FBUixDQUFZSixHQUFaLEVBQWlCRSxVQUFqQixFQUErQixDQUpqQztBQUs1QkcsVUFMNEIsR0FLZkosT0FMZSxDQUs1QkksUUFMNEI7QUFNcEMsTUFBTUMsY0FBY0QsWUFBWUEsU0FBUyxxQkFBVCxDQUFoQztBQUNBO0FBQ0UsU0FBT0MsV0FBUCxLQUF1QixXQUF2Qjs7QUFFRSxTQUFPQSxXQUFQLEtBQXVCLFFBQXZCO0FBQ0csR0FBRSwwQkFBRCxDQUE2QkMsSUFBN0IsQ0FBa0NELFdBQWxDLENBSE4sQ0FERjs7QUFNRTtBQUNBLFVBQU0sSUFBSUUsU0FBSixDQUFjLGtIQUFkLENBQU47QUFDRDs7QUFFRCxNQUFJUCxRQUFRUSxPQUFSLENBQWdCLENBQWhCLE1BQXVCLE9BQTNCLEVBQW9DO0FBQ2xDLFFBQUksQ0FBQ1AsV0FBV1EsVUFBWCxDQUFzQixPQUF0QixDQUFMLEVBQXFDLENBQUUsT0FBUzs7QUFFaEQsUUFBTUMsbUJBQW1CVCxXQUFXVSxLQUFYLENBQWlCLENBQWpCLENBQXpCO0FBQ0EsUUFBSSxDQUFDekMsYUFBYXdDLGdCQUFiLEVBQStCTCxlQUFlTyxTQUE5QyxDQUFMLEVBQStELENBQUUsT0FBUzs7QUFFMUVaLFlBQVFhLE1BQVIsQ0FBZTtBQUNibkMsWUFBTXFCLEdBRE87QUFFYmUsZUFBU3ZDLFNBQVNELHVCQUFULENBRkk7QUFHYnlDLFlBQU0sRUFBRWQsWUFBWVMsZ0JBQWQsRUFITztBQUliO0FBQ0FNLFNBTGEsNEJBS1R2QyxLQUxTLEVBS0Y7QUFDVCxpQkFBT0QscUJBQXFCQyxLQUFyQixFQUE0QnNCLEdBQTVCLEVBQWlDLEVBQWpDLEVBQXFDLENBQXJDLEVBQXdDLENBQXhDLENBQVA7QUFDRCxTQVBZLGdCQUFmOztBQVNELEdBZkQsTUFlTyxJQUFJQyxRQUFRUSxPQUFSLENBQWdCLENBQWhCLE1BQXVCLFFBQTNCLEVBQXFDO0FBQzFDO0FBQ0VQLGVBQVdRLFVBQVgsQ0FBc0IsT0FBdEI7QUFDRyxLQUFDdkMsYUFBYStCLFVBQWIsRUFBeUJJLGVBQWVPLFNBQXhDLENBREo7QUFFRyxLQUFDMUMsOEJBQXFCK0IsVUFBckIsR0FBbUNJLGVBQWVPLFNBQWxELENBSE47QUFJRTtBQUNBO0FBQ0Q7O0FBRURaLFlBQVFhLE1BQVIsQ0FBZTtBQUNibkMsWUFBTXFCLEdBRE87QUFFYmUsZUFBU3ZDLFNBQVNGLG9CQUFULENBRkk7QUFHYjBDLFlBQU0sRUFBRWQsc0JBQUYsRUFITztBQUliO0FBQ0FlLFNBTGEsNEJBS1R2QyxLQUxTLEVBS0Y7QUFDVCxpQkFBT0QscUJBQXFCQyxLQUFyQixFQUE0QnNCLEdBQTVCLEVBQWlDLE9BQWpDLEVBQTBDLENBQTFDLEVBQTZDLENBQTdDLENBQVA7QUFDRCxTQVBZLGdCQUFmOztBQVNELEdBbEJNLE1Ba0JBLElBQUksT0FBT0MsUUFBUVEsT0FBUixDQUFnQixDQUFoQixDQUFQLEtBQThCLFdBQWxDLEVBQStDO0FBQ3BELFVBQU0sSUFBSVMsS0FBSixDQUFVLGdCQUFWLENBQU47QUFDRCxHQUZNLE1BRUE7QUFDTCxVQUFNLElBQUlBLEtBQUosZ0NBQWdDakIsUUFBUVEsT0FBUixDQUFnQixDQUFoQixDQUFoQyxFQUFOO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBVSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSjlCLFVBQU0sWUFERjtBQUVKK0IsVUFBTTtBQUNKQyxtQkFBYSxpR0FEVDtBQUVKQyxtQkFBYSxJQUZUO0FBR0pDLGdCQUFVLGlCQUhOO0FBSUpDLFdBQUtyRCxRQUFRLDZCQUFSLENBSkQsRUFGRjs7QUFRSnNELGFBQVMsTUFSTDtBQVNKQyxZQUFRO0FBQ05yQyxZQUFNLE9BREE7QUFFTnNDLGdCQUFVLENBRko7QUFHTkMsZ0JBQVUsQ0FISjtBQUlOQyxhQUFPO0FBQ0w7QUFDRSxnQkFBTSxDQUFDLFFBQUQsRUFBVyxPQUFYLENBRFIsRUFESyxDQUpELEVBVEo7Ozs7QUFtQkp2RCxzQkFuQkksRUFEUzs7QUFzQmZ3RCxRQXRCZSwrQkFzQlIvQixPQXRCUSxFQXNCQztBQUNkLGFBQU87QUFDTGdDLHNCQURLLHVDQUNVdEQsSUFEVixFQUNnQjtBQUNuQixnQkFBSSxDQUFDYywwQkFBMEJkLElBQTFCLENBQUwsRUFBc0MsQ0FBRSxPQUFTOztBQUVqRCxnQkFBTXVELE1BQU12RCxLQUFLa0IsU0FBTCxDQUFlLENBQWYsQ0FBWjs7QUFFQSxtQkFBT0UsZUFBZW1DLEdBQWYsRUFBb0JqQyxPQUFwQixDQUFQO0FBQ0QsV0FQSTtBQVFMa0MsOEJBUkssK0NBUWtCeEQsSUFSbEIsRUFRd0I7QUFDM0IsbUJBQU9vQixlQUFlcEIsS0FBS3lELE1BQXBCLEVBQTRCbkMsT0FBNUIsQ0FBUDtBQUNELFdBVkk7QUFXTG9DLHlCQVhLLDBDQVdhMUQsSUFYYixFQVdtQjtBQUN0QixtQkFBT29CLGVBQWVwQixLQUFLeUQsTUFBcEIsRUFBNEJuQyxPQUE1QixDQUFQO0FBQ0QsV0FiSTtBQWNMcUMsd0JBZEsseUNBY1kzRCxJQWRaLEVBY2tCO0FBQ3JCLGdCQUFJLENBQUNXLGdCQUFnQlgsS0FBS3lELE1BQXJCLENBQUwsRUFBbUMsQ0FBRSxPQUFTOztBQUU5QyxtQkFBT3JDLGVBQWVwQixLQUFLeUQsTUFBcEIsRUFBNEJuQyxPQUE1QixDQUFQO0FBQ0QsV0FsQkksNkJBQVA7O0FBb0JELEtBM0NjLG1CQUFqQiIsImZpbGUiOiJlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzQ29yZU1vZHVsZSA9IHJlcXVpcmUoJ2lzLWNvcmUtbW9kdWxlJyk7XG5jb25zdCB7IGRlZmF1bHQ6IGRvY3NVcmwgfSA9IHJlcXVpcmUoJy4uL2RvY3NVcmwnKTtcblxuY29uc3QgRE9fUFJFRkVSX01FU1NBR0VfSUQgPSAncmVxdWlyZU5vZGVQcm90b2NvbCc7XG5jb25zdCBORVZFUl9QUkVGRVJfTUVTU0FHRV9JRCA9ICdmb3JiaWROb2RlUHJvdG9jb2wnO1xuY29uc3QgbWVzc2FnZXMgPSB7XG4gIFtET19QUkVGRVJfTUVTU0FHRV9JRF06ICdQcmVmZXIgYG5vZGU6e3ttb2R1bGVOYW1lfX1gIG92ZXIgYHt7bW9kdWxlTmFtZX19YC4nLFxuICBbTkVWRVJfUFJFRkVSX01FU1NBR0VfSURdOiAnUHJlZmVyIGB7e21vZHVsZU5hbWV9fWAgb3ZlciBgbm9kZTp7e21vZHVsZU5hbWV9fWAuJyxcbn07XG5cbmZ1bmN0aW9uIHJlcGxhY2VTdHJpbmdMaXRlcmFsKFxuICBmaXhlcixcbiAgbm9kZSxcbiAgdGV4dCxcbiAgcmVsYXRpdmVSYW5nZVN0YXJ0LFxuICByZWxhdGl2ZVJhbmdlRW5kLFxuKSB7XG4gIGNvbnN0IGZpcnN0Q2hhcmFjdGVySW5kZXggPSBub2RlLnJhbmdlWzBdICsgMTtcbiAgY29uc3Qgc3RhcnQgPSBOdW1iZXIuaXNJbnRlZ2VyKHJlbGF0aXZlUmFuZ2VFbmQpXG4gICAgPyByZWxhdGl2ZVJhbmdlU3RhcnQgKyBmaXJzdENoYXJhY3RlckluZGV4XG4gICAgOiBmaXJzdENoYXJhY3RlckluZGV4O1xuICBjb25zdCBlbmQgPSBOdW1iZXIuaXNJbnRlZ2VyKHJlbGF0aXZlUmFuZ2VFbmQpXG4gICAgPyByZWxhdGl2ZVJhbmdlRW5kICsgZmlyc3RDaGFyYWN0ZXJJbmRleFxuICAgIDogbm9kZS5yYW5nZVsxXSAtIDE7XG5cbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UoW3N0YXJ0LCBlbmRdLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSAnTGl0ZXJhbCcgJiYgdHlwZW9mIG5vZGUudmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRpY1JlcXVpcmVXaXRoMVBhcmFtKG5vZGUpIHtcbiAgcmV0dXJuICFub2RlLm9wdGlvbmFsXG4gICAgJiYgbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgJiYgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3JlcXVpcmUnXG4gICAgLy8gY2hlY2sgZm9yIG9ubHkgMSBhcmd1bWVudFxuICAgICYmIG5vZGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgICYmIG5vZGUuYXJndW1lbnRzWzBdXG4gICAgJiYgaXNTdHJpbmdMaXRlcmFsKG5vZGUuYXJndW1lbnRzWzBdKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRSZXBvcnQoc3JjLCBjb250ZXh0KSB7XG4gIC8vIFRPRE8gdXNlIHNyYy5xdWFzaXNbMF0udmFsdWUucmF3XG4gIGlmICghc3JjIHx8IHNyYy50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJykgeyByZXR1cm47IH1cbiAgY29uc3QgbW9kdWxlTmFtZSA9ICd2YWx1ZScgaW4gc3JjID8gc3JjLnZhbHVlIDogc3JjLm5hbWU7XG4gIGlmICh0eXBlb2YgbW9kdWxlTmFtZSAhPT0gJ3N0cmluZycpIHsgY29uc29sZS5sb2coc3JjLCBtb2R1bGVOYW1lKTsgfVxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBjb250ZXh0O1xuICBjb25zdCBub2RlVmVyc2lvbiA9IHNldHRpbmdzICYmIHNldHRpbmdzWydpbXBvcnQvbm9kZS12ZXJzaW9uJ107XG4gIGlmIChcbiAgICB0eXBlb2Ygbm9kZVZlcnNpb24gIT09ICd1bmRlZmluZWQnXG4gICAgJiYgKFxuICAgICAgdHlwZW9mIG5vZGVWZXJzaW9uICE9PSAnc3RyaW5nJ1xuICAgICAgfHwgISgvXlswLTldK1xcLlswLTldK1xcLlswLTldKyQvKS50ZXN0KG5vZGVWZXJzaW9uKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGltcG9ydC9ub2RlLXZlcnNpb25gIHNldHRpbmcgbXVzdCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybWF0IFwiMTAuMjMuNDVcIiAoYSBzZW12ZXIgdmVyc2lvbiwgd2l0aCBubyBsZWFkaW5nIHplcm8pJyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5vcHRpb25zWzBdID09PSAnbmV2ZXInKSB7XG4gICAgaWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJ25vZGU6JykpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBhY3R1YWxNb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5zbGljZSg1KTtcbiAgICBpZiAoIWlzQ29yZU1vZHVsZShhY3R1YWxNb2R1bGVOYW1lLCBub2RlVmVyc2lvbiB8fCB1bmRlZmluZWQpKSB7IHJldHVybjsgfVxuXG4gICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgbm9kZTogc3JjLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZXNbTkVWRVJfUFJFRkVSX01FU1NBR0VfSURdLFxuICAgICAgZGF0YTogeyBtb2R1bGVOYW1lOiBhY3R1YWxNb2R1bGVOYW1lIH0sXG4gICAgICAvKiogQHBhcmFtIHtpbXBvcnQoJ2VzbGludCcpLlJ1bGUuUnVsZUZpeGVyfSBmaXhlciAqL1xuICAgICAgZml4KGZpeGVyKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlU3RyaW5nTGl0ZXJhbChmaXhlciwgc3JjLCAnJywgMCwgNSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGNvbnRleHQub3B0aW9uc1swXSA9PT0gJ2Fsd2F5cycpIHtcbiAgICBpZiAoXG4gICAgICBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJ25vZGU6JylcbiAgICAgIHx8ICFpc0NvcmVNb2R1bGUobW9kdWxlTmFtZSwgbm9kZVZlcnNpb24gfHwgdW5kZWZpbmVkKVxuICAgICAgfHwgIWlzQ29yZU1vZHVsZShgbm9kZToke21vZHVsZU5hbWV9YCwgbm9kZVZlcnNpb24gfHwgdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgIG5vZGU6IHNyYyxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VzW0RPX1BSRUZFUl9NRVNTQUdFX0lEXSxcbiAgICAgIGRhdGE6IHsgbW9kdWxlTmFtZSB9LFxuICAgICAgLyoqIEBwYXJhbSB7aW1wb3J0KCdlc2xpbnQnKS5SdWxlLlJ1bGVGaXhlcn0gZml4ZXIgKi9cbiAgICAgIGZpeChmaXhlcikge1xuICAgICAgICByZXR1cm4gcmVwbGFjZVN0cmluZ0xpdGVyYWwoZml4ZXIsIHNyYywgJ25vZGU6JywgMCwgMCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnNbMF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9wdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcHRpb246ICR7Y29udGV4dC5vcHRpb25zWzBdfWApO1xuICB9XG59XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdlc2xpbnQnKS5SdWxlLlJ1bGVNb2R1bGV9ICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0VuZm9yY2UgZWl0aGVyIHVzaW5nLCBvciBvbWl0dGluZywgdGhlIGBub2RlOmAgcHJvdG9jb2wgd2hlbiBpbXBvcnRpbmcgTm9kZS5qcyBidWlsdGluIG1vZHVsZXMuJyxcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgY2F0ZWdvcnk6ICdTdGF0aWMgYW5hbHlzaXMnLFxuICAgICAgdXJsOiBkb2NzVXJsKCdlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UnKSxcbiAgICB9LFxuICAgIGZpeGFibGU6ICdjb2RlJyxcbiAgICBzY2hlbWE6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBtaW5JdGVtczogMSxcbiAgICAgIG1heEl0ZW1zOiAxLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGVudW06IFsnYWx3YXlzJywgJ25ldmVyJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWVzc2FnZXMsXG4gIH0sXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0YXRpY1JlcXVpcmVXaXRoMVBhcmFtKG5vZGUpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGFyZyA9IG5vZGUuYXJndW1lbnRzWzBdO1xuXG4gICAgICAgIHJldHVybiBjaGVja0FuZFJlcG9ydChhcmcsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gY2hlY2tBbmRSZXBvcnQobm9kZS5zb3VyY2UsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQW5kUmVwb3J0KG5vZGUuc291cmNlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBJbXBvcnRFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZ0xpdGVyYWwobm9kZS5zb3VyY2UpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHJldHVybiBjaGVja0FuZFJlcG9ydChub2RlLnNvdXJjZSwgY29udGV4dCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19
--- +++ @@ -2,2 +2,3 @@ +var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch); var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);@@ -17,3 +18,23 @@ checkTypeImports: { type: 'boolean' },- ignorePackages: { type: 'boolean' } } };+ ignorePackages: { type: 'boolean' },+ pathGroupOverrides: {+ type: 'array',+ items: {+ type: 'object',+ properties: {+ pattern: {+ type: 'string' },++ patternOptions: {+ type: 'object' },++ action: {+ type: 'string',+ 'enum': ['enforce', 'ignore'] } },+++ additionalProperties: false,+ required: ['pattern', 'action'] } } } };++ @@ -55,2 +76,6 @@ result.checkTypeImports = obj.checkTypeImports;+ }++ if (obj.pathGroupOverrides !== undefined) {+ result.pathGroupOverrides = obj.pathGroupOverrides; }@@ -145,2 +170,11 @@ + function computeOverrideAction(pathGroupOverrides, path) {+ for (var i = 0, l = pathGroupOverrides.length; i < l; i++) {var _pathGroupOverrides$i =+ pathGroupOverrides[i],pattern = _pathGroupOverrides$i.pattern,patternOptions = _pathGroupOverrides$i.patternOptions,action = _pathGroupOverrides$i.action;+ if ((0, _minimatch2['default'])(path, pattern, patternOptions || { nocomment: true })) {+ return action;+ }+ }+ }+ function checkFileExtension(source, node) {@@ -151,4 +185,14 @@ + // If not undefined, the user decided if rules are enforced on this import+ var overrideAction = computeOverrideAction(+ props.pathGroupOverrides || [],+ importPathWithQueryString);+++ if (overrideAction === 'ignore') {+ return;+ }+ // don't enforce anything on builtins- if ((0, _importType.isBuiltIn)(importPathWithQueryString, context.settings)) {return;}+ if (!overrideAction && (0, _importType.isBuiltIn)(importPathWithQueryString, context.settings)) {return;} @@ -158,3 +202,3 @@ // Like `import Decimal from decimal.js`)- if (isExternalRootModule(importPath)) {return;}+ if (!overrideAction && isExternalRootModule(importPath)) {return;} @@ -176,3 +220,3 @@ if (!props.checkTypeImports && (node.importKind === 'type' || node.exportKind === 'type')) {return;}- var extensionRequired = isUseOfExtensionRequired(extension, isPackage);+ var extensionRequired = isUseOfExtensionRequired(extension, !overrideAction && isPackage); var extensionForbidden = isUseOfExtensionForbidden(extension);@@ -197,2 +241,2 @@ }return create;}() };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwicGF0dGVybiIsImNoZWNrVHlwZUltcG9ydHMiLCJpZ25vcmVQYWNrYWdlcyIsImJ1aWxkUHJvcGVydGllcyIsImNvbnRleHQiLCJyZXN1bHQiLCJkZWZhdWx0Q29uZmlnIiwib3B0aW9ucyIsImZvckVhY2giLCJvYmoiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwic2NoZW1hIiwiYW55T2YiLCJpdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsImNyZWF0ZSIsInByb3BzIiwiZ2V0TW9kaWZpZXIiLCJleHRlbnNpb24iLCJpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQiLCJpc1BhY2thZ2UiLCJpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuIiwiaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbiIsImZpbGUiLCJwYXRoIiwiZXh0bmFtZSIsImZpbGVXaXRob3V0RXh0ZW5zaW9uIiwic2xpY2UiLCJsZW5ndGgiLCJyZXNvbHZlZEZpbGVXaXRob3V0RXh0ZW5zaW9uIiwiaXNFeHRlcm5hbFJvb3RNb2R1bGUiLCJzbGFzaENvdW50Iiwic3BsaXQiLCJjaGVja0ZpbGVFeHRlbnNpb24iLCJzb3VyY2UiLCJub2RlIiwidmFsdWUiLCJpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nIiwic2V0dGluZ3MiLCJpbXBvcnRQYXRoIiwicmVwbGFjZSIsInJlc29sdmVkUGF0aCIsInN1YnN0cmluZyIsImVuZHNXaXRoIiwiaW1wb3J0S2luZCIsImV4cG9ydEtpbmQiLCJleHRlbnNpb25SZXF1aXJlZCIsImV4dGVuc2lvbkZvcmJpZGRlbiIsInJlcG9ydCIsIm1lc3NhZ2UiLCJjb21tb25qcyJdLCJtYXBwaW5ncyI6ImFBQUEsNEI7O0FBRUEsc0Q7QUFDQTtBQUNBLGtFO0FBQ0EscUM7O0FBRUEsSUFBTUEsYUFBYSxFQUFFLFFBQU0sQ0FBQyxRQUFELEVBQVcsZ0JBQVgsRUFBNkIsT0FBN0IsQ0FBUixFQUFuQjtBQUNBLElBQU1DLG9CQUFvQjtBQUN4QkMsUUFBTSxRQURrQjtBQUV4QkQscUJBQW1CLEVBQUUsTUFBTUQsVUFBUixFQUZLLEVBQTFCOztBQUlBLElBQU1HLGFBQWE7QUFDakJELFFBQU0sUUFEVztBQUVqQkMsY0FBWTtBQUNWQyxhQUFTSCxpQkFEQztBQUVWSSxzQkFBa0IsRUFBRUgsTUFBTSxTQUFSLEVBRlI7QUFHVkksb0JBQWdCLEVBQUVKLE1BQU0sU0FBUixFQUhOLEVBRkssRUFBbkI7Ozs7QUFTQSxTQUFTSyxlQUFULENBQXlCQyxPQUF6QixFQUFrQzs7QUFFaEMsTUFBTUMsU0FBUztBQUNiQyxtQkFBZSxPQURGO0FBRWJOLGFBQVMsRUFGSTtBQUdiRSxvQkFBZ0IsS0FISCxFQUFmOzs7QUFNQUUsVUFBUUcsT0FBUixDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBQ0MsR0FBRCxFQUFTOztBQUUvQjtBQUNBLFFBQUksT0FBT0EsR0FBUCxLQUFlLFFBQW5CLEVBQTZCO0FBQzNCSixhQUFPQyxhQUFQLEdBQXVCRyxHQUF2QjtBQUNBO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJQSxJQUFJVCxPQUFKLEtBQWdCVSxTQUFoQixJQUE2QkQsSUFBSVAsY0FBSixLQUF1QlEsU0FBcEQsSUFBaUVELElBQUlSLGdCQUFKLEtBQXlCUyxTQUE5RixFQUF5RztBQUN2R0MsYUFBT0MsTUFBUCxDQUFjUCxPQUFPTCxPQUFyQixFQUE4QlMsR0FBOUI7QUFDQTtBQUNEOztBQUVEO0FBQ0EsUUFBSUEsSUFBSVQsT0FBSixLQUFnQlUsU0FBcEIsRUFBK0I7QUFDN0JDLGFBQU9DLE1BQVAsQ0FBY1AsT0FBT0wsT0FBckIsRUFBOEJTLElBQUlULE9BQWxDO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJUyxJQUFJUCxjQUFKLEtBQXVCUSxTQUEzQixFQUFzQztBQUNwQ0wsYUFBT0gsY0FBUCxHQUF3Qk8sSUFBSVAsY0FBNUI7QUFDRDs7QUFFRCxRQUFJTyxJQUFJUixnQkFBSixLQUF5QlMsU0FBN0IsRUFBd0M7QUFDdENMLGFBQU9KLGdCQUFQLEdBQTBCUSxJQUFJUixnQkFBOUI7QUFDRDtBQUNGLEdBM0JEOztBQTZCQSxNQUFJSSxPQUFPQyxhQUFQLEtBQXlCLGdCQUE3QixFQUErQztBQUM3Q0QsV0FBT0MsYUFBUCxHQUF1QixRQUF2QjtBQUNBRCxXQUFPSCxjQUFQLEdBQXdCLElBQXhCO0FBQ0Q7O0FBRUQsU0FBT0csTUFBUDtBQUNEOztBQUVEUSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSmpCLFVBQU0sWUFERjtBQUVKa0IsVUFBTTtBQUNKQyxnQkFBVSxhQUROO0FBRUpDLG1CQUFhLGlFQUZUO0FBR0pDLFdBQUssMEJBQVEsWUFBUixDQUhELEVBRkY7OztBQVFKQyxZQUFRO0FBQ05DLGFBQU87QUFDTDtBQUNFdkIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUMxQixVQUFELENBRlQ7QUFHRTJCLHlCQUFpQixLQUhuQixFQURLOztBQU1MO0FBQ0V6QixjQUFNLE9BRFI7QUFFRXdCLGVBQU87QUFDTDFCLGtCQURLO0FBRUxHLGtCQUZLLENBRlQ7O0FBTUV3Qix5QkFBaUIsS0FObkIsRUFOSzs7QUFjTDtBQUNFekIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUN2QixVQUFELENBRlQ7QUFHRXdCLHlCQUFpQixLQUhuQixFQWRLOztBQW1CTDtBQUNFekIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUN6QixpQkFBRCxDQUZUO0FBR0UwQix5QkFBaUIsS0FIbkIsRUFuQks7O0FBd0JMO0FBQ0V6QixjQUFNLE9BRFI7QUFFRXdCLGVBQU87QUFDTDFCLGtCQURLO0FBRUxDLHlCQUZLLENBRlQ7O0FBTUUwQix5QkFBaUIsS0FObkIsRUF4QkssQ0FERCxFQVJKLEVBRFM7Ozs7OztBQThDZkMsUUE5Q2UsK0JBOENScEIsT0E5Q1EsRUE4Q0M7O0FBRWQsVUFBTXFCLFFBQVF0QixnQkFBZ0JDLE9BQWhCLENBQWQ7O0FBRUEsZUFBU3NCLFdBQVQsQ0FBcUJDLFNBQXJCLEVBQWdDO0FBQzlCLGVBQU9GLE1BQU16QixPQUFOLENBQWMyQixTQUFkLEtBQTRCRixNQUFNbkIsYUFBekM7QUFDRDs7QUFFRCxlQUFTc0Isd0JBQVQsQ0FBa0NELFNBQWxDLEVBQTZDRSxTQUE3QyxFQUF3RDtBQUN0RCxlQUFPSCxZQUFZQyxTQUFaLE1BQTJCLFFBQTNCLEtBQXdDLENBQUNGLE1BQU12QixjQUFQLElBQXlCLENBQUMyQixTQUFsRSxDQUFQO0FBQ0Q7O0FBRUQsZUFBU0MseUJBQVQsQ0FBbUNILFNBQW5DLEVBQThDO0FBQzVDLGVBQU9ELFlBQVlDLFNBQVosTUFBMkIsT0FBbEM7QUFDRDs7QUFFRCxlQUFTSSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsWUFBTUwsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYUYsSUFBYixDQUFsQjtBQUNBLFlBQU1HLHVCQUF1QkgsS0FBS0ksS0FBTCxDQUFXLENBQVgsRUFBYyxDQUFDVCxVQUFVVSxNQUF6QixDQUE3QjtBQUNBLFlBQU1DLCtCQUErQiwwQkFBUUgsb0JBQVIsRUFBOEIvQixPQUE5QixDQUFyQzs7QUFFQSxlQUFPa0MsaUNBQWlDLDBCQUFRTixJQUFSLEVBQWM1QixPQUFkLENBQXhDO0FBQ0Q7O0FBRUQsZUFBU21DLG9CQUFULENBQThCUCxJQUE5QixFQUFvQztBQUNsQyxZQUFJQSxTQUFTLEdBQVQsSUFBZ0JBLFNBQVMsSUFBN0IsRUFBbUMsQ0FBRSxPQUFPLEtBQVAsQ0FBZTtBQUNwRCxZQUFNUSxhQUFhUixLQUFLUyxLQUFMLENBQVcsR0FBWCxFQUFnQkosTUFBaEIsR0FBeUIsQ0FBNUM7O0FBRUEsWUFBSUcsZUFBZSxDQUFuQixFQUF1QixDQUFFLE9BQU8sSUFBUCxDQUFjO0FBQ3ZDLFlBQUksMEJBQVNSLElBQVQsS0FBa0JRLGNBQWMsQ0FBcEMsRUFBdUMsQ0FBRSxPQUFPLElBQVAsQ0FBYztBQUN2RCxlQUFPLEtBQVA7QUFDRDs7QUFFRCxlQUFTRSxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBb0NDLElBQXBDLEVBQTBDO0FBQ3hDO0FBQ0EsWUFBSSxDQUFDRCxNQUFELElBQVcsQ0FBQ0EsT0FBT0UsS0FBdkIsRUFBOEIsQ0FBRSxPQUFTOztBQUV6QyxZQUFNQyw0QkFBNEJILE9BQU9FLEtBQXpDOztBQUVBO0FBQ0EsWUFBSSwyQkFBVUMseUJBQVYsRUFBcUMxQyxRQUFRMkMsUUFBN0MsQ0FBSixFQUE0RCxDQUFFLE9BQVM7O0FBRXZFLFlBQU1DLGFBQWFGLDBCQUEwQkcsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsRUFBN0MsQ0FBbkI7O0FBRUE7QUFDQTtBQUNBLFlBQUlWLHFCQUFxQlMsVUFBckIsQ0FBSixFQUFzQyxDQUFFLE9BQVM7O0FBRWpELFlBQU1FLGVBQWUsMEJBQVFGLFVBQVIsRUFBb0I1QyxPQUFwQixDQUFyQjs7QUFFQTtBQUNBO0FBQ0EsWUFBTXVCLFlBQVlNLGtCQUFLQyxPQUFMLENBQWFnQixnQkFBZ0JGLFVBQTdCLEVBQXlDRyxTQUF6QyxDQUFtRCxDQUFuRCxDQUFsQjs7QUFFQTtBQUNBLFlBQU10QixZQUFZO0FBQ2hCbUIsa0JBRGdCO0FBRWhCLGtDQUFRQSxVQUFSLEVBQW9CNUMsT0FBcEIsQ0FGZ0I7QUFHaEJBLGVBSGdCO0FBSWIsa0NBQVM0QyxVQUFULENBSkw7O0FBTUEsWUFBSSxDQUFDckIsU0FBRCxJQUFjLENBQUNxQixXQUFXSSxRQUFYLGNBQXdCekIsU0FBeEIsRUFBbkIsRUFBeUQ7QUFDdkQ7QUFDQSxjQUFJLENBQUNGLE1BQU14QixnQkFBUCxLQUE0QjJDLEtBQUtTLFVBQUwsS0FBb0IsTUFBcEIsSUFBOEJULEtBQUtVLFVBQUwsS0FBb0IsTUFBOUUsQ0FBSixFQUEyRixDQUFFLE9BQVM7QUFDdEcsY0FBTUMsb0JBQW9CM0IseUJBQXlCRCxTQUF6QixFQUFvQ0UsU0FBcEMsQ0FBMUI7QUFDQSxjQUFNMkIscUJBQXFCMUIsMEJBQTBCSCxTQUExQixDQUEzQjtBQUNBLGNBQUk0QixxQkFBcUIsQ0FBQ0Msa0JBQTFCLEVBQThDO0FBQzVDcEQsb0JBQVFxRCxNQUFSLENBQWU7QUFDYmIsb0JBQU1ELE1BRE87QUFFYmU7QUFDNEIvQix1Q0FBZ0JBLFNBQWhCLFdBQWdDLEVBRDVELHFCQUNzRW1CLHlCQUR0RSxPQUZhLEVBQWY7O0FBS0Q7QUFDRixTQVpELE1BWU8sSUFBSW5CLFNBQUosRUFBZTtBQUNwQixjQUFJRywwQkFBMEJILFNBQTFCLEtBQXdDSSw2QkFBNkJpQixVQUE3QixDQUE1QyxFQUFzRjtBQUNwRjVDLG9CQUFRcUQsTUFBUixDQUFlO0FBQ2JiLG9CQUFNRCxNQURPO0FBRWJlLHFFQUE4Qy9CLFNBQTlDLHVCQUFpRW1CLHlCQUFqRSxPQUZhLEVBQWY7O0FBSUQ7QUFDRjtBQUNGOztBQUVELGFBQU8sZ0NBQWNKLGtCQUFkLEVBQWtDLEVBQUVpQixVQUFVLElBQVosRUFBbEMsQ0FBUDtBQUNELEtBbEljLG1CQUFqQiIsImZpbGUiOiJleHRlbnNpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSc7XG5pbXBvcnQgeyBpc0J1aWx0SW4sIGlzRXh0ZXJuYWxNb2R1bGUsIGlzU2NvcGVkIH0gZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJztcbmltcG9ydCBtb2R1bGVWaXNpdG9yIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcic7XG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJztcblxuY29uc3QgZW51bVZhbHVlcyA9IHsgZW51bTogWydhbHdheXMnLCAnaWdub3JlUGFja2FnZXMnLCAnbmV2ZXInXSB9O1xuY29uc3QgcGF0dGVyblByb3BlcnRpZXMgPSB7XG4gIHR5cGU6ICdvYmplY3QnLFxuICBwYXR0ZXJuUHJvcGVydGllczogeyAnLionOiBlbnVtVmFsdWVzIH0sXG59O1xuY29uc3QgcHJvcGVydGllcyA9IHtcbiAgdHlwZTogJ29iamVjdCcsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBwYXR0ZXJuOiBwYXR0ZXJuUHJvcGVydGllcyxcbiAgICBjaGVja1R5cGVJbXBvcnRzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgIGlnbm9yZVBhY2thZ2VzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZGVmYXVsdENvbmZpZzogJ25ldmVyJyxcbiAgICBwYXR0ZXJuOiB7fSxcbiAgICBpZ25vcmVQYWNrYWdlczogZmFsc2UsXG4gIH07XG5cbiAgY29udGV4dC5vcHRpb25zLmZvckVhY2goKG9iaikgPT4ge1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHN0cmluZywgc2V0IGRlZmF1bHRDb25maWcgdG8gaXRzIHZhbHVlXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9iajtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgbmV3IHN0cnVjdHVyZSwgdHJhbnNmZXIgYWxsIHByb3BzIHRvIHJlc3VsdC5wYXR0ZXJuXG4gICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQgJiYgb2JqLmNoZWNrVHlwZUltcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBhbGwgcHJvcHNcbiAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqLnBhdHRlcm4pO1xuICAgIH1cblxuICAgIC8vIElmIGlnbm9yZVBhY2thZ2VzIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBpdCB0byByZXN1bHRcbiAgICBpZiAob2JqLmlnbm9yZVBhY2thZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlcztcbiAgICB9XG5cbiAgICBpZiAob2JqLmNoZWNrVHlwZUltcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmNoZWNrVHlwZUltcG9ydHMgPSBvYmouY2hlY2tUeXBlSW1wb3J0cztcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGVmYXVsdENvbmZpZyA9PT0gJ2lnbm9yZVBhY2thZ2VzJykge1xuICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cyc7XG4gICAgcmVzdWx0Lmlnbm9yZVBhY2thZ2VzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnU3R5bGUgZ3VpZGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbnN1cmUgY29uc2lzdGVudCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gd2l0aGluIHRoZSBpbXBvcnQgcGF0aC4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCdleHRlbnNpb25zJyksXG4gICAgfSxcblxuICAgIHNjaGVtYToge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtlbnVtVmFsdWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3Byb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbcGF0dGVyblByb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICBlbnVtVmFsdWVzLFxuICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KTtcblxuICAgIGZ1bmN0aW9uIGdldE1vZGlmaWVyKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIHByb3BzLnBhdHRlcm5bZXh0ZW5zaW9uXSB8fCBwcm9wcy5kZWZhdWx0Q29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSkge1xuICAgICAgcmV0dXJuIGdldE1vZGlmaWVyKGV4dGVuc2lvbikgPT09ICdhbHdheXMnICYmICghcHJvcHMuaWdub3JlUGFja2FnZXMgfHwgIWlzUGFja2FnZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oZmlsZSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpO1xuICAgICAgY29uc3QgZmlsZVdpdGhvdXRFeHRlbnNpb24gPSBmaWxlLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPT09IHJlc29sdmUoZmlsZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFeHRlcm5hbFJvb3RNb2R1bGUoZmlsZSkge1xuICAgICAgaWYgKGZpbGUgPT09ICcuJyB8fCBmaWxlID09PSAnLi4nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgY29uc3Qgc2xhc2hDb3VudCA9IGZpbGUuc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuXG4gICAgICBpZiAoc2xhc2hDb3VudCA9PT0gMCkgIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIGlmIChpc1Njb3BlZChmaWxlKSAmJiBzbGFzaENvdW50IDw9IDEpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZpbGVFeHRlbnNpb24oc291cmNlLCBub2RlKSB7XG4gICAgICAvLyBiYWlsIGlmIHRoZSBkZWNsYXJhdGlvbiBkb2Vzbid0IGhhdmUgYSBzb3VyY2UsIGUuZy4gXCJleHBvcnQgeyBmb28gfTtcIiwgb3IgaWYgaXQncyBvbmx5IHBhcnRpYWxseSB0eXBlZCBsaWtlIGluIGFuIGVkaXRvclxuICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS52YWx1ZSkgeyByZXR1cm47IH1cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZyA9IHNvdXJjZS52YWx1ZTtcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBhbnl0aGluZyBvbiBidWlsdGluc1xuICAgICAgaWYgKGlzQnVpbHRJbihpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nLCBjb250ZXh0LnNldHRpbmdzKSkgeyByZXR1cm47IH1cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcucmVwbGFjZSgvXFw/KC4qKSQvLCAnJyk7XG5cbiAgICAgIC8vIGRvbid0IGVuZm9yY2UgaW4gcm9vdCBleHRlcm5hbCBwYWNrYWdlcyBhcyB0aGV5IG1heSBoYXZlIG5hbWVzIHdpdGggYC5qc2AuXG4gICAgICAvLyBMaWtlIGBpbXBvcnQgRGVjaW1hbCBmcm9tIGRlY2ltYWwuanNgKVxuICAgICAgaWYgKGlzRXh0ZXJuYWxSb290TW9kdWxlKGltcG9ydFBhdGgpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpO1xuXG4gICAgICAvLyBnZXQgZXh0ZW5zaW9uIGZyb20gcmVzb2x2ZWQgcGF0aCwgaWYgcG9zc2libGUuXG4gICAgICAvLyBmb3IgdW5yZXNvbHZlZCwgdXNlIHNvdXJjZSB2YWx1ZS5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShyZXNvbHZlZFBhdGggfHwgaW1wb3J0UGF0aCkuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIG1vZHVsZVxuICAgICAgY29uc3QgaXNQYWNrYWdlID0gaXNFeHRlcm5hbE1vZHVsZShcbiAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkgfHwgaXNTY29wZWQoaW1wb3J0UGF0aCk7XG5cbiAgICAgIGlmICghZXh0ZW5zaW9uIHx8ICFpbXBvcnRQYXRoLmVuZHNXaXRoKGAuJHtleHRlbnNpb259YCkpIHtcbiAgICAgICAgLy8gaWdub3JlIHR5cGUtb25seSBpbXBvcnRzIGFuZCBleHBvcnRzXG4gICAgICAgIGlmICghcHJvcHMuY2hlY2tUeXBlSW1wb3J0cyAmJiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgbm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpKSB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbkZvcmJpZGRlbiA9IGlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4oZXh0ZW5zaW9uKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvblJlcXVpcmVkICYmICFleHRlbnNpb25Gb3JiaWRkZW4pIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBgTWlzc2luZyBmaWxlIGV4dGVuc2lvbiAke2V4dGVuc2lvbiA/IGBcIiR7ZXh0ZW5zaW9ufVwiIGAgOiAnJ31mb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pICYmIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gXCIke2V4dGVuc2lvbn1cIiBmb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3IoY2hlY2tGaWxlRXh0ZW5zaW9uLCB7IGNvbW1vbmpzOiB0cnVlIH0pO1xuICB9LFxufTtcbiJdfQ==+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwicGF0dGVybiIsImNoZWNrVHlwZUltcG9ydHMiLCJpZ25vcmVQYWNrYWdlcyIsInBhdGhHcm91cE92ZXJyaWRlcyIsIml0ZW1zIiwicGF0dGVybk9wdGlvbnMiLCJhY3Rpb24iLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsInJlcXVpcmVkIiwiYnVpbGRQcm9wZXJ0aWVzIiwiY29udGV4dCIsInJlc3VsdCIsImRlZmF1bHRDb25maWciLCJvcHRpb25zIiwiZm9yRWFjaCIsIm9iaiIsInVuZGVmaW5lZCIsIk9iamVjdCIsImFzc2lnbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwiZG9jcyIsImNhdGVnb3J5IiwiZGVzY3JpcHRpb24iLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsImFkZGl0aW9uYWxJdGVtcyIsImNyZWF0ZSIsInByb3BzIiwiZ2V0TW9kaWZpZXIiLCJleHRlbnNpb24iLCJpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQiLCJpc1BhY2thZ2UiLCJpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuIiwiaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbiIsImZpbGUiLCJwYXRoIiwiZXh0bmFtZSIsImZpbGVXaXRob3V0RXh0ZW5zaW9uIiwic2xpY2UiLCJsZW5ndGgiLCJyZXNvbHZlZEZpbGVXaXRob3V0RXh0ZW5zaW9uIiwiaXNFeHRlcm5hbFJvb3RNb2R1bGUiLCJzbGFzaENvdW50Iiwic3BsaXQiLCJjb21wdXRlT3ZlcnJpZGVBY3Rpb24iLCJpIiwibCIsIm5vY29tbWVudCIsImNoZWNrRmlsZUV4dGVuc2lvbiIsInNvdXJjZSIsIm5vZGUiLCJ2YWx1ZSIsImltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmciLCJvdmVycmlkZUFjdGlvbiIsInNldHRpbmdzIiwiaW1wb3J0UGF0aCIsInJlcGxhY2UiLCJyZXNvbHZlZFBhdGgiLCJzdWJzdHJpbmciLCJlbmRzV2l0aCIsImltcG9ydEtpbmQiLCJleHBvcnRLaW5kIiwiZXh0ZW5zaW9uUmVxdWlyZWQiLCJleHRlbnNpb25Gb3JiaWRkZW4iLCJyZXBvcnQiLCJtZXNzYWdlIiwiY29tbW9uanMiXSwibWFwcGluZ3MiOiJhQUFBLDRCOztBQUVBLHNDO0FBQ0Esc0Q7QUFDQTtBQUNBLGtFO0FBQ0EscUM7O0FBRUEsSUFBTUEsYUFBYSxFQUFFLFFBQU0sQ0FBQyxRQUFELEVBQVcsZ0JBQVgsRUFBNkIsT0FBN0IsQ0FBUixFQUFuQjtBQUNBLElBQU1DLG9CQUFvQjtBQUN4QkMsUUFBTSxRQURrQjtBQUV4QkQscUJBQW1CLEVBQUUsTUFBTUQsVUFBUixFQUZLLEVBQTFCOztBQUlBLElBQU1HLGFBQWE7QUFDakJELFFBQU0sUUFEVztBQUVqQkMsY0FBWTtBQUNWQyxhQUFTSCxpQkFEQztBQUVWSSxzQkFBa0IsRUFBRUgsTUFBTSxTQUFSLEVBRlI7QUFHVkksb0JBQWdCLEVBQUVKLE1BQU0sU0FBUixFQUhOO0FBSVZLLHdCQUFvQjtBQUNsQkwsWUFBTSxPQURZO0FBRWxCTSxhQUFPO0FBQ0xOLGNBQU0sUUFERDtBQUVMQyxvQkFBWTtBQUNWQyxtQkFBUztBQUNQRixrQkFBTSxRQURDLEVBREM7O0FBSVZPLDBCQUFnQjtBQUNkUCxrQkFBTSxRQURRLEVBSk47O0FBT1ZRLGtCQUFRO0FBQ05SLGtCQUFNLFFBREE7QUFFTixvQkFBTSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBRkEsRUFQRSxFQUZQOzs7QUFjTFMsOEJBQXNCLEtBZGpCO0FBZUxDLGtCQUFVLENBQUMsU0FBRCxFQUFZLFFBQVosQ0FmTCxFQUZXLEVBSlYsRUFGSyxFQUFuQjs7Ozs7O0FBNkJBLFNBQVNDLGVBQVQsQ0FBeUJDLE9BQXpCLEVBQWtDOztBQUVoQyxNQUFNQyxTQUFTO0FBQ2JDLG1CQUFlLE9BREY7QUFFYlosYUFBUyxFQUZJO0FBR2JFLG9CQUFnQixLQUhILEVBQWY7OztBQU1BUSxVQUFRRyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixVQUFDQyxHQUFELEVBQVM7O0FBRS9CO0FBQ0EsUUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDM0JKLGFBQU9DLGFBQVAsR0FBdUJHLEdBQXZCO0FBQ0E7QUFDRDs7QUFFRDtBQUNBLFFBQUlBLElBQUlmLE9BQUosS0FBZ0JnQixTQUFoQixJQUE2QkQsSUFBSWIsY0FBSixLQUF1QmMsU0FBcEQsSUFBaUVELElBQUlkLGdCQUFKLEtBQXlCZSxTQUE5RixFQUF5RztBQUN2R0MsYUFBT0MsTUFBUCxDQUFjUCxPQUFPWCxPQUFyQixFQUE4QmUsR0FBOUI7QUFDQTtBQUNEOztBQUVEO0FBQ0EsUUFBSUEsSUFBSWYsT0FBSixLQUFnQmdCLFNBQXBCLEVBQStCO0FBQzdCQyxhQUFPQyxNQUFQLENBQWNQLE9BQU9YLE9BQXJCLEVBQThCZSxJQUFJZixPQUFsQztBQUNEOztBQUVEO0FBQ0EsUUFBSWUsSUFBSWIsY0FBSixLQUF1QmMsU0FBM0IsRUFBc0M7QUFDcENMLGFBQU9ULGNBQVAsR0FBd0JhLElBQUliLGNBQTVCO0FBQ0Q7O0FBRUQsUUFBSWEsSUFBSWQsZ0JBQUosS0FBeUJlLFNBQTdCLEVBQXdDO0FBQ3RDTCxhQUFPVixnQkFBUCxHQUEwQmMsSUFBSWQsZ0JBQTlCO0FBQ0Q7O0FBRUQsUUFBSWMsSUFBSVosa0JBQUosS0FBMkJhLFNBQS9CLEVBQTBDO0FBQ3hDTCxhQUFPUixrQkFBUCxHQUE0QlksSUFBSVosa0JBQWhDO0FBQ0Q7QUFDRixHQS9CRDs7QUFpQ0EsTUFBSVEsT0FBT0MsYUFBUCxLQUF5QixnQkFBN0IsRUFBK0M7QUFDN0NELFdBQU9DLGFBQVAsR0FBdUIsUUFBdkI7QUFDQUQsV0FBT1QsY0FBUCxHQUF3QixJQUF4QjtBQUNEOztBQUVELFNBQU9TLE1BQVA7QUFDRDs7QUFFRFEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0p2QixVQUFNLFlBREY7QUFFSndCLFVBQU07QUFDSkMsZ0JBQVUsYUFETjtBQUVKQyxtQkFBYSxpRUFGVDtBQUdKQyxXQUFLLDBCQUFRLFlBQVIsQ0FIRCxFQUZGOzs7QUFRSkMsWUFBUTtBQUNOQyxhQUFPO0FBQ0w7QUFDRTdCLGNBQU0sT0FEUjtBQUVFTSxlQUFPLENBQUNSLFVBQUQsQ0FGVDtBQUdFZ0MseUJBQWlCLEtBSG5CLEVBREs7O0FBTUw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPO0FBQ0xSLGtCQURLO0FBRUxHLGtCQUZLLENBRlQ7O0FBTUU2Qix5QkFBaUIsS0FObkIsRUFOSzs7QUFjTDtBQUNFOUIsY0FBTSxPQURSO0FBRUVNLGVBQU8sQ0FBQ0wsVUFBRCxDQUZUO0FBR0U2Qix5QkFBaUIsS0FIbkIsRUFkSzs7QUFtQkw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPLENBQUNQLGlCQUFELENBRlQ7QUFHRStCLHlCQUFpQixLQUhuQixFQW5CSzs7QUF3Qkw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPO0FBQ0xSLGtCQURLO0FBRUxDLHlCQUZLLENBRlQ7O0FBTUUrQix5QkFBaUIsS0FObkIsRUF4QkssQ0FERCxFQVJKLEVBRFM7Ozs7OztBQThDZkMsUUE5Q2UsK0JBOENSbkIsT0E5Q1EsRUE4Q0M7O0FBRWQsVUFBTW9CLFFBQVFyQixnQkFBZ0JDLE9BQWhCLENBQWQ7O0FBRUEsZUFBU3FCLFdBQVQsQ0FBcUJDLFNBQXJCLEVBQWdDO0FBQzlCLGVBQU9GLE1BQU05QixPQUFOLENBQWNnQyxTQUFkLEtBQTRCRixNQUFNbEIsYUFBekM7QUFDRDs7QUFFRCxlQUFTcUIsd0JBQVQsQ0FBa0NELFNBQWxDLEVBQTZDRSxTQUE3QyxFQUF3RDtBQUN0RCxlQUFPSCxZQUFZQyxTQUFaLE1BQTJCLFFBQTNCLEtBQXdDLENBQUNGLE1BQU01QixjQUFQLElBQXlCLENBQUNnQyxTQUFsRSxDQUFQO0FBQ0Q7O0FBRUQsZUFBU0MseUJBQVQsQ0FBbUNILFNBQW5DLEVBQThDO0FBQzVDLGVBQU9ELFlBQVlDLFNBQVosTUFBMkIsT0FBbEM7QUFDRDs7QUFFRCxlQUFTSSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsWUFBTUwsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYUYsSUFBYixDQUFsQjtBQUNBLFlBQU1HLHVCQUF1QkgsS0FBS0ksS0FBTCxDQUFXLENBQVgsRUFBYyxDQUFDVCxVQUFVVSxNQUF6QixDQUE3QjtBQUNBLFlBQU1DLCtCQUErQiwwQkFBUUgsb0JBQVIsRUFBOEI5QixPQUE5QixDQUFyQzs7QUFFQSxlQUFPaUMsaUNBQWlDLDBCQUFRTixJQUFSLEVBQWMzQixPQUFkLENBQXhDO0FBQ0Q7O0FBRUQsZUFBU2tDLG9CQUFULENBQThCUCxJQUE5QixFQUFvQztBQUNsQyxZQUFJQSxTQUFTLEdBQVQsSUFBZ0JBLFNBQVMsSUFBN0IsRUFBbUMsQ0FBRSxPQUFPLEtBQVAsQ0FBZTtBQUNwRCxZQUFNUSxhQUFhUixLQUFLUyxLQUFMLENBQVcsR0FBWCxFQUFnQkosTUFBaEIsR0FBeUIsQ0FBNUM7O0FBRUEsWUFBSUcsZUFBZSxDQUFuQixFQUF1QixDQUFFLE9BQU8sSUFBUCxDQUFjO0FBQ3ZDLFlBQUksMEJBQVNSLElBQVQsS0FBa0JRLGNBQWMsQ0FBcEMsRUFBdUMsQ0FBRSxPQUFPLElBQVAsQ0FBYztBQUN2RCxlQUFPLEtBQVA7QUFDRDs7QUFFRCxlQUFTRSxxQkFBVCxDQUErQjVDLGtCQUEvQixFQUFtRG1DLElBQW5ELEVBQXlEO0FBQ3ZELGFBQUssSUFBSVUsSUFBSSxDQUFSLEVBQVdDLElBQUk5QyxtQkFBbUJ1QyxNQUF2QyxFQUErQ00sSUFBSUMsQ0FBbkQsRUFBc0RELEdBQXRELEVBQTJEO0FBQ2I3Qyw2QkFBbUI2QyxDQUFuQixDQURhLENBQ2pEaEQsT0FEaUQseUJBQ2pEQSxPQURpRCxDQUN4Q0ssY0FEd0MseUJBQ3hDQSxjQUR3QyxDQUN4QkMsTUFEd0IseUJBQ3hCQSxNQUR3QjtBQUV6RCxjQUFJLDRCQUFVZ0MsSUFBVixFQUFnQnRDLE9BQWhCLEVBQXlCSyxrQkFBa0IsRUFBRTZDLFdBQVcsSUFBYixFQUEzQyxDQUFKLEVBQXFFO0FBQ25FLG1CQUFPNUMsTUFBUDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxlQUFTNkMsa0JBQVQsQ0FBNEJDLE1BQTVCLEVBQW9DQyxJQUFwQyxFQUEwQztBQUN4QztBQUNBLFlBQUksQ0FBQ0QsTUFBRCxJQUFXLENBQUNBLE9BQU9FLEtBQXZCLEVBQThCLENBQUUsT0FBUzs7QUFFekMsWUFBTUMsNEJBQTRCSCxPQUFPRSxLQUF6Qzs7QUFFQTtBQUNBLFlBQU1FLGlCQUFpQlQ7QUFDckJqQixjQUFNM0Isa0JBQU4sSUFBNEIsRUFEUDtBQUVyQm9ELGlDQUZxQixDQUF2Qjs7O0FBS0EsWUFBSUMsbUJBQW1CLFFBQXZCLEVBQWlDO0FBQy9CO0FBQ0Q7O0FBRUQ7QUFDQSxZQUFJLENBQUNBLGNBQUQsSUFBbUIsMkJBQVVELHlCQUFWLEVBQXFDN0MsUUFBUStDLFFBQTdDLENBQXZCLEVBQStFLENBQUUsT0FBUzs7QUFFMUYsWUFBTUMsYUFBYUgsMEJBQTBCSSxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxFQUE3QyxDQUFuQjs7QUFFQTtBQUNBO0FBQ0EsWUFBSSxDQUFDSCxjQUFELElBQW1CWixxQkFBcUJjLFVBQXJCLENBQXZCLEVBQXlELENBQUUsT0FBUzs7QUFFcEUsWUFBTUUsZUFBZSwwQkFBUUYsVUFBUixFQUFvQmhELE9BQXBCLENBQXJCOztBQUVBO0FBQ0E7QUFDQSxZQUFNc0IsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYXFCLGdCQUFnQkYsVUFBN0IsRUFBeUNHLFNBQXpDLENBQW1ELENBQW5ELENBQWxCOztBQUVBO0FBQ0EsWUFBTTNCLFlBQVk7QUFDaEJ3QixrQkFEZ0I7QUFFaEIsa0NBQVFBLFVBQVIsRUFBb0JoRCxPQUFwQixDQUZnQjtBQUdoQkEsZUFIZ0I7QUFJYixrQ0FBU2dELFVBQVQsQ0FKTDs7QUFNQSxZQUFJLENBQUMxQixTQUFELElBQWMsQ0FBQzBCLFdBQVdJLFFBQVgsY0FBd0I5QixTQUF4QixFQUFuQixFQUF5RDtBQUN2RDtBQUNBLGNBQUksQ0FBQ0YsTUFBTTdCLGdCQUFQLEtBQTRCb0QsS0FBS1UsVUFBTCxLQUFvQixNQUFwQixJQUE4QlYsS0FBS1csVUFBTCxLQUFvQixNQUE5RSxDQUFKLEVBQTJGLENBQUUsT0FBUztBQUN0RyxjQUFNQyxvQkFBb0JoQyx5QkFBeUJELFNBQXpCLEVBQW9DLENBQUN3QixjQUFELElBQW1CdEIsU0FBdkQsQ0FBMUI7QUFDQSxjQUFNZ0MscUJBQXFCL0IsMEJBQTBCSCxTQUExQixDQUEzQjtBQUNBLGNBQUlpQyxxQkFBcUIsQ0FBQ0Msa0JBQTFCLEVBQThDO0FBQzVDeEQsb0JBQVF5RCxNQUFSLENBQWU7QUFDYmQsb0JBQU1ELE1BRE87QUFFYmdCO0FBQzRCcEMsdUNBQWdCQSxTQUFoQixXQUFnQyxFQUQ1RCxxQkFDc0V1Qix5QkFEdEUsT0FGYSxFQUFmOztBQUtEO0FBQ0YsU0FaRCxNQVlPLElBQUl2QixTQUFKLEVBQWU7QUFDcEIsY0FBSUcsMEJBQTBCSCxTQUExQixLQUF3Q0ksNkJBQTZCc0IsVUFBN0IsQ0FBNUMsRUFBc0Y7QUFDcEZoRCxvQkFBUXlELE1BQVIsQ0FBZTtBQUNiZCxvQkFBTUQsTUFETztBQUViZ0IscUVBQThDcEMsU0FBOUMsdUJBQWlFdUIseUJBQWpFLE9BRmEsRUFBZjs7QUFJRDtBQUNGO0FBQ0Y7O0FBRUQsYUFBTyxnQ0FBY0osa0JBQWQsRUFBa0MsRUFBRWtCLFVBQVUsSUFBWixFQUFsQyxDQUFQO0FBQ0QsS0FySmMsbUJBQWpCIiwiZmlsZSI6ImV4dGVuc2lvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IG1pbmltYXRjaCBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJztcbmltcG9ydCB7IGlzQnVpbHRJbiwgaXNFeHRlcm5hbE1vZHVsZSwgaXNTY29wZWQgfSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnO1xuaW1wb3J0IG1vZHVsZVZpc2l0b3IgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9tb2R1bGVWaXNpdG9yJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG5jb25zdCBlbnVtVmFsdWVzID0geyBlbnVtOiBbJ2Fsd2F5cycsICdpZ25vcmVQYWNrYWdlcycsICduZXZlciddIH07XG5jb25zdCBwYXR0ZXJuUHJvcGVydGllcyA9IHtcbiAgdHlwZTogJ29iamVjdCcsXG4gIHBhdHRlcm5Qcm9wZXJ0aWVzOiB7ICcuKic6IGVudW1WYWx1ZXMgfSxcbn07XG5jb25zdCBwcm9wZXJ0aWVzID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgIHBhdHRlcm46IHBhdHRlcm5Qcm9wZXJ0aWVzLFxuICAgIGNoZWNrVHlwZUltcG9ydHM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgaWdub3JlUGFja2FnZXM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgcGF0aEdyb3VwT3ZlcnJpZGVzOiB7XG4gICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwYXR0ZXJuOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdHRlcm5PcHRpb25zOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBlbnVtOiBbJ2VuZm9yY2UnLCAnaWdub3JlJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogWydwYXR0ZXJuJywgJ2FjdGlvbiddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZGVmYXVsdENvbmZpZzogJ25ldmVyJyxcbiAgICBwYXR0ZXJuOiB7fSxcbiAgICBpZ25vcmVQYWNrYWdlczogZmFsc2UsXG4gIH07XG5cbiAgY29udGV4dC5vcHRpb25zLmZvckVhY2goKG9iaikgPT4ge1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHN0cmluZywgc2V0IGRlZmF1bHRDb25maWcgdG8gaXRzIHZhbHVlXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9iajtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgbmV3IHN0cnVjdHVyZSwgdHJhbnNmZXIgYWxsIHByb3BzIHRvIHJlc3VsdC5wYXR0ZXJuXG4gICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQgJiYgb2JqLmNoZWNrVHlwZUltcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBhbGwgcHJvcHNcbiAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqLnBhdHRlcm4pO1xuICAgIH1cblxuICAgIC8vIElmIGlnbm9yZVBhY2thZ2VzIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBpdCB0byByZXN1bHRcbiAgICBpZiAob2JqLmlnbm9yZVBhY2thZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlcztcbiAgICB9XG5cbiAgICBpZiAob2JqLmNoZWNrVHlwZUltcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmNoZWNrVHlwZUltcG9ydHMgPSBvYmouY2hlY2tUeXBlSW1wb3J0cztcbiAgICB9XG5cbiAgICBpZiAob2JqLnBhdGhHcm91cE92ZXJyaWRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQucGF0aEdyb3VwT3ZlcnJpZGVzID0gb2JqLnBhdGhHcm91cE92ZXJyaWRlcztcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGVmYXVsdENvbmZpZyA9PT0gJ2lnbm9yZVBhY2thZ2VzJykge1xuICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cyc7XG4gICAgcmVzdWx0Lmlnbm9yZVBhY2thZ2VzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnU3R5bGUgZ3VpZGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbnN1cmUgY29uc2lzdGVudCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gd2l0aGluIHRoZSBpbXBvcnQgcGF0aC4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCdleHRlbnNpb25zJyksXG4gICAgfSxcblxuICAgIHNjaGVtYToge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtlbnVtVmFsdWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3Byb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbcGF0dGVyblByb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICBlbnVtVmFsdWVzLFxuICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KTtcblxuICAgIGZ1bmN0aW9uIGdldE1vZGlmaWVyKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIHByb3BzLnBhdHRlcm5bZXh0ZW5zaW9uXSB8fCBwcm9wcy5kZWZhdWx0Q29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSkge1xuICAgICAgcmV0dXJuIGdldE1vZGlmaWVyKGV4dGVuc2lvbikgPT09ICdhbHdheXMnICYmICghcHJvcHMuaWdub3JlUGFja2FnZXMgfHwgIWlzUGFja2FnZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oZmlsZSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpO1xuICAgICAgY29uc3QgZmlsZVdpdGhvdXRFeHRlbnNpb24gPSBmaWxlLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPT09IHJlc29sdmUoZmlsZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFeHRlcm5hbFJvb3RNb2R1bGUoZmlsZSkge1xuICAgICAgaWYgKGZpbGUgPT09ICcuJyB8fCBmaWxlID09PSAnLi4nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgY29uc3Qgc2xhc2hDb3VudCA9IGZpbGUuc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuXG4gICAgICBpZiAoc2xhc2hDb3VudCA9PT0gMCkgIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIGlmIChpc1Njb3BlZChmaWxlKSAmJiBzbGFzaENvdW50IDw9IDEpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlT3ZlcnJpZGVBY3Rpb24ocGF0aEdyb3VwT3ZlcnJpZGVzLCBwYXRoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhdGhHcm91cE92ZXJyaWRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBwYXR0ZXJuT3B0aW9ucywgYWN0aW9uIH0gPSBwYXRoR3JvdXBPdmVycmlkZXNbaV07XG4gICAgICAgIGlmIChtaW5pbWF0Y2gocGF0aCwgcGF0dGVybiwgcGF0dGVybk9wdGlvbnMgfHwgeyBub2NvbW1lbnQ6IHRydWUgfSkpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tGaWxlRXh0ZW5zaW9uKHNvdXJjZSwgbm9kZSkge1xuICAgICAgLy8gYmFpbCBpZiB0aGUgZGVjbGFyYXRpb24gZG9lc24ndCBoYXZlIGEgc291cmNlLCBlLmcuIFwiZXhwb3J0IHsgZm9vIH07XCIsIG9yIGlmIGl0J3Mgb25seSBwYXJ0aWFsbHkgdHlwZWQgbGlrZSBpbiBhbiBlZGl0b3JcbiAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UudmFsdWUpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNvbnN0IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcgPSBzb3VyY2UudmFsdWU7XG5cbiAgICAgIC8vIElmIG5vdCB1bmRlZmluZWQsIHRoZSB1c2VyIGRlY2lkZWQgaWYgcnVsZXMgYXJlIGVuZm9yY2VkIG9uIHRoaXMgaW1wb3J0XG4gICAgICBjb25zdCBvdmVycmlkZUFjdGlvbiA9IGNvbXB1dGVPdmVycmlkZUFjdGlvbihcbiAgICAgICAgcHJvcHMucGF0aEdyb3VwT3ZlcnJpZGVzIHx8IFtdLFxuICAgICAgICBpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nLFxuICAgICAgKTtcblxuICAgICAgaWYgKG92ZXJyaWRlQWN0aW9uID09PSAnaWdub3JlJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGRvbid0IGVuZm9yY2UgYW55dGhpbmcgb24gYnVpbHRpbnNcbiAgICAgIGlmICghb3ZlcnJpZGVBY3Rpb24gJiYgaXNCdWlsdEluKGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcsIGNvbnRleHQuc2V0dGluZ3MpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCBpbXBvcnRQYXRoID0gaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZy5yZXBsYWNlKC9cXD8oLiopJC8sICcnKTtcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBpbiByb290IGV4dGVybmFsIHBhY2thZ2VzIGFzIHRoZXkgbWF5IGhhdmUgbmFtZXMgd2l0aCBgLmpzYC5cbiAgICAgIC8vIExpa2UgYGltcG9ydCBEZWNpbWFsIGZyb20gZGVjaW1hbC5qc2ApXG4gICAgICBpZiAoIW92ZXJyaWRlQWN0aW9uICYmIGlzRXh0ZXJuYWxSb290TW9kdWxlKGltcG9ydFBhdGgpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpO1xuXG4gICAgICAvLyBnZXQgZXh0ZW5zaW9uIGZyb20gcmVzb2x2ZWQgcGF0aCwgaWYgcG9zc2libGUuXG4gICAgICAvLyBmb3IgdW5yZXNvbHZlZCwgdXNlIHNvdXJjZSB2YWx1ZS5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShyZXNvbHZlZFBhdGggfHwgaW1wb3J0UGF0aCkuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIG1vZHVsZVxuICAgICAgY29uc3QgaXNQYWNrYWdlID0gaXNFeHRlcm5hbE1vZHVsZShcbiAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkgfHwgaXNTY29wZWQoaW1wb3J0UGF0aCk7XG5cbiAgICAgIGlmICghZXh0ZW5zaW9uIHx8ICFpbXBvcnRQYXRoLmVuZHNXaXRoKGAuJHtleHRlbnNpb259YCkpIHtcbiAgICAgICAgLy8gaWdub3JlIHR5cGUtb25seSBpbXBvcnRzIGFuZCBleHBvcnRzXG4gICAgICAgIGlmICghcHJvcHMuY2hlY2tUeXBlSW1wb3J0cyAmJiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgbm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpKSB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sICFvdmVycmlkZUFjdGlvbiAmJiBpc1BhY2thZ2UpO1xuICAgICAgICBjb25zdCBleHRlbnNpb25Gb3JiaWRkZW4gPSBpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuKGV4dGVuc2lvbik7XG4gICAgICAgIGlmIChleHRlbnNpb25SZXF1aXJlZCAmJiAhZXh0ZW5zaW9uRm9yYmlkZGVuKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgYE1pc3NpbmcgZmlsZSBleHRlbnNpb24gJHtleHRlbnNpb24gPyBgXCIke2V4dGVuc2lvbn1cIiBgIDogJyd9Zm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4oZXh0ZW5zaW9uKSAmJiBpc1Jlc29sdmFibGVXaXRob3V0RXh0ZW5zaW9uKGltcG9ydFBhdGgpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgdXNlIG9mIGZpbGUgZXh0ZW5zaW9uIFwiJHtleHRlbnNpb259XCIgZm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKGNoZWNrRmlsZUV4dGVuc2lvbiwgeyBjb21tb25qczogdHJ1ZSB9KTtcbiAgfSxcbn07XG4iXX0=
--- +++ @@ -418,3 +418,3 @@ /** Some parsers (languages without types) don't provide ImportKind */-var DEAFULT_IMPORT_KIND = 'value';+var DEFAULT_IMPORT_KIND = 'value'; var getNormalizedValue = function getNormalizedValue(node, toLowerCase) {@@ -464,4 +464,4 @@ result = multiplierImportKind * compareString(- nodeA.node.importKind || DEAFULT_IMPORT_KIND,- nodeB.node.importKind || DEAFULT_IMPORT_KIND);+ nodeA.node.importKind || DEFAULT_IMPORT_KIND,+ nodeB.node.importKind || DEFAULT_IMPORT_KIND); @@ -515,8 +515,13 @@ -function computeRank(context, ranks, importEntry, excludedImportTypes) {+function computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup) { var impType = void 0; var rank = void 0;++ var isTypeGroupInGroups = ranks.omittedTypes.indexOf('type') === -1;+ var isTypeOnlyImport = importEntry.node.importKind === 'type';+ var isExcludedFromPathRank = isTypeOnlyImport && isTypeGroupInGroups && excludedImportTypes.has('type');+ if (importEntry.type === 'import:object') { impType = 'object';- } else if (importEntry.node.importKind === 'type' && ranks.omittedTypes.indexOf('type') === -1) {+ } else if (isTypeOnlyImport && isTypeGroupInGroups && !isSortingTypesGroup) { impType = 'type';@@ -525,8 +530,19 @@ }- if (!excludedImportTypes.has(impType)) {++ if (!excludedImportTypes.has(impType) && !isExcludedFromPathRank) { rank = computePathRank(ranks.groups, ranks.pathGroups, importEntry.value, ranks.maxPosition); }+ if (typeof rank === 'undefined') { rank = ranks.groups[impType];- }++ if (typeof rank === 'undefined') {+ return -1;+ }+ }++ if (isTypeOnlyImport && isSortingTypesGroup) {+ rank = ranks.groups.type + rank / 10;+ }+ if (importEntry.type !== 'import' && !importEntry.type.startsWith('import:')) {@@ -538,6 +554,16 @@ -function registerNode(context, importEntry, ranks, imported, excludedImportTypes) {- var rank = computeRank(context, ranks, importEntry, excludedImportTypes);+function registerNode(context, importEntry, ranks, imported, excludedImportTypes, isSortingTypesGroup) {+ var rank = computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup); if (rank !== -1) {- imported.push(Object.assign({}, importEntry, { rank: rank }));+ var importNode = importEntry.node;++ if (importEntry.type === 'require' && importNode.parent.parent.type === 'VariableDeclaration') {+ importNode = importNode.parent.parent;+ }++ imported.push(Object.assign({},+ importEntry, {+ rank: rank,+ isMultiline: importNode.loc.end.line !== importNode.loc.start.line }));+ }@@ -566,5 +592,7 @@ -// Creates an object with type-rank pairs.-// Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }-// Will throw an error if it contains a type that does not exist, or has a duplicate+/**+ * Creates an object with type-rank pairs.+ *+ * Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }+ */ function convertGroupsToRanks(groups) {@@ -572,8 +600,2 @@ [].concat(group).forEach(function (groupItem) {- if (types.indexOf(groupItem) === -1) {- throw new Error('Incorrect configuration of the rule: Unknown type `' + String(JSON.stringify(groupItem)) + '`');- }- if (res[groupItem] !== undefined) {- throw new Error('Incorrect configuration of the rule: `' + String(groupItem) + '` is duplicated');- } res[groupItem] = index * 2;@@ -667,3 +689,3 @@ -function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports, distinctGroup) {+function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports_, newlinesBetweenTypeOnlyImports_, distinctGroup, isSortingTypesGroup, isConsolidatingSpaceBetweenImports) { var getNumberOfEmptyLinesBetween = function getNumberOfEmptyLinesBetween(currentImport, previousImport) {@@ -680,21 +702,118 @@ imported.slice(1).forEach(function (currentImport) {- var emptyLinesBetween = getNumberOfEmptyLinesBetween(currentImport, previousImport);- var isStartOfDistinctGroup = getIsStartOfDistinctGroup(currentImport, previousImport);-- if (newlinesBetweenImports === 'always' ||- newlinesBetweenImports === 'always-and-inside-groups') {- if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {- if (distinctGroup || !distinctGroup && isStartOfDistinctGroup) {+ var emptyLinesBetween = getNumberOfEmptyLinesBetween(+ currentImport,+ previousImport);+++ var isStartOfDistinctGroup = getIsStartOfDistinctGroup(+ currentImport,+ previousImport);+++ var isTypeOnlyImport = currentImport.node.importKind === 'type';+ var isPreviousImportTypeOnlyImport = previousImport.node.importKind === 'type';++ var isNormalImportNextToTypeOnlyImportAndRelevant = isTypeOnlyImport !== isPreviousImportTypeOnlyImport && isSortingTypesGroup;++ var isTypeOnlyImportAndRelevant = isTypeOnlyImport && isSortingTypesGroup;++ // In the special case where newlinesBetweenImports and consolidateIslands+ // want the opposite thing, consolidateIslands wins+ var newlinesBetweenImports = isSortingTypesGroup &&+ isConsolidatingSpaceBetweenImports && (+ previousImport.isMultiline || currentImport.isMultiline) &&+ newlinesBetweenImports_ === 'never' ?+ 'always-and-inside-groups' :+ newlinesBetweenImports_;++ // In the special case where newlinesBetweenTypeOnlyImports and+ // consolidateIslands want the opposite thing, consolidateIslands wins+ var newlinesBetweenTypeOnlyImports = isSortingTypesGroup &&+ isConsolidatingSpaceBetweenImports && (+ isNormalImportNextToTypeOnlyImportAndRelevant ||+ previousImport.isMultiline ||+ currentImport.isMultiline) &&+ newlinesBetweenTypeOnlyImports_ === 'never' ?+ 'always-and-inside-groups' :+ newlinesBetweenTypeOnlyImports_;++ var isNotIgnored = isTypeOnlyImportAndRelevant &&+ newlinesBetweenTypeOnlyImports !== 'ignore' ||+ !isTypeOnlyImportAndRelevant && newlinesBetweenImports !== 'ignore';++ if (isNotIgnored) {+ var shouldAssertNewlineBetweenGroups = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) && (+ newlinesBetweenTypeOnlyImports === 'always' ||+ newlinesBetweenTypeOnlyImports === 'always-and-inside-groups') ||+ !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant && (+ newlinesBetweenImports === 'always' ||+ newlinesBetweenImports === 'always-and-inside-groups');++ var shouldAssertNoNewlineWithinGroup = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) &&+ newlinesBetweenTypeOnlyImports !== 'always-and-inside-groups' ||+ !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant &&+ newlinesBetweenImports !== 'always-and-inside-groups';++ var shouldAssertNoNewlineBetweenGroup = !isSortingTypesGroup ||+ !isNormalImportNextToTypeOnlyImportAndRelevant ||+ newlinesBetweenTypeOnlyImports === 'never';++ var isTheNewlineBetweenImportsInTheSameGroup = distinctGroup && currentImport.rank === previousImport.rank ||+ !distinctGroup && !isStartOfDistinctGroup;++ // Let's try to cut down on linting errors sent to the user+ var alreadyReported = false;++ if (shouldAssertNewlineBetweenGroups) {+ if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {+ if (distinctGroup || isStartOfDistinctGroup) {+ alreadyReported = true;+ context.report({+ node: previousImport.node,+ message: 'There should be at least one empty line between import groups',+ fix: fixNewLineAfterImport(context, previousImport) });++ }+ } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineWithinGroup) {+ if (isTheNewlineBetweenImportsInTheSameGroup) {+ alreadyReported = true;+ context.report({+ node: previousImport.node,+ message: 'There should be no empty line within import group',+ fix: removeNewLineAfterImport(context, currentImport, previousImport) });++ }+ }+ } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineBetweenGroup) {+ alreadyReported = true;+ context.report({+ node: previousImport.node,+ message: 'There should be no empty line between import groups',+ fix: removeNewLineAfterImport(context, currentImport, previousImport) });++ }++ if (!alreadyReported && isConsolidatingSpaceBetweenImports) {+ if (emptyLinesBetween === 0 && currentImport.isMultiline) { context.report({ node: previousImport.node,- message: 'There should be at least one empty line between import groups',+ message: 'There should be at least one empty line between this import and the multi-line import that follows it', fix: fixNewLineAfterImport(context, previousImport) }); - }- } else if (emptyLinesBetween > 0 &&- newlinesBetweenImports !== 'always-and-inside-groups') {- if (distinctGroup && currentImport.rank === previousImport.rank || !distinctGroup && !isStartOfDistinctGroup) {+ } else if (emptyLinesBetween === 0 && previousImport.isMultiline) { context.report({ node: previousImport.node,- message: 'There should be no empty line within import group',+ message: 'There should be at least one empty line between this multi-line import and the import that follows it',+ fix: fixNewLineAfterImport(context, previousImport) });++ } else if (+ emptyLinesBetween > 0 &&+ !previousImport.isMultiline &&+ !currentImport.isMultiline &&+ isTheNewlineBetweenImportsInTheSameGroup)+ {+ context.report({+ node: previousImport.node,+ message:+ 'There should be no empty lines between this single-line import and the single-line import that follows it', fix: removeNewLineAfterImport(context, currentImport, previousImport) });@@ -703,8 +822,2 @@ }- } else if (emptyLinesBetween > 0) {- context.report({- node: previousImport.node,- message: 'There should be no empty line between import groups',- fix: removeNewLineAfterImport(context, currentImport, previousImport) });- }@@ -742,3 +855,14 @@ groups: {- type: 'array' },+ type: 'array',+ uniqueItems: true,+ items: {+ oneOf: [+ { 'enum': types },+ {+ type: 'array',+ uniqueItems: true,+ items: { 'enum': types } }] } },
… 156 more lines (truncated)
--- +++ @@ -2,3 +2,3 @@ "name": "eslint-plugin-import",- "version": "2.31.0",+ "version": "2.32.0", "description": "Import with sanity.",@@ -8,2 +8,3 @@ "main": "lib/index.js",+ "types": "index.d.ts", "directories": {@@ -18,3 +19,4 @@ "config",- "memo-parser/{*.js,LICENSE,*.md}"+ "memo-parser/{*.js,LICENSE,*.md}",+ "index.d.ts" ],@@ -33,5 +35,7 @@ "test-all": "node --require babel-register ./scripts/testAll",- "test-examples": "npm run build && npm run test-example:legacy && npm run test-example:flat",+ "test-examples": "npm run build && npm run test-example:legacy && npm run test-example:flat && npm run test-example:v9", "test-example:legacy": "cd examples/legacy && npm install && npm run lint", "test-example:flat": "cd examples/flat && npm install && npm run lint",+ "test-example:v9": "cd examples/v9 && npm install && npm run lint",+ "test-types": "npx --package typescript@latest tsc --noEmit index.d.ts", "prepublishOnly": "safe-publish-latest && npm run build",@@ -65,2 +69,3 @@ "@test-scope/some-module": "file:./tests/files/symlinked-module",+ "@types/eslint": "^8.56.12", "@typescript-eslint/parser": "^2.23.0 || ^3.3.0 || ^4.29.3 || ^5.10.0",@@ -104,2 +109,3 @@ "sinon": "^2.4.1",+ "tmp": "^0.2.1", "typescript": "^2.8.1 || ~3.9.5 || ~4.5.2",@@ -112,6 +118,6 @@ "@rtsao/scc": "^1.1.0",- "array-includes": "^3.1.8",- "array.prototype.findlastindex": "^1.2.5",- "array.prototype.flat": "^1.3.2",- "array.prototype.flatmap": "^1.3.2",+ "array-includes": "^3.1.9",+ "array.prototype.findlastindex": "^1.2.6",+ "array.prototype.flat": "^1.3.3",+ "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7",@@ -119,5 +125,5 @@ "eslint-import-resolver-node": "^0.3.9",- "eslint-module-utils": "^2.12.0",+ "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2",- "is-core-module": "^2.15.1",+ "is-core-module": "^2.16.1", "is-glob": "^4.0.3",@@ -126,5 +132,5 @@ "object.groupby": "^1.0.3",- "object.values": "^1.2.0",+ "object.values": "^1.2.1", "semver": "^6.3.1",- "string.prototype.trimend": "^1.0.8",+ "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0"
event-stream npm DELETIONBURST ×10
3.2.0
3.2.1
3.2.2
3.3.0
3.3.1
3.3.2
3.3.3
3.3.4
3.3.5
3.3.6
4.0.0
4.0.1
DELETION
3.3.6 published then removed
high · registry-verified · 2018-09-09 · 7y ago
BURST
2 releases in 43m: 0.5.2, 0.5.3
info · registry-verified · 2011-11-01 · 14y ago
BURST
8 releases in 0m: 0.1.0, 0.2.0, 0.2.1, 0.3.0, 0.4.0, 0.5.0, 0.5.1, 0.7.0
info · registry-verified · 2011-12-07 · 14y ago
BURST
2 releases in 10m: 0.9.0, 0.9.1
info · registry-verified · 2012-04-21 · 14y ago
BURST
3 releases in 39m: 0.9.4, 0.9.6, 0.9.7
info · registry-verified · 2012-04-25 · 14y ago
BURST
2 releases in 38m: 1.0.0, 1.1.0
info · registry-verified · 2012-05-21 · 14y ago
BURST
3 releases in 15m: 2.0.1, 2.0.2, 2.0.3
info · registry-verified · 2012-06-12 · 14y ago
BURST
2 releases in 41m: 2.1.3, 2.1.4
info · registry-verified · 2012-07-04 · 14y ago
BURST
2 releases in 28m: 2.2.3, 3.0.0
info · registry-verified · 2012-08-18 · 13y ago
BURST
2 releases in 4m: 3.0.6, 3.0.7
info · registry-verified · 2012-09-30 · 13y ago
BURST
2 releases in 16m: 3.0.17, 3.0.18
info · registry-verified · 2013-12-04 · 12y ago
release diff 4.0.0 → 4.0.1
+0 added · -0 removed · ~2 modified
--- +++ @@ -2,3 +2,3 @@ "name": "event-stream",- "version": "4.0.0",+ "version": "4.0.1", "description": "construct pipes of streams of events",@@ -30,23 +30,5 @@ },- "testling": {- "files": "test/*.js",- "browsers": {- "ie": [- 8,- 9- ],- "firefox": [- 13- ],- "chrome": [- 20- ],- "safari": [- 5.1- ],- "opera": [- 12- ]- }- },+ "keywords": [+ "stream", "map", "flatmap", "filter", "split", "join", "merge", "replace"+ ], "license": "MIT",
husky npm DELETION ×13BURST ×13
9.0.8
9.0.9
9.0.10
9.0.11
9.1.0
9.1.1
9.1.2
9.1.3
9.1.4
9.1.5
9.1.6
9.1.7
DELETION
0.1.0 published then removed
high · registry-verified · 2014-06-09 · 12y ago
DELETION
0.1.1 published then removed
high · registry-verified · 2014-06-09 · 12y ago
DELETION
0.1.2 published then removed
high · registry-verified · 2014-06-09 · 12y ago
DELETION
0.1.3 published then removed
high · registry-verified · 2014-06-09 · 12y ago
DELETION
0.1.4 published then removed
high · registry-verified · 2014-06-10 · 12y ago
DELETION
0.1.5 published then removed
high · registry-verified · 2014-06-10 · 12y ago
DELETION
0.2.0 published then removed
high · registry-verified · 2014-06-16 · 12y ago
DELETION
0.2.1 published then removed
high · registry-verified · 2014-06-16 · 12y ago
DELETION
0.2.3 published then removed
high · registry-verified · 2014-06-18 · 12y ago
DELETION
0.3.0 published then removed
high · registry-verified · 2014-06-23 · 12y ago
DELETION
0.3.1 published then removed
high · registry-verified · 2014-06-23 · 12y ago
DELETION
0.3.2 published then removed
high · registry-verified · 2014-06-23 · 12y ago
DELETION
0.3.3 published then removed
high · registry-verified · 2014-06-23 · 12y ago
BURST
4 releases in 20m: 0.1.0, 0.1.1, 0.1.2, 0.1.3
info · registry-verified · 2014-06-09 · 12y ago
BURST
2 releases in 8m: 0.3.0, 0.3.1
info · registry-verified · 2014-06-23 · 12y ago
BURST
2 releases in 10m: 0.3.3, 0.4.0
info · registry-verified · 2014-06-23 · 12y ago
BURST
3 releases in 49m: 0.4.1, 0.4.2, 0.4.3
info · registry-verified · 2014-06-23 · 12y ago
BURST
2 releases in 59m: 0.9.0, 0.9.1
info · registry-verified · 2015-07-22 · 10y ago
BURST
2 releases in 51m: 3.0.6, 3.0.7
info · registry-verified · 2019-09-28 · 6y ago
BURST
2 releases in 20m: 4.0.2, 4.0.3
info · registry-verified · 2020-01-09 · 6y ago
BURST
3 releases in 51m: 5.0.2, 5.0.3, 5.0.4
info · registry-verified · 2020-11-22 · 5y ago
BURST
2 releases in 2m: 4.3.2, 4.3.3
info · registry-verified · 2020-12-05 · 5y ago
BURST
2 releases in 9m: 5.0.5, 5.0.6
info · registry-verified · 2020-12-11 · 5y ago
BURST
2 releases in 9m: 7.0.3, 7.0.4
info · registry-verified · 2021-10-21 · 4y ago
BURST
2 releases in 48m: 9.0.3, 9.0.4
info · registry-verified · 2024-01-25 · 2y ago
BURST
2 releases in 42m: 9.0.8, 9.0.9
info · registry-verified · 2024-02-01 · 2y ago
release diff 9.1.6 → 9.1.7
+0 added · -0 removed · ~2 modified
--- +++ @@ -21,3 +21,3 @@ -d = c => console.error(`${c} command is DEPRECATED`)+d = c => console.error(`husky - ${c} command is DEPRECATED`) if (['add', 'set', 'uninstall'].includes(a)) { d(a); p.exit(1) }
--- +++ @@ -2,3 +2,3 @@ "name": "husky",- "version": "9.1.6",+ "version": "9.1.7", "type": "module",
mocha npm critical-tier DELETIONBURST
11.2.2
11.3.0
11.4.0
11.5.0
11.6.0
11.7.0
11.7.1
11.7.2
11.7.3
11.7.4
11.7.5
11.7.6
DELETION
3.4.0 published then removed
high · registry-verified · 2017-05-14 · 9y ago
BURST
2 releases in 46m: 1.4.3, 1.5.0
info · registry-verified · 2012-09-21 · 13y ago
release diff 11.7.5 → 11.7.6
+0 added · -0 removed · ~67 modified
+38 more files not shown
--- +++ @@ -2,3 +2,3 @@ -'use strict';+"use strict"; @@ -12,4 +12,4 @@ -const os = require('node:os');-const {loadOptions} = require('../lib/cli/options');+const os = require("node:os");+const { loadOptions } = require("../lib/cli/options"); const {@@ -17,7 +17,7 @@ isNodeFlag,- impliesNoTimeouts-} = require('../lib/cli/node-flags');-const unparse = require('yargs-unparser');-const debug = require('debug')('mocha:cli:mocha');-const {aliases} = require('../lib/cli/run-option-metadata');+ impliesNoTimeouts,+} = require("../lib/cli/node-flags");+const unparse = require("yargs-unparser");+const debug = require("debug")("mocha:cli:mocha");+const { aliases } = require("../lib/cli/run-option-metadata"); @@ -29,3 +29,3 @@ const opts = loadOptions(process.argv.slice(2));-debug('loaded opts', opts);+debug("loaded opts", opts); @@ -36,5 +36,5 @@ */-const disableTimeouts = value => {+const disableTimeouts = (value) => { if (impliesNoTimeouts(value)) {- debug('option %s disabled timeouts', value);+ debug("option %s disabled timeouts", value); mochaArgs.timeout = 0;@@ -49,7 +49,7 @@ */-const trimV8Option = value =>- value !== 'v8-options' && /^v8-/.test(value) ? value.slice(3) : value;+const trimV8Option = (value) =>+ value !== "v8-options" && /^v8-/.test(value) ? value.slice(3) : value; // sort options into "node" and "mocha" buckets-Object.keys(opts).forEach(opt => {+Object.keys(opts).forEach((opt) => { if (isNodeFlag(opt)) {@@ -62,5 +62,5 @@ // disable 'timeout' for debugFlags-Object.keys(nodeArgs).forEach(opt => disableTimeouts(opt));-mochaArgs['node-option'] &&- mochaArgs['node-option'].forEach(opt => disableTimeouts(opt));+Object.keys(nodeArgs).forEach((opt) => disableTimeouts(opt));+mochaArgs["node-option"] &&+ mochaArgs["node-option"].forEach((opt) => disableTimeouts(opt)); @@ -73,6 +73,6 @@ if (mochaArgs._) {- const i = mochaArgs._.findIndex(val => val === 'inspect');+ const i = mochaArgs._.findIndex((val) => val === "inspect"); if (i > -1) { mochaArgs._.splice(i, 1);- disableTimeouts('inspect');+ disableTimeouts("inspect"); hasInspect = true;@@ -81,14 +81,15 @@ -if (mochaArgs['node-option'] || Object.keys(nodeArgs).length || hasInspect) {- const {spawn} = require('node:child_process');- const mochaPath = require.resolve('../lib/cli/cli.js');+if (mochaArgs["node-option"] || Object.keys(nodeArgs).length || hasInspect) {+ const { spawn } = require("node:child_process");+ const mochaPath = require.resolve("../lib/cli/cli.js"); const nodeArgv =- (mochaArgs['node-option'] && mochaArgs['node-option'].map(v => '--' + v)) ||+ (mochaArgs["node-option"] &&+ mochaArgs["node-option"].map((v) => "--" + v)) || unparseNodeFlags(nodeArgs); - if (hasInspect) nodeArgv.unshift('inspect');- delete mochaArgs['node-option'];+ if (hasInspect) nodeArgv.unshift("inspect");+ delete mochaArgs["node-option"]; - debug('final node argv', nodeArgv);+ debug("final node argv", nodeArgv); @@ -97,3 +98,3 @@ mochaPath,- unparse(mochaArgs, {alias: aliases})+ unparse(mochaArgs, { alias: aliases }), );@@ -101,5 +102,5 @@ debug(- 'forking child process via command: %s %s',+ "forking child process via command: %s %s", process.execPath,- args.join(' ')+ args.join(" "), );@@ -107,10 +108,11 @@ const proc = spawn(process.execPath, args, {- stdio: 'inherit'+ stdio: "inherit", }); - proc.on('exit', (code, signal) => {- process.on('exit', () => {+ proc.on("exit", (code, signal) => {+ process.on("exit", () => { if (signal) {- signal = typeof signal === 'string' ? os.constants.signals[signal] : signal;- if (mochaArgs['posix-exit-codes'] === true) {+ signal =+ typeof signal === "string" ? os.constants.signals[signal] : signal;+ if (mochaArgs["posix-exit-codes"] === true) { process.exitCode = SIGNAL_OFFSET + signal;@@ -119,3 +121,3 @@ } else {- process.exit(Math.min(code, mochaArgs['posix-exit-codes'] ? 1 : 255));+ process.exit(Math.min(code, mochaArgs["posix-exit-codes"] ? 1 : 255)); }@@ -125,7 +127,7 @@ // terminate children.- process.on('SIGINT', () => {+ process.on("SIGINT", () => { // XXX: a previous comment said this would abort the runner, but I can't see that it does // anything with the default runner.- debug('main process caught SIGINT');- proc.kill('SIGINT');+ debug("main process caught SIGINT");+ proc.kill("SIGINT"); // if running in parallel mode, we will have a proper SIGINT handler, so the below won't@@ -134,4 +136,4 @@ // win32 does not support SIGTERM, so use next best thing.- if (os.platform() === 'win32') {- proc.kill('SIGKILL');+ if (os.platform() === "win32") {+ proc.kill("SIGKILL"); } else {@@ -139,4 +141,4 @@ // in cut-off text or a befouled terminal.- debug('sending SIGTERM to child process');- proc.kill('SIGTERM');+ debug("sending SIGTERM to child process");+ proc.kill("SIGTERM"); }@@ -145,4 +147,4 @@ } else {- debug('running Mocha in-process');- require('../lib/cli/cli').main([], mochaArgs);+ debug("running Mocha in-process");+ require("../lib/cli/cli").main([], mochaArgs); }
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,5 +9,5 @@ -const fs = require('node:fs');-const pc = require('picocolors');-const yargsParser = require('yargs-parser');+const fs = require("node:fs");+const pc = require("picocolors");+const yargsParser = require("yargs-parser"); const {@@ -16,11 +16,11 @@ isMochaFlag,- expectedTypeForFlag-} = require('./run-option-metadata');-const {ONE_AND_DONE_ARGS} = require('./one-and-dones');-const mocharc = require('../mocharc.json');-const {list} = require('./run-helpers');-const {loadConfig, findConfig} = require('./config');-const findUp = require('find-up');-const debug = require('debug')('mocha:cli:options');-const {isNodeFlag} = require('./node-flags');+ expectedTypeForFlag,+} = require("./run-option-metadata");+const { ONE_AND_DONE_ARGS } = require("./one-and-dones");+const mocharc = require("../mocharc.json");+const { list } = require("./run-helpers");+const { loadConfig, findConfig } = require("./config");+const findUp = require("find-up");+const debug = require("debug")("mocha:cli:options");+const { isNodeFlag } = require("./node-flags"); const {@@ -28,5 +28,5 @@ createInvalidArgumentTypeError,- createUnsupportedError-} = require('../errors');-const {isNumeric} = require('../utils');+ createUnsupportedError,+} = require("../errors");+const { isNumeric } = require("../utils"); @@ -49,6 +49,6 @@ const YARGS_PARSER_CONFIG = {- 'combine-arrays': true,- 'short-option-groups': false,- 'dot-notation': false,- 'strip-aliased': true+ "combine-arrays": true,+ "short-option-groups": false,+ "dot-notation": false,+ "strip-aliased": true, };@@ -64,3 +64,3 @@ const configuration = Object.assign({}, YARGS_PARSER_CONFIG, {- 'camel-case-expansion': false+ "camel-case-expansion": false, });@@ -75,3 +75,3 @@ */-const globOptions = ['spec', 'ignore'];+const globOptions = ["spec", "ignore"]; const coerceOpts = Object.assign(@@ -80,5 +80,6 @@ Object.assign(acc, {- [arg]: v => Array.from(new Set(globOptions.includes(arg) ? v : list(v)))+ [arg]: (v) =>+ Array.from(new Set(globOptions.includes(arg) ? v : list(v))), }),- {}+ {}, ),@@ -88,5 +89,5 @@ (acc, arg) =>- Object.assign(acc, {[arg]: v => (Array.isArray(v) ? v.pop() : v)}),- {}- )+ Object.assign(acc, { [arg]: (v) => (Array.isArray(v) ? v.pop() : v) }),+ {},+ ), );@@ -103,3 +104,3 @@ .concat(types.string, types.number)- .reduce((acc, arg) => Object.assign(acc, {[arg]: 1}), {});+ .reduce((acc, arg) => Object.assign(acc, { [arg]: 1 }), {}); @@ -116,3 +117,3 @@ allArgs,- parsedResult+ parsedResult, ) => {@@ -122,3 +123,3 @@ const flag = allArgs.find((arg, index) => {- const normalizedArg = arg.replace(/^--?/, '');+ const normalizedArg = arg.replace(/^--?/, ""); return (@@ -134,3 +135,3 @@ numericArg,- expectedTypeForFlag(flag)+ expectedTypeForFlag(flag), );@@ -138,3 +139,3 @@ throw createUnsupportedError(- `Option ${numericArg} is unsupported by the mocha cli`+ `Option ${numericArg} is unsupported by the mocha cli`, );@@ -158,9 +159,9 @@ // 4. we can then reapply the values after yargs-parser is done.- const allArgs = Array.isArray(args) ? args : args.split(' ');+ const allArgs = Array.isArray(args) ? args : args.split(" "); const nodeArgs = allArgs.reduce((acc, arg) => {- const pair = arg.split('=');+ const pair = arg.split("="); let flag = pair[0]; if (isNodeFlag(flag, false)) {- flag = flag.replace(/^--?/, '');- return acc.concat([[flag, arg.includes('=') ? pair[1] : true]]);+ flag = flag.replace(/^--?/, "");+ return acc.concat([[flag, arg.includes("=") ? pair[1] : true]]); }@@ -179,3 +180,3 @@ number: types.number,- boolean: types.boolean.concat(nodeArgs.map(pair => pair[0]))+ boolean: types.boolean.concat(nodeArgs.map((pair) => pair[0])), });@@ -186,3 +187,3 @@ - const numericPositionalArg = result.argv._.find(arg => isNumeric(arg));+ const numericPositionalArg = result.argv._.find((arg) => isNumeric(arg)); if (numericPositionalArg) {@@ -191,3 +192,3 @@ allArgs,- result.argv+ result.argv, );@@ -238,3 +239,3 @@ try {- configData = fs.readFileSync(filepath, 'utf8');+ configData = fs.readFileSync(filepath, "utf8"); } catch (err) {@@ -244,7 +245,6 @@ `Unable to read ${filepath}: ${err}`,- filepath+ filepath, ); } else {- debug('failed to read default package.json at %s; ignoring',- filepath);+ debug("failed to read default package.json at %s; ignoring", filepath); return result;@@ -255,6 +255,6 @@ if (pkg.mocha) {- debug('`mocha` prop of package.json parsed: %O', pkg.mocha);+ debug("`mocha` prop of package.json parsed: %O", pkg.mocha); result = pkg.mocha; } else {- debug('no config found in %s', filepath);+ debug("no config found in %s", filepath); }@@ -264,3 +264,3 @@ `Unable to parse ${filepath}: ${err}`,- filepath+ filepath, );@@ -295,3 +295,3 @@ (acc, arg) => acc || arg in args,- false+ false, )@@ -301,3 +301,3 @@ - const envConfig = parse(process.env.MOCHA_OPTIONS || '');+ const envConfig = parse(process.env.MOCHA_OPTIONS || ""); const rcConfig = loadRc(args);@@ -320,3 +320,3 @@ rcConfig || {},- pkgConfig || {}+ pkgConfig || {}, );
--- +++ @@ -7,3 +7,3 @@ -'use strict';+"use strict"; @@ -15,9 +15,9 @@ -const serializeJavascript = require('serialize-javascript');-const workerpool = require('workerpool');-const {deserialize} = require('./serializer');-const debug = require('debug')('mocha:parallel:buffered-worker-pool');-const {createInvalidArgumentTypeError} = require('../errors');+const serializeJavascript = require("serialize-javascript");+const workerpool = require("workerpool");+const { deserialize } = require("./serializer");+const debug = require("debug")("mocha:parallel:buffered-worker-pool");+const { createInvalidArgumentTypeError } = require("../errors"); -const WORKER_PATH = require.resolve('./worker.js');+const WORKER_PATH = require.resolve("./worker.js"); @@ -38,7 +38,7 @@ // use child processes, not worker threads!- workerType: 'process',+ workerType: "process", // ensure the same flags sent to `node` for this `mocha` invocation are passed // along to children- forkOpts: {execArgv: process.execArgv},- maxWorkers: workerpool.cpus - 1+ forkOpts: { execArgv: process.execArgv },+ maxWorkers: workerpool.cpus - 1, };@@ -57,5 +57,5 @@ 1,- typeof opts.maxWorkers === 'undefined'+ typeof opts.maxWorkers === "undefined" ? WORKER_POOL_DEFAULT_OPTS.maxWorkers- : opts.maxWorkers+ : opts.maxWorkers, );@@ -66,3 +66,3 @@ debug(- 'not enough CPU cores available to run multiple jobs; avoid --parallel on this machine'+ "not enough CPU cores available to run multiple jobs; avoid --parallel on this machine", );@@ -71,5 +71,5 @@ debug(- '%d concurrent job(s) requested, but only %d core(s) available',+ "%d concurrent job(s) requested, but only %d core(s) available", maxWorkers,- workerpool.cpus+ workerpool.cpus, );@@ -78,5 +78,5 @@ debug(- 'run(): starting worker pool of max size %d, using node args: %s',+ "run(): starting worker pool of max size %d, using node args: %s", maxWorkers,- process.execArgv.join(' ')+ process.execArgv.join(" "), );@@ -84,3 +84,3 @@ let counter = 0;- const onCreateWorker = ({forkOpts}) => {+ const onCreateWorker = ({ forkOpts }) => { return {@@ -89,4 +89,4 @@ // adds an incremental id to all workers, which can be useful to allocate resources for each process- env: {...process.env, MOCHA_WORKER_ID: counter++}- }+ env: { ...process.env, MOCHA_WORKER_ID: counter++ },+ }, };@@ -98,3 +98,3 @@ maxWorkers,- onCreateWorker+ onCreateWorker, };@@ -111,3 +111,3 @@ /* istanbul ignore next */- debug('terminate(): terminating with force = %s', force);+ debug("terminate(): terminating with force = %s", force); return this._pool.terminate(force);@@ -126,7 +126,7 @@ async run(filepath, options = {}) {- if (!filepath || typeof filepath !== 'string') {+ if (!filepath || typeof filepath !== "string") { throw createInvalidArgumentTypeError(- 'Expected a non-empty filepath',- 'filepath',- 'string'+ "Expected a non-empty filepath",+ "filepath",+ "string", );@@ -134,3 +134,3 @@ const serializedOptions = BufferedWorkerPool.serializeOptions(options);- const result = await this._pool.exec('run', [filepath, serializedOptions]);+ const result = await this._pool.exec("run", [filepath, serializedOptions]); return deserialize(result);@@ -169,3 +169,3 @@ unsafe: true, // this means we don't care about XSS- ignoreFunction: true // do not serialize functions+ ignoreFunction: true, // do not serialize functions });@@ -174,5 +174,5 @@ debug(- 'serializeOptions(): serialized options %O to: %s',+ "serializeOptions(): serialized options %O to: %s", opts,- serialized+ serialized, );
--- +++ @@ -6,3 +6,3 @@ -'use strict';+"use strict"; @@ -15,12 +15,12 @@ createInvalidArgumentTypeError,- createInvalidArgumentValueError-} = require('../errors');-const workerpool = require('workerpool');-const Mocha = require('../mocha');-const {handleRequires, validateLegacyPlugin} = require('../cli/run-helpers');-const d = require('debug');+ createInvalidArgumentValueError,+} = require("../errors");+const workerpool = require("workerpool");+const Mocha = require("../mocha");+const { handleRequires, validateLegacyPlugin } = require("../cli/run-helpers");+const d = require("debug"); const debug = d.debug(`mocha:parallel:worker:${process.pid}`); const isDebugEnabled = d.enabled(`mocha:parallel:worker:${process.pid}`);-const {serialize} = require('./serializer');-const {setInterval, clearInterval} = global;+const { serialize } = require("./serializer");+const { setInterval, clearInterval } = global; @@ -30,3 +30,3 @@ throw new Error(- 'This script is intended to be run as a worker (by the `workerpool` package).'+ "This script is intended to be run as a worker (by the `workerpool` package).", );@@ -45,8 +45,8 @@ */-let bootstrap = async argv => {+let bootstrap = async (argv) => { // globalSetup and globalTeardown do not run in workers const plugins = await handleRequires(argv.require, {- ignoredPlugins: ['mochaGlobalSetup', 'mochaGlobalTeardown']+ ignoredPlugins: ["mochaGlobalSetup", "mochaGlobalTeardown"], });- validateLegacyPlugin(argv, 'ui', Mocha.interfaces);+ validateLegacyPlugin(argv, "ui", Mocha.interfaces); @@ -54,3 +54,3 @@ bootstrap = () => {};- debug('bootstrap(): finished with args: %O', argv);+ debug("bootstrap(): finished with args: %O", argv); };@@ -65,3 +65,3 @@ */-async function run(filepath, serializedOptions = '{}') {+async function run(filepath, serializedOptions = "{}") { if (!filepath) {@@ -69,4 +69,4 @@ 'Expected a non-empty "filepath" argument',- 'file',- 'string'+ "file",+ "string", );@@ -74,9 +74,9 @@ - debug('run(): running test file %s', filepath);+ debug("run(): running test file %s", filepath); - if (typeof serializedOptions !== 'string') {+ if (typeof serializedOptions !== "string") { throw createInvalidArgumentTypeError(- 'run() expects second parameter to be a string which was serialized by the `serialize-javascript` module',- 'serializedOptions',- 'string'+ "run() expects second parameter to be a string which was serialized by the `serialize-javascript` module",+ "serializedOptions",+ "string", );@@ -86,8 +86,8 @@ // eslint-disable-next-line no-eval- argv = eval('(' + serializedOptions + ')');+ argv = eval("(" + serializedOptions + ")"); } catch (err) { throw createInvalidArgumentValueError(- 'run() was unable to deserialize the options',- 'serializedOptions',- serializedOptions+ "run() was unable to deserialize the options",+ "serializedOptions",+ serializedOptions, );@@ -95,3 +95,3 @@ - const opts = Object.assign({ui: 'bdd'}, argv, {+ const opts = Object.assign({ ui: "bdd" }, argv, { // if this was true, it would cause infinite recursion.@@ -101,3 +101,3 @@ // it's useful for a Mocha instance to know if it's running in a worker process.- isWorker: true+ isWorker: true, });@@ -113,3 +113,3 @@ } catch (err) {- debug('run(): could not load file %s: %s', filepath, err);+ debug("run(): could not load file %s: %s", filepath, err); throw err;@@ -122,9 +122,9 @@ debugInterval = setInterval(() => {- debug('run(): still running %s...', filepath);+ debug("run(): still running %s...", filepath); }, 5000).unref(); }- mocha.run(result => {+ mocha.run((result) => { // Runner adds these; if we don't remove them, we'll get a leak.- process.removeAllListeners('uncaughtException');- process.removeAllListeners('unhandledRejection');+ process.removeAllListeners("uncaughtException");+ process.removeAllListeners("unhandledRejection"); @@ -133,4 +133,4 @@ debug(- 'run(): completed run with %d test failures; returning to main process',- typeof result.failures === 'number' ? result.failures : 0+ "run(): completed run with %d test failures; returning to main process",+ typeof result.failures === "number" ? result.failures : 0, );@@ -140,3 +140,3 @@ // rejection should only happen if an error is "unrecoverable"- debug('run(): serialization failed; rejecting: %O', err);+ debug("run(): serialization failed; rejecting: %O", err); reject(err);@@ -150,5 +150,5 @@ // this registers the `run` function.-workerpool.worker({run});+workerpool.worker({ run }); -debug('started worker process');+debug("started worker process");
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,7 +9,7 @@ -process.stdout = require('browser-stdout')({label: false});--var parseQuery = require('./lib/browser/parse-query');-var highlightTags = require('./lib/browser/highlight-tags');-var Mocha = require('./lib/mocha');+process.stdout = require("browser-stdout")({ label: false });++var parseQuery = require("./lib/browser/parse-query");+var highlightTags = require("./lib/browser/highlight-tags");+var Mocha = require("./lib/mocha"); @@ -21,3 +21,3 @@ -var mocha = new Mocha({reporter: 'html'});+var mocha = new Mocha({ reporter: "html" }); @@ -43,3 +43,3 @@ process.removeListener = function (e, fn) {- if (e === 'uncaughtException') {+ if (e === "uncaughtException") { if (originalOnerrorHandler) {@@ -61,3 +61,3 @@ process.listenerCount = function (name) {- if (name === 'uncaughtException') {+ if (name === "uncaughtException") { return uncaughtExceptionHandlers.length;@@ -72,5 +72,5 @@ process.on = function (e, fn) {- if (e === 'uncaughtException') {+ if (e === "uncaughtException") { global.onerror = function (msg, url, line, col, err) {- fn(err || new Error(msg + ' (' + url + ':' + line + ':' + col + ')'));+ fn(err || new Error(msg + " (" + url + ":" + line + ":" + col + ")")); return !mocha.options.allowUncaught;@@ -82,3 +82,3 @@ process.listeners = function (err) {- if (err === 'uncaughtException') {+ if (err === "uncaughtException") { return uncaughtExceptionHandlers;@@ -91,3 +91,3 @@ // Ensure that this default UI does not expose its methods to the global scope.-mocha.suite.removeAllListeners('pre-require');+mocha.suite.removeAllListeners("pre-require"); @@ -138,3 +138,3 @@ Mocha.prototype.ui.call(this, ui);- this.suite.emit('pre-require', global, null, this);+ this.suite.emit("pre-require", global, null, this); return this;@@ -147,4 +147,4 @@ mocha.setup = function (opts) {- if (typeof opts === 'string') {- opts = {ui: opts};+ if (typeof opts === "string") {+ opts = { ui: opts }; }@@ -156,3 +156,3 @@ .filter(function (opt) {- return opt !== 'delay';+ return opt !== "delay"; })@@ -172,5 +172,5 @@ var options = mocha.options;- mocha.globals('location');-- var query = parseQuery(global.location.search || '');+ mocha.globals("location");++ var query = parseQuery(global.location.search || ""); if (query.grep) {@@ -190,6 +190,6 @@ document &&- document.getElementById('mocha') &&+ document.getElementById("mocha") && options.noHighlighting !== true ) {- highlightTags('code');+ highlightTags("code"); }
--- +++ @@ -1,3 +1,3 @@-'use strict';+"use strict"; -module.exports = require('./lib/mocha');+module.exports = require("./lib/mocha");
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -11,4 +11,4 @@ return js- .replace(/</g, '<')- .replace(/>/g, '>')+ .replace(/</g, "<")+ .replace(/>/g, ">") .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')@@ -19,3 +19,3 @@ /\bnew[ \t]+(\w+)/gm,- '<span class="keyword">new</span> <span class="init">$1</span>'+ '<span class="keyword">new</span> <span class="init">$1</span>', )@@ -23,3 +23,3 @@ /\b(function|new|throw|return|var|if|else)\b/gm,- '<span class="keyword">$1</span>'+ '<span class="keyword">$1</span>', );@@ -34,3 +34,3 @@ module.exports = function highlightTags(name) {- var code = document.getElementById('mocha').getElementsByTagName(name);+ var code = document.getElementById("mocha").getElementsByTagName(name); for (var i = 0, len = code.length; i < len; ++i) {
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -11,6 +11,6 @@ return qs- .replace('?', '')- .split('&')+ .replace("?", "")+ .split("&") .reduce(function (obj, pair) {- var i = pair.indexOf('=');+ var i = pair.indexOf("="); var key = pair.slice(0, i);@@ -19,3 +19,3 @@ // Due to how the URLSearchParams API treats spaces- obj[key] = decodeURIComponent(val.replace(/\+/g, '%20'));+ obj[key] = decodeURIComponent(val.replace(/\+/g, "%20"));
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,6 +10,6 @@ -const debug = require('debug')('mocha:cli:cli');-const symbols = require('log-symbols');-const yargs = require('yargs');-const path = require('node:path');+const debug = require("debug")("mocha:cli:cli");+const symbols = require("log-symbols");+const yargs = require("yargs");+const path = require("node:path"); const {@@ -18,9 +18,14 @@ loadOptions,- YARGS_PARSER_CONFIG-} = require('./options');-const lookupFiles = require('./lookup-files');-const commands = require('./commands');-const pc = require('picocolors');-const {repository, homepage, version, discord} = require('../../package.json');-const {cwd} = require('../utils');+ YARGS_PARSER_CONFIG,+} = require("./options");+const lookupFiles = require("./lookup-files");+const commands = require("./commands");+const pc = require("picocolors");+const {+ repository,+ homepage,+ version,+ discord,+} = require("../../package.json");+const { cwd } = require("../utils"); @@ -36,6 +41,6 @@ exports.main = (argv = process.argv.slice(2), mochaArgs) => {- debug('entered main with raw args', argv);+ debug("entered main with raw args", argv); // ensure we can require() from current working directory- if (typeof module.paths !== 'undefined') {- module.paths.push(cwd(), path.resolve('node_modules'));+ if (typeof module.paths !== "undefined") {+ module.paths.push(cwd(), path.resolve("node_modules")); }@@ -45,3 +50,3 @@ } catch (err) {- debug('unable to set Error.stackTraceLimit = Infinity', err);+ debug("unable to set Error.stackTraceLimit = Infinity", err); }@@ -51,3 +56,3 @@ yargs()- .scriptName('mocha')+ .scriptName("mocha") .command(commands.run)@@ -55,16 +60,16 @@ .updateStrings({- 'Positionals:': 'Positional Arguments',- 'Options:': 'Other Options',- 'Commands:': 'Commands'+ "Positionals:": "Positional Arguments",+ "Options:": "Other Options",+ "Commands:": "Commands", }) .fail((msg, err, yargs) => {- debug('caught error sometime before command handler: %O', err);+ debug("caught error sometime before command handler: %O", err); yargs.showHelp();- console.error(`\n${symbols.error} ${pc.red('ERROR:')} ${msg}`);+ console.error(`\n${symbols.error} ${pc.red("ERROR:")} ${msg}`); process.exit(1); })- .help('help', 'Show usage information & exit')- .alias('help', 'h')- .version('version', 'Show version number & exit', version)- .alias('version', 'V')+ .help("help", "Show usage information & exit")+ .alias("help", "h")+ .version("version", "Show version number & exit", version)+ .alias("version", "V") .wrap(process.stdout.columns ? Math.min(process.stdout.columns, 80) : 80)@@ -75,3 +80,3 @@ Docs: ${pc.yellow(homepage)}- `+ `, )
--- +++ @@ -1,10 +1,10 @@-'use strict';+"use strict"; -const path = require('node:path');-const pc = require('picocolors');-const debug = require('debug')('mocha:cli:run:helpers');-const { minimatch } = require('minimatch');-const {NO_FILES_MATCH_PATTERN} = require('../error-constants').constants;-const lookupFiles = require('./lookup-files');-const {castArray} = require('../utils');+const path = require("node:path");+const pc = require("picocolors");+const debug = require("debug")("mocha:cli:run:helpers");+const { minimatch } = require("minimatch");+const { NO_FILES_MATCH_PATTERN } = require("../error-constants").constants;+const lookupFiles = require("./lookup-files");+const { castArray } = require("../utils"); @@ -35,3 +35,3 @@ sort,- spec+ spec, } = {}) => {@@ -41,9 +41,9 @@ const moreSpecFiles = castArray(lookupFiles(arg, extension, recursive))- .filter(filename =>+ .filter((filename) => ignore.every(- pattern =>- !minimatch(filename, pattern, {windowsPathsNoEscape: true})- )+ (pattern) =>+ !minimatch(filename, pattern, { windowsPathsNoEscape: true }),+ ), )- .map(filename => path.resolve(filename));+ .map((filename) => path.resolve(filename)); return [...specFiles, ...moreSpecFiles];@@ -51,3 +51,3 @@ if (err.code === NO_FILES_MATCH_PATTERN) {- unmatchedSpecFiles.push({message: err.message, pattern: err.pattern});+ unmatchedSpecFiles.push({ message: err.message, pattern: err.pattern }); return specFiles;@@ -62,3 +62,3 @@ const unmatchedFiles = [];- fileArgs.forEach(file => {+ fileArgs.forEach((file) => { const fileAbsolutePath = path.resolve(file);@@ -68,6 +68,6 @@ } catch (err) {- if (err.code === 'MODULE_NOT_FOUND') {+ if (err.code === "MODULE_NOT_FOUND") { unmatchedFiles.push({ pattern: file,- absolutePath: fileAbsolutePath+ absolutePath: fileAbsolutePath, });@@ -87,6 +87,6 @@ const files = [- ...fileArgs.map(filepath => path.resolve(filepath)),- ...specFiles+ ...fileArgs.map((filepath) => path.resolve(filepath)),+ ...specFiles, ];- debug('test files (in order): ', files);+ debug("test files (in order): ", files); @@ -97,5 +97,5 @@ ? `Error: No test files found: ${JSON.stringify(- unmatchedSpecFiles[0].pattern+ unmatchedSpecFiles[0].pattern, )}` // stringify to print escaped characters raw- : 'Error: No test files found';+ : "Error: No test files found"; console.error(pc.red(noneFoundMsg));@@ -104,3 +104,3 @@ // print messages as a warning- unmatchedSpecFiles.forEach(warning => {+ unmatchedSpecFiles.forEach((warning) => { console.warn(pc.yellow(`Warning: ${warning.message}`));@@ -111,3 +111,3 @@ files,- unmatchedFiles+ unmatchedFiles, };
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,5 +10,5 @@ module.exports = {- init: require('./init'),+ init: require("./init"), // default command- run: require('./run'),-}+ run: require("./run"),+};
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,8 +9,8 @@ -const fs = require('node:fs');-const path = require('node:path');-const debug = require('debug')('mocha:cli:config');-const findUp = require('find-up');-const {createUnparsableFileError} = require('../errors');-const utils = require('../utils');+const fs = require("node:fs");+const path = require("node:path");+const debug = require("debug")("mocha:cli:config");+const findUp = require("find-up");+const { createUnparsableFileError } = require("../errors");+const utils = require("../utils"); @@ -24,8 +24,8 @@ exports.CONFIG_FILES = [- '.mocharc.cjs',- '.mocharc.js',- '.mocharc.yaml',- '.mocharc.yml',- '.mocharc.jsonc',- '.mocharc.json'+ ".mocharc.cjs",+ ".mocharc.js",+ ".mocharc.yaml",+ ".mocharc.yml",+ ".mocharc.jsonc",+ ".mocharc.json", ];@@ -37,4 +37,5 @@ const parsers = (exports.parsers = {- yaml: filepath => require('js-yaml').load(fs.readFileSync(filepath, 'utf8')),- js: filepath => {+ yaml: (filepath) =>+ require("js-yaml").load(fs.readFileSync(filepath, "utf8")),+ js: (filepath) => { let cwdFilepath;@@ -51,6 +52,6 @@ },- json: filepath =>+ json: (filepath) => JSON.parse(- require('strip-json-comments')(fs.readFileSync(filepath, 'utf8'))- )+ require("strip-json-comments")(fs.readFileSync(filepath, "utf8")),+ ), });@@ -65,5 +66,5 @@ */-exports.loadConfig = filepath => {+exports.loadConfig = (filepath) => { let config = {};- debug('loadConfig: trying to parse config at %s', filepath);+ debug("loadConfig: trying to parse config at %s", filepath); @@ -71,5 +72,5 @@ try {- if (ext === '.yml' || ext === '.yaml') {+ if (ext === ".yml" || ext === ".yaml") { config = parsers.yaml(filepath);- } else if (ext === '.js' || ext === '.cjs') {+ } else if (ext === ".js" || ext === ".cjs") { config = parsers.js(filepath);@@ -81,3 +82,3 @@ `Unable to read/parse ${filepath}: ${err}`,- filepath+ filepath, );@@ -94,5 +95,5 @@ exports.findConfig = (cwd = utils.cwd()) => {- const filepath = findUp.sync(exports.CONFIG_FILES, {cwd});+ const filepath = findUp.sync(exports.CONFIG_FILES, { cwd }); if (filepath) {- debug('findConfig: found config file %s', filepath);+ debug("findConfig: found config file %s", filepath); }
--- +++ @@ -1,3 +1,3 @@-'use strict';+"use strict"; -module.exports = require('./cli');+module.exports = require("./cli");
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,28 +9,28 @@ -const fs = require('node:fs');-const path = require('node:path');+const fs = require("node:fs");+const path = require("node:path"); -exports.command = 'init <path>';+exports.command = "init <path>"; -exports.description = 'create a client-side Mocha setup at <path>';+exports.description = "create a client-side Mocha setup at <path>"; -exports.builder = yargs =>- yargs.positional('path', {- type: 'string',- normalize: true+exports.builder = (yargs) =>+ yargs.positional("path", {+ type: "string",+ normalize: true, }); -exports.handler = argv => {+exports.handler = (argv) => { const destdir = argv.path;- const srcdir = path.join(__dirname, '..', '..');- fs.mkdirSync(destdir, {recursive: true});- const css = fs.readFileSync(path.join(srcdir, 'mocha.css'));- const js = fs.readFileSync(path.join(srcdir, 'mocha.js'));+ const srcdir = path.join(__dirname, "..", "..");+ fs.mkdirSync(destdir, { recursive: true });+ const css = fs.readFileSync(path.join(srcdir, "mocha.css"));+ const js = fs.readFileSync(path.join(srcdir, "mocha.js")); const tmpl = fs.readFileSync(- path.join(srcdir, 'lib', 'browser', 'template.html')+ path.join(srcdir, "lib", "browser", "template.html"), );- fs.writeFileSync(path.join(destdir, 'mocha.css'), css);- fs.writeFileSync(path.join(destdir, 'mocha.js'), js);- fs.writeFileSync(path.join(destdir, 'tests.spec.js'), '');- fs.writeFileSync(path.join(destdir, 'index.html'), tmpl);+ fs.writeFileSync(path.join(destdir, "mocha.css"), css);+ fs.writeFileSync(path.join(destdir, "mocha.js"), js);+ fs.writeFileSync(path.join(destdir, "tests.spec.js"), "");+ fs.writeFileSync(path.join(destdir, "index.html"), tmpl); };
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; /**@@ -7,9 +7,9 @@ -var fs = require('node:fs');-var path = require('node:path');-var glob = require('glob');-var errors = require('../errors');+var fs = require("node:fs");+var path = require("node:path");+var glob = require("glob");+var errors = require("../errors"); var createNoFilesMatchPatternError = errors.createNoFilesMatchPatternError; var createMissingArgumentError = errors.createMissingArgumentError;-const debug = require('debug')('mocha:cli:lookup-files');+const debug = require("debug")("mocha:cli:lookup-files"); @@ -30,3 +30,3 @@ */-const isHiddenOnUnix = pathname => path.basename(pathname).startsWith('.');+const isHiddenOnUnix = (pathname) => path.basename(pathname).startsWith("."); @@ -48,4 +48,4 @@ exts- .map(ext => (ext.startsWith('.') ? ext : `.${ext}`))- .some(ext => pathname.endsWith(ext));+ .map((ext) => (ext.startsWith(".") ? ext : `.${ext}`))+ .some((ext) => pathname.endsWith(ext)); @@ -70,3 +70,3 @@ extensions = [],- recursive = false+ recursive = false, ) {@@ -77,3 +77,3 @@ let pattern;- if (glob.hasMagic(filepath, {windowsPathsNoEscape: true})) {+ if (glob.hasMagic(filepath, { windowsPathsNoEscape: true })) { // Handle glob as is without extensions@@ -83,6 +83,6 @@ const strExtensions = extensions- .map(ext => (ext.startsWith('.') ? ext : `.${ext}`))- .join('|');+ .map((ext) => (ext.startsWith(".") ? ext : `.${ext}`))+ .join("|"); pattern = `${filepath}+(${strExtensions})`;- debug('looking for files using glob pattern: %s', pattern);+ debug("looking for files using glob pattern: %s", pattern); }@@ -92,3 +92,3 @@ nodir: true,- windowsPathsNoEscape: true+ windowsPathsNoEscape: true, })@@ -97,3 +97,3 @@ // https://github.com/mochajs/mocha/pull/5250/files#r1840469747- .sort((a, b) => a.localeCompare(b, 'en'))+ .sort((a, b) => a.localeCompare(b, "en")), );@@ -102,3 +102,3 @@ `Cannot find any files matching pattern "${filepath}"`,- filepath+ filepath, );@@ -120,3 +120,3 @@ // Handle directory- fs.readdirSync(filepath).forEach(dirent => {+ fs.readdirSync(filepath).forEach((dirent) => { const pathname = path.join(filepath, dirent);@@ -138,4 +138,4 @@ `Argument '${extensions}' required when argument '${filepath}' is a directory`,- 'extensions',- 'array'+ "extensions",+ "array", );
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,4 +9,4 @@ const nodeFlags = process.allowedNodeEnvironmentFlags;-const {isMochaFlag} = require('./run-option-metadata');-const unparse = require('yargs-unparser');+const { isMochaFlag } = require("./run-option-metadata");+const unparse = require("yargs-unparser"); @@ -17,3 +17,3 @@ */-const debugFlags = new Set(['inspect', 'inspect-brk']);+const debugFlags = new Set(["inspect", "inspect-brk"]); @@ -43,3 +43,3 @@ // strip the leading dashes to match against subsequent checks- flag = flag.replace(/^--?/, '');+ flag = flag.replace(/^--?/, ""); }@@ -52,3 +52,3 @@ /(?:preserve-symlinks(?:-main)?|harmony(?:[_-]|$)|(?:trace[_-].+$)|gc[_-]global$|es[_-]staging$|use[_-]strict$|v8[_-](?!options).+?$)/.test(- flag+ flag, )@@ -64,3 +64,3 @@ */-exports.impliesNoTimeouts = flag => debugFlags.has(flag);+exports.impliesNoTimeouts = (flag) => debugFlags.has(flag); @@ -74,3 +74,3 @@ */-exports.unparseNodeFlags = opts => {+exports.unparseNodeFlags = (opts) => { var args = unparse(opts);@@ -78,7 +78,7 @@ ? args- .join(' ')+ .join(" ") .split(/\b/)- .map(arg => (arg === ' ' ? '=' : arg))- .join('')- .split(' ')+ .map((arg) => (arg === " " ? "=" : arg))+ .join("")+ .split(" ") : [];
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,3 +10,3 @@ -const Mocha = require('../mocha');+const Mocha = require("../mocha"); @@ -19,3 +19,3 @@ */-const showKeys = obj => {+const showKeys = (obj) => { console.log();@@ -25,6 +25,7 @@ .filter(- key => /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract+ (key) =>+ /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract, ) .sort()- .forEach(key => {+ .forEach((key) => { const description = obj[key].description;@@ -32,4 +33,4 @@ ` ${key.padEnd(maxKeyLength + 1)}${- description ? `- ${description}` : ''- }`+ description ? `- ${description}` : ""+ }`, );@@ -49,3 +50,3 @@ */- 'list-interfaces': () => {+ "list-interfaces": () => { showKeys(Mocha.interfaces);@@ -56,5 +57,5 @@ */- 'list-reporters': () => {+ "list-reporters": () => { showKeys(Mocha.reporters);- }+ }, };@@ -67,3 +68,3 @@ exports.ONE_AND_DONE_ARGS = new Set(- ['help', 'h', 'version', 'V'].concat(Object.keys(exports.ONE_AND_DONES))+ ["help", "h", "version", "V"].concat(Object.keys(exports.ONE_AND_DONES)), );
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -16,12 +16,12 @@ -const fs = require('node:fs');-const path = require('node:path');-const pc = require('picocolors');-const debug = require('debug')('mocha:cli:run:helpers');-const {watchRun, watchParallelRun} = require('./watch-run');-const collectFiles = require('./collect-files');-const {format} = require('node:util');-const {createInvalidLegacyPluginError} = require('../errors');-const {requireOrImport} = require('../nodejs/esm-utils');-const PluginLoader = require('../plugin-loader');+const fs = require("node:fs");+const path = require("node:path");+const pc = require("picocolors");+const debug = require("debug")("mocha:cli:run:helpers");+const { watchRun, watchParallelRun } = require("./watch-run");+const collectFiles = require("./collect-files");+const { format } = require("node:util");+const { createInvalidLegacyPluginError } = require("../errors");+const { requireOrImport } = require("../nodejs/esm-utils");+const PluginLoader = require("../plugin-loader"); @@ -33,5 +33,8 @@ */-const exitMochaLater = clampedCode => {- process.on('exit', () => {- process.exitCode = Math.min(clampedCode, process.argv.includes('--posix-exit-codes') ? 1 : 255);+const exitMochaLater = (clampedCode) => {+ process.on("exit", () => {+ process.exitCode = Math.min(+ clampedCode,+ process.argv.includes("--posix-exit-codes") ? 1 : 255,+ ); });@@ -46,4 +49,4 @@ */-const exitMocha = clampedCode => {- const usePosixExitCodes = process.argv.includes('--posix-exit-codes');+const exitMocha = (clampedCode) => {+ const usePosixExitCodes = process.argv.includes("--posix-exit-codes"); clampedCode = Math.min(clampedCode, usePosixExitCodes ? 1 : 255);@@ -66,6 +69,6 @@ - streams.forEach(stream => {+ streams.forEach((stream) => { // submit empty write request and wait for completion draining += 1;- stream.write('', done);+ stream.write("", done); });@@ -82,4 +85,4 @@ */-exports.list = str =>- Array.isArray(str) ? exports.list(str.join(',')) : str.split(/ *, */);+exports.list = (str) =>+ Array.isArray(str) ? exports.list(str.join(",")) : str.split(/ *, */); @@ -93,4 +96,7 @@ */-exports.handleRequires = async (requires = [], {ignoredPlugins = []} = {}) => {- const pluginLoader = PluginLoader.create({ignore: ignoredPlugins});+exports.handleRequires = async (+ requires = [],+ { ignoredPlugins = [] } = {},+) => {+ const pluginLoader = PluginLoader.create({ ignore: ignoredPlugins }); for await (const mod of requires) {@@ -100,8 +106,8 @@ modpath = path.resolve(mod);- debug('resolved required file %s to %s', mod, modpath);+ debug("resolved required file %s to %s", mod, modpath); } const requiredModule = await requireOrImport(modpath);- if (requiredModule && typeof requiredModule === 'object') {+ if (requiredModule && typeof requiredModule === "object") { if (pluginLoader.load(requiredModule)) {- debug('found one or more plugin implementations in %s', modpath);+ debug("found one or more plugin implementations in %s", modpath); }@@ -112,3 +118,3 @@ if (Object.keys(plugins).length) {- debug('finalized plugin implementations: %O', plugins);+ debug("finalized plugin implementations: %O", plugins); }@@ -129,7 +135,7 @@ - unmatchedFiles.forEach(({pattern, absolutePath}) => {+ unmatchedFiles.forEach(({ pattern, absolutePath }) => { console.error( pc.yellow(- `Warning: Cannot find any files matching pattern "${pattern}" at the absolute path "${absolutePath}"`- )+ `Warning: Cannot find any files matching pattern "${pattern}" at the absolute path "${absolutePath}"`,+ ), );@@ -137,3 +143,3 @@ console.log(- 'No test file(s) found with the given pattern, exiting with code 1'+ "No test file(s) found with the given pattern, exiting with code 1", );@@ -154,4 +160,4 @@ mocha,- {exit, passOnFailingTestSuite},- fileCollectParams+ { exit, passOnFailingTestSuite },+ fileCollectParams, ) => {@@ -163,3 +169,3 @@ - debug('single run with %d file(s)', fileCollectionObj.files.length);+ debug("single run with %d file(s)", fileCollectionObj.files.length); mocha.files = fileCollectionObj.files;@@ -168,5 +174,3 @@ await mocha.loadFilesAsync();- return mocha.run(- createExitHandler({exit, passOnFailingTestSuite})- );+ return mocha.run(createExitHandler({ exit, passOnFailingTestSuite })); };@@ -194,4 +198,4 @@ debug(- 'executing %d test file(s) in parallel mode',- fileCollectionObj.files.length+ "executing %d test file(s) in parallel mode",+ fileCollectionObj.files.length, );@@ -200,5 +204,3 @@ // note that we DO NOT load any files here; this is handled by the worker- return mocha.run(- createExitHandler(options)- );+ return mocha.run(createExitHandler(options)); };@@ -225,3 +227,3 @@ sort = false,- spec = []+ spec = [], } = options;@@ -234,3 +236,3 @@ sort,- spec+ spec, };@@ -269,3 +271,3 @@ `"--${pluginType}" can only be specified once`,- pluginType+ pluginType, );@@ -273,3 +275,3 @@ - const createUnknownError = err =>+ const createUnknownError = (err) => createInvalidLegacyPluginError(@@ -277,3 +279,3 @@ pluginType,- pluginId+ pluginId, );@@ -300,10 +302,6 @@ const createExitHandler = ({ exit, passOnFailingTestSuite }) => {- return code => {- const clampedCode = passOnFailingTestSuite- ? 0- : Math.min(code, 255);-- return exit- ? exitMocha(clampedCode)- : exitMochaLater(clampedCode);+ return (code) => {+ const clampedCode = passOnFailingTestSuite ? 0 : Math.min(code, 255);++ return exit ? exitMocha(clampedCode) : exitMochaLater(clampedCode); };
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -16,50 +16,50 @@ array: [- 'extension',- 'file',- 'global',- 'ignore',- 'node-option',- 'reporter-option',- 'require',- 'spec',- 'watch-files',- 'watch-ignore'+ "extension",+ "file",+ "global",+ "ignore",+ "node-option",+ "reporter-option",+ "require",+ "spec",+ "watch-files",+ "watch-ignore", ], boolean: [- 'allow-uncaught',- 'async-only',- 'bail',- 'check-leaks',- 'color',- 'delay',- 'diff',- 'dry-run',- 'exit',- 'pass-on-failing-test-suite',- 'fail-zero',- 'forbid-only',- 'forbid-pending',- 'full-trace',- 'inline-diffs',- 'invert',- 'list-interfaces',- 'list-reporters',- 'no-colors',- 'parallel',- 'posix-exit-codes',- 'recursive',- 'sort',- 'watch'+ "allow-uncaught",+ "async-only",+ "bail",+ "check-leaks",+ "color",+ "delay",+ "diff",+ "dry-run",+ "exit",+ "pass-on-failing-test-suite",+ "fail-zero",+ "forbid-only",+ "forbid-pending",+ "full-trace",+ "inline-diffs",+ "invert",+ "list-interfaces",+ "list-reporters",+ "no-colors",+ "parallel",+ "posix-exit-codes",+ "recursive",+ "sort",+ "watch", ],- number: ['retries', 'jobs'],+ number: ["retries", "jobs"], string: [- 'config',- 'fgrep',- 'grep',- 'package',- 'reporter',- 'ui',- 'slow',- 'timeout'- ]+ "config",+ "fgrep",+ "grep",+ "package",+ "reporter",+ "ui",+ "slow",+ "timeout",+ ], });@@ -73,22 +73,22 @@ exports.aliases = {- 'async-only': ['A'],- bail: ['b'],- color: ['c', 'colors'],- fgrep: ['f'],- global: ['globals'],- grep: ['g'],- ignore: ['exclude'],- invert: ['i'],- jobs: ['j'],- 'no-colors': ['C'],- 'node-option': ['n'],- parallel: ['p'],- reporter: ['R'],- 'reporter-option': ['reporter-options', 'O'],- require: ['r'],- slow: ['s'],- sort: ['S'],- timeout: ['t', 'timeouts'],- ui: ['u'],- watch: ['w']+ "async-only": ["A"],+ bail: ["b"],+ color: ["c", "colors"],+ fgrep: ["f"],+ global: ["globals"],+ grep: ["g"],+ ignore: ["exclude"],+ invert: ["i"],+ jobs: ["j"],+ "no-colors": ["C"],+ "node-option": ["n"],+ parallel: ["p"],+ reporter: ["R"],+ "reporter-option": ["reporter-options", "O"],+ require: ["r"],+ slow: ["s"],+ sort: ["S"],+ timeout: ["t", "timeouts"],+ ui: ["u"],+ watch: ["w"], };@@ -98,6 +98,6 @@ // then adds aliases of each flag (if any)- TYPES[key].forEach(flag => {+ TYPES[key].forEach((flag) => { acc.add(flag); const aliases = exports.aliases[flag] || [];- aliases.forEach(alias => {+ aliases.forEach((alias) => { acc.add(alias);@@ -114,4 +114,4 @@ */-exports.isMochaFlag = flag => {- return ALL_MOCHA_FLAGS.has(flag.replace(/^--?/, ''));+exports.isMochaFlag = (flag) => {+ return ALL_MOCHA_FLAGS.has(flag.replace(/^--?/, "")); };@@ -124,4 +124,4 @@ */-exports.expectedTypeForFlag = flag => {- const normalizedName = flag.replace(/^--?/, '');+exports.expectedTypeForFlag = (flag) => {+ const normalizedName = flag.replace(/^--?/, ""); @@ -130,8 +130,8 @@ const fullFlagName =- Object.keys(aliases).find(flagName =>- aliases[flagName].includes(normalizedName)+ Object.keys(aliases).find((flagName) =>+ aliases[flagName].includes(normalizedName), ) || normalizedName; - return Object.keys(TYPES).find(flagType =>- TYPES[flagType].includes(fullFlagName)+ return Object.keys(TYPES).find((flagType) =>+ TYPES[flagType].includes(fullFlagName), );
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,5 +9,5 @@ -const symbols = require('log-symbols');-const pc = require('picocolors');-const Mocha = require('../mocha');+const symbols = require("log-symbols");+const pc = require("picocolors");+const Mocha = require("../mocha"); const {@@ -15,4 +15,4 @@ createInvalidArgumentValueError,- createMissingArgumentError-} = require('../errors');+ createMissingArgumentError,+} = require("../errors"); @@ -22,8 +22,8 @@ validateLegacyPlugin,- runMocha-} = require('./run-helpers');-const {ONE_AND_DONES, ONE_AND_DONE_ARGS} = require('./one-and-dones');-const debug = require('debug')('mocha:cli:run');-const defaults = require('../mocharc.json');-const {types, aliases} = require('./run-option-metadata');+ runMocha,+} = require("./run-helpers");+const { ONE_AND_DONES, ONE_AND_DONE_ARGS } = require("./one-and-dones");+const debug = require("debug")("mocha:cli:run");+const defaults = require("../mocharc.json");+const { types, aliases } = require("./run-option-metadata"); @@ -34,25 +34,25 @@ const GROUPS = {- FILES: 'File Handling',- FILTERS: 'Test Filters',- NODEJS: 'Node.js & V8',- OUTPUT: 'Reporting & Output',- RULES: 'Rules & Behavior',- CONFIG: 'Configuration'+ FILES: "File Handling",+ FILTERS: "Test Filters",+ NODEJS: "Node.js & V8",+ OUTPUT: "Reporting & Output",+ RULES: "Rules & Behavior",+ CONFIG: "Configuration", }; -exports.command = ['$0 [spec..]', 'inspect'];--exports.describe = 'Run tests with Mocha';--exports.builder = yargs =>+exports.command = ["$0 [spec..]", "inspect"];++exports.describe = "Run tests with Mocha";++exports.builder = (yargs) => yargs .options({- 'allow-uncaught': {- description: 'Allow uncaught errors to propagate',- group: GROUPS.RULES- },- 'async-only': {- description:- 'Require all tests to use a callback (async) or return a Promise',- group: GROUPS.RULES+ "allow-uncaught": {+ description: "Allow uncaught errors to propagate",+ group: GROUPS.RULES,+ },+ "async-only": {+ description:+ "Require all tests to use a callback (async) or return a Promise",+ group: GROUPS.RULES, },@@ -60,11 +60,11 @@ description: 'Abort ("bail") after first test failure',- group: GROUPS.RULES- },- 'check-leaks': {- description: 'Check for global variable leaks',- group: GROUPS.RULES+ group: GROUPS.RULES,+ },+ "check-leaks": {+ description: "Check for global variable leaks",+ group: GROUPS.RULES, }, color: {- description: 'Force-enable color output',- group: GROUPS.OUTPUT+ description: "Force-enable color output",+ group: GROUPS.OUTPUT, },@@ -72,9 +72,9 @@ config: true,- defaultDescription: '(nearest rc file)',- description: 'Path to config file',- group: GROUPS.CONFIG+ defaultDescription: "(nearest rc file)",+ description: "Path to config file",+ group: GROUPS.CONFIG, }, delay: {- description: 'Delay initial execution of root suite',- group: GROUPS.RULES+ description: "Delay initial execution of root suite",+ group: GROUPS.RULES, },@@ -82,12 +82,12 @@ default: true,- description: 'Show diff on failure',- group: GROUPS.OUTPUT- },- 'dry-run': {- description: 'Report tests without executing them',- group: GROUPS.RULES+ description: "Show diff on failure",+ group: GROUPS.OUTPUT,+ },+ "dry-run": {+ description: "Report tests without executing them",+ group: GROUPS.RULES, }, exit: {- description: 'Force Mocha to quit after tests complete',- group: GROUPS.RULES+ description: "Force Mocha to quit after tests complete",+ group: GROUPS.RULES, },@@ -95,41 +95,41 @@ default: defaults.extension,- description: 'File extension(s) to load',- group: GROUPS.FILES,- requiresArg: true,- coerce: list- },- 'pass-on-failing-test-suite': {+ description: "File extension(s) to load",+ group: GROUPS.FILES,+ requiresArg: true,+ coerce: list,+ },+ "pass-on-failing-test-suite": { default: false,- description: 'Not fail test run if tests were failed',- group: GROUPS.RULES- },- 'fail-zero': {- description: 'Fail test run if no test(s) encountered',- group: GROUPS.RULES+ description: "Not fail test run if tests were failed",+ group: GROUPS.RULES,+ },+ "fail-zero": {+ description: "Fail test run if no test(s) encountered",+ group: GROUPS.RULES, }, fgrep: {- conflicts: 'grep',- description: 'Only run tests containing this string',+ conflicts: "grep",+ description: "Only run tests containing this string", group: GROUPS.FILTERS,- requiresArg: true+ requiresArg: true, }, file: {- defaultDescription: '(none)',- description:- 'Specify file(s) to be loaded prior to root suite execution',+ defaultDescription: "(none)",+ description:+ "Specify file(s) to be loaded prior to root suite execution", group: GROUPS.FILES, normalize: true,- requiresArg: true- },- 'forbid-only': {- description: 'Fail if exclusive test(s) encountered',- group: GROUPS.RULES- },- 'forbid-pending': {- description: 'Fail if pending test(s) encountered',- group: GROUPS.RULES- },- 'full-trace': {- description: 'Display full stack traces',- group: GROUPS.OUTPUT+ requiresArg: true,+ },+ "forbid-only": {+ description: "Fail if exclusive test(s) encountered",+ group: GROUPS.RULES,+ },+ "forbid-pending": {+ description: "Fail if pending test(s) encountered",+ group: GROUPS.RULES,+ },+ "full-trace": {+ description: "Display full stack traces",+ group: GROUPS.OUTPUT, },@@ -137,27 +137,27 @@ coerce: list,- description: 'List of allowed global variables',- group: GROUPS.RULES,- requiresArg: true+ description: "List of allowed global variables",+ group: GROUPS.RULES,+ requiresArg: true, }, grep: {- coerce: value => (!value ? null : value),- conflicts: 'fgrep',- description: 'Only run tests matching this string or regexp',+ coerce: (value) => (!value ? null : value),+ conflicts: "fgrep",+ description: "Only run tests matching this string or regexp", group: GROUPS.FILTERS,- requiresArg: true+ requiresArg: true, }, ignore: {- defaultDescription: '(none)',- description: 'Ignore file(s) or glob pattern(s)',- group: GROUPS.FILES,- requiresArg: true- },- 'inline-diffs': {- description:- 'Display actual/expected differences inline within each string',- group: GROUPS.OUTPUT+ defaultDescription: "(none)",+ description: "Ignore file(s) or glob pattern(s)",+ group: GROUPS.FILES,+ requiresArg: true,+ },+ "inline-diffs": {+ description:+ "Display actual/expected differences inline within each string",+ group: GROUPS.OUTPUT, },
… 296 more lines (truncated)
--- +++ @@ -1,12 +1,12 @@-'use strict';--const logSymbols = require('log-symbols');-const debug = require('debug')('mocha:cli:watch');-const path = require('node:path');-const chokidar = require('chokidar');-const glob = require('glob');-const isPathInside = require('is-path-inside');-const {minimatch} = require('minimatch');-const Context = require('../context');-const collectFiles = require('./collect-files');+"use strict";++const logSymbols = require("log-symbols");+const debug = require("debug")("mocha:cli:watch");+const path = require("node:path");+const chokidar = require("chokidar");+const glob = require("glob");+const isPathInside = require("is-path-inside");+const { minimatch } = require("minimatch");+const Context = require("../context");+const collectFiles = require("./collect-files"); @@ -48,6 +48,6 @@ mocha,- {watchFiles, watchIgnore},- fileCollectParams+ { watchFiles, watchIgnore },+ fileCollectParams, ) => {- debug('creating parallel watcher');+ debug("creating parallel watcher"); @@ -56,3 +56,3 @@ watchIgnore,- beforeRun({mocha}) {+ beforeRun({ mocha }) { // I don't know why we're cloning the root suite.@@ -66,3 +66,3 @@ // test depends on this module.- const Mocha = require('../mocha');+ const Mocha = require("../mocha"); @@ -92,3 +92,3 @@ },- fileCollectParams+ fileCollectParams, });@@ -110,4 +110,4 @@ */-exports.watchRun = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => {- debug('creating serial watcher');+exports.watchRun = (mocha, { watchFiles, watchIgnore }, fileCollectParams) => {+ debug("creating serial watcher"); @@ -116,3 +116,3 @@ watchIgnore,- beforeRun({mocha}) {+ beforeRun({ mocha }) { mocha.unloadFiles();@@ -128,3 +128,3 @@ // test depends on this module.- const Mocha = require('../mocha');+ const Mocha = require("../mocha"); @@ -151,3 +151,3 @@ },- fileCollectParams+ fileCollectParams, });@@ -165,3 +165,3 @@ function createPathFilter(globPaths, basePath) {- debug('creating path filter from glob paths: %s', globPaths);+ debug("creating path filter from glob paths: %s", globPaths); @@ -172,4 +172,4 @@ const res = {- dir: {paths: new Set(), globs: new Set()},- match: {paths: new Set(), globs: new Set()}+ dir: { paths: new Set(), globs: new Set() },+ match: { paths: new Set(), globs: new Set() }, };@@ -177,3 +177,3 @@ // for checking if a path ends with `/**/*`- const globEnd = path.join(path.sep, '**', '*');+ const globEnd = path.join(path.sep, "**", "*"); @@ -183,3 +183,3 @@ */- const patterns = globPaths.flatMap(globPath => {+ const patterns = globPaths.flatMap((globPath) => { return new glob.Glob(globPath, {@@ -187,3 +187,3 @@ magicalBraces: true,- windowsPathsNoEscape: true+ windowsPathsNoEscape: true, }).patterns;@@ -193,3 +193,3 @@ for (const pattern of patterns) {- debug('processing glob pattern: %s', pattern.globString());+ debug("processing glob pattern: %s", pattern.globString()); @@ -211,7 +211,7 @@ const entry = currentPattern.pattern();- const isString = typeof entry === 'string';+ const isString = typeof entry === "string"; debug(- 'found %s pattern: %s',- isString ? 'string' : 'glob or regexp',- entry+ "found %s pattern: %s",+ isString ? "string" : "glob or regexp",+ entry, );@@ -228,3 +228,3 @@ if (!isGlob) {- debug('all subpatterns of %j processed', pattern.globString());+ debug("all subpatterns of %j processed", pattern.globString()); }@@ -233,5 +233,5 @@ const cleanPath = path.resolve(basePath, ...segments);- debug('clean path: %s', cleanPath);+ debug("clean path: %s", cleanPath); res.dir.paths.add(cleanPath);- res.dir.globs.add(path.resolve(cleanPath, '**', '*'));+ res.dir.globs.add(path.resolve(cleanPath, "**", "*")); @@ -239,3 +239,3 @@ const absPath = path.resolve(basePath, pattern.globString());- debug('absolute path: %s', absPath);+ debug("absolute path: %s", absPath); (isGlob ? res.match.globs : res.match.paths).add(absPath);@@ -245,3 +245,3 @@ if (!absPath.endsWith(globEnd)) {- res.match.globs.add(path.resolve(absPath, '**', '*'));+ res.match.globs.add(path.resolve(absPath, "**", "*")); }@@ -249,3 +249,3 @@ - debug('returning path filter: %o', res);+ debug("returning path filter: %o", res); return res;@@ -278,3 +278,3 @@ if (- minimatch(filePath, globPath, {dot: true, windowsPathsNoEscape: true})+ minimatch(filePath, globPath, { dot: true, windowsPathsNoEscape: true }) ) {@@ -298,5 +298,5 @@ debug(- 'creating path matcher from allowed: %o, ignored: %o',+ "creating path matcher from allowed: %o, ignored: %o", allowed,- ignored+ ignored, );@@ -381,3 +381,3 @@ return ignore;- }+ }, };@@ -406,10 +406,10 @@ mocha,- {watchFiles, watchIgnore, beforeRun, fileCollectParams}+ { watchFiles, watchIgnore, beforeRun, fileCollectParams }, ) => { if (!watchFiles) {- watchFiles = fileCollectParams.extension.map(ext => `**/*.${ext}`);+ watchFiles = fileCollectParams.extension.map((ext) => `**/*.${ext}`); } - debug('watching files: %s', watchFiles);- debug('ignoring files matching: %s', watchIgnore);+ debug("watching files: %s", watchFiles);+ debug("ignoring files matching: %s", watchIgnore); let globalFixtureContext;@@ -433,3 +433,3 @@ ignoreInitial: true,- ignored: matcher.ignore+ ignored: matcher.ignore, });@@ -437,9 +437,9 @@ const rerunner = createRerunner(mocha, watcher, {- beforeRun- });-- watcher.on('ready', async () => {- debug('watcher ready');+ beforeRun,+ });++ watcher.on("ready", async () => {+ debug("watcher ready"); if (!globalFixtureContext) {- debug('triggering global setup');+ debug("triggering global setup"); globalFixtureContext = await mocha.runGlobalSetup();@@ -449,3 +449,3 @@ - watcher.on('all', (_event, filePath) => {+ watcher.on("all", (_event, filePath) => { // only allow file paths that match the allowed patterns@@ -457,3 +457,3 @@ hideCursor();- process.on('exit', () => {+ process.on("exit", () => { showCursor();@@ -470,5 +470,5 @@ if (process.connected) {- process.on('message', msg => {- if (msg === 'SIGINT') {- process.emit('SIGINT');+ process.on("message", (msg) => {+ if (msg === "SIGINT") {+ process.emit("SIGINT"); }@@ -478,3 +478,3 @@ let exiting = false;- process.on('SIGINT', async () => {+ process.on("SIGINT", async () => { showCursor();@@ -484,3 +484,3 @@ if (mocha.hasGlobalTeardownFixtures()) {- debug('running global teardown');+ debug("running global teardown"); try {@@ -497,6 +497,6 @@ process.stdin.resume();- process.stdin.setEncoding('utf8');- process.stdin.on('data', data => {+ process.stdin.setEncoding("utf8");+ process.stdin.on("data", (data) => { const str = data.toString().trim().toLowerCase();- if (str === 'rs') rerunner.scheduleRun();+ if (str === "rs") rerunner.scheduleRun(); });@@ -517,3 +517,3 @@ */-const createRerunner = (mocha, watcher, {beforeRun} = {}) => {+const createRerunner = (mocha, watcher, { beforeRun } = {}) => { // Set to a `Runner` when mocha is running. Set to `null` when mocha is not@@ -527,5 +527,5 @@ try {- mocha = beforeRun ? beforeRun({mocha, watcher}) || mocha : mocha;+ mocha = beforeRun ? beforeRun({ mocha, watcher }) || mocha : mocha; runner = mocha.run(() => {- debug('finished watch run');+ debug("finished watch run");
… 47 more lines (truncated)
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict";
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -14,3 +14,3 @@ */- FATAL: 'ERR_MOCHA_FATAL',+ FATAL: "ERR_MOCHA_FATAL", @@ -21,3 +21,3 @@ */- INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE',+ INVALID_ARG_TYPE: "ERR_MOCHA_INVALID_ARG_TYPE", @@ -28,3 +28,3 @@ */- INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE',+ INVALID_ARG_VALUE: "ERR_MOCHA_INVALID_ARG_VALUE", @@ -35,3 +35,3 @@ */- INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION',+ INVALID_EXCEPTION: "ERR_MOCHA_INVALID_EXCEPTION", @@ -42,3 +42,3 @@ */- INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE',+ INVALID_INTERFACE: "ERR_MOCHA_INVALID_INTERFACE", @@ -49,3 +49,3 @@ */- INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER',+ INVALID_REPORTER: "ERR_MOCHA_INVALID_REPORTER", @@ -56,3 +56,3 @@ */- MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE',+ MULTIPLE_DONE: "ERR_MOCHA_MULTIPLE_DONE", @@ -63,3 +63,3 @@ */- NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN',+ NO_FILES_MATCH_PATTERN: "ERR_MOCHA_NO_FILES_MATCH_PATTERN", @@ -70,3 +70,3 @@ */- UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED',+ UNSUPPORTED: "ERR_MOCHA_UNSUPPORTED", @@ -77,3 +77,3 @@ */- INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING',+ INSTANCE_ALREADY_RUNNING: "ERR_MOCHA_INSTANCE_ALREADY_RUNNING", @@ -84,3 +84,3 @@ */- INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED',+ INSTANCE_ALREADY_DISPOSED: "ERR_MOCHA_INSTANCE_ALREADY_DISPOSED", @@ -91,3 +91,3 @@ */- FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY',+ FORBIDDEN_EXCLUSIVITY: "ERR_MOCHA_FORBIDDEN_EXCLUSIVITY", @@ -98,3 +98,3 @@ */- INVALID_PLUGIN_IMPLEMENTATION: 'ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION',+ INVALID_PLUGIN_IMPLEMENTATION: "ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION", @@ -105,3 +105,3 @@ */- INVALID_PLUGIN_DEFINITION: 'ERR_MOCHA_INVALID_PLUGIN_DEFINITION',+ INVALID_PLUGIN_DEFINITION: "ERR_MOCHA_INVALID_PLUGIN_DEFINITION", @@ -112,3 +112,3 @@ */- TIMEOUT: 'ERR_MOCHA_TIMEOUT',+ TIMEOUT: "ERR_MOCHA_TIMEOUT", @@ -119,3 +119,3 @@ */- UNPARSABLE_FILE: 'ERR_MOCHA_UNPARSABLE_FILE'+ UNPARSABLE_FILE: "ERR_MOCHA_UNPARSABLE_FILE", };
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,4 +9,4 @@ -const {format} = require('node:util');-const { constants } = require('./error-constants.js');+const { format } = require("node:util");+const { constants } = require("./error-constants.js"); @@ -29,3 +29,3 @@ process.nextTick(function () {- console.warn(type + ': ' + msg);+ console.warn(type + ": " + msg); });@@ -41,3 +41,3 @@ */-const deprecate = msg => {+const deprecate = (msg) => { msg = String(msg);@@ -45,3 +45,3 @@ deprecate.cache[msg] = true;- emitWarning(msg, 'DeprecationWarning');+ emitWarning(msg, "DeprecationWarning"); }@@ -57,3 +57,3 @@ */-const warn = msg => {+const warn = (msg) => { if (msg) {@@ -179,3 +179,3 @@ err.value = value;- err.reason = typeof reason !== 'undefined' ? reason : 'is invalid';+ err.reason = typeof reason !== "undefined" ? reason : "is invalid"; return err;@@ -227,5 +227,5 @@ switch (pluginType) {- case 'reporter':+ case "reporter": return createInvalidReporterError(message, pluginId);- case 'ui':+ case "ui": return createInvalidInterfaceError(message, pluginId);@@ -248,3 +248,3 @@ function createInvalidPluginError(...args) {- deprecate('Use createInvalidLegacyPluginError() instead');+ deprecate("Use createInvalidLegacyPluginError() instead"); return createInvalidLegacyPluginError(...args);@@ -262,3 +262,3 @@ cleanReferencesAfterRun,- instance+ instance, ) {@@ -296,19 +296,19 @@ try {- title = format('<%s>', runnable.fullTitle());+ title = format("<%s>", runnable.fullTitle()); if (runnable.parent.root) {- title += ' (of root suite)';+ title += " (of root suite)"; } } catch (ignored) {- title = format('<%s> (of unknown suite)', runnable.title);+ title = format("<%s> (of unknown suite)", runnable.title); } var message = format(- 'done() called multiple times in %s %s',- runnable.type ? runnable.type : 'unknown runnable',- title+ "done() called multiple times in %s %s",+ runnable.type ? runnable.type : "unknown runnable",+ title, ); if (runnable.file) {- message += format(' of file %s', runnable.file);+ message += format(" of file %s", runnable.file); } if (originalErr) {- message += format('; in addition, done() received error: %s', originalErr);+ message += format("; in addition, done() received error: %s", originalErr); }@@ -333,4 +333,4 @@ mocha.isWorker- ? '`.only` is not supported in parallel mode'- : '`.only` forbidden by --forbid-only'+ ? "`.only` is not supported in parallel mode"+ : "`.only` forbidden by --forbid-only", );@@ -367,3 +367,3 @@ msg,- {pluginDef, pluginImpl} = {}+ { pluginDef, pluginImpl } = {}, ) {@@ -413,4 +413,4 @@ */-const isMochaError = err =>- Boolean(err && typeof err === 'object' && MOCHA_ERRORS.has(err.code));+const isMochaError = (err) =>+ Boolean(err && typeof err === "object" && MOCHA_ERRORS.has(err.code)); @@ -438,3 +438,3 @@ isMochaError,- warn+ warn, };
--- +++ @@ -1,6 +1,6 @@-'use strict';+"use strict"; -var Runnable = require('./runnable');-const {inherits, constants} = require('./utils');-const {MOCHA_ID_PROP_NAME} = constants;+var Runnable = require("./runnable");+const { inherits, constants } = require("./utils");+const { MOCHA_ID_PROP_NAME } = constants; @@ -22,3 +22,3 @@ Runnable.call(this, title, fn);- this.type = 'hook';+ this.type = "hook"; }@@ -73,4 +73,4 @@ title: this.ctx.currentTest.title,- [MOCHA_ID_PROP_NAME]: this.ctx.currentTest.id- }+ [MOCHA_ID_PROP_NAME]: this.ctx.currentTest.id,+ }, }@@ -81,3 +81,3 @@ $$fullTitle: this.parent.fullTitle(),- [MOCHA_ID_PROP_NAME]: this.parent.id+ [MOCHA_ID_PROP_NAME]: this.parent.id, },@@ -86,3 +86,3 @@ type: this.type,- [MOCHA_ID_PROP_NAME]: this.id+ [MOCHA_ID_PROP_NAME]: this.id, };
rc npm DELETION ×3BURST ×3
1.2.0
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.2.8
1.2.9
1.3.9
2.3.9
DELETION
1.2.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
DELETION
1.3.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
DELETION
2.3.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
BURST
2 releases in 1m: 0.1.2, 0.1.3
info · registry-verified · 2013-04-27 · 13y ago
BURST
2 releases in 1m: 1.1.3, 1.1.4
info · registry-verified · 2015-11-05 · 10y ago
BURST
3 releases in 0m: 1.2.9, 1.3.9, 2.3.9
info · registry-verified · 2021-11-04 · 4y ago
release diff 1.2.7 → 1.2.8
+0 added · -0 removed · ~1 modified
--- +++ @@ -2,3 +2,3 @@ "name": "rc",- "version": "1.2.7",+ "version": "1.2.8", "description": "hardwired configuration loader",@@ -23,3 +23,3 @@ "dependencies": {- "deep-extend": "^0.5.1",+ "deep-extend": "^0.6.0", "ini": "~1.3.0",
rimraf npm DELETIONBURST ×7
5.0.5
5.0.6
5.0.7
5.0.8
5.0.9
6.0.0
6.0.1
5.0.10
6.1.0
6.1.1
6.1.2
6.1.3
DELETION
2.2.7 published then removed
high · registry-verified · 2014-05-05 · 12y ago
BURST
2 releases in 11m: 1.0.5, 1.0.6
info · registry-verified · 2011-09-03 · 14y ago
BURST
2 releases in 4m: 2.2.3, 2.2.4
info · registry-verified · 2013-11-29 · 12y ago
BURST
2 releases in 24m: 4.0.0, 4.0.1
info · registry-verified · 2023-01-13 · 3y ago
BURST
3 releases in 9m: 4.0.2, 4.0.3, 4.0.4
info · registry-verified · 2023-01-13 · 3y ago
BURST
2 releases in 10m: 5.0.3, 5.0.4
info · registry-verified · 2023-09-25 · 2y ago
BURST
2 releases in 2m: 5.0.9, 6.0.0
info · registry-verified · 2024-07-08 · 2y ago
BURST
2 releases in 24m: 6.1.1, 6.1.2
info · registry-verified · 2025-11-19 · 7mo ago
release diff 6.1.2 → 6.1.3
+0 added · -0 removed · ~45 modified
--- +++ @@ -1,2 +1,3 @@ import fs, { Dirent } from 'fs';+import fsPromises from 'fs/promises'; export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs';@@ -4,11 +5,11 @@ export declare const promises: {- chmod: typeof fs.promises.chmod;- mkdir: typeof fs.promises.mkdir;+ chmod: typeof fsPromises.chmod;+ mkdir: typeof fsPromises.mkdir; readdir: (path: fs.PathLike) => Promise<fs.Dirent<string>[]>;- rename: typeof fs.promises.rename;- rm: typeof fs.promises.rm;- rmdir: typeof fs.promises.rmdir;- stat: typeof fs.promises.stat;- lstat: typeof fs.promises.lstat;- unlink: typeof fs.promises.unlink;+ rename: typeof fsPromises.rename;+ rm: typeof fsPromises.rm;+ rmdir: typeof fsPromises.rmdir;+ stat: typeof fsPromises.stat;+ lstat: typeof fsPromises.lstat;+ unlink: typeof fsPromises.unlink; };
--- +++ @@ -45,7 +45,13 @@ exports.nativeSync = wrapSync(rimraf_native_js_1.rimrafNativeSync);-exports.native = Object.assign(wrap(rimraf_native_js_1.rimrafNative), { sync: exports.nativeSync });+exports.native = Object.assign(wrap(rimraf_native_js_1.rimrafNative), {+ sync: exports.nativeSync,+}); exports.manualSync = wrapSync(rimraf_manual_js_1.rimrafManualSync);-exports.manual = Object.assign(wrap(rimraf_manual_js_1.rimrafManual), { sync: exports.manualSync });+exports.manual = Object.assign(wrap(rimraf_manual_js_1.rimrafManual), {+ sync: exports.manualSync,+}); exports.windowsSync = wrapSync(rimraf_windows_js_1.rimrafWindowsSync);-exports.windows = Object.assign(wrap(rimraf_windows_js_1.rimrafWindows), { sync: exports.windowsSync });+exports.windows = Object.assign(wrap(rimraf_windows_js_1.rimrafWindows), {+ sync: exports.windowsSync,+}); exports.posixSync = wrapSync(rimraf_posix_js_1.rimrafPosixSync);
--- +++ @@ -12,3 +12,4 @@ typeOrUndef(o.maxBackoff, 'number') &&- (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&+ (typeOrUndef(o.glob, 'boolean') ||+ (o.glob && typeof o.glob === 'object')) && typeOrUndef(o.filter, 'function');
--- +++ @@ -11,3 +11,4 @@ : `type ${type} ${path}`;- const msg = 'The "path" argument must be of type string. ' + `Received ${received}`;+ const msg = 'The "path" argument must be of type string. ' ++ `Received ${received}`; throw Object.assign(new TypeError(msg), {
--- +++ @@ -1,3 +1,3 @@-export declare const readdirOrError: (path: string) => Promise<import("fs").Dirent<string>[] | Error>;-export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent<string>[] | Error;+export declare const readdirOrError: (path: string) => Promise<import("node:fs").Dirent<string>[] | Error>;+export declare const readdirOrErrorSync: (path: string) => import("node:fs").Dirent<string>[] | Error; //# sourceMappingURL=readdir-or-error.d.ts.map
--- +++ @@ -21,4 +21,3 @@ opt?.signal?.throwIfAborted();- return ((0, ignore_enoent_js_1.ignoreENOENTSync)(() => rimrafPosixDirSync(path, opt, (0, fs_js_1.lstatSync)(path))) ??- true);+ return ((0, ignore_enoent_js_1.ignoreENOENTSync)(() => rimrafPosixDirSync(path, opt, (0, fs_js_1.lstatSync)(path))) ?? true); };
--- +++ @@ -1,2 +1,3 @@ import fs, { Dirent } from 'fs';+import fsPromises from 'fs/promises'; export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs';@@ -4,11 +5,11 @@ export declare const promises: {- chmod: typeof fs.promises.chmod;- mkdir: typeof fs.promises.mkdir;+ chmod: typeof fsPromises.chmod;+ mkdir: typeof fsPromises.mkdir; readdir: (path: fs.PathLike) => Promise<fs.Dirent<string>[]>;- rename: typeof fs.promises.rename;- rm: typeof fs.promises.rm;- rmdir: typeof fs.promises.rmdir;- stat: typeof fs.promises.stat;- lstat: typeof fs.promises.lstat;- unlink: typeof fs.promises.unlink;+ rename: typeof fsPromises.rename;+ rm: typeof fsPromises.rm;+ rmdir: typeof fsPromises.rmdir;+ stat: typeof fsPromises.stat;+ lstat: typeof fsPromises.lstat;+ unlink: typeof fsPromises.unlink; };
--- +++ @@ -4,3 +4,3 @@ import { rimrafManual, rimrafManualSync } from './rimraf-manual.js';-import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js';+import { rimrafMoveRemove, rimrafMoveRemoveSync, } from './rimraf-move-remove.js'; import { rimrafNative, rimrafNativeSync } from './rimraf-native.js';@@ -37,7 +37,13 @@ export const nativeSync = wrapSync(rimrafNativeSync);-export const native = Object.assign(wrap(rimrafNative), { sync: nativeSync });+export const native = Object.assign(wrap(rimrafNative), {+ sync: nativeSync,+}); export const manualSync = wrapSync(rimrafManualSync);-export const manual = Object.assign(wrap(rimrafManual), { sync: manualSync });+export const manual = Object.assign(wrap(rimrafManual), {+ sync: manualSync,+}); export const windowsSync = wrapSync(rimrafWindowsSync);-export const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync });+export const windows = Object.assign(wrap(rimrafWindows), {+ sync: windowsSync,+}); export const posixSync = wrapSync(rimrafPosixSync);
--- +++ @@ -9,3 +9,4 @@ typeOrUndef(o.maxBackoff, 'number') &&- (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&+ (typeOrUndef(o.glob, 'boolean') ||+ (o.glob && typeof o.glob === 'object')) && typeOrUndef(o.filter, 'function');
--- +++ @@ -9,3 +9,4 @@ : `type ${type} ${path}`;- const msg = 'The "path" argument must be of type string. ' + `Received ${received}`;+ const msg = 'The "path" argument must be of type string. ' ++ `Received ${received}`; throw Object.assign(new TypeError(msg), {
--- +++ @@ -1,3 +1,3 @@-export declare const readdirOrError: (path: string) => Promise<import("fs").Dirent<string>[] | Error>;-export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent<string>[] | Error;+export declare const readdirOrError: (path: string) => Promise<import("node:fs").Dirent<string>[] | Error>;+export declare const readdirOrErrorSync: (path: string) => import("node:fs").Dirent<string>[] | Error; //# sourceMappingURL=readdir-or-error.d.ts.map
--- +++ @@ -15,3 +15,3 @@ import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js';-import { lstatSync, promises, renameSync, rmdirSync, unlinkSync } from './fs.js';+import { lstatSync, promises, renameSync, rmdirSync, unlinkSync, } from './fs.js'; import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js';
--- +++ @@ -17,4 +17,3 @@ opt?.signal?.throwIfAborted();- return (ignoreENOENTSync(() => rimrafPosixDirSync(path, opt, lstatSync(path))) ??- true);+ return (ignoreENOENTSync(() => rimrafPosixDirSync(path, opt, lstatSync(path))) ?? true); };
--- +++ @@ -15,3 +15,3 @@ import { retryBusy, retryBusySync } from './retry-busy.js';-import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js';+import { rimrafMoveRemove, rimrafMoveRemoveSync, } from './rimraf-move-remove.js'; import { errorCode } from './error.js';
--- +++ @@ -2,3 +2,3 @@ "name": "rimraf",- "version": "6.1.2",+ "version": "6.1.3", "type": "module",@@ -47,16 +47,4 @@ },- "prettier": {- "experimentalTernaries": true,- "semi": false,- "printWidth": 80,- "tabWidth": 2,- "useTabs": false,- "singleQuote": true,- "jsxSingleQuote": false,- "bracketSameLine": true,- "arrowParens": "avoid",- "endOfLine": "lf"- }, "devDependencies": {- "@types/node": "^24.9.2",+ "@types/node": "^25.2.0", "mkdirp": "^3.0.1",@@ -74,3 +62,3 @@ "dependencies": {- "glob": "^13.0.0",+ "glob": "^13.0.3", "package-json-from-dist": "^1.0.1"@@ -87,6 +75,3 @@ ],- "module": "./dist/esm/index.js",- "tap": {- "coverage-map": "map.js"- }+ "module": "./dist/esm/index.js" }
ts-jest npm DELETIONBURST ×5
29.4.0
29.4.1
29.4.2
29.4.3
29.4.4
29.4.5
29.4.6
29.4.7
29.4.8
29.4.9
29.4.10
29.4.11
DELETION
0.1.12 published then removed
high · registry-verified · 2016-11-03 · 9y ago
BURST
3 releases in 44m: 0.0.1, 0.1.0, 0.1.1
info · registry-verified · 2016-08-31 · 9y ago
BURST
2 releases in 2m: 0.1.2, 0.1.3
info · registry-verified · 2016-08-31 · 9y ago
BURST
2 releases in 47m: 17.0.2, 17.0.3
info · registry-verified · 2016-12-01 · 9y ago
BURST
2 releases in 59m: 19.0.12, 19.0.13
info · registry-verified · 2017-04-26 · 9y ago
BURST
3 releases in 49m: 29.4.7, 29.4.8, 29.4.9
info · registry-verified · 2026-04-01 · 3mo ago
release diff 29.4.10 → 29.4.11
+1 added · -0 removed · ~5 modified
--- +++ @@ -68,7 +68,7 @@ * - User-supplied Bundler with a non-Bundler-compatible forced module is- * also TS5095 on the supported TS range — substitute Node10. (TypeScript- * 6 relaxed this for `module: CommonJS` specifically; that relaxation is- * deliberately not encoded here so behavior stays consistent across the- * full peerDependency range. See `isBundlerCompatibleModuleKind` for the- * follow-up pointer.)+ * TS5095, substitute Node10. (TypeScript 6 relaxed this for+ * `module: CommonJS` specifically; that relaxation is encoded inside+ * `isBundlerCompatibleModuleKind` via a runtime version check, so on+ * TS ≥ 6 user-supplied Bundler passes through unchanged on the CJS+ * path.) *@@ -96,9 +96,8 @@ *- * Note: TypeScript 6.0 relaxed this restriction for `module: CommonJS`- * specifically (`CommonJS` + `Bundler` is now a valid pair on TS ≥ 6); the- * other non-ES module kinds (`AMD` / `UMD` / `System` / `None`) remain- * Bundler-incompatible on every TypeScript version. The TS 6 relaxation is- * intentionally not encoded here to keep behavior consistent across the full- * peerDependency range (`>=4.3 <7`); honoring it can ride in as a follow-up- * once the TS 6 baseline lands.+ * TypeScript 6.0 relaxed TS5095 for `module: CommonJS` specifically+ * (`CommonJS` + `Bundler` is a valid pair on TS ≥ 6); the other non-ES+ * module kinds (`AMD` / `UMD` / `System` / `None`) remain Bundler-incompatible+ * on every TypeScript version. The version is detected at runtime from+ * `this._ts.version` so the function stays correct across the full+ * peerDependency range (`>=4.3 <7`). *
--- +++ @@ -183,7 +183,7 @@ * - User-supplied Bundler with a non-Bundler-compatible forced module is- * also TS5095 on the supported TS range — substitute Node10. (TypeScript- * 6 relaxed this for `module: CommonJS` specifically; that relaxation is- * deliberately not encoded here so behavior stays consistent across the- * full peerDependency range. See `isBundlerCompatibleModuleKind` for the- * follow-up pointer.)+ * TS5095, substitute Node10. (TypeScript 6 relaxed this for+ * `module: CommonJS` specifically; that relaxation is encoded inside+ * `isBundlerCompatibleModuleKind` via a runtime version check, so on+ * TS ≥ 6 user-supplied Bundler passes through unchanged on the CJS+ * path.) *@@ -226,9 +226,8 @@ *- * Note: TypeScript 6.0 relaxed this restriction for `module: CommonJS`- * specifically (`CommonJS` + `Bundler` is now a valid pair on TS ≥ 6); the- * other non-ES module kinds (`AMD` / `UMD` / `System` / `None`) remain- * Bundler-incompatible on every TypeScript version. The TS 6 relaxation is- * intentionally not encoded here to keep behavior consistent across the full- * peerDependency range (`>=4.3 <7`); honoring it can ride in as a follow-up- * once the TS 6 baseline lands.+ * TypeScript 6.0 relaxed TS5095 for `module: CommonJS` specifically+ * (`CommonJS` + `Bundler` is a valid pair on TS ≥ 6); the other non-ES+ * module kinds (`AMD` / `UMD` / `System` / `None`) remain Bundler-incompatible+ * on every TypeScript version. The version is detected at runtime from+ * `this._ts.version` so the function stays correct across the full+ * peerDependency range (`>=4.3 <7`). *@@ -245,2 +244,7 @@ return true;+ }+ // TS 6 made `CommonJS` + `Bundler` a valid pair.+ if (moduleKind === M.CommonJS) {+ const tsMajor = parseInt(this._ts.version.split('.')[0], 10);+ return tsMajor >= 6; }
--- +++ @@ -2,3 +2,3 @@ "name": "ts-jest",- "version": "29.4.10",+ "version": "29.4.11", "main": "dist/index.js",
tslib npm DELETION ×2BURST ×3
2.4.1
2.5.0
2.5.1
2.5.2
2.5.3
2.6.0
2.6.1
2.6.2
2.6.3
2.7.0
2.8.0
2.8.1
DELETION
0.0.1 published then removed
high · registry-verified · 2014-12-30 · 11y ago
DELETION
0.0.2 published then removed
high · registry-verified · 2014-12-30 · 11y ago
BURST
2 releases in 13m: 1.13.0, 2.0.0
info · registry-verified · 2020-05-13 · 6y ago
BURST
2 releases in 3m: 1.14.0, 2.0.2
info · registry-verified · 2020-10-06 · 5y ago
BURST
2 releases in 1m: 1.14.1, 2.0.3
info · registry-verified · 2020-10-09 · 5y ago
release diff 2.8.0 → 2.8.1
+0 added · -0 removed · ~4 modified
--- +++ @@ -4,3 +4,3 @@ "homepage": "https://www.typescriptlang.org/",- "version": "2.8.0",+ "version": "2.8.1", "license": "0BSD",
--- +++ @@ -265,2 +265,11 @@ +var ownKeys = function(o) {+ ownKeys = Object.getOwnPropertyNames || function (o) {+ var ar = [];+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+ return ar;+ };+ return ownKeys(o);+};+ export function __importStar(mod) {@@ -268,3 +277,3 @@ var result = {};- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod);
--- +++ @@ -265,2 +265,11 @@ +var ownKeys = function(o) {+ ownKeys = Object.getOwnPropertyNames || function (o) {+ var ar = [];+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+ return ar;+ };+ return ownKeys(o);+};+ export function __importStar(mod) {@@ -268,3 +277,3 @@ var result = {};- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod);
--- +++ @@ -314,2 +314,11 @@ + var ownKeys = function(o) {+ ownKeys = Object.getOwnPropertyNames || function (o) {+ var ar = [];+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+ return ar;+ };+ return ownKeys(o);+ };+ __importStar = function (mod) {@@ -317,3 +326,3 @@ var result = {};- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod);@@ -442,34 +451,34 @@ 0 && (module.exports = {- __extends,- __assign,- __rest,- __decorate,- __param,- __esDecorate,- __runInitializers,- __propKey,- __setFunctionName,- __metadata,- __awaiter,- __generator,- __exportStar,- __createBinding,- __values,- __read,- __spread,- __spreadArrays,- __spreadArray,- __await,- __asyncGenerator,- __asyncDelegator,- __asyncValues,- __makeTemplateObject,- __importStar,- __importDefault,- __classPrivateFieldGet,- __classPrivateFieldSet,- __classPrivateFieldIn,- __addDisposableResource,- __disposeResources,- __rewriteRelativeImportExtension,+ __extends: __extends,+ __assign: __assign,+ __rest: __rest,+ __decorate: __decorate,+ __param: __param,+ __esDecorate: __esDecorate,+ __runInitializers: __runInitializers,+ __propKey: __propKey,+ __setFunctionName: __setFunctionName,+ __metadata: __metadata,+ __awaiter: __awaiter,+ __generator: __generator,+ __exportStar: __exportStar,+ __createBinding: __createBinding,+ __values: __values,+ __read: __read,+ __spread: __spread,+ __spreadArrays: __spreadArrays,+ __spreadArray: __spreadArray,+ __await: __await,+ __asyncGenerator: __asyncGenerator,+ __asyncDelegator: __asyncDelegator,+ __asyncValues: __asyncValues,+ __makeTemplateObject: __makeTemplateObject,+ __importStar: __importStar,+ __importDefault: __importDefault,+ __classPrivateFieldGet: __classPrivateFieldGet,+ __classPrivateFieldSet: __classPrivateFieldSet,+ __classPrivateFieldIn: __classPrivateFieldIn,+ __addDisposableResource: __addDisposableResource,+ __disposeResources: __disposeResources,+ __rewriteRelativeImportExtension: __rewriteRelativeImportExtension, });
ts-node npm DELETIONBURST ×10
10.3.0
10.3.1
10.4.0
10.5.0
10.6.0
10.7.0
10.8.0
10.8.1
10.8.2
10.9.0
10.9.1
10.9.2
DELETION
8.5.1 published then removed
high · registry-verified · 2019-11-15 · 6y ago
BURST
2 releases in 10m: 0.2.1, 0.2.2
info · registry-verified · 2015-09-22 · 10y ago
BURST
2 releases in 18m: 1.2.0, 1.2.1
info · registry-verified · 2016-07-22 · 9y ago
BURST
3 releases in 21m: 1.5.0, 1.5.1, 1.5.2
info · registry-verified · 2016-10-15 · 9y ago
BURST
2 releases in 48m: 2.1.1, 2.1.2
info · registry-verified · 2017-03-21 · 9y ago
BURST
2 releases in 17m: 3.2.2, 3.3.0
info · registry-verified · 2017-07-24 · 8y ago
BURST
2 releases in 53m: 4.0.0, 4.0.1
info · registry-verified · 2017-12-10 · 8y ago
BURST
2 releases in 18m: 6.2.0, 7.0.0
info · registry-verified · 2018-06-22 · 8y ago
BURST
2 releases in 23m: 8.0.0, 8.0.1
info · registry-verified · 2019-01-22 · 7y ago
BURST
2 releases in 57m: 8.4.0, 8.4.1
info · registry-verified · 2019-09-15 · 6y ago
BURST
2 releases in 7m: 8.5.1, 8.5.2
info · registry-verified · 2019-11-15 · 6y ago
release diff 10.9.1 → 10.9.2
+0 added · -0 removed · ~8 modified
--- +++ @@ -3,2 +3,3 @@ exports.createSwcOptions = exports.targetMapping = exports.create = void 0;+const ts_internals_1 = require("../ts-internals"); function create(createOptions) {@@ -37,5 +38,3 @@ const { fileName } = transpileOptions;- const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx')- ? tsxOptions- : nonTsxOptions;+ const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx') ? tsxOptions : nonTsxOptions; const { code, map } = swcInstance.transformSync(input, {@@ -63,3 +62,3 @@ exports.targetMapping.set(/* ts.ScriptTarget.ES2022 */ 9, 'es2022');-exports.targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'es2022');+exports.targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'esnext'); /**@@ -79,2 +78,3 @@ 'es2022',+ 'esnext', ];@@ -102,3 +102,3 @@ var _a;- const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, module, jsx, jsxFactory, jsxFragmentFactory, strict, alwaysStrict, noImplicitUseStrict, } = compilerOptions;+ const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, module, jsx, jsxFactory, jsxFragmentFactory, strict, alwaysStrict, noImplicitUseStrict, jsxImportSource, } = compilerOptions; let swcTarget = (_a = exports.targetMapping.get(target)) !== null && _a !== void 0 ? _a : 'es3';@@ -147,6 +147,5 @@ : true;- const jsxRuntime = jsx === JsxEmit.ReactJSX || jsx === JsxEmit.ReactJSXDev- ? 'automatic'- : undefined;+ const jsxRuntime = jsx === JsxEmit.ReactJSX || jsx === JsxEmit.ReactJSXDev ? 'automatic' : undefined; const jsxDevelopment = jsx === JsxEmit.ReactJSXDev ? true : undefined;+ const useDefineForClassFields = (0, ts_internals_1.getUseDefineForClassFields)(compilerOptions); const nonTsxOptions = createVariant(false);@@ -160,7 +159,11 @@ ? {- noInterop: !esModuleInterop, type: moduleType,- strictMode,- // For NodeNext and Node12, emit as CJS but do not transform dynamic imports- ignoreDynamic: nodeModuleEmitKind === 'nodecjs',+ ...(moduleType === 'amd' || moduleType === 'commonjs' || moduleType === 'umd'+ ? {+ noInterop: !esModuleInterop,+ strictMode,+ // For NodeNext and Node12, emit as CJS but do not transform dynamic imports+ ignoreDynamic: nodeModuleEmitKind === 'nodecjs',+ }+ : {}), }@@ -188,3 +191,5 @@ runtime: jsxRuntime,+ importSource: jsxImportSource, },+ useDefineForClassFields, },@@ -192,3 +197,4 @@ experimental: {- keepImportAssertions: true,+ keepImportAttributes: true,+ emitAssertForImportAttributes: true, },
--- +++ @@ -1 +1,6 @@-export {};+import type * as _ts from 'typescript';+export declare function getUseDefineForClassFields(compilerOptions: _ts.CompilerOptions): boolean;+export declare function getEmitScriptTarget(compilerOptions: {+ module?: _ts.CompilerOptions['module'];+ target?: _ts.CompilerOptions['target'];+}): _ts.ScriptTarget;
--- +++ @@ -2,3 +2,3 @@ Object.defineProperty(exports, "__esModule", { value: true });-exports.getPatternFromSpec = exports.createTsInternals = void 0;+exports.getEmitScriptTarget = exports.getUseDefineForClassFields = exports.getPatternFromSpec = exports.createTsInternals = void 0; const path_1 = require("path");@@ -39,2 +39,3 @@ // If the path isn't a rooted or relative path, resolve like a module+ const tsGte5_3_0 = (0, util_1.versionGteLt)(ts.version, '5.3.0'); const resolved = ts.nodeModuleNameResolver(extendedConfig, combinePaths(basePath, 'tsconfig.json'), { moduleResolution: ts.ModuleResolutionKind.NodeJs }, host, @@ -42,3 +43,4 @@ /*projectRefs*/ undefined, - /*lookupConfig*/ true);+ /*conditionsOrIsConfigLookup*/ tsGte5_3_0 ? undefined : true, + /*isConfigLookup*/ tsGte5_3_0 ? true : undefined); if (resolved.resolvedModule) {@@ -298,2 +300,22 @@ }+const ts_ScriptTarget_ES5 = 1;+const ts_ScriptTarget_ES2022 = 9;+const ts_ScriptTarget_ESNext = 99;+const ts_ModuleKind_Node16 = 100;+const ts_ModuleKind_NodeNext = 199;+// https://github.com/microsoft/TypeScript/blob/fc418a2e611c88cf9afa0115ff73490b2397d311/src/compiler/utilities.ts#L8761+function getUseDefineForClassFields(compilerOptions) {+ return compilerOptions.useDefineForClassFields === undefined+ ? getEmitScriptTarget(compilerOptions) >= ts_ScriptTarget_ES2022+ : compilerOptions.useDefineForClassFields;+}+exports.getUseDefineForClassFields = getUseDefineForClassFields;+// https://github.com/microsoft/TypeScript/blob/fc418a2e611c88cf9afa0115ff73490b2397d311/src/compiler/utilities.ts#L8556+function getEmitScriptTarget(compilerOptions) {+ var _a;+ return ((_a = compilerOptions.target) !== null && _a !== void 0 ? _a : ((compilerOptions.module === ts_ModuleKind_Node16 && ts_ScriptTarget_ES2022) ||+ (compilerOptions.module === ts_ModuleKind_NodeNext && ts_ScriptTarget_ESNext) ||+ ts_ScriptTarget_ES5));+}+exports.getEmitScriptTarget = getEmitScriptTarget; //# sourceMappingURL=ts-internals.js.map
--- +++ @@ -2,3 +2,3 @@ "name": "ts-node",- "version": "10.9.1",+ "version": "10.9.2", "description": "TypeScript execution environment and REPL for node.js, with source map support",@@ -114,4 +114,4 @@ "@microsoft/api-extractor": "^7.19.4",- "@swc/core": ">=1.2.205",- "@swc/wasm": ">=1.2.205",+ "@swc/core": "^1.3.100",+ "@swc/wasm": "^1.3.100", "@types/diff": "^4.0.2",
--- +++ @@ -2,2 +2,3 @@ "$schema": "http://json-schema.org/draft-04/schema#",+ "allowTrailingCommas": true, "allOf": [@@ -94,4 +95,16 @@ "extends": {- "description": "Path to base configuration file to inherit from. Requires TypeScript version 2.1 or later.",- "type": "string"+ "description": "Path to base configuration file to inherit from (requires TypeScript version 2.1 or later), or array of base files, with the rightmost files having the greater priority (requires TypeScript version 5.0 or later).",+ "oneOf": [+ {+ "default": "",+ "type": "string"+ },+ {+ "default": [],+ "items": {+ "type": "string"+ },+ "type": "array"+ }+ ] }@@ -200,2 +213,12 @@ "properties": {+ "allowArbitraryExtensions": {+ "description": "Enable importing files with any extension, provided a declaration file is present.",+ "type": "boolean",+ "markdownDescription": "Enable importing files with any extension, provided a declaration file is present.\n\nSee more: https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions"+ },+ "allowImportingTsExtensions": {+ "description": "Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set.",+ "type": "boolean",+ "markdownDescription": "Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set.\n\nSee more: https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions"+ }, "charset": {@@ -210,2 +233,11 @@ "markdownDescription": "Enable constraints that allow a TypeScript project to be used with project references.\n\nSee more: https://www.typescriptlang.org/tsconfig#composite"+ },+ "customConditions": {+ "description": "Conditions to set in addition to the resolver-specific defaults when resolving imports.",+ "type": "array",+ "uniqueItems": true,+ "items": {+ "type": "string"+ },+ "markdownDescription": "Conditions to set in addition to the resolver-specific defaults when resolving imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#customConditions" },@@ -263,5 +295,9 @@ "tsBuildInfoFile": {+ "$comment": "The value of 'null' is UNDOCUMENTED.", "description": "Specify the folder for .tsbuildinfo incremental compilation files.", "default": ".tsbuildinfo",- "type": "string",+ "type": [+ "string",+ "null"+ ], "markdownDescription": "Specify the folder for .tsbuildinfo incremental compilation files.\n\nSee more: https://www.typescriptlang.org/tsconfig#tsBuildInfoFile"@@ -346,3 +382,3 @@ {- "pattern": "^([Cc][Oo][Mm][Mm][Oo][Nn][Jj][Ss]|[AaUu][Mm][Dd]|[Ss][Yy][Ss][Tt][Ee][Mm]|[Ee][Ss]([356]|20(1[567]|2[02])|[Nn][Ee][Xx][Tt])|[Nn][Oo][dD][Ee]16|[Nn][Oo][Dd][Ed][Nn][Ee][Xx][Tt]|[Nn][Oo][Nn][Ee])$"+ "pattern": "^([Cc][Oo][Mm][Mm][Oo][Nn][Jj][Ss]|[AaUu][Mm][Dd]|[Ss][Yy][Ss][Tt][Ee][Mm]|[Ee][Ss]([356]|20(1[567]|2[02])|[Nn][Ee][Xx][Tt])|[Nn][Oo][dD][Ee]16|[Nn][Oo][Dd][Ee][Nn][Ee][Xx][Tt]|[Nn][Oo][Nn][Ee])$" }@@ -359,4 +395,14 @@ "Node",+ "Node10", "Node16",- "NodeNext"+ "NodeNext",+ "Bundler"+ ],+ "markdownEnumDescriptions": [+ "It’s recommended to use `\"Node16\"` instead",+ "Deprecated, use `\"Node10\"` in TypeScript 5.0+ instead",+ "It’s recommended to use `\"Node16\"` instead",+ "This is the recommended setting for libraries and Node.js applications",+ "This is the recommended setting for libraries and Node.js applications",+ "This is the recommended setting in TypeScript 5.0+ for applications that use a bundler" ]@@ -364,6 +410,5 @@ {- "pattern": "^(([Nn]ode)|([Nn]ode16)|([Nn]ode[Nn]ext)|([Cc]lassic))$"+ "pattern": "^(([Nn]ode)|([Nn]ode1[06])|([Nn]ode[Nn]ext)|([Cc]lassic)|([Bb]undler))$" } ],- "default": "classic", "markdownDescription": "Specify how TypeScript looks up a file from a given module specifier.\n\nSee more: https://www.typescriptlang.org/tsconfig#moduleResolution"@@ -558,2 +603,3 @@ "ES2022",+ "ES2023", "ESNext"@@ -562,3 +608,3 @@ {- "pattern": "^([Ee][Ss]([356]|(20(1[56789]|2[012]))|[Nn][Ee][Xx][Tt]))$"+ "pattern": "^([Ee][Ss]([356]|(20(1[56789]|2[0123]))|[Nn][Ee][Xx][Tt]))$" }@@ -802,2 +848,3 @@ "ES2019.Array",+ "ES2019.Intl", "ES2019.Object",@@ -828,2 +875,4 @@ "ES2020.Intl",+ "ES2020.Date",+ "ES2020.Number", "ES2021.Promise",@@ -832,3 +881,3 @@ "ESNext.WeakRef",- "es2021.intl",+ "ES2021.Intl", "ES2022",@@ -838,3 +887,13 @@ "ES2022.Object",- "ES2022.String"+ "ES2022.String",+ "ES2022.SharedMemory",+ "ES2022.RegExp",+ "ES2023",+ "ES2023.Array",+ "Decorators",+ "Decorators.Legacy",+ "ES2017.Date",+ "ES2023.Collection",+ "ESNext.Decorators",+ "ESNext.Disposable" ]@@ -845,18 +904,18 @@ {- "pattern": "^[Ee][Ss]2015(\\.([Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]|[Cc][Oo][Rr][Ee]|[Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Pp][Rr][Oo][Xx][Yy]|[Rr][Ee][Ff][Ll][Ee][Cc][Tt]|[Ss][Yy][Mm][Bb][Oo][Ll].[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"- },- {- "pattern": "^[Ee][Ss]2016(\\.[Aa][Rr][Rr][Aa][Yy].[Ii][Nn][Cc][Ll][Uu][Dd][Ee])?$"- },- {- "pattern": "^[Ee][Ss]2017(\\.([Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Tt][Yy][Pp][Ee][Dd][Aa][Rr][Rr][Aa][Yy][Ss]))?$"- },- {- "pattern": "^[Ee][Ss]2018(\\.([Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"- },- {- "pattern": "^[Ee][Ss]2019(\\.([Aa][Rr][Rr][Aa][Yy]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"- },- {- "pattern": "^[Ee][Ss]2020(\\.([Bb][Ii][Gg][Ii][Nn][Tt]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll].[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]))?$"+ "pattern": "^[Ee][Ss]2015(\\.([Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]|[Cc][Oo][Rr][Ee]|[Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Pp][Rr][Oo][Xx][Yy]|[Rr][Ee][Ff][Ll][Ee][Cc][Tt]|[Ss][Yy][Mm][Bb][Oo][Ll]\\.[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"+ },+ {+ "pattern": "^[Ee][Ss]2016(\\.[Aa][Rr][Rr][Aa][Yy]\\.[Ii][Nn][Cc][Ll][Uu][Dd][Ee])?$"+ },+ {+ "pattern": "^[Ee][Ss]2017(\\.([Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Tt][Yy][Pp][Ee][Dd][Aa][Rr][Rr][Aa][Yy][Ss]|[Dd][Aa][Tt][Ee]))?$"+ },+ {+ "pattern": "^[Ee][Ss]2018(\\.([Aa][Ss][Yy][Nn][Cc][Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"+ },+ {+ "pattern": "^[Ee][Ss]2019(\\.([Aa][Rr][Rr][Aa][Yy]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"+ },+ {+ "pattern": "^[Ee][Ss]2020(\\.([Bb][Ii][Gg][Ii][Nn][Tt]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]\\.[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ii][Nn][Tt][Ll]|[Dd][Aa][Tt][Ee]|[Nn][Uu][Mm][Bb][Ee][Rr]))?$" },@@ -866,6 +925,9 @@ {- "pattern": "^[Ee][Ss]2022(\\.([Aa][Rr][Rr][Aa][Yy]|[Ee][Rr][Rr][Oo][Rr]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]))?$"- },- {- "pattern": "^[Ee][Ss][Nn][Ee][Xx][Tt](\\.([Aa][Rr][Rr][Aa][Yy]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Bb][Ii][Gg][Ii][Nn][Tt]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]|[Ww][Ee][Aa][Kk][Rr][Ee][Ff]))?$"+ "pattern": "^[Ee][Ss]2022(\\.([Aa][Rr][Rr][Aa][Yy]|[Ee][Rr][Rr][Oo][Rr]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"+ },+ {+ "pattern": "^[Ee][Ss]2023(\\.([Aa][Rr][Rr][Aa][Yy]|[Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]))?$"+ },+ {+ "pattern": "^[Ee][Ss][Nn][Ee][Xx][Tt](\\.([Aa][Rr][Rr][Aa][Yy]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Bb][Ii][Gg][Ii][Nn][Tt]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]|[Ww][Ee][Aa][Kk][Rr][Ee][Ff]|[Dd][Ee][Cc][Oo][Rr][Aa][Tt][Oo][Rr][Ss]|[Dd][Ii][Ss][Pp][Oo][Ss][Aa][Bb][Ll][Ee]))?$" },@@ -878,3 +940,6 @@ {- "pattern": "^[Ww][Ee][Bb][Ww][Oo][Rr][Kk][Ee][Rr](\\.[Ii][Mm][Pp][Oo][Rr][Tt][Ss][Cc][Rr][Ii][Pp][Tt][Ss])?$"+ "pattern": "^[Ww][Ee][Bb][Ww][Oo][Rr][Kk][Ee][Rr](\\.([Ii][Mm][Pp][Oo][Rr][Tt][Ss][Cc][Rr][Ii][Pp][Tt][Ss]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]))?$"+ },+ {+ "pattern": "^[Dd][Ee][Cc][Oo][Rr][Aa][Tt][Oo][Rr][Ss](\\.([Ll][Ee][Gg][Aa][Cc][Yy]))?$" }@@ -883,2 +948,10 @@ "markdownDescription": "Specify a set of bundled library declaration files that describe the target runtime environment.\n\nSee more: https://www.typescriptlang.org/tsconfig#lib"+ },+ "moduleDetection": {+ "description": "Specify how TypeScript determine a file as module.",+ "enum": [+ "auto",+ "legacy",+ "force"+ ] },@@ -988,2 +1061,14 @@ },+ "resolvePackageJsonExports": {+ "description": "Use the package.json 'exports' field when resolving package imports.",+ "type": "boolean",+ "default": false,+ "markdownDescription": "Use the package.json 'exports' field when resolving package imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports"+ },+ "resolvePackageJsonImports": {+ "description": "Use the package.json 'imports' field when resolving imports.",+ "type": "boolean",+ "default": false,+ "markdownDescription": "Use the package.json 'imports' field when resolving imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#resolvePackageJsonImports"+ }, "assumeChangesOnlyAffectDirectDependencies": {@@ -1011,2 +1096,7 @@ "markdownDescription": "Opt a project out of multi-project reference checking when editing.\n\nSee more: https://www.typescriptlang.org/tsconfig#disableSolutionSearching"+ },+ "verbatimModuleSyntax": {+ "description": "Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting.",+ "type": "boolean",+ "markdownDescription": "Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting.\n\nSee more: https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax" }
typescript npm critical-tier DELETIONBURST ×4
5.5.4
5.6.2
5.6.3
5.7.2
5.7.3
5.8.2
5.8.3
5.9.2
5.9.3
6.0.2
6.0.3
7.0.2
DELETION
1.9.0 published then removed
high · registry-verified · 2016-04-28 · 10y ago
BURST
2 releases in 15m: 1.8.6, 1.8.7
info · registry-verified · 2016-03-02 · 10y ago
BURST
5 releases in 8m: 3.1.7, 3.7.6, 3.9.8, 4.0.6, 4.1.4
info · registry-verified · 2021-02-09 · 5y ago
BURST
5 releases in 3m: 3.1.8, 3.7.7, 3.9.9, 4.0.7, 4.1.5
info · registry-verified · 2021-02-10 · 5y ago
BURST
4 releases in 53m: 3.9.10, 4.0.8, 4.3.3, 4.1.6
info · registry-verified · 2021-06-16 · 5y ago
release diff 6.0.3 → 7.0.2
+412 added · -136 removed · ~4 modified
new files touching dangerous APIs: dist/api/async/client.js, dist/api/syncChannel.js, dist/ast/scanner.js, vendor/vscode-jsonrpc/lib/browser/ril.js, vendor/vscode-jsonrpc/lib/node/main.d.ts, vendor/vscode-jsonrpc/lib/node/main.js
+202 more files not shown
--- +++ @@ -0,0 +1,211 @@+import { createMessageConnection, RequestType, SocketMessageReader, SocketMessageWriter, StreamMessageReader, StreamMessageWriter, } from "#vscode-jsonrpc/node";+import { fsCallbackNames, } from "../fs.js";+import { isSpawnOptions, resolveExePath, } from "../options.js";+import { combineTimingInfo, disabledServerTimingInfo, disabledTimingInfo, TimingCollector, } from "../timing.js";+/**+ * Client handles communication with the TypeScript API server+ * over STDIO (spawned process) or a Unix domain socket using JSON-RPC.+ */+export class Client {+ socket;+ process;+ connection;+ options;+ connected = false;+ timing;+ constructor(options) {+ this.options = options;+ if (isSpawnOptions(options) && options.collectTiming) {+ this.timing = new TimingCollector();+ }+ }+ async connect() {+ if (this.connected)+ return;+ if (isSpawnOptions(this.options)) {+ await this.connectViaSpawn(this.options);+ }+ else {+ await this.connectViaSocket(this.options);+ }+ }+ async connectViaSpawn(options) {+ const { spawn } = await import("node:child_process");+ return new Promise((resolve, reject) => {+ const args = [+ "--api",+ "--async",+ "--cwd",+ options.cwd ?? process.cwd(),+ ];+ if (options.collectTiming) {+ args.push("--timing");+ }+ // Enable virtual FS callbacks for each provided FS function+ const enabledCallbacks = [];+ if (options.fs) {+ for (const name of fsCallbackNames) {+ if (options.fs[name]) {+ enabledCallbacks.push(name);+ }+ }+ }+ if (enabledCallbacks.length > 0) {+ args.push(`--callbacks=${enabledCallbacks.join(",")}`);+ }+ this.process = spawn(resolveExePath(options), args, {+ stdio: ["pipe", "pipe", "inherit"],+ });+ this.process.once("error", error => {+ reject(new Error(`Failed to start tsgo process: ${error.message}`));+ });+ this.process.once("spawn", () => {+ this.connected = true;+ resolve();+ });+ const reader = new StreamMessageReader(this.process.stdout);+ const writer = new StreamMessageWriter(this.process.stdin);+ this.connection = createMessageConnection(reader, writer);+ this.registerFSCallbacks(this.connection, options.fs);+ this.connection.listen();+ });+ }+ async connectViaSocket(options) {+ const { createConnection } = await import("node:net");+ return new Promise((resolve, reject) => {+ this.socket = createConnection(options.pipe, () => {+ const reader = new SocketMessageReader(this.socket);+ const writer = new SocketMessageWriter(this.socket);+ this.connection = createMessageConnection(reader, writer);+ this.connection.listen();+ this.connected = true;+ resolve();+ });+ this.socket.once("error", error => {+ reject(new Error(`Socket error: ${error.message}`));+ });+ });+ }+ registerFSCallbacks(connection, fs) {+ if (!fs)+ return;+ for (const name of fsCallbackNames) {+ const callback = fs[name];+ if (callback) {+ const requestType = new RequestType(name);+ connection.onRequest(requestType, (arg) => {+ const result = callback(arg);+ if (name === "readFile") {+ // readFile has 3 returns: string (content), null (not found), undefined (fall back).+ // JSON-RPC can't distinguish null from undefined, so wrap in object.+ if (result === undefined)+ return null;+ return { content: result };+ }+ return result ?? null;+ });+ }+ }+ }+ async apiRequest(method, params) {+ if (!this.connected) {+ await this.connect();+ }+ if (!this.connection) {+ throw new Error("Connection not established");+ }+ const requestType = new RequestType(method);+ if (!this.timing) {+ return this.connection.sendRequest(requestType, params);+ }+ // Round-trip latency is measured here; byte counts approximate the wire+ // payload via the serialized JSON. Server-side processing time is not+ // carried on the response; it is retrieved separately (via a+ // getServerTiming request) and folded in by getTimingInfo().+ const bytesSent = params === undefined ? 0 : Buffer.byteLength(JSON.stringify(params), "utf-8");+ const start = performance.now();+ const result = await this.connection.sendRequest(requestType, params);+ const roundTripMs = performance.now() - start;+ this.timing.record({+ method,+ roundTripMs,+ bytesSent,+ bytesReceived: result === undefined || result === null+ ? 0+ : Buffer.byteLength(JSON.stringify(result), "utf-8"),+ });+ return result;+ }+ async apiRequestBinary(method, params) {+ const response = await this.apiRequest(method, params);+ if (!response)+ return undefined;+ const buffer = Buffer.from(response.data, "base64");+ return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);+ }+ /**+ * Returns the timing collector that per-node materialization is reported+ * into, or undefined when timing collection is disabled. The returned+ * collector is the same one folded into {@link getTimingInfo}, so+ * materialization totals surface alongside request timings.+ */+ getTimingCollector() {+ return this.timing;+ }+ /**+ * Returns a combined timing snapshot: client-measured round-trip and byte+ * counts folded together with the server's own per-request processing time+ * (fetched via a getServerTiming request) and estimated transport overhead.+ */+ async getTimingInfo() {+ if (!this.timing) {+ return disabledTimingInfo();+ }+ const local = this.timing.getInfo();+ // No requests have been sent yet: nothing to fetch from the server.+ if (!this.connected || !this.connection) {+ return local;+ }+ return combineTimingInfo(local, await this.fetchServerTiming());+ }+ async resetTimingInfo() {+ if (!this.timing)+ return;+ this.timing.reset();+ if (this.connected && this.connection) {+ // Keep the server's collection in sync so combined totals stay meaningful.+ const requestType = new RequestType("resetServerTiming");+ await this.connection.sendRequest(requestType, undefined);+ }+ }+ async fetchServerTiming() {+ if (!this.connection) {+ return disabledServerTimingInfo();+ }+ // Fetch the server's own timing collection via a dedicated request. This+ // bypasses the client-side collector so the query does not pollute it.+ const requestType = new RequestType("getServerTiming");+ return this.connection.sendRequest(requestType, undefined);+ }+ async close() {+ if (this.connection) {+ this.connection.dispose();+ this.connection = undefined;+ }+ if (this.socket) {+ this.socket.destroy();+ this.socket = undefined;+ }+ if (this.process) {+ // Close stdin to unblock the server's read loop, allowing it to exit cleanly.+ // The server is blocked on stdin.Read(), so just sending SIGTERM would deadlock:+ // - Node won't exit while child is alive+ // - Child can't process SIGTERM while blocked on read+ // - Read won't error until stdin is closed+ this.process.stdin?.end();+ this.process = undefined;+ }+ this.connected = false;+ }+}+//# sourceMappingURL=client.js.map
--- +++ @@ -0,0 +1,508 @@+/**+ * Pure JS replacement for @typescript/libsyncrpc.+ *+ * Spawns a child process and communicates with it synchronously over+ * stdin/stdout pipes using the same MessagePack-based tuple protocol:+ * [MessageType (u8), method (bin), payload (bin)]+ *+ * Synchronous I/O is achieved by calling fs.readSync / fs.writeSync+ * directly on the pipe file descriptors obtained from the spawned+ * ChildProcess.+ */+import { spawn, } from "node:child_process";+import { closeSync, openSync, readSync, writeSync, } from "node:fs";+import { binHeaderSize, MSGPACK_BIN16, MSGPACK_BIN32, MSGPACK_BIN8, MSGPACK_FIXARRAY3, MSGPACK_UINT8, writeBinHeader, } from "./node/msgpack.js";+// ── MessageType constants ────────────────────────────────────────────+// Sent by channel (parent → child)+const MSG_REQUEST = 1;+const MSG_CALL_RESPONSE = 2;+const MSG_CALL_ERROR = 3;+// Sent by child (child → parent)+const MSG_RESPONSE = 4;+const MSG_ERROR = 5;+const MSG_CALL = 6;+// Pre-allocated buffer used by Atomics.wait for tiny sleeps when a+// non-blocking fd returns EAGAIN.+const sleepBuf = new Int32Array(new SharedArrayBuffer(4));+// Shared empty buffer – avoids allocating Buffer.alloc(0) on every+// zero-length bin field.+const EMPTY_BUF = Buffer.alloc(0);+// ── Global cleanup tracking ─────────────────────────────────────────+// Track all live child processes so they can be killed on process exit.+// This mimics the auto-cleanup behavior of the native libsyncrpc module,+// whose Rust/C++ destructors would kill children automatically.+const liveChildren = new Set();+process.on("exit", () => {+ for (const child of liveChildren) {+ try {+ child.kill();+ }+ catch {+ // swallow – process may already be dead+ }+ }+ liveChildren.clear();+});+/**+ * SyncRpcChannel – drop-in replacement for the native libsyncrpc class.+ *+ * API surface intentionally matches the original:+ * - constructor(exe, args)+ * - requestSync(method, payload): string+ * - requestBinarySync(method, payload): Uint8Array+ * - registerCallback(name, cb)+ * - close()+ *+ * The protocol is unversioned; both sides (this JS channel and the Go+ * child process) must be built from the same tree.+ *+ * This class is **not** thread-safe. All calls must originate from a+ * single thread — do not share an instance across worker threads.+ */+export class SyncRpcChannel {+ child;+ readFd;+ writeFd;+ pipeFd;+ callbacks = new Map();+ methodBufCache = new Map();+ // When true, the payload byte lengths of each request/response are recorded+ // and exposed via the `last*` fields below. These count only the JSON/binary+ // payload bytes, not the MessagePack tuple framing (message type, method+ // name, and length headers).+ collectTiming;+ // Per-request payload byte measurements for the most recently completed+ // request. Only meaningful when `collectTiming` is true. Callers read these+ // immediately after a request returns (the channel is strictly serial).+ lastBytesSent = 0;+ lastBytesReceived = 0;+ _msgType = 0;+ _msgName = EMPTY_BUF;+ _msgPayload = EMPTY_BUF;+ headerBuf = Buffer.allocUnsafe(4);+ // Read-ahead buffer – reduces readSync syscalls by buffering data from the pipe.+ readBuf = Buffer.allocUnsafe(65536);+ readBufPos = 0;+ readBufLen = 0;+ // Write buffer – assembles entire tuples for a single writeSync.+ writeBuf = Buffer.allocUnsafe(65536);+ constructor(exe, args, collectTiming = false) {+ this.collectTiming = collectTiming;+ const isWindows = process.platform === "win32";+ if (isWindows) {+ // On Windows, libuv pipe handles don't expose POSIX fds, so+ // readSync/writeSync can't be used on stdio pipes. Instead,+ // we create a Windows named pipe path, pass it to the child+ // via --pipe, and open it with fs.openSync which returns a+ // real C-runtime fd backed by a proper HANDLE.+ const pipePath = `\\\\.\\pipe\\tsgo-sync-${process.pid}-${Date.now()}`;+ this.child = spawn(exe, [...args, "--pipe", pipePath], {+ stdio: ["ignore", "ignore", "inherit"],+ });+ // Retry openSync until the child creates the named pipe.+ let fd;+ for (let i = 0; i < 500; i++) {+ try {+ fd = openSync(pipePath, "r+");+ break;+ }+ catch {+ if (this.child.exitCode !== null) {+ throw new Error(`Child process exited with code ${this.child.exitCode} before pipe was ready`);+ }+ Atomics.wait(sleepBuf, 0, 0, 10);+ }+ }+ if (fd === undefined) {+ this.child.kill();+ throw new Error("SyncRpcChannel: timed out connecting to named pipe");+ }+ this.readFd = fd;+ this.writeFd = fd;+ this.pipeFd = fd;+ }+ else {+ // POSIX: use stdio pipe file descriptors directly.+ this.child = spawn(exe, args, {+ stdio: ["pipe", "pipe", "inherit"],+ });+ const stdout = this.child.stdout;+ const stdin = this.child.stdin;+ this.readFd = stdout._handle.fd;+ this.writeFd = stdin._handle.fd;+ if (typeof this.readFd !== "number" || this.readFd < 0 || typeof this.writeFd !== "number" || this.writeFd < 0) {+ stdout.destroy();+ stdin.destroy();+ this.child.kill();+ throw new Error("SyncRpcChannel: could not obtain pipe file descriptors.");+ }+ // Set the pipe handles to blocking mode. Under node --test's+ // process isolation, pipes are created in non-blocking mode+ // (for the IPC channel). This causes readSync/writeSync to get+ // EAGAIN, requiring costly 1ms sleeps per retry. Setting+ // blocking mode ensures readSync blocks properly until data+ // arrives, matching the behavior of the native libsyncrpc.+ stdout._handle.setBlocking?.(true);+ stdin._handle.setBlocking?.(true);+ // Prevent Node's event-loop from reading stdout or keeping the+ // process alive – we will use fs.readSync exclusively.+ stdout.pause();+ stdout.unref();+ stdin.unref();+ }+ // Track for auto-cleanup on process exit.+ liveChildren.add(this.child);+ this.child.unref();+ }+ // ── Public API ──────────────────────────────────────────────────+ /**+ * Send a request and synchronously wait for the response (string).+ * Handles Call (callback) messages from the child inline.+ */+ requestSync(method, payload) {+ this.ensureOpen();+ const result = this.requestBytesSync(method, payload);+ return result.toString("utf-8");+ }+ /**+ * Send a request and synchronously wait for the response (binary).+ * Handles Call (callback) messages from the child inline.+ */+ requestBinarySync(method, payload) {+ this.ensureOpen();+ return this.requestBytesSync(method, payload);+ }+ /** Register a string→string callback that the child may invoke. */+ registerCallback(name, callback) {+ this.callbacks.set(name, callback);+ }+ /** Kill the child process and release resources. */+ close() {+ try {+ liveChildren.delete(this.child);+ if (this.pipeFd !== undefined) {+ closeSync(this.pipeFd);+ this.pipeFd = undefined;+ }+ // Destroy the stdio streams so that their pipe handles are closed+ // and no longer prevent the event loop from draining.+ this.child.stdout?.destroy();+ this.child.stdin?.destroy();+ this.child.kill();+ this.readFd = -1;+ this.writeFd = -1;+ }+ catch {+ // swallow – process may already be dead+ }+ }+ // ── Core request loop ───────────────────────────────────────────+ ensureOpen() {+ if (this.readFd < 0) {+ throw new Error("SyncRpcChannel is closed");+ }+ }+ getMethodBuf(method) {+ let buf = this.methodBufCache.get(method);+ if (buf === undefined) {+ buf = Buffer.from(method, "utf-8");+ this.methodBufCache.set(method, buf);+ }+ return buf;+ }+ requestBytesSync(method, payload) {+ const methodBuf = this.getMethodBuf(method);+ if (this.collectTiming) {+ this.lastBytesSent = typeof payload === "string"+ ? Buffer.byteLength(payload, "utf-8")+ : payload.length;+ this.lastBytesReceived = 0;+ }+ this.writeTuple(MSG_REQUEST, methodBuf, payload);+ for (;;) {+ this.readTuple();+ switch (this._msgType) {+ case MSG_RESPONSE: {+ // Compare raw bytes instead of decoding to string.+ if (!methodBuf.equals(this._msgName)) {+ throw new Error(`name mismatch for response: expected \`${method}\`, got \`${this._msgName.toString("utf-8")}\``);+ }+ if (this.collectTiming) {+ this.lastBytesReceived = this._msgPayload.length;+ }+ return this._msgPayload;+ }+ case MSG_ERROR: {+ if (methodBuf.equals(this._msgName)) {+ throw new Error(this._msgPayload.toString("utf-8"));+ }+ throw new Error(`name mismatch for response: expected \`${method}\`, got \`${this._msgName.toString("utf-8")}\``);+ }+ case MSG_CALL: {+ this.handleCall(this._msgName.toString("utf-8"), this._msgPayload);+ break;+ }+ default:+ throw new Error(`Invalid message type from child: ${this._msgType}`);+ }
… 261 more lines (truncated)
--- +++ @@ -0,0 +1,2230 @@+import { CharacterCodes } from "#enums/characterCodes";+import { CommentDirectiveType } from "#enums/commentDirectiveType";+import { LanguageVariant } from "#enums/languageVariant";+import { RegularExpressionFlags } from "#enums/regularExpressionFlags";+import { ScriptTarget } from "#enums/scriptTarget";+import { SyntaxKind } from "#enums/syntaxKind";+import { TokenFlags } from "#enums/tokenFlags";+// Internal-only, not exported+const EscapeSequenceScanningFlags = {+ String: 1 << 0,+ ReportErrors: 1 << 1,+ RegularExpression: 1 << 2,+ AnnexB: 1 << 3,+ AnyUnicodeMode: 1 << 4,+ AtomEscape: 1 << 5,+ ReportInvalidEscapeErrors: (1 << 2) | (1 << 1),+ AllowExtendedUnicodeEscape: (1 << 0) | (1 << 4),+};+export function tokenIsIdentifierOrKeyword(token) {+ return token >= SyntaxKind.Identifier;+}+export function tokenIsIdentifierOrKeywordOrGreaterThan(token) {+ return token === SyntaxKind.GreaterThanToken || tokenIsIdentifierOrKeyword(token);+}+export const textToKeywordObj = {+ abstract: SyntaxKind.AbstractKeyword,+ accessor: SyntaxKind.AccessorKeyword,+ any: SyntaxKind.AnyKeyword,+ as: SyntaxKind.AsKeyword,+ asserts: SyntaxKind.AssertsKeyword,+ assert: SyntaxKind.AssertKeyword,+ bigint: SyntaxKind.BigIntKeyword,+ boolean: SyntaxKind.BooleanKeyword,+ break: SyntaxKind.BreakKeyword,+ case: SyntaxKind.CaseKeyword,+ catch: SyntaxKind.CatchKeyword,+ class: SyntaxKind.ClassKeyword,+ continue: SyntaxKind.ContinueKeyword,+ const: SyntaxKind.ConstKeyword,+ ["" + "constructor"]: SyntaxKind.ConstructorKeyword,+ debugger: SyntaxKind.DebuggerKeyword,+ declare: SyntaxKind.DeclareKeyword,+ default: SyntaxKind.DefaultKeyword,+ defer: SyntaxKind.DeferKeyword,+ delete: SyntaxKind.DeleteKeyword,+ do: SyntaxKind.DoKeyword,+ else: SyntaxKind.ElseKeyword,+ enum: SyntaxKind.EnumKeyword,+ export: SyntaxKind.ExportKeyword,+ extends: SyntaxKind.ExtendsKeyword,+ false: SyntaxKind.FalseKeyword,+ finally: SyntaxKind.FinallyKeyword,+ for: SyntaxKind.ForKeyword,+ from: SyntaxKind.FromKeyword,+ function: SyntaxKind.FunctionKeyword,+ get: SyntaxKind.GetKeyword,+ if: SyntaxKind.IfKeyword,+ implements: SyntaxKind.ImplementsKeyword,+ import: SyntaxKind.ImportKeyword,+ in: SyntaxKind.InKeyword,+ infer: SyntaxKind.InferKeyword,+ instanceof: SyntaxKind.InstanceOfKeyword,+ interface: SyntaxKind.InterfaceKeyword,+ intrinsic: SyntaxKind.IntrinsicKeyword,+ is: SyntaxKind.IsKeyword,+ keyof: SyntaxKind.KeyOfKeyword,+ let: SyntaxKind.LetKeyword,+ module: SyntaxKind.ModuleKeyword,+ namespace: SyntaxKind.NamespaceKeyword,+ never: SyntaxKind.NeverKeyword,+ new: SyntaxKind.NewKeyword,+ null: SyntaxKind.NullKeyword,+ number: SyntaxKind.NumberKeyword,+ object: SyntaxKind.ObjectKeyword,+ package: SyntaxKind.PackageKeyword,+ private: SyntaxKind.PrivateKeyword,+ protected: SyntaxKind.ProtectedKeyword,+ public: SyntaxKind.PublicKeyword,+ override: SyntaxKind.OverrideKeyword,+ out: SyntaxKind.OutKeyword,+ readonly: SyntaxKind.ReadonlyKeyword,+ require: SyntaxKind.RequireKeyword,+ global: SyntaxKind.GlobalKeyword,+ return: SyntaxKind.ReturnKeyword,+ satisfies: SyntaxKind.SatisfiesKeyword,+ set: SyntaxKind.SetKeyword,+ static: SyntaxKind.StaticKeyword,+ string: SyntaxKind.StringKeyword,+ super: SyntaxKind.SuperKeyword,+ switch: SyntaxKind.SwitchKeyword,+ symbol: SyntaxKind.SymbolKeyword,+ this: SyntaxKind.ThisKeyword,+ throw: SyntaxKind.ThrowKeyword,+ true: SyntaxKind.TrueKeyword,+ try: SyntaxKind.TryKeyword,+ type: SyntaxKind.TypeKeyword,+ typeof: SyntaxKind.TypeOfKeyword,+ undefined: SyntaxKind.UndefinedKeyword,+ unique: SyntaxKind.UniqueKeyword,+ unknown: SyntaxKind.UnknownKeyword,+ using: SyntaxKind.UsingKeyword,+ var: SyntaxKind.VarKeyword,+ void: SyntaxKind.VoidKeyword,+ while: SyntaxKind.WhileKeyword,+ with: SyntaxKind.WithKeyword,+ yield: SyntaxKind.YieldKeyword,+ async: SyntaxKind.AsyncKeyword,+ await: SyntaxKind.AwaitKeyword,+ of: SyntaxKind.OfKeyword,+};+const textToKeyword = new Map(Object.entries(textToKeywordObj));+const textToToken = new Map(Object.entries({+ ...textToKeywordObj,+ "{": SyntaxKind.OpenBraceToken,+ "}": SyntaxKind.CloseBraceToken,+ "(": SyntaxKind.OpenParenToken,+ ")": SyntaxKind.CloseParenToken,+ "[": SyntaxKind.OpenBracketToken,+ "]": SyntaxKind.CloseBracketToken,+ ".": SyntaxKind.DotToken,+ "...": SyntaxKind.DotDotDotToken,+ ";": SyntaxKind.SemicolonToken,+ ",": SyntaxKind.CommaToken,+ "<": SyntaxKind.LessThanToken,+ ">": SyntaxKind.GreaterThanToken,+ "<=": SyntaxKind.LessThanEqualsToken,+ ">=": SyntaxKind.GreaterThanEqualsToken,+ "==": SyntaxKind.EqualsEqualsToken,+ "!=": SyntaxKind.ExclamationEqualsToken,+ "===": SyntaxKind.EqualsEqualsEqualsToken,+ "!==": SyntaxKind.ExclamationEqualsEqualsToken,+ "=>": SyntaxKind.EqualsGreaterThanToken,+ "+": SyntaxKind.PlusToken,+ "-": SyntaxKind.MinusToken,+ "**": SyntaxKind.AsteriskAsteriskToken,+ "*": SyntaxKind.AsteriskToken,+ "/": SyntaxKind.SlashToken,+ "%": SyntaxKind.PercentToken,+ "++": SyntaxKind.PlusPlusToken,+ "--": SyntaxKind.MinusMinusToken,+ "<<": SyntaxKind.LessThanLessThanToken,+ "</": SyntaxKind.LessThanSlashToken,+ ">>": SyntaxKind.GreaterThanGreaterThanToken,+ ">>>": SyntaxKind.GreaterThanGreaterThanGreaterThanToken,+ "&": SyntaxKind.AmpersandToken,+ "|": SyntaxKind.BarToken,+ "^": SyntaxKind.CaretToken,+ "!": SyntaxKind.ExclamationToken,+ "~": SyntaxKind.TildeToken,+ "&&": SyntaxKind.AmpersandAmpersandToken,+ "||": SyntaxKind.BarBarToken,+ "?": SyntaxKind.QuestionToken,+ "??": SyntaxKind.QuestionQuestionToken,+ "?.": SyntaxKind.QuestionDotToken,+ ":": SyntaxKind.ColonToken,+ "=": SyntaxKind.EqualsToken,+ "+=": SyntaxKind.PlusEqualsToken,+ "-=": SyntaxKind.MinusEqualsToken,+ "*=": SyntaxKind.AsteriskEqualsToken,+ "**=": SyntaxKind.AsteriskAsteriskEqualsToken,+ "/=": SyntaxKind.SlashEqualsToken,+ "%=": SyntaxKind.PercentEqualsToken,+ "<<=": SyntaxKind.LessThanLessThanEqualsToken,+ ">>=": SyntaxKind.GreaterThanGreaterThanEqualsToken,+ ">>>=": SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,+ "&=": SyntaxKind.AmpersandEqualsToken,+ "|=": SyntaxKind.BarEqualsToken,+ "^=": SyntaxKind.CaretEqualsToken,+ "||=": SyntaxKind.BarBarEqualsToken,+ "&&=": SyntaxKind.AmpersandAmpersandEqualsToken,+ "??=": SyntaxKind.QuestionQuestionEqualsToken,+ "@": SyntaxKind.AtToken,+ "#": SyntaxKind.HashToken,+ "`": SyntaxKind.BacktickToken,+}));+const charCodeToRegExpFlag = new Map([+ [CharacterCodes.d, RegularExpressionFlags.HasIndices],+ [CharacterCodes.g, RegularExpressionFlags.Global],+ [CharacterCodes.i, RegularExpressionFlags.IgnoreCase],+ [CharacterCodes.m, RegularExpressionFlags.Multiline],+ [CharacterCodes.s, RegularExpressionFlags.DotAll],+ [CharacterCodes.u, RegularExpressionFlags.Unicode],+ [CharacterCodes.v, RegularExpressionFlags.UnicodeSets],+ [CharacterCodes.y, RegularExpressionFlags.Sticky],+]);+/**+ * Generated by scripts/regenerate-unicode-identifier-parts.mjs on node v22.1.0 with unicode 15.1+ * based on http://www.unicode.org/reports/tr31/ and https://www.ecma-international.org/ecma-262/6.0/#sec-names-and-keywords+ * unicodeESNextIdentifierStart corresponds to the ID_Start and Other_ID_Start property, and+ * unicodeESNextIdentifierPart corresponds to ID_Continue, Other_ID_Continue, plus ID_Start and Other_ID_Start+ */+// dprint-ignore+const unicodeESNextIdentifierStart = [65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2160, 2183, 2185, 2190, 2208, 2249, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3165, 3165, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3293, 3294, 3296, 3297, 3313, 3314, 3332, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5905, 5919, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6988, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69248, 69289, 69296, 69297, 69376, 69404, 69415, 69415, 69424, 69445, 69488, 69505, 69552, 69572, 69600, 69622, 69635, 69687, 69745, 69746, 69749, 69749, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69959, 69959, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70207, 70208, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70753, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71488, 71494, 71680, 71723, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71983, 71999, 71999, 72001, 72001, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73474, 73474, 73476, 73488, 73490, 73523, 73648, 73648, 73728, 74649, 74752, 74862, 74880, 75075, 77712, 77808, 77824, 78895, 78913, 78918, 82944, 83526, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 122624, 122654, 122661, 122666, 122928, 122989, 123136, 123180, 123191, 123197, 123214, 123214, 123536, 123565, 123584, 123627, 124112, 124139, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 191472, 192093, 194560, 195101, 196608, 201546, 201552, 205743];+// dprint-ignore+const unicodeESNextIdentifierPart = [48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2160, 2183, 2185, 2190, 2200, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2901, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3132, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3165, 3165, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3293, 3294, 3296, 3299, 3302, 3311, 3313, 3315, 3328, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3457, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3790, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5909, 5919, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6159, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6847, 6862, 6912, 6988, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43047, 43052, 43052, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69248, 69289, 69291, 69292, 69296, 69297, 69373, 69404, 69415, 69415, 69424, 69456, 69488, 69509, 69552, 69572, 69600, 69622, 69632, 69702, 69734, 69749, 69759, 69818, 69826, 69826, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69959, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70094, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70209, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70753, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71488, 71494, 71680, 71738, 71840, 71913, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71989, 71991, 71992, 71995, 72003, 72016, 72025, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73472, 73488, 73490, 73530, 73534, 73538, 73552, 73561, 73648, 73648, 73728, 74649, 74752, 74862, 74880, 75075, 77712, 77808, 77824, 78895, 78912, 78933, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92784, 92862, 92864, 92873, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94180, 94192, 94193, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 118528, 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122624, 122654, 122661, 122666, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 122928, 122989, 123023, 123023, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123536, 123566, 123584, 123641, 124112, 124153, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 130032, 130041, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 191472, 192093, 194560, 195101, 196608, 201546, 201552, 205743, 917760, 917999];+const commentDirectiveRegExSingleLine = /^\/\/\/?\s*@(ts-expect-error|ts-ignore)/;+const commentDirectiveRegExMultiLine = /^(?:\/|\*)*\s*@(ts-expect-error|ts-ignore)/;+const jsDocTagTerminators = new Set([" ", "\t", "\n", "\r", "}", "*"]);+function hasJSDocTag(text, offset, ...tags) {+ for (const tag of tags) {+ if (text.startsWith(tag, offset)) {+ if (offset + tag.length === text.length) {+ return true;+ }+ if (jsDocTagTerminators.has(text[offset + tag.length])) {+ return true;+ }+ }+ }+ return false;+}+function scanJSDocCommentForTags(text, tokenFlags) {+ let offset = 0;+ while (true) {+ const i = text.indexOf("@", offset);+ if (i < 0) {+ return tokenFlags;+ }+ offset = i + 1;+ if (!(tokenFlags & TokenFlags.PrecedingJSDocWithDeprecated) && hasJSDocTag(text, offset, "deprecated")) {+ tokenFlags |= TokenFlags.PrecedingJSDocWithDeprecated;+ }+ if (!(tokenFlags & TokenFlags.PrecedingJSDocWithSeeOrLink) && hasJSDocTag(text, offset, "see", "link", "linkcode", "linkplain")) {+ tokenFlags |= TokenFlags.PrecedingJSDocWithSeeOrLink;+ }+ if ((tokenFlags & (TokenFlags.PrecedingJSDocWithDeprecated | TokenFlags.PrecedingJSDocWithSeeOrLink)) ===+ (TokenFlags.PrecedingJSDocWithDeprecated | TokenFlags.PrecedingJSDocWithSeeOrLink)) {+ return tokenFlags;+ }+ }+}+function lookupInUnicodeMap(code, map) {+ if (code < map[0]) {+ return false;+ }+ let lo = 0;+ let hi = map.length;+ let mid;+ while (lo + 1 < hi) {+ mid = lo + (hi - lo) / 2;+ mid -= mid % 2;+ if (map[mid] <= code && code <= map[mid + 1]) {+ return true;+ }+ if (code < map[mid]) {+ hi = mid;+ }
… 1983 more lines (truncated)
--- +++ @@ -1,8 +1,28 @@-// This file is a shim which defers loading the real module until the compile cache is enabled.+#!/usr/bin/env node++import getExePath from "#getExePath";+import { execFileSync } from "node:child_process";++const exe = getExePath();++if (process.platform !== "win32" && typeof process.execve === "function") {+ // > v22.15.0+ try {+ process.execve(exe, [exe, ...process.argv.slice(2)]);+ }+ catch {+ // may not be available, ignore the error and fallback+ }+}+ try {- const { enableCompileCache } = require("node:module");- if (enableCompileCache) {- enableCompileCache();- }-} catch {}-module.exports = require("./_tsc.js");+ execFileSync(exe, process.argv.slice(2), { stdio: "inherit" });+}+catch (e) {+ if (e.status) {+ process.exitCode = e.status;+ }+ else {+ throw e;+ }+}
--- +++ @@ -0,0 +1,529 @@+/// <reference path="../node/node.d.ts" preserve="true" />+import { CompletionItemKind } from "#enums/completionItemKind";+import { DiagnosticCategory } from "#enums/diagnosticCategory";+import { ElementFlags } from "#enums/elementFlags";+import { ModuleKind } from "#enums/moduleKind";+import { NodeBuilderFlags } from "#enums/nodeBuilderFlags";+import { ObjectFlags } from "#enums/objectFlags";+import { SignatureFlags } from "#enums/signatureFlags";+import { SignatureKind } from "#enums/signatureKind";+import { SymbolFlags } from "#enums/symbolFlags";+import { TypeFlags } from "#enums/typeFlags";+import { TypePredicateKind } from "#enums/typePredicateKind";+import { type __String, type Expression, type Identifier, ModifierFlags, type Node, type Path, type SourceFile, type SyntaxKind, type TypeNode } from "../../ast/index.ts";+import type { APIOptions, LSPConnectionOptions } from "../options.ts";+import type { CompilerOptions, ConfigResponse, DocumentIdentifier, DocumentPosition, LSPUpdateSnapshotParams, ProjectResponse, SignatureResponse, SourceFileMetadata, SymbolResponse, TypeResponse, UpdateSnapshotParams, UpdateSnapshotResponse } from "../proto.ts";+import { SourceFileCache } from "../sourceFileCache.ts";+import type { RequestTiming, TimingAccumulators, TimingInfo } from "../timing.ts";+import { Client, type ClientSocketOptions, type ClientSpawnOptions } from "./client.ts";+import type { AssertsIdentifierTypePredicate, AssertsThisTypePredicate, BigIntLiteralType, BooleanLiteralType, CompletionEntry, CompletionInfo, CompletionOptions, ConditionalType, Diagnostic, FreshableType, IdentifierTypePredicate, IndexedAccessType, IndexInfo, IndexType, InterfaceType, IntersectionType, IntrinsicType, JSDocTagInfo, LiteralType, NumberLiteralType, ObjectType, StringLiteralType, StringMappingType, SubstitutionType, TemplateLiteralType, ThisTypePredicate, TupleType, Type, TypeParameter, TypePredicate, TypePredicateBase, TypeReference, UnionOrIntersectionType, UnionType } from "./types.ts";+export { documentURIToFileName, fileNameToDocumentURI } from "../path.ts";+export { CompletionItemKind, DiagnosticCategory, ElementFlags, ModifierFlags, ModuleKind, NodeBuilderFlags, ObjectFlags, SignatureFlags, SignatureKind, SymbolFlags, TypeFlags, TypePredicateKind };+export type { APIOptions, AssertsIdentifierTypePredicate, AssertsThisTypePredicate, BigIntLiteralType, BooleanLiteralType, ClientSocketOptions, ClientSpawnOptions, CompilerOptions, CompletionEntry, CompletionInfo, CompletionOptions, ConditionalType, Diagnostic, DocumentIdentifier, DocumentPosition, FreshableType, IdentifierTypePredicate, IndexedAccessType, IndexInfo, IndexType, InterfaceType, IntersectionType, IntrinsicType, JSDocTagInfo, LiteralType, LSPConnectionOptions, NumberLiteralType, ObjectType, RequestTiming, SourceFileMetadata, StringLiteralType, StringMappingType, SubstitutionType, TemplateLiteralType, ThisTypePredicate, TimingAccumulators, TimingInfo, TupleType, Type, TypeParameter, TypePredicate, TypePredicateBase, TypeReference, UnionOrIntersectionType, UnionType };+export declare class API<FromLSP extends boolean = false> {+ private client;+ private sourceFileCache;+ private toPath;+ private initialized;+ private activeSnapshots;+ private latestSnapshot;+ readonly internal: InternalAPI;+ constructor(options?: APIOptions | LSPConnectionOptions);+ /**+ * Create an API instance from an existing LSP connection's API session.+ * Use this when connecting to an API pipe provided by an LSP server via custom/initializeAPISession.+ */+ static fromLSPConnection(options: LSPConnectionOptions): Promise<API<true>>;+ private ensureInitialized;+ parseConfigFile(file: DocumentIdentifier): Promise<ConfigResponse>;+ updateSnapshot(params?: FromLSP extends true ? LSPUpdateSnapshotParams : UpdateSnapshotParams): Promise<Snapshot>;+ close(): Promise<void>;+ clearSourceFileCache(): void;+ /**+ * Returns a snapshot of collected timing information for requests made+ * through this API instance: client-measured round-trip latency and bytes+ * transferred, folded together with the server's own per-request processing+ * time and an estimated transport overhead (round-trip minus server time).+ *+ * Fetching the snapshot issues a lightweight request to the server to+ * retrieve its timing collection. Collection must be enabled via the+ * `collectTiming` option; when it is not, the returned snapshot has+ * `enabled: false` and zeroed totals.+ */+ getTimingInfo(): Promise<TimingInfo>;+ /** Clears all accumulated timing totals and recent-request history, on both the client and the server. */+ resetTimingInfo(): Promise<void>;+}+export declare class InternalAPI {+ private client;+ private ensureInitialized;+ /** @internal */+ constructor(client: Client, ensureInitialized: () => Promise<void>);+ startCPUProfile(dir: string): Promise<void>;+ stopCPUProfile(): Promise<string>;+ saveHeapProfile(dir: string): Promise<string>;+}+export declare class Snapshot {+ readonly id: number;+ private projectMap;+ private toPath;+ private client;+ private disposed;+ private onDispose;+ private snapshotRegistry;+ constructor(data: UpdateSnapshotResponse, client: Client, sourceFileCache: SourceFileCache, toPath: (fileName: string) => Path, onDispose: () => void);+ getProjects(): readonly Project[];+ getProject(configFileName: string): Project | undefined;+ getDefaultProjectForFile(file: DocumentIdentifier): Promise<Project | undefined>;+ [globalThis.Symbol.dispose](): void;+ dispose(): Promise<void>;+ isDisposed(): boolean;+ private ensureNotDisposed;+}+declare class SnapshotObjectRegistry {+ private readonly symbols;+ private readonly client;+ private readonly snapshotId;+ private readonly resolveProject;+ constructor(client: Client, snapshotId: number, resolveProject: (projectId: Path) => Project | undefined);+ /** Resolve a project id (a config file path) to its Project within this snapshot. */+ getProject(projectId: Path): Project | undefined;+ getOrCreateSymbol(data: SymbolResponse): Symbol;+ getSymbol(id: number): Symbol | undefined;+ clear(): void;+ fetchSymbol(source: Symbol | Signature | Type, method: string, handle: number | undefined, projectId?: Path): Promise<Symbol>;+ fetchSymbols(source: Symbol | Signature | Type, method: string, handles?: readonly number[], projectId?: Path): Promise<readonly Symbol[]>;+}+declare class ProjectObjectRegistry {+ private client;+ private snapshotId;+ private project;+ private snapshotRegistry;+ private types;+ private signatures;+ constructor(client: Client, snapshotId: number, project: Project, snapshotRegistry: SnapshotObjectRegistry);+ getOrCreateSymbol(data: SymbolResponse): Symbol;+ getSymbol(id: number): Symbol | undefined;+ getOrCreateType(data: TypeResponse): TypeObject;+ getType(id: number): TypeObject | undefined;+ getOrCreateSignature(data: SignatureResponse): Signature;+ getSignature(id: number): Signature | undefined;+ clear(): void;+ fetchType<T extends Type>(source: Symbol | Signature | Type, method: string, handle: number | false | undefined): Promise<T>;+ fetchSymbol(source: Symbol | Signature | Type, method: string, handle: number | undefined): Promise<Symbol>;+ fetchSignature(source: Symbol | Signature | Type, method: string, handle: number | undefined): Promise<Signature>;+ fetchTypes(source: Symbol | Signature | Type, method: string, handles?: readonly number[]): Promise<readonly Type[]>;+ fetchSymbols(source: Symbol | Signature | Type, method: string, handles?: readonly number[]): Promise<readonly Symbol[]>;+ fetchBaseTypes(source: Type): Promise<readonly Type[]>;+}+export declare class Project {+ readonly id: Path;+ readonly configFileName: string;+ readonly compilerOptions: CompilerOptions;+ readonly rootFiles: readonly string[];+ readonly program: Program;+ readonly checker: Checker;+ readonly emitter: Emitter;+ private client;+ constructor(data: ProjectResponse, snapshotId: number, client: Client, sourceFileCache: SourceFileCache, toPath: (fileName: string) => Path, snapshotRegistry: SnapshotObjectRegistry);+ dispose(): void;+}+export declare class Program {+ private snapshotId;+ private project;+ private client;+ private sourceFileCache;+ private toPath;+ private decoder;+ private sourceFileMetadataCache;+ constructor(snapshotId: number, project: Project, client: Client, sourceFileCache: SourceFileCache, toPath: (fileName: string) => Path);+ getCompilerOptions(): CompilerOptions;+ getSourceFile(file: DocumentIdentifier): Promise<SourceFile | undefined>;+ getSourceFileNames(): Promise<readonly string[]>;+ /**+ * Returns program-stored metadata for the given source file, or `undefined` if the file+ * is not part of the program. Metadata is fetched lazily per file and cached on this+ * `Program` instance.+ */+ getSourceFileMetadata(fileName: string): Promise<SourceFileMetadata | undefined>;+ /**+ * Returns program-stored metadata for the source file at the given path, or `undefined`+ * if the file is not part of the program. Like {@link getSourceFileMetadata}, but skips+ * the file name to path conversion. Metadata is fetched lazily per file and cached on+ * this `Program` instance.+ */+ getSourceFileMetadataByPath(path: Path): Promise<SourceFileMetadata | undefined>;+ private fetchSourceFileMetadata;+ /**+ * Returns whether the given source file was loaded as part of an external library+ * (e.g. a dependency resolved from `node_modules`). The underlying program metadata is+ * fetched lazily per file and cached on this `Program` instance.+ */+ isSourceFileFromExternalLibrary(file: SourceFile): Promise<boolean>;+ /**+ * Returns whether the given source file is a default library file (e.g. `lib.d.ts`).+ * The underlying program metadata is fetched lazily per file and cached on this+ * `Program` instance.+ */+ isSourceFileDefaultLibrary(file: SourceFile): Promise<boolean>;+ /**+ * Get syntactic (parse) diagnostics for a specific file or all files.+ * @param file - Optional file to get diagnostics for. If omitted, returns diagnostics for all files.+ */+ getSyntacticDiagnostics(file?: DocumentIdentifier): Promise<readonly Diagnostic[]>;+ /**+ * Get binder diagnostics for a specific file or all files.+ * @param file - Optional file to get diagnostics for. If omitted, returns diagnostics for all files.+ */+ getBindDiagnostics(file?: DocumentIdentifier): Promise<readonly Diagnostic[]>;+ /**+ * Get semantic (type-check) diagnostics for a specific file or all files.+ * @param file - Optional file to get diagnostics for. If omitted, returns diagnostics for all files.+ */+ getSemanticDiagnostics(file?: DocumentIdentifier): Promise<readonly Diagnostic[]>;+ /**+ * Get suggestion diagnostics for a specific file or all files.+ * @param file - Optional file to get diagnostics for. If omitted, returns diagnostics for all files.+ */+ getSuggestionDiagnostics(file?: DocumentIdentifier): Promise<readonly Diagnostic[]>;+ /**+ * Get declaration emit diagnostics for a specific file or all files.+ * @param file - Optional file to get diagnostics for. If omitted, returns diagnostics for all files.+ */+ getDeclarationDiagnostics(file?: DocumentIdentifier): Promise<readonly Diagnostic[]>;+ /**+ * Get program-wide diagnostics for the project, including compiler options diagnostics.+ */+ getProgramDiagnostics(): Promise<readonly Diagnostic[]>;+ /**+ * Get global (non-file-specific) semantic diagnostics for the project.+ */+ getGlobalDiagnostics(): Promise<readonly Diagnostic[]>;+ /**+ * Get config file parsing diagnostics for the project.+ */+ getConfigFileParsingDiagnostics(): Promise<readonly Diagnostic[]>;+}+export declare class Checker {+ private snapshotId;+ private project;+ private client;+ private objectRegistry;+ private wellKnownSymbols;+ constructor(snapshotId: number, project: Project, client: Client, objectRegistry: ProjectObjectRegistry);+ dispose(): void;+ getSymbolAtLocation(node: Node): Promise<Symbol | undefined>;+ getSymbolAtLocation(nodes: readonly Node[]): Promise<(Symbol | undefined)[]>;+ getSymbolAtPosition(file: DocumentIdentifier, position: number): Promise<Symbol | undefined>;+ getSymbolAtPosition(file: DocumentIdentifier, positions: readonly number[]): Promise<(Symbol | undefined)[]>;+ getTypeOfSymbol(symbol: Symbol): Promise<Type | undefined>;+ getTypeOfSymbol(symbols: readonly Symbol[]): Promise<(Type | undefined)[]>;+ /**+ * Get the declared type of a symbol. Always returns a type; for symbols whose+ * declared type cannot be determined the checker yields the error type (use+ * {@link Type.isErrorType} to detect it).+ */+ getDeclaredTypeOfSymbol(symbol: Symbol): Promise<Type>;+ getReferencesToSymbolInFile(file: DocumentIdentifier, symbol: Symbol): Promise<NodeHandle[]>;+ getReferencedSymbolsForNode(node: Node, position: number): Promise<ReferencedSymbolEntry[]>;+ getSignatureUsage(signatureDecl: Node): Promise<SignatureUsage[]>;+ getCompletionsAtPosition(document: string, position: number, options?: CompletionOptions): Promise<CompletionInfo | undefined>;+ getTypeAtLocation(node: Node): Promise<Type | undefined>;+ getTypeAtLocation(nodes: readonly Node[]): Promise<(Type | undefined)[]>;+ getSignaturesOfType(type: Type, kind: SignatureKind): Promise<readonly Signature[]>;+ getResolvedSignature(node: Node): Promise<Signature | undefined>;+ getTypeAtPosition(file: DocumentIdentifier, position: number): Promise<Type | undefined>;+ getTypeAtPosition(file: DocumentIdentifier, positions: readonly number[]): Promise<(Type | undefined)[]>;+ resolveName(name: string, meaning: SymbolFlags, location?: Node | DocumentPosition, excludeGlobals?: boolean): Promise<Symbol | undefined>;+ getResolvedSymbol(node: Identifier): Promise<Symbol | undefined>;+ getContextualType(node: Expression): Promise<Type | undefined>;+ getBaseTypeOfLiteralType(type: Type): Promise<Type | undefined>;+ getNonNullableType(type: Type): Promise<Type | undefined>;+ getTypeFromTypeNode(node: TypeNode): Promise<Type | undefined>;+ getWidenedType(type: Type): Promise<Type | undefined>;+ getParameterType(signature: Signature, index: number): Promise<Type | undefined>;+ isArrayLikeType(type: Type): Promise<boolean>;+ isTypeAssignableTo(source: Type, target: Type): Promise<boolean>;+ getShorthandAssignmentValueSymbol(node: Node): Promise<Symbol | undefined>;
… 282 more lines (truncated)
--- +++ @@ -0,0 +1,1657 @@+/// <reference path="../node/node.ts" preserve="true" />+import { CompletionItemKind } from "#enums/completionItemKind";+import { DiagnosticCategory } from "#enums/diagnosticCategory";+import { ElementFlags } from "#enums/elementFlags";+import { ModuleKind } from "#enums/moduleKind";+import { NodeBuilderFlags } from "#enums/nodeBuilderFlags";+import { ObjectFlags } from "#enums/objectFlags";+import { SignatureFlags } from "#enums/signatureFlags";+import { SignatureKind } from "#enums/signatureKind";+import { SymbolFlags } from "#enums/symbolFlags";+import { TypeFlags } from "#enums/typeFlags";+import { TypePredicateKind } from "#enums/typePredicateKind";+import { ModifierFlags, unescapeLeadingUnderscores, } from "../../ast/index.js";+import { encodeNode, uint8ArrayToBase64, } from "../node/encoder.js";+import { decodeNode, getNodeId, parseNodeHandle, readParseOptionsKey, readSourceFileHash, RemoteSourceFile, } from "../node/node.js";+import { Wtf8Decoder } from "../node/wtf8.js";+import { createGetCanonicalFileName, toPath, } from "../path.js";+import { resolveFileName, toUpdateSnapshotRequest, } from "../proto.js";+import { SourceFileCache } from "../sourceFileCache.js";+import { Client, } from "./client.js";+export { documentURIToFileName, fileNameToDocumentURI } from "../path.js";+export { CompletionItemKind, DiagnosticCategory, ElementFlags, ModifierFlags, ModuleKind, NodeBuilderFlags, ObjectFlags, SignatureFlags, SignatureKind, SymbolFlags, TypeFlags, TypePredicateKind };+export class API {+ client;+ sourceFileCache;+ toPath;+ initialized = false;+ activeSnapshots = new Set();+ latestSnapshot;+ internal;+ constructor(options = {}) {+ this.client = new Client(options);+ this.sourceFileCache = new SourceFileCache();+ this.internal = new InternalAPI(this.client, () => this.ensureInitialized());+ }+ /**+ * Create an API instance from an existing LSP connection's API session.+ * Use this when connecting to an API pipe provided by an LSP server via custom/initializeAPISession.+ */+ static async fromLSPConnection(options) {+ const api = new API(options);+ await api.ensureInitialized();+ return api;+ }+ async ensureInitialized() {+ if (!this.initialized) {+ const response = await this.client.apiRequest("initialize", null);+ const getCanonicalFileName = createGetCanonicalFileName(response.useCaseSensitiveFileNames);+ const currentDirectory = response.currentDirectory;+ this.toPath = (fileName) => toPath(fileName, currentDirectory, getCanonicalFileName);+ this.initialized = true;+ }+ }+ async parseConfigFile(file) {+ await this.ensureInitialized();+ return this.client.apiRequest("parseConfigFile", { file });+ }+ async updateSnapshot(params) {+ await this.ensureInitialized();+ const requestParams = toUpdateSnapshotRequest(params);+ const data = await this.client.apiRequest("updateSnapshot", requestParams);+ // Retain cached source files from previous snapshot for unchanged files+ if (this.latestSnapshot) {+ this.sourceFileCache.retainForSnapshot(data.snapshot, this.latestSnapshot.id, data.changes);+ if (this.latestSnapshot.isDisposed()) {+ this.sourceFileCache.releaseSnapshot(this.latestSnapshot.id);+ }+ }+ const snapshot = new Snapshot(data, this.client, this.sourceFileCache, this.toPath, () => {+ this.activeSnapshots.delete(snapshot);+ if (snapshot !== this.latestSnapshot) {+ this.sourceFileCache.releaseSnapshot(snapshot.id);+ }+ });+ this.latestSnapshot = snapshot;+ this.activeSnapshots.add(snapshot);+ return snapshot;+ }+ async close() {+ // Dispose all active snapshots+ for (const snapshot of [...this.activeSnapshots]) {+ await snapshot.dispose();+ }+ // Release the latest snapshot's cache refs if still held+ if (this.latestSnapshot) {+ this.sourceFileCache.releaseSnapshot(this.latestSnapshot.id);+ this.latestSnapshot = undefined;+ }+ await this.client.close();+ this.sourceFileCache.clear();+ }+ clearSourceFileCache() {+ this.sourceFileCache.clear();+ }+ /**+ * Returns a snapshot of collected timing information for requests made+ * through this API instance: client-measured round-trip latency and bytes+ * transferred, folded together with the server's own per-request processing+ * time and an estimated transport overhead (round-trip minus server time).+ *+ * Fetching the snapshot issues a lightweight request to the server to+ * retrieve its timing collection. Collection must be enabled via the+ * `collectTiming` option; when it is not, the returned snapshot has+ * `enabled: false` and zeroed totals.+ */+ getTimingInfo() {+ return this.client.getTimingInfo();+ }+ /** Clears all accumulated timing totals and recent-request history, on both the client and the server. */+ resetTimingInfo() {+ return this.client.resetTimingInfo();+ }+}+export class InternalAPI {+ client;+ ensureInitialized;+ /** @internal */+ constructor(client, ensureInitialized) {+ this.client = client;+ this.ensureInitialized = ensureInitialized;+ }+ async startCPUProfile(dir) {+ await this.ensureInitialized();+ await this.client.apiRequest("startCPUProfile", { dir });+ }+ async stopCPUProfile() {+ await this.ensureInitialized();+ const result = await this.client.apiRequest("stopCPUProfile", null);+ return result.file;+ }+ async saveHeapProfile(dir) {+ await this.ensureInitialized();+ const result = await this.client.apiRequest("saveHeapProfile", { dir });+ return result.file;+ }+}+export class Snapshot {+ id;+ projectMap;+ toPath;+ client;+ disposed = false;+ onDispose;+ snapshotRegistry;+ constructor(data, client, sourceFileCache, toPath, onDispose) {+ this.id = data.snapshot;+ this.client = client;+ this.toPath = toPath;+ this.onDispose = onDispose;+ this.projectMap = new Map();+ this.snapshotRegistry = new SnapshotObjectRegistry(client, this.id, projectId => this.projectMap.get(projectId));+ for (const projData of data.projects) {+ const project = new Project(projData, this.id, client, sourceFileCache, toPath, this.snapshotRegistry);+ this.projectMap.set(toPath(projData.configFileName), project);+ }+ }+ getProjects() {+ this.ensureNotDisposed();+ return [...this.projectMap.values()];+ }+ getProject(configFileName) {+ this.ensureNotDisposed();+ return this.projectMap.get(this.toPath(configFileName));+ }+ async getDefaultProjectForFile(file) {+ this.ensureNotDisposed();+ const data = await this.client.apiRequest("getDefaultProjectForFile", {+ snapshot: this.id,+ file,+ });+ if (!data)+ return undefined;+ return this.projectMap.get(this.toPath(data.configFileName));+ }+ [globalThis.Symbol.dispose]() {+ this.dispose();+ }+ async dispose() {+ if (this.disposed)+ return;+ this.disposed = true;+ for (const project of this.projectMap.values()) {+ project.dispose();+ }+ this.projectMap.clear();+ this.snapshotRegistry.clear();+ this.onDispose();+ await this.client.apiRequest("release", { snapshot: this.id });+ }+ isDisposed() {+ return this.disposed;+ }+ ensureNotDisposed() {+ if (this.disposed) {+ throw new Error("Snapshot is disposed");+ }+ }+}+class SnapshotObjectRegistry {+ symbols = new Map();+ client;+ snapshotId;+ resolveProject;+ constructor(client, snapshotId, resolveProject) {+ this.client = client;+ this.snapshotId = snapshotId;+ this.resolveProject = resolveProject;+ }+ /** Resolve a project id (a config file path) to its Project within this snapshot. */+ getProject(projectId) {+ return this.resolveProject(projectId);+ }+ getOrCreateSymbol(data) {+ let symbol = this.symbols.get(data.id);+ if (!symbol) {+ symbol = new Symbol(data, this);+ this.symbols.set(data.id, symbol);+ }+ return symbol;+ }+ getSymbol(id) {+ return this.symbols.get(id);+ }+ clear() {+ this.symbols.clear();+ }+ async fetchSymbol(source, method, handle, projectId) {+ if (!handle)+ return undefined;+ const cached = this.getSymbol(handle);+ if (cached)+ return cached;+ const data = await this.client.apiRequest(method, {+ snapshot: this.snapshotId,+ project: projectId,+ objectId: source.id,+ });+ if (!data)+ throw new Error(`${method} returned null symbol for ${source.constructor.name} ${source.id}`);+ return this.getOrCreateSymbol(data);+ }+ async fetchSymbols(source, method, handles, projectId) {+ if (handles) {+ const result = new Array(handles.length);+ let allCached = true;+ for (let i = 0; i < handles.length; i++) {+ const cached = this.getSymbol(handles[i]);
… 1410 more lines (truncated)
--- +++ @@ -0,0 +1,39 @@+import { type ClientOptions, type ClientSocketOptions, type ClientSpawnOptions } from "../options.ts";+import { TimingCollector, type TimingInfo } from "../timing.ts";+export type { ClientOptions, ClientSocketOptions, ClientSpawnOptions };+/**+ * Client handles communication with the TypeScript API server+ * over STDIO (spawned process) or a Unix domain socket using JSON-RPC.+ */+export declare class Client {+ private socket;+ private process;+ private connection;+ private options;+ private connected;+ private timing;+ constructor(options: ClientOptions);+ connect(): Promise<void>;+ private connectViaSpawn;+ private connectViaSocket;+ private registerFSCallbacks;+ apiRequest<T>(method: string, params?: unknown): Promise<T>;+ apiRequestBinary(method: string, params?: unknown): Promise<Uint8Array | undefined>;+ /**+ * Returns the timing collector that per-node materialization is reported+ * into, or undefined when timing collection is disabled. The returned+ * collector is the same one folded into {@link getTimingInfo}, so+ * materialization totals surface alongside request timings.+ */+ getTimingCollector(): TimingCollector | undefined;+ /**+ * Returns a combined timing snapshot: client-measured round-trip and byte+ * counts folded together with the server's own per-request processing time+ * (fetched via a getServerTiming request) and estimated transport overhead.+ */+ getTimingInfo(): Promise<TimingInfo>;+ resetTimingInfo(): Promise<void>;+ private fetchServerTiming;+ close(): Promise<void>;+}+//# sourceMappingURL=client.d.ts.map
--- +++ @@ -0,0 +1,310 @@+import type { CompletionItemKind } from "#enums/completionItemKind";+import type { DiagnosticCategory } from "#enums/diagnosticCategory";+import type { ElementFlags } from "#enums/elementFlags";+import type { ObjectFlags } from "#enums/objectFlags";+import type { TypeFlags } from "#enums/typeFlags";+import type { TypePredicateKind } from "#enums/typePredicateKind";+import type { NodeHandle, Symbol } from "./api.ts";+/**+ * A TypeScript type.+ *+ * Use TypeFlags to determine the specific kind of type and access+ * kind-specific properties. For example:+ *+ * ```ts+ * if (type.flags & TypeFlags.StringLiteral) {+ * console.log((type as StringLiteralType).value); // string+ * }+ * ```+ */+export interface Type {+ /** Type flags — use to determine the specific kind of type. */+ readonly flags: TypeFlags;+ /** Unique identifier for this type */+ readonly id: number;+ /** Get the symbol associated with this type, if any */+ getSymbol(): Promise<Symbol | undefined>;+ /** Get the type arguments of the type alias this type was instantiated from, if any */+ getAliasTypeArguments(): Promise<readonly Type[]>;+ /** Get the symbol of the type alias this type was instantiated from, if any */+ getAliasSymbol(): Promise<Symbol | undefined>;+ /**+ * Get the base types of this type, or `undefined` if it is not a class or+ * interface type.+ */+ getBaseTypes(): Promise<readonly Type[] | undefined>;+ /** Whether this type is a class or interface type */+ isClassOrInterface(): this is InterfaceType;+ /** Whether this type is a union type */+ isUnionType(): this is UnionType;+ /** Whether this type is an intersection type */+ isIntersectionType(): this is IntersectionType;+ /** Whether this type is an object type */+ isObjectType(): this is ObjectType;+ /** Whether this type is an intrinsic primitive type */+ isIntrinsicType(): this is IntrinsicType;+ /**+ * Whether this is the error type — the placeholder produced when a type+ * cannot be determined (e.g. an unresolved reference).+ */+ isErrorType(): boolean;+ /** Whether this type is a literal type */+ isLiteralType(): this is LiteralType;+ /** Whether this type is a string literal type */+ isStringLiteralType(): this is StringLiteralType;+ /** Whether this type is a number literal type */+ isNumberLiteralType(): this is NumberLiteralType;+ /** Whether this type is a bigint literal type */+ isBigIntLiteralType(): this is BigIntLiteralType;+ /** Whether this type is a boolean literal type */+ isBooleanLiteralType(): this is BooleanLiteralType;+ /** Whether this type is a type reference */+ isTypeReference(): this is TypeReference;+ /** Whether this type is a tuple type */+ isTupleType(): this is TupleType;+ /** Whether this type is an index type (`keyof T`) */+ isIndexType(): this is IndexType;+ /** Whether this type is an indexed access type (`T[K]`) */+ isIndexedAccessType(): this is IndexedAccessType;+ /** Whether this type is a conditional type */+ isConditionalType(): this is ConditionalType;+ /** Whether this type is a substitution type */+ isSubstitutionType(): this is SubstitutionType;+ /** Whether this type is a template literal type */+ isTemplateLiteralType(): this is TemplateLiteralType;+ /** Whether this type is a string mapping type */+ isStringMappingType(): this is StringMappingType;+ /** Whether this type is a type parameter */+ isTypeParameter(): this is TypeParameter;+}+/**+ * Freshable types (TypeFlags.Freshable) - literal types (TypeFlags.Literal) and computed enum types (TypeFlags.Enum).+ */+export interface FreshableType extends Type {+ /** Get the fresh version of this type, if any */+ getFreshType(): Promise<FreshableType | undefined>;+ /** Get the regular (non-fresh) version of this type, if any */+ getRegularType(): Promise<FreshableType | undefined>;+}+/** Literal types: StringLiteral, NumberLiteral, BigIntLiteral, BooleanLiteral */+export interface LiteralType extends FreshableType {+ /** The literal value. Use TypeFlags to narrow to a specific literal subtype with a concrete value type. */+ readonly value: string | number | boolean | bigint;+}+/** String literal types (TypeFlags.StringLiteral) */+export interface StringLiteralType extends LiteralType {+ /** The string value of the literal */+ readonly value: string;+}+/** Numeric literal types (TypeFlags.NumberLiteral) */+export interface NumberLiteralType extends LiteralType {+ /** The numeric value of the literal */+ readonly value: number;+}+/** BigInt literal types (TypeFlags.BigIntLiteral) */+export interface BigIntLiteralType extends LiteralType {+ /** The bigint value of the literal */+ readonly value: bigint;+}+/** Boolean literal types (TypeFlags.BooleanLiteral) */+export interface BooleanLiteralType extends LiteralType {+ /** The boolean value of the literal */+ readonly value: boolean;+}+/** Object types (TypeFlags.Object) */+export interface ObjectType extends Type {+ /** Object flags — use to determine the specific kind of object type. */+ readonly objectFlags: ObjectFlags;+}+/** Type references (ObjectFlags.Reference) — e.g. Array<string>, Map<K, V> */+export interface TypeReference extends ObjectType {+ /** Get the generic target type (e.g. Array for Array<string>) */+ getTarget(): Promise<Type>;+}+/** Interface types — classes and interfaces (ObjectFlags.ClassOrInterface) */+export interface InterfaceType extends TypeReference {+ /** Get all type parameters (outer + local, excluding thisType) */+ getTypeParameters(): Promise<readonly TypeParameter[]>;+ /** Get outer type parameters from enclosing declarations */+ getOuterTypeParameters(): Promise<readonly TypeParameter[]>;+ /** Get local type parameters declared on this interface/class */+ getLocalTypeParameters(): Promise<readonly TypeParameter[]>;+}+/** Tuple types (ObjectFlags.Tuple) */+export interface TupleType extends InterfaceType {+ /** Per-element flags (Required, Optional, Rest, Variadic) */+ readonly elementFlags: readonly ElementFlags[];+ /** Number of initial required or optional elements */+ readonly fixedLength: number;+ /** Whether the tuple is readonly */+ readonly readonly: boolean;+}+/** Union or intersection types (TypeFlags.Union | TypeFlags.Intersection) */+export interface UnionOrIntersectionType extends Type {+ /** Get the constituent types */+ getTypes(): Promise<readonly Type[]>;+}+/** Union types (TypeFlags.Union) */+export interface UnionType extends UnionOrIntersectionType {+}+/** Intersection types (TypeFlags.Intersection) */+export interface IntersectionType extends UnionOrIntersectionType {+}+/** Type parameters (TypeFlags.TypeParameter) */+export interface TypeParameter extends Type {+ /** True if this is the synthetic `this` type of an interface, class, or tuple */+ readonly isThisType?: boolean | undefined;+}+/** Index types — keyof T (TypeFlags.Index) */+export interface IndexType extends Type {+ /** Get the target type T in `keyof T` */+ getTarget(): Promise<Type>;+}+/** Indexed access types — T[K] (TypeFlags.IndexedAccess) */+export interface IndexedAccessType extends Type {+ /** Get the object type T in `T[K]` */+ getObjectType(): Promise<Type>;+ /** Get the index type K in `T[K]` */+ getIndexType(): Promise<Type>;+}+/** Conditional types — T extends U ? X : Y (TypeFlags.Conditional) */+export interface ConditionalType extends Type {+ /** Get the check type T in `T extends U ? X : Y` */+ getCheckType(): Promise<Type>;+ /** Get the extends type U in `T extends U ? X : Y` */+ getExtendsType(): Promise<Type>;+ /** Get the true type X in `T extends U ? X : Y` */+ getTrueType(): Promise<Type>;+ /** Get the false type Y in `T extends U ? X : Y` */+ getFalseType(): Promise<Type>;+}+/** Substitution types (TypeFlags.Substitution) */+export interface SubstitutionType extends Type {+ getBaseType(): Promise<Type>;+ getConstraint(): Promise<Type>;+}+/** Template literal types (TypeFlags.TemplateLiteral) */+export interface TemplateLiteralType extends Type {+ /** Text segments (always one more than the number of type spans) */+ readonly texts: readonly string[];+ /** Get the types interspersed between text segments */+ getTypes(): Promise<readonly Type[]>;+}+/** String mapping types — Uppercase<T>, Lowercase<T>, etc. (TypeFlags.StringMapping) */+export interface StringMappingType extends Type {+ /** Get the mapped type */+ getTarget(): Promise<Type>;+}+/** Intrinsic types — any, unknown, string, number, bigint, symbol, void, undefined, null, never, object (TypeFlags.Intrinsic) */+export interface IntrinsicType extends Type {+ /** The intrinsic type name (e.g. "any", "string", "never") */+ readonly intrinsicName: string;+}+/** Base for all type predicates */+export interface TypePredicateBase {+ readonly kind: TypePredicateKind;+ readonly type: Type | undefined;+}+/** `this is T` */+export interface ThisTypePredicate extends TypePredicateBase {+ readonly kind: TypePredicateKind.This;+ readonly parameterName: undefined;+ readonly parameterIndex: undefined;+ readonly type: Type;+}+/** `x is T` */+export interface IdentifierTypePredicate extends TypePredicateBase {+ readonly kind: TypePredicateKind.Identifier;+ readonly parameterName: string;+ readonly parameterIndex: number;+ readonly type: Type;+}+/** `asserts this is T` */+export interface AssertsThisTypePredicate extends TypePredicateBase {+ readonly kind: TypePredicateKind.AssertsThis;+ readonly parameterName: undefined;+ readonly parameterIndex: undefined;+ readonly type: Type | undefined;+}+/** `asserts x is T` */+export interface AssertsIdentifierTypePredicate extends TypePredicateBase {+ readonly kind: TypePredicateKind.AssertsIdentifier;+ readonly parameterName: string;+ readonly parameterIndex: number;+ readonly type: Type | undefined;+}+/** A type predicate — e.g. `x is T` or `asserts x is T` */+export type TypePredicate = ThisTypePredicate | IdentifierTypePredicate | AssertsThisTypePredicate | AssertsIdentifierTypePredicate;+/** An index signature — e.g. `[key: string]: T` */+export interface IndexInfo {+ /** The index key type (e.g. string or number) */+ readonly keyType: Type;+ /** The index value type */+ readonly valueType: Type;+ /** Whether the index signature is readonly */+ readonly isReadonly: boolean;+ /** The index signature declaration, if any */+ readonly declaration?: NodeHandle | undefined;
… 63 more lines (truncated)
--- +++ @@ -0,0 +1,2 @@+export {};+//# sourceMappingURL=types.js.map
--- +++ @@ -0,0 +1,109 @@+import type { JsxEmit } from "#enums/jsxEmit";+import type { ModuleDetectionKind } from "#enums/moduleDetectionKind";+import type { ModuleKind } from "#enums/moduleKind";+import type { ModuleResolutionKind } from "#enums/moduleResolutionKind";+import type { NewLineKind } from "#enums/newLineKind";+import type { ScriptTarget } from "#enums/scriptTarget";+export interface CompilerOptions {+ allowJs?: boolean;+ allowArbitraryExtensions?: boolean;+ allowImportingTsExtensions?: boolean;+ allowNonTsExtensions?: boolean;+ allowUmdGlobalAccess?: boolean;+ allowUnreachableCode?: boolean;+ allowUnusedLabels?: boolean;+ assumeChangesOnlyAffectDirectDependencies?: boolean;+ checkJs?: boolean;+ customConditions?: string[];+ composite?: boolean;+ emitDeclarationOnly?: boolean;+ emitBOM?: boolean;+ emitDecoratorMetadata?: boolean;+ declaration?: boolean;+ declarationDir?: string;+ declarationMap?: boolean;+ deduplicatePackages?: boolean;+ disableSizeLimit?: boolean;+ disableSourceOfProjectReferenceRedirect?: boolean;+ disableSolutionSearching?: boolean;+ disableReferencedProjectLoad?: boolean;+ erasableSyntaxOnly?: boolean;+ exactOptionalPropertyTypes?: boolean;+ experimentalDecorators?: boolean;+ forceConsistentCasingInFileNames?: boolean;+ isolatedModules?: boolean;+ isolatedDeclarations?: boolean;+ ignoreConfig?: boolean;+ ignoreDeprecations?: string;+ importHelpers?: boolean;+ inlineSourceMap?: boolean;+ inlineSources?: boolean;+ init?: boolean;+ incremental?: boolean;+ jsx?: JsxEmit;+ jsxFactory?: string;+ jsxFragmentFactory?: string;+ jsxImportSource?: string;+ lib?: string[];+ libReplacement?: boolean;+ locale?: string;+ mapRoot?: string;+ module?: ModuleKind;+ moduleResolution?: ModuleResolutionKind;+ moduleSuffixes?: string[];+ moduleDetection?: ModuleDetectionKind;+ newLine?: NewLineKind;+ noEmit?: boolean;+ noCheck?: boolean;+ noErrorTruncation?: boolean;+ noFallthroughCasesInSwitch?: boolean;+ noImplicitAny?: boolean;+ noImplicitThis?: boolean;+ noImplicitReturns?: boolean;+ noEmitHelpers?: boolean;+ noLib?: boolean;+ noPropertyAccessFromIndexSignature?: boolean;+ noUncheckedIndexedAccess?: boolean;+ noEmitOnError?: boolean;+ noUnusedLocals?: boolean;+ noUnusedParameters?: boolean;+ noResolve?: boolean;+ noImplicitOverride?: boolean;+ noUncheckedSideEffectImports?: boolean;+ outDir?: string;+ paths?: Record<string, string[]>;+ preserveConstEnums?: boolean;+ preserveSymlinks?: boolean;+ project?: string;+ resolveJsonModule?: boolean;+ resolvePackageJsonExports?: boolean;+ resolvePackageJsonImports?: boolean;+ removeComments?: boolean;+ rewriteRelativeImportExtensions?: boolean;+ reactNamespace?: string;+ rootDir?: string;+ rootDirs?: string[];+ skipLibCheck?: boolean;+ stableTypeOrdering?: boolean;+ strict?: boolean;+ strictBindCallApply?: boolean;+ strictBuiltinIteratorReturn?: boolean;+ strictFunctionTypes?: boolean;+ strictNullChecks?: boolean;+ strictPropertyInitialization?: boolean;+ stripInternal?: boolean;+ skipDefaultLibCheck?: boolean;+ sourceMap?: boolean;+ sourceRoot?: string;+ suppressOutputPathCheck?: boolean;+ target?: ScriptTarget;+ traceResolution?: boolean;+ tsBuildInfoFile?: string;+ typeRoots?: string[];+ types?: string[];+ useDefineForClassFields?: boolean;+ useUnknownInCatchVariables?: boolean;+ verbatimModuleSyntax?: boolean;+ maxNodeModuleJsDepth?: number;+}+//# sourceMappingURL=compilerOptions.d.ts.map
--- +++ @@ -0,0 +1,2 @@+export {};+//# sourceMappingURL=compilerOptions.js.map
--- +++ @@ -0,0 +1,23 @@+export interface FileSystemEntries {+ files: string[];+ directories: string[];+}+export interface FileSystem {+ directoryExists?: (directoryName: string) => boolean | undefined;+ fileExists?: (fileName: string) => boolean | undefined;+ getAccessibleEntries?: (directoryName: string) => FileSystemEntries | undefined;+ /**+ * Read a file's content.+ * - Return the file content as a `string` (including `""` for empty files).+ * - Return `null` to indicate the file does not exist (without falling back to the real FS).+ * - Return `undefined` to fall back to the real filesystem.+ */+ readFile?: (fileName: string) => string | null | undefined;+ realpath?: (path: string) => string | undefined;+ writeFile?: (path: string, content: string) => void;+ removeFile?: (path: string) => void;+}+/** The callback names supported by the Go server for virtual FS delegation. */+export declare const fsCallbackNames: readonly ["readFile", "fileExists", "directoryExists", "getAccessibleEntries", "realpath"];+export declare function createVirtualFileSystem(files: Record<string, string>): FileSystem;+//# sourceMappingURL=fs.d.ts.map
--- +++ @@ -0,0 +1,109 @@+import { getPathComponents } from "./path.js";+/** The callback names supported by the Go server for virtual FS delegation. */+export const fsCallbackNames = ["readFile", "fileExists", "directoryExists", "getAccessibleEntries", "realpath"];+export function createVirtualFileSystem(files) {+ const root = {+ type: "directory",+ children: {},+ };+ const content = {};+ for (const filePath of Object.keys(files)) {+ content[filePath] = files[filePath];+ addToTree(filePath);+ }+ return {+ directoryExists,+ fileExists,+ getAccessibleEntries,+ readFile,+ realpath: path => path,+ writeFile,+ removeFile,+ };+ function getNodeFromPath(path) {+ if (!path || path === "/") {+ return root;+ }+ const segments = getPathComponents(path).slice(1);+ let current = root;+ for (const segment of segments) {+ if (current.type !== "directory") {+ return undefined;+ }+ const child = current.children[segment];+ if (!child) {+ return undefined;+ }+ current = child;+ }+ return current;+ }+ function ensureDirectory(segments) {+ let current = root;+ for (const segment of segments) {+ if (!current.children[segment]) {+ current.children[segment] = { type: "directory", children: {} };+ }+ else if (current.children[segment].type !== "directory") {+ throw new Error(`Cannot create directory: a file already exists at "/${segments.join("/")}"`);+ }+ current = current.children[segment];+ }+ return current;+ }+ function addToTree(path) {+ const segments = getPathComponents(path).slice(1);+ if (segments.length === 0) {+ throw new Error(`Invalid file path: "${path}"`);+ }+ const filename = segments.pop();+ const dirNode = ensureDirectory(segments);+ dirNode.children[filename] = { type: "file" };+ }+ function writeFile(path, data) {+ content[path] = data;+ addToTree(path);+ }+ function removeFile(path) {+ delete content[path];+ const segments = getPathComponents(path).slice(1);+ if (segments.length === 0)+ return;+ const filename = segments.pop();+ const dirNode = getNodeFromPath("/" + segments.join("/"));+ if (dirNode && dirNode.type === "directory") {+ delete dirNode.children[filename];+ }+ }+ function directoryExists(directoryName) {+ const node = getNodeFromPath(directoryName);+ return !!node && node.type === "directory";+ }+ function fileExists(fileName) {+ return fileName in content;+ }+ function getAccessibleEntries(directoryName) {+ const node = getNodeFromPath(directoryName);+ if (!node || node.type !== "directory") {+ return undefined;+ }+ const fileEntries = [];+ const directories = [];+ for (const [name, child] of Object.entries(node.children)) {+ if (child.type === "file") {+ fileEntries.push(name);+ }+ else {+ directories.push(name);+ }+ }+ return { files: fileEntries, directories };+ }+ function readFile(fileName) {+ if (fileName in content) {+ return content[fileName];+ }+ return undefined;+ }+}+//# sourceMappingURL=fs.js.map
--- +++ @@ -0,0 +1,15 @@+import type { Node, SourceFile } from "../../ast/index.ts";+/**+ * Encode a SourceFile AST node into the binary format.+ */+export declare function encodeSourceFile(sourceFile: SourceFile): Uint8Array;+/**+ * Encode an arbitrary AST node into the binary format.+ * When encoding a non-SourceFile node, the header hash and parse options fields will be zero.+ */+export declare function encodeNode(node: Node): Uint8Array;+/**+ * Encode a Uint8Array to a base64 string.+ */+export declare function uint8ArrayToBase64(data: Uint8Array): string;+//# sourceMappingURL=encoder.d.ts.map
--- +++ @@ -0,0 +1,5 @@+import type { Node } from "../../ast/index.ts";+import { SyntaxKind } from "../../ast/index.ts";+export declare function getNodeDataType(kind: SyntaxKind): number;+export declare function getNodeCommonData(node: Node): number;+//# sourceMappingURL=encoder.generated.d.ts.map
--- +++ @@ -0,0 +1,74 @@+// Code generated by _scripts/generate-encoder.ts. DO NOT EDIT.+import { SyntaxKind } from "../../ast/index.js";+import { NODE_DATA_TYPE_CHILDREN, NODE_DATA_TYPE_EXTENDED, NODE_DATA_TYPE_STRING, } from "./protocol.js";+export function getNodeDataType(kind) {+ switch (kind) {+ case SyntaxKind.Identifier:+ case SyntaxKind.PrivateIdentifier:+ case SyntaxKind.JsxText:+ case SyntaxKind.JSDocText:+ case SyntaxKind.JSDocLink:+ case SyntaxKind.JSDocLinkPlain:+ case SyntaxKind.JSDocLinkCode:+ return NODE_DATA_TYPE_STRING;+ case SyntaxKind.StringLiteral:+ case SyntaxKind.NumericLiteral:+ case SyntaxKind.BigIntLiteral:+ case SyntaxKind.RegularExpressionLiteral:+ case SyntaxKind.NoSubstitutionTemplateLiteral:+ case SyntaxKind.TemplateHead:+ case SyntaxKind.TemplateMiddle:+ case SyntaxKind.TemplateTail:+ case SyntaxKind.SourceFile:+ return NODE_DATA_TYPE_EXTENDED;+ default:+ return NODE_DATA_TYPE_CHILDREN;+ }+}+export function getNodeCommonData(node) {+ switch (node.kind) {+ case SyntaxKind.Block:+ return (node.multiLine ? 1 : 0) << 24;+ case SyntaxKind.HeritageClause:+ return (node.token === SyntaxKind.ImplementsKeyword ? 1 : 0) << 24;+ case SyntaxKind.ExportAssignment:+ return (node.isExportEquals ? 1 : 0) << 24;+ case SyntaxKind.ExportSpecifier:+ return (node.isTypeOnly ? 1 : 0) << 24;+ case SyntaxKind.PrefixUnaryExpression:+ return (node.operator === SyntaxKind.MinusToken ? 1 : node.operator === SyntaxKind.TildeToken ? 2 : node.operator === SyntaxKind.ExclamationToken ? 3 : node.operator === SyntaxKind.PlusPlusToken ? 4 : node.operator === SyntaxKind.MinusMinusToken ? 5 : 0) << 24;+ case SyntaxKind.PostfixUnaryExpression:+ return (node.operator === SyntaxKind.MinusMinusToken ? 1 : 0) << 24;+ case SyntaxKind.MetaProperty:+ return (node.keywordToken === SyntaxKind.NewKeyword ? 1 : 0) << 24;+ case SyntaxKind.ArrayLiteralExpression:+ return (node.multiLine ? 1 : 0) << 24;+ case SyntaxKind.ObjectLiteralExpression:+ return (node.multiLine ? 1 : 0) << 24;+ case SyntaxKind.TypeOperator:+ return (node.operator === SyntaxKind.ReadonlyKeyword ? 1 : node.operator === SyntaxKind.UniqueKeyword ? 2 : 0) << 24;+ case SyntaxKind.ImportAttributes:+ return (node.multiLine ? 1 : 0) << 24 | (node.token === SyntaxKind.AssertKeyword ? 1 : 0) << 25;+ case SyntaxKind.JsxText:+ return (node.containsOnlyTriviaWhiteSpaces ? 1 : 0) << 24;+ case SyntaxKind.ModuleDeclaration:+ return (node.keyword === SyntaxKind.NamespaceKeyword ? 1 : 0) << 24;+ case SyntaxKind.ImportEqualsDeclaration:+ return (node.isTypeOnly ? 1 : 0) << 24;+ case SyntaxKind.ExportDeclaration:+ return (node.isTypeOnly ? 1 : 0) << 24;+ case SyntaxKind.ImportType:+ return (node.isTypeOf ? 1 : 0) << 24;+ case SyntaxKind.ImportClause:+ return (node.phaseModifier === SyntaxKind.TypeKeyword ? 1 : node.phaseModifier === SyntaxKind.DeferKeyword ? 2 : 0) << 24;+ case SyntaxKind.ImportSpecifier:+ return (node.isTypeOnly ? 1 : 0) << 24;+ case SyntaxKind.JSDocTypeLiteral:+ return (node.isArrayType ? 1 : 0) << 24;+ case SyntaxKind.JSDocParameterTag:+ case SyntaxKind.JSDocPropertyTag:+ return (node.isBracketed ? 1 : 0) << 24 | (node.isNameFirst ? 1 : 0) << 25;+ }+ return 0;+}+//# sourceMappingURL=encoder.generated.js.map
--- +++ @@ -0,0 +1,287 @@+import { SyntaxKind } from "../../ast/index.js";+import { getNodeCommonData, getNodeDataType, } from "./encoder.generated.js";+import { MsgpackWriter } from "./msgpack.js";+import { childProperties, HEADER_OFFSET_EXTENDED_DATA, HEADER_OFFSET_METADATA, HEADER_OFFSET_NODES, HEADER_OFFSET_STRING_TABLE, HEADER_OFFSET_STRING_TABLE_OFFSETS, HEADER_OFFSET_STRUCTURED_DATA, HEADER_SIZE, KIND_NODE_LIST, NODE_DATA_TYPE_CHILDREN, NODE_DATA_TYPE_EXTENDED, NODE_DATA_TYPE_STRING, NODE_LEN, PROTOCOL_VERSION, } from "./protocol.js";+const NODE_FIELDS = NODE_LEN / 4;+const NODE_FIELD_NEXT = 3;+const NO_STRUCTURED_DATA = 0xFFFFFFFF;+// String table that accumulates strings into a flat byte pool.+class StringTable {+ parts;+ byteLen;+ offsets;+ constructor() {+ this.parts = [];+ this.byteLen = 0;+ this.offsets = [];+ }+ add(text) {+ const index = this.offsets.length;+ const encoder = cachedEncoder();+ const encodedLength = encoder.encode(text).length;+ const offset = this.byteLen;+ this.parts.push(text);+ this.byteLen += encodedLength;+ this.offsets.push(offset, offset + encodedLength);+ return index;+ }+ encode() {+ const encoder = cachedEncoder();+ const dataBytes = encoder.encode(this.parts.join(""));+ const offsetBytes = new Uint8Array(this.offsets.length * 4);+ const view = new DataView(offsetBytes.buffer);+ for (let i = 0; i < this.offsets.length; i++) {+ view.setUint32(i * 4, this.offsets[i], true);+ }+ const result = new Uint8Array(offsetBytes.length + dataBytes.length);+ result.set(offsetBytes, 0);+ result.set(dataBytes, offsetBytes.length);+ return result;+ }+ stringByteLength() {+ return this.byteLen;+ }+ offsetsCount() {+ return this.offsets.length;+ }+}+let _encoder;+function cachedEncoder() {+ return _encoder ??= new TextEncoder();+}+function getChildrenPropertyMask(node) {+ const kind = node.kind;+ const props = childProperties[kind];+ if (!props) {+ return 0;+ }+ const n = node;+ let mask = 0;+ for (let i = 0; i < props.length; i++) {+ const prop = props[i];+ if (prop !== undefined && isChildPresent(n[prop])) {+ mask |= 1 << i;+ }+ }+ return mask;+}+// A child is "present" if it's non-null/non-undefined.+// This matches the Go encoder's behavior where non-nil NodeLists (even empty)+// are treated as present, and only nil NodeLists are absent.+function isChildPresent(v) {+ if (v === undefined || v === null)+ return false;+ return true;+}+function recordNodeStrings(node, strs) {+ return strs.add(node.text ?? "");+}+function encodeFileReferences(refs, writer) {+ if (!refs || refs.length === 0)+ return NO_STRUCTURED_DATA;+ const offset = writer.finish().length;+ writer.writeArrayHeader(refs.length);+ for (const ref of refs) {+ writer.writeArrayHeader(5);+ writer.writeUint(ref.pos);+ writer.writeUint(ref.end);+ writer.writeString(ref.fileName);+ writer.writeUint(ref.resolutionMode ?? 0);+ writer.writeBool(ref.preserve ?? false);+ }+ return offset;+}+function recordExtendedData(node, strs, extendedData, structuredWriter) {+ const offset = extendedData.length * 4;+ if (node.kind === SyntaxKind.SourceFile) {+ const sf = node;+ const textIndex = strs.add(sf.text);+ const fileNameIndex = strs.add(sf.fileName);+ const pathIndex = strs.add(sf.path);+ const referencedFilesOffset = encodeFileReferences(sf.referencedFiles, structuredWriter);+ const typeRefDirectivesOffset = encodeFileReferences(sf.typeReferenceDirectives, structuredWriter);+ const libRefDirectivesOffset = encodeFileReferences(sf.libReferenceDirectives, structuredWriter);+ extendedData.push(textIndex, fileNameIndex, pathIndex, sf.languageVariant, sf.scriptKind, referencedFilesOffset, typeRefDirectivesOffset, libRefDirectivesOffset, NO_STRUCTURED_DATA, NO_STRUCTURED_DATA, NO_STRUCTURED_DATA, 0);+ }+ else if (node.kind === SyntaxKind.TemplateHead ||+ node.kind === SyntaxKind.TemplateMiddle ||+ node.kind === SyntaxKind.TemplateTail) {+ const tmpl = node;+ const text = tmpl.text ?? "";+ const rawText = tmpl.rawText ?? "";+ const templateFlags = tmpl.templateFlags ?? 0;+ const textIndex = strs.add(text);+ const rawTextIndex = strs.add(rawText);+ extendedData.push(textIndex, rawTextIndex, templateFlags);+ }+ else {+ // StringLiteral, NumericLiteral, BigIntLiteral, RegularExpressionLiteral,+ // NoSubstitutionTemplateLiteral — format: [textIndex, tokenFlags]+ const n = node;+ const text = n.text ?? "";+ const tokenFlags = n.tokenFlags ?? 0;+ const textIndex = strs.add(text);+ extendedData.push(textIndex, tokenFlags);+ }+ return offset;+}+function getNodeData(node, strs, extendedData, structuredWriter) {+ const t = getNodeDataType(node.kind);+ const common = getNodeCommonData(node);+ switch (t) {+ case NODE_DATA_TYPE_CHILDREN:+ return t | common | getChildrenPropertyMask(node);+ case NODE_DATA_TYPE_STRING:+ return t | common | recordNodeStrings(node, strs);+ case NODE_DATA_TYPE_EXTENDED:+ return t | common | recordExtendedData(node, strs, extendedData, structuredWriter);+ default:+ throw new Error("unreachable");+ }+}+function getChildPropertiesForNode(node) {+ return childProperties[node.kind];+}+// Returns whether a value is a NodeArray (array-like with pos and end).+function isNodeArray(value) {+ return Array.isArray(value) && typeof value.pos === "number" && typeof value.end === "number";+}+/**+ * Encode a SourceFile AST node into the binary format.+ */+export function encodeSourceFile(sourceFile) {+ return encodeNode(sourceFile);+}+/**+ * Encode an arbitrary AST node into the binary format.+ * When encoding a non-SourceFile node, the header hash and parse options fields will be zero.+ */+export function encodeNode(node) {+ const strs = new StringTable();+ const extendedDataValues = [];+ const structuredWriter = new MsgpackWriter();+ // We'll build an array of uint32 values for the nodes section, 7 per node+ const nodeValues = [];+ // Nil node (index 0)+ nodeValues.push(0, 0, 0, 0, 0, 0, 0);+ let nodeCount = 0;+ let parentIndex = 0;+ let prevIndex = 0;+ function visitNode(node) {+ nodeCount++;+ const currentIndex = nodeCount;+ if (prevIndex !== 0) {+ // Set next pointer on previous sibling+ nodeValues[prevIndex * NODE_FIELDS + NODE_FIELD_NEXT] = currentIndex;+ }+ const data = getNodeData(node, strs, extendedDataValues, structuredWriter);+ nodeValues.push(node.kind, node.pos >= 0 ? node.pos : 0, node.end >= 0 ? node.end : 0, 0, // next (filled in later)+ parentIndex, data, node.flags);+ const saveParentIndex = parentIndex;+ const savePrevIndex = prevIndex;+ parentIndex = currentIndex;+ prevIndex = 0;+ visitChildren(node);+ prevIndex = currentIndex;+ parentIndex = saveParentIndex;+ }+ function visitNodeList(list) {+ if (!list) {+ return;+ }+ nodeCount++;+ const currentIndex = nodeCount;+ if (prevIndex !== 0) {+ nodeValues[prevIndex * NODE_FIELDS + NODE_FIELD_NEXT] = currentIndex;+ }+ nodeValues.push(KIND_NODE_LIST, list.pos >= 0 ? list.pos : 0, list.end >= 0 ? list.end : 0, 0, // next+ parentIndex, list.length, // data for NodeList is its length+ 0);+ const saveParentIndex = parentIndex;+ parentIndex = currentIndex;+ prevIndex = 0;+ for (const child of list) {+ visitNode(child);+ }+ prevIndex = currentIndex;+ parentIndex = saveParentIndex;+ }+ function visitChildren(node) {+ const props = getChildPropertiesForNode(node);+ const n = node;+ if (props) {+ for (const propName of props) {+ if (propName === undefined)+ continue;+ const child = n[propName];+ if (child === undefined || child === null)+ continue;+ if (isNodeArray(child)) {+ visitNodeList(child);+ }+ else {+ visitNode(child);+ }+ }+ }+ }+ // Encode root node+ nodeCount++;+ parentIndex++;+ const rootData = getNodeData(node, strs, extendedDataValues, structuredWriter);+ nodeValues.push(node.kind, node.pos >= 0 ? node.pos : 0, node.end >= 0 ? node.end : 0, 0, 0, rootData, node.flags);+ const saveParent = parentIndex;+ prevIndex = 0;+ parentIndex = 1; // root is at index 1+ visitChildren(node);+ parentIndex = saveParent;+ // Encode extended data section+ const extendedDataBytes = new Uint8Array(extendedDataValues.length * 4);+ const extView = new DataView(extendedDataBytes.buffer);+ for (let i = 0; i < extendedDataValues.length; i++) {+ extView.setUint32(i * 4, extendedDataValues[i], true);+ }+ // Encode structured data section+ const structuredDataBytes = structuredWriter.finish();+ // Encode string table+ const strsBytes = strs.encode();
… 40 more lines (truncated)
--- +++ @@ -0,0 +1,32 @@+export declare const MSGPACK_FIXARRAY3 = 147;+export declare const MSGPACK_BIN8 = 196;+export declare const MSGPACK_BIN16 = 197;+export declare const MSGPACK_BIN32 = 198;+export declare const MSGPACK_UINT8 = 204;+/** Compute the MessagePack bin header size for a given data length. */+export declare function binHeaderSize(len: number): number;+/** Write a MessagePack bin header into `buf` at `off`, return new offset. */+export declare function writeBinHeader(buf: Uint8Array, off: number, len: number): number;+export declare class MsgpackWriter {+ private buf;+ private view;+ private pos;+ constructor(initialSize?: number);+ private ensure;+ writeArrayHeader(length: number): void;+ writeUint(value: number): void;+ writeString(str: string): void;+ writeBool(value: boolean): void;+ finish(): Uint8Array;+}+export declare class MsgpackReader {+ private buf;+ private view;+ private pos;+ constructor(data: Uint8Array, offset?: number);+ readArrayHeader(): number;+ readUint(): number;+ readString(): string;+ readBool(): boolean;+}+//# sourceMappingURL=msgpack.d.ts.map
--- +++ @@ -0,0 +1,213 @@+// Minimal msgpack encoder/decoder.+// Supports: arrays, unsigned integers, strings, booleans, binary data.+import { Wtf8Decoder } from "./wtf8.js";+// ── MessagePack format constants ────────────────────────────────────+export const MSGPACK_FIXARRAY3 = 0x93; // 3-element fixarray+export const MSGPACK_BIN8 = 0xc4;+export const MSGPACK_BIN16 = 0xc5;+export const MSGPACK_BIN32 = 0xc6;+export const MSGPACK_UINT8 = 0xcc;+// ── Bin header helpers ──────────────────────────────────────────────+/** Compute the MessagePack bin header size for a given data length. */+export function binHeaderSize(len) {+ if (len < 0x100)+ return 2; // BIN8: marker + 1-byte size+ if (len < 0x10000)+ return 3; // BIN16: marker + 2-byte size+ return 5; // BIN32: marker + 4-byte size+}+/** Write a MessagePack bin header into `buf` at `off`, return new offset. */+export function writeBinHeader(buf, off, len) {+ if (len < 0x100) {+ buf[off++] = MSGPACK_BIN8;+ buf[off++] = len;+ }+ else if (len < 0x10000) {+ buf[off++] = MSGPACK_BIN16;+ buf[off++] = (len >>> 8) & 0xff;+ buf[off++] = len & 0xff;+ }+ else {+ buf[off++] = MSGPACK_BIN32;+ buf[off++] = (len >>> 24) & 0xff;+ buf[off++] = (len >>> 16) & 0xff;+ buf[off++] = (len >>> 8) & 0xff;+ buf[off++] = len & 0xff;+ }+ return off;+}+const encoder = new TextEncoder();+const decoder = new Wtf8Decoder();+export class MsgpackWriter {+ buf;+ view;+ pos;+ constructor(initialSize = 256) {+ this.buf = new Uint8Array(initialSize);+ this.view = new DataView(this.buf.buffer);+ this.pos = 0;+ }+ ensure(n) {+ if (this.pos + n > this.buf.length) {+ let newSize = this.buf.length * 2;+ while (newSize < this.pos + n)+ newSize *= 2;+ const next = new Uint8Array(newSize);+ next.set(this.buf);+ this.buf = next;+ this.view = new DataView(this.buf.buffer);+ }+ }+ writeArrayHeader(length) {+ if (length <= 0x0f) {+ this.ensure(1);+ this.buf[this.pos++] = 0x90 | length;+ }+ else if (length <= 0xffff) {+ this.ensure(3);+ this.buf[this.pos++] = 0xdc;+ this.view.setUint16(this.pos, length, false);+ this.pos += 2;+ }+ else {+ this.ensure(5);+ this.buf[this.pos++] = 0xdd;+ this.view.setUint32(this.pos, length, false);+ this.pos += 4;+ }+ }+ writeUint(value) {+ if (value <= 0x7f) {+ this.ensure(1);+ this.buf[this.pos++] = value;+ }+ else if (value <= 0xff) {+ this.ensure(2);+ this.buf[this.pos++] = 0xcc;+ this.buf[this.pos++] = value;+ }+ else if (value <= 0xffff) {+ this.ensure(3);+ this.buf[this.pos++] = 0xcd;+ this.view.setUint16(this.pos, value, false);+ this.pos += 2;+ }+ else {+ this.ensure(5);+ this.buf[this.pos++] = 0xce;+ this.view.setUint32(this.pos, value, false);+ this.pos += 4;+ }+ }+ writeString(str) {+ const encoded = encoder.encode(str);+ const len = encoded.length;+ if (len <= 0x1f) {+ this.ensure(1 + len);+ this.buf[this.pos++] = 0xa0 | len;+ }+ else if (len <= 0xff) {+ this.ensure(2 + len);+ this.buf[this.pos++] = 0xd9;+ this.buf[this.pos++] = len;+ }+ else if (len <= 0xffff) {+ this.ensure(3 + len);+ this.buf[this.pos++] = 0xda;+ this.view.setUint16(this.pos, len, false);+ this.pos += 2;+ }+ else {+ this.ensure(5 + len);+ this.buf[this.pos++] = 0xdb;+ this.view.setUint32(this.pos, len, false);+ this.pos += 4;+ }+ this.buf.set(encoded, this.pos);+ this.pos += len;+ }+ writeBool(value) {+ this.ensure(1);+ this.buf[this.pos++] = value ? 0xc3 : 0xc2;+ }+ finish() {+ return this.buf.subarray(0, this.pos);+ }+}+export class MsgpackReader {+ buf;+ view;+ pos;+ constructor(data, offset = 0) {+ this.buf = data;+ this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);+ this.pos = offset;+ }+ readArrayHeader() {+ const byte = this.buf[this.pos++];+ if ((byte & 0xf0) === 0x90)+ return byte & 0x0f;+ if (byte === 0xdc) {+ const len = this.view.getUint16(this.pos, false);+ this.pos += 2;+ return len;+ }+ if (byte === 0xdd) {+ const len = this.view.getUint32(this.pos, false);+ this.pos += 4;+ return len;+ }+ throw new Error(`Expected array header, got 0x${byte.toString(16)}`);+ }+ readUint() {+ const byte = this.buf[this.pos++];+ if (byte <= 0x7f)+ return byte;+ if (byte === 0xcc)+ return this.buf[this.pos++];+ if (byte === 0xcd) {+ const val = this.view.getUint16(this.pos, false);+ this.pos += 2;+ return val;+ }+ if (byte === 0xce) {+ const val = this.view.getUint32(this.pos, false);+ this.pos += 4;+ return val;+ }+ throw new Error(`Expected uint, got 0x${byte.toString(16)}`);+ }+ readString() {+ const byte = this.buf[this.pos++];+ let len;+ if ((byte & 0xe0) === 0xa0) {+ len = byte & 0x1f;+ }+ else if (byte === 0xd9) {+ len = this.buf[this.pos++];+ }+ else if (byte === 0xda) {+ len = this.view.getUint16(this.pos, false);+ this.pos += 2;+ }+ else if (byte === 0xdb) {+ len = this.view.getUint32(this.pos, false);+ this.pos += 4;+ }+ else {+ throw new Error(`Expected string, got 0x${byte.toString(16)}`);+ }+ const str = decoder.decode(this.buf.subarray(this.pos, this.pos + len));+ this.pos += len;+ return str;+ }+ readBool() {+ const byte = this.buf[this.pos++];+ if (byte === 0xc3)+ return true;+ if (byte === 0xc2)+ return false;+ throw new Error(`Expected bool, got 0x${byte.toString(16)}`);+ }+}+//# sourceMappingURL=msgpack.js.map
--- +++ @@ -0,0 +1,76 @@+import { type FileReference, type LineAndCharacter, type Node, type Path, SyntaxKind } from "../../ast/index.ts";+import type { TimingCollector } from "../timing.ts";+import { RemoteNode, RemoteNodeList } from "./node.generated.ts";+import { type SourceFileInfo, type TextDecoder } from "./node.infrastructure.ts";+export { RemoteNode, RemoteNodeList } from "./node.generated.ts";+export { readParseOptionsKey, readSourceFileHash, RemoteNodeBase } from "./node.infrastructure.ts";+export declare class RemoteSourceFile extends RemoteNode implements SourceFileInfo {+ readonly nodes: (RemoteNode | RemoteNodeList)[];+ readonly _offsetNodes: number;+ readonly _offsetStringTableOffsets: number;+ readonly _offsetStringTable: number;+ readonly _offsetExtendedData: number;+ readonly _offsetStructuredData: number;+ readonly _decoder: TextDecoder;+ readonly _timing: TimingCollector | undefined;+ private _lineStarts;+ private _cachedText;+ private _cachedReferencedFiles;+ private _cachedTypeReferenceDirectives;+ private _cachedLibReferenceDirectives;+ private _cachedImports;+ private _cachedModuleAugmentations;+ private _cachedAmbientModuleNames;+ constructor(data: Uint8Array, decoder: TextDecoder, timing?: TimingCollector);+ readFileReferences(structuredDataOffset: number): readonly FileReference[];+ readNodeIndexArray(structuredDataOffset: number): readonly Node[];+ readStringArray(structuredDataOffset: number): readonly string[];+ /** @internal */+ getOrCreateNodeAtIndex(index: number): Node;+ private get extendedDataOffset();+ get fileName(): string;+ get path(): string;+ get languageVariant(): number;+ get scriptKind(): number;+ get referencedFiles(): readonly FileReference[];+ get typeReferenceDirectives(): readonly FileReference[];+ get libReferenceDirectives(): readonly FileReference[];+ get imports(): readonly Node[];+ get moduleAugmentations(): readonly Node[];+ get ambientModuleNames(): readonly string[];+ get externalModuleIndicator(): Node | true | undefined;+ get isDeclarationFile(): boolean;+ get text(): string;+ getLineStarts(): readonly number[];+ getLineAndCharacterOfPosition(position: number): LineAndCharacter;+ getPositionOfLineAndCharacter(line: number, character: number): number;+}+/**+ * Find a descendant node at a specific position with matching kind and end position.+ */+export declare function findDescendant(root: Node, pos: number, end: number, kind: SyntaxKind): Node | undefined;+/**+ * Parsed components of a node handle.+ */+export interface ParsedNodeHandle {+ index: number;+ kind: SyntaxKind;+ path: Path;+}+/**+ * Parse a node handle string into its components.+ * Handle format: "index.kind.path" where path may contain dots.+ */+export declare function parseNodeHandle(handle: string): ParsedNodeHandle;+/**+ * Decode binary-encoded AST data into a Node.+ * Works for any binary-encoded node, including synthetic nodes+ * (e.g. from typeToTypeNode) that don't have a source file.+ */+export declare function decodeNode(data: Uint8Array): Node;+/**+ * Get the unique ID string for a remote node.+ * Throws if the node is not a RemoteNode (i.e. not decoded from binary data).+ */+export declare function getNodeId(node: Node): string;+//# sourceMappingURL=node.d.ts.map
--- +++ @@ -0,0 +1,182 @@+import { ModifierFlags, type Node, type NodeArray, type SourceFile, SyntaxKind } from "../../ast/index.ts";+import { RemoteNodeBase, type SourceFileInfo } from "./node.infrastructure.ts";+export declare class RemoteNodeList extends Array<RemoteNode> implements NodeArray<RemoteNode> {+ static get [Symbol.species](): ArrayConstructor;+ parent: RemoteNode;+ hasTrailingComma?: boolean;+ transformFlags: number;+ protected view: DataView;+ protected index: number;+ private _byteIndex;+ private _cursorIndex;+ private _cursorNodeIndex;+ get pos(): number;+ get end(): number;+ get next(): number;+ private get data();+ private sourceFile;+ constructor(view: DataView, index: number, parent: RemoteNode, sourceFile: SourceFileInfo, offsetNodes: number);+ get 0(): RemoteNode;+ get 1(): RemoteNode;+ get 2(): RemoteNode;+ get 3(): RemoteNode;+ get 4(): RemoteNode;+ get 5(): RemoteNode;+ get 6(): RemoteNode;+ get 7(): RemoteNode;+ get 8(): RemoteNode;+ get 9(): RemoteNode;+ get 10(): RemoteNode;+ get 11(): RemoteNode;+ get 12(): RemoteNode;+ get 13(): RemoteNode;+ get 14(): RemoteNode;+ get 15(): RemoteNode;+ [Symbol.iterator](): ArrayIterator<RemoteNode>;+ forEachNode<T>(visitNode: (node: RemoteNode) => T | undefined): T | undefined;+ at(index: number): RemoteNode;+ private getOrCreateChildAtNodeIndex;+ __print(): string;+}+export declare class RemoteNode extends RemoteNodeBase implements Node {+ protected static NODE_LEN: number;+ protected get sourceFile(): SourceFileInfo;+ protected _sourceFile: SourceFileInfo;+ get id(): string;+ constructor(view: DataView, index: number, parent: RemoteNode, sourceFile: SourceFileInfo, offsetNodes: number);+ forEachChild<T>(visitNode: (node: Node) => T, visitList?: (list: NodeArray<Node>) => T): T | undefined;+ get jsDoc(): readonly Node[] | undefined;+ getSourceFile(): SourceFile;+ getStart(sourceFile?: SourceFile, includeJsDocComment?: boolean): number;+ getFullStart(): number;+ getEnd(): number;+ getWidth(sourceFile?: SourceFile): number;+ getFullWidth(): number;+ getLeadingTriviaWidth(sourceFile?: SourceFile): number;+ getFullText(sourceFile?: SourceFile): string;+ getText(sourceFile?: SourceFile): string;+ protected getString(index: number): string;+ private getOrCreateChildAtNodeIndex;+ private hasChildren;+ private getNamedChild;+ private getChildAtOrder;+ __print(): string;+ __printChildren(): string;+ __printSubtree(): string;+ get containsOnlyTriviaWhiteSpaces(): boolean;+ get isArrayType(): boolean;+ get isBracketed(): boolean;+ get isExportEquals(): boolean;+ get isNameFirst(): boolean;+ get isTypeOf(): boolean;+ get isTypeOnly(): boolean;+ get multiLine(): boolean;+ get keyword(): SyntaxKind | undefined;+ get keywordToken(): SyntaxKind | undefined;+ get operator(): SyntaxKind | undefined;+ get phaseModifier(): SyntaxKind | undefined;+ get token(): SyntaxKind | undefined;+ get templateFlags(): number | undefined;+ get tokenFlags(): number;+ get argument(): RemoteNode | undefined;+ get argumentExpression(): RemoteNode | undefined;+ get arguments(): RemoteNodeList | undefined;+ get assertsModifier(): RemoteNode | undefined;+ get asteriskToken(): RemoteNode | undefined;+ get attributes(): RemoteNode | RemoteNodeList | undefined;+ get awaitModifier(): RemoteNode | undefined;+ get block(): RemoteNode | undefined;+ get body(): RemoteNode | undefined;+ get caseBlock(): RemoteNode | undefined;+ get catchClause(): RemoteNode | undefined;+ get checkType(): RemoteNode | undefined;+ get children(): RemoteNode | RemoteNodeList | undefined;+ get className(): RemoteNode | undefined;+ get clauses(): RemoteNodeList | undefined;+ get closingElement(): RemoteNode | undefined;+ get closingFragment(): RemoteNode | undefined;+ get colonToken(): RemoteNode | undefined;+ get comment(): RemoteNodeList | undefined;+ get condition(): RemoteNode | undefined;+ get constraint(): RemoteNode | undefined;+ get declarationList(): RemoteNode | undefined;+ get declarations(): RemoteNodeList | undefined;+ get defaultType(): RemoteNode | undefined;+ get dotDotDotToken(): RemoteNode | undefined;+ get elements(): RemoteNodeList | undefined;+ get elementType(): RemoteNode | undefined;+ get elseStatement(): RemoteNode | undefined;+ get endOfFileToken(): RemoteNode | undefined;+ get equalsGreaterThanToken(): RemoteNode | undefined;+ get equalsToken(): RemoteNode | undefined;+ get exclamationToken(): RemoteNode | undefined;+ get exportClause(): RemoteNode | undefined;+ get expression(): RemoteNode | undefined;+ get exprName(): RemoteNode | undefined;+ get extendsType(): RemoteNode | undefined;+ get falseType(): RemoteNode | undefined;+ get finallyBlock(): RemoteNode | undefined;+ get head(): RemoteNode | undefined;+ get heritageClauses(): RemoteNodeList | undefined;+ get importClause(): RemoteNode | undefined;+ get incrementor(): RemoteNode | undefined;+ get indexType(): RemoteNode | undefined;+ get initializer(): RemoteNode | undefined;+ get jsdocPropertyTags(): RemoteNode | undefined;+ get label(): RemoteNode | undefined;+ get left(): RemoteNode | undefined;+ get literal(): RemoteNode | undefined;+ get members(): RemoteNodeList | undefined;+ get modifiers(): RemoteNodeList | undefined;+ get moduleReference(): RemoteNode | undefined;+ get moduleSpecifier(): RemoteNode | undefined;+ get name(): RemoteNode | undefined;+ get namedBindings(): RemoteNode | undefined;+ get nameExpression(): RemoteNode | undefined;+ get namespace(): RemoteNode | undefined;+ get nameType(): RemoteNode | undefined;+ get objectAssignmentInitializer(): RemoteNode | undefined;+ get objectType(): RemoteNode | undefined;+ get openingElement(): RemoteNode | undefined;+ get openingFragment(): RemoteNode | undefined;+ get operand(): RemoteNode | undefined;+ get operatorToken(): RemoteNode | undefined;+ get parameterName(): RemoteNode | undefined;+ get parameters(): RemoteNodeList | undefined;+ get postfixToken(): RemoteNode | undefined;+ get properties(): RemoteNodeList | undefined;+ get propertyName(): RemoteNode | undefined;+ get qualifier(): RemoteNode | undefined;+ get questionDotToken(): RemoteNode | undefined;+ get questionToken(): RemoteNode | undefined;+ get readonlyToken(): RemoteNode | undefined;+ get right(): RemoteNode | undefined;+ get statement(): RemoteNode | undefined;+ get statements(): RemoteNodeList | undefined;+ get tag(): RemoteNode | undefined;+ get tagName(): RemoteNode | undefined;+ get tags(): RemoteNodeList | undefined;+ get template(): RemoteNode | undefined;+ get templateSpans(): RemoteNodeList | undefined;+ get thenStatement(): RemoteNode | undefined;+ get thisArg(): RemoteNode | undefined;+ get trueType(): RemoteNode | undefined;+ get tryBlock(): RemoteNode | undefined;+ get tupleNameSource(): RemoteNode | undefined;+ get type(): RemoteNode | undefined;+ get typeArguments(): RemoteNodeList | undefined;+ get typeExpression(): RemoteNode | undefined;+ get typeName(): RemoteNode | undefined;+ get typeParameter(): RemoteNode | undefined;+ get typeParameters(): RemoteNodeList | undefined;+ get types(): RemoteNodeList | undefined;+ get value(): RemoteNode | undefined;+ get variableDeclaration(): RemoteNode | undefined;+ get whenFalse(): RemoteNode | undefined;+ get whenTrue(): RemoteNode | undefined;+ get text(): string | undefined;+ get rawText(): string | undefined;+ get flags(): number;+ get modifierFlags(): ModifierFlags;+}+//# sourceMappingURL=node.generated.d.ts.map
--- +++ @@ -0,0 +1,835 @@+// Code generated by _scripts/generate-encoder.ts. DO NOT EDIT.+import { getTokenPosOfNode, ModifierFlags, SyntaxKind, } from "../../ast/index.js";+import { modifierToFlag, NODE_CHILD_MASK, NODE_DATA_TYPE_MASK, NODE_EXTENDED_DATA_MASK, NODE_STRING_INDEX_MASK, popcount8, RemoteNodeBase, } from "./node.infrastructure.js";+import { childProperties, KIND_NODE_LIST, NODE_DATA_TYPE_CHILDREN, NODE_DATA_TYPE_EXTENDED, NODE_DATA_TYPE_STRING, NODE_LEN, NODE_OFFSET_DATA, NODE_OFFSET_END, NODE_OFFSET_FLAGS, NODE_OFFSET_KIND, NODE_OFFSET_NEXT, NODE_OFFSET_PARENT, NODE_OFFSET_POS, } from "./protocol.js";+export class RemoteNodeList extends Array {+ // Inherited Array methods like filter/map/slice use ArraySpeciesCreate, which would+ // otherwise call `new RemoteNodeList(length)` and fail. Produce a plain Array instead.+ static get [Symbol.species]() {+ return Array;+ }+ parent;+ hasTrailingComma;+ transformFlags = 0;+ view;+ index;+ _byteIndex;+ // Cursor memoizing the last resolved (logical index -> node index) so that+ // sequential forward access (index loops and list[i], plus forEach/map/+ // reduce/filter) resumes instead of re-walking from the head, turning an+ // O(n) pass over the whole list from O(n^2) into O(n).+ _cursorIndex = 0;+ _cursorNodeIndex = 0;+ get pos() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_POS, true);+ }+ get end() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_END, true);+ }+ get next() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_NEXT, true);+ }+ get data() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_DATA, true);+ }+ sourceFile;+ constructor(view, index, parent, sourceFile, offsetNodes) {+ super();+ this.view = view;+ this.index = index;+ this.parent = parent;+ this.sourceFile = sourceFile;+ this._byteIndex = offsetNodes + index * NODE_LEN;+ this.length = this.data;+ this._cursorNodeIndex = index + 1;+ const length = this.length;+ for (let i = 16; i < length; i++) {+ Object.defineProperty(this, i, {+ get() {+ return this.at(i);+ },+ });+ }+ }+ get 0() {+ return this.at(0);+ }+ get 1() {+ return this.at(1);+ }+ get 2() {+ return this.at(2);+ }+ get 3() {+ return this.at(3);+ }+ get 4() {+ return this.at(4);+ }+ get 5() {+ return this.at(5);+ }+ get 6() {+ return this.at(6);+ }+ get 7() {+ return this.at(7);+ }+ get 8() {+ return this.at(8);+ }+ get 9() {+ return this.at(9);+ }+ get 10() {+ return this.at(10);+ }+ get 11() {+ return this.at(11);+ }+ get 12() {+ return this.at(12);+ }+ get 13() {+ return this.at(13);+ }+ get 14() {+ return this.at(14);+ }+ get 15() {+ return this.at(15);+ }+ *[Symbol.iterator]() {+ if (!this.length)+ return;+ let next = this.index + 1;+ while (next) {+ const child = this.getOrCreateChildAtNodeIndex(next);+ next = child.next;+ yield child;+ }+ }+ forEachNode(visitNode) {+ if (!this.length)+ return;+ let next = this.index + 1;+ while (next) {+ const child = this.getOrCreateChildAtNodeIndex(next);+ next = child.next;+ const result = visitNode(child);+ if (result)+ return result;+ }+ }+ at(index) {+ if (!Number.isInteger(index)) {+ return undefined;+ }+ if (index >= this.data || (index < 0 && -index > this.data)) {+ return undefined;+ }+ if (index < 0) {+ index = this.length + index;+ }+ // Walk the raw buffer following each node's `next` pointer instead of+ // materializing every intermediate RemoteNode just to read it. Resume from+ // the memoized cursor when possible so sequential forward access is O(1)+ // amortized (a full in-order pass is O(n) rather than O(n^2)).+ const offsetNodes = this.sourceFile._offsetNodes;+ let i;+ let next;+ if (index >= this._cursorIndex) {+ i = this._cursorIndex;+ next = this._cursorNodeIndex;+ }+ else {+ i = 0;+ next = this.index + 1;+ }+ for (; i < index; i++) {+ next = this.view.getUint32(offsetNodes + next * NODE_LEN + NODE_OFFSET_NEXT, true);+ }+ this._cursorIndex = index;+ this._cursorNodeIndex = next;+ return this.getOrCreateChildAtNodeIndex(next);+ }+ getOrCreateChildAtNodeIndex(index) {+ let child = this.sourceFile.nodes[index];+ if (!child) {+ const kind = this.view.getUint32(this.sourceFile._offsetNodes + index * NODE_LEN + NODE_OFFSET_KIND, true);+ if (kind === KIND_NODE_LIST) {+ throw new Error("NodeList cannot directly contain another NodeList");+ }+ const sf = this.sourceFile;+ child = new RemoteNode(this.view, index, this.parent, sf, sf._offsetNodes);+ sf.nodes[index] = child;+ sf._timing?.recordMaterialization();+ }+ return child;+ }+ __print() {+ const result = [];+ result.push(`kind: NodeList`);+ result.push(`index: ${this.index}`);+ result.push(`byteIndex: ${this._byteIndex}`);+ result.push(`length: ${this.length}`);+ return result.join("\n");+ }+}+export class RemoteNode extends RemoteNodeBase {+ static NODE_LEN = NODE_LEN;+ get sourceFile() {+ return this._sourceFile;+ }+ _sourceFile;+ get id() {+ return `${this.index}.${this.kind}.${this.sourceFile.path}`;+ }+ constructor(view, index, parent, sourceFile, offsetNodes) {+ super(view, index, parent, offsetNodes + index * NODE_LEN);+ this._sourceFile = sourceFile;+ }+ forEachChild(visitNode, visitList) {+ if (this.hasChildren()) {+ let next = this.index + 1;+ do {+ const child = this.getOrCreateChildAtNodeIndex(next);+ if (child instanceof RemoteNodeList) {+ if (visitList) {+ const result = visitList(child);+ if (result) {+ return result;+ }+ }+ else {+ const result = child.forEachNode(visitNode);+ if (result) {+ return result;+ }+ }+ }+ else if (child.kind !== SyntaxKind.JSDoc) {+ const result = visitNode(child);+ if (result) {+ return result;+ }+ }+ next = child.next;+ } while (next);+ }+ }+ get jsDoc() {+ if (!this.hasChildren()) {+ return undefined;+ }+ let result;+ let next = this.index + 1;+ do {+ const child = this.getOrCreateChildAtNodeIndex(next);+ if (!(child instanceof RemoteNodeList) && child.kind === SyntaxKind.JSDoc) {+ (result ??= []).push(child);+ }+ next = child.next;+ } while (next);+ return result;+ }+ getSourceFile() {+ return this.sourceFile;+ }+ getStart(sourceFile, includeJsDocComment) {+ return getTokenPosOfNode(this, sourceFile ?? this.getSourceFile(), includeJsDocComment);+ }+ getFullStart() {+ return this.pos;+ }+ getEnd() {+ return this.end;+ }
… 588 more lines (truncated)
--- +++ @@ -0,0 +1,62 @@+import { type FileReference, ModifierFlags, type Node, SyntaxKind } from "../../ast/index.ts";+import type { TimingCollector } from "../timing.ts";+import { NODE_DATA_TYPE_CHILDREN, NODE_DATA_TYPE_EXTENDED, NODE_DATA_TYPE_STRING } from "./protocol.ts";+export declare const popcount8: number[];+export type NodeDataType = typeof NODE_DATA_TYPE_CHILDREN | typeof NODE_DATA_TYPE_STRING | typeof NODE_DATA_TYPE_EXTENDED;+export declare const NODE_DATA_TYPE_MASK = 3221225472;+export declare const NODE_CHILD_MASK = 255;+export declare const NODE_STRING_INDEX_MASK = 16777215;+export declare const NODE_EXTENDED_DATA_MASK = 16777215;+export interface TextDecoder {+ decode(input?: ArrayBufferView | ArrayBufferLike): string;+}+export interface SourceFileInfo {+ readonly _offsetNodes: number;+ readonly _offsetStringTableOffsets: number;+ readonly _offsetStringTable: number;+ readonly _offsetExtendedData: number;+ readonly _offsetStructuredData: number;+ readonly _decoder: TextDecoder;+ nodes: any[];+ readonly path?: string;+ /**+ * The timing collector that per-node materialization is reported into, and+ * that this source file registered itself with when fetched. Present only+ * when timing collection is enabled; when undefined, materialization is not+ * timed and no clock is read.+ */+ readonly _timing?: TimingCollector | undefined;+ readFileReferences(offset: number): readonly FileReference[];+ readNodeIndexArray(offset: number): readonly Node[];+ readStringArray(offset: number): readonly string[];+ getOrCreateNodeAtIndex(index: number): Node;+}+/**+ * Read the 128-bit content hash from a source file binary response as a hex string.+ */+export declare function readSourceFileHash(data: DataView): string;+/**+ * Read the per-file parse options key from a source file binary response.+ * This encodes the ExternalModuleIndicatorOptions bitmask as a string,+ * allowing the client to distinguish files parsed with different options.+ */+export declare function readParseOptionsKey(data: DataView): string;+export declare function modifierToFlag(kind: SyntaxKind): ModifierFlags;+export declare class RemoteNodeBase {+ parent: any;+ view: DataView;+ protected index: number;+ protected _byteIndex: number;+ constructor(view: DataView, index: number, parent: any, byteIndex: number);+ get kind(): SyntaxKind;+ get pos(): number;+ get end(): number;+ get next(): number;+ protected get parentIndex(): number;+ protected get data(): number;+ protected get dataType(): NodeDataType;+ protected get childMask(): number;+ protected getFileText(start: number, end: number): string;+ protected get sourceFile(): SourceFileInfo;+}+//# sourceMappingURL=node.infrastructure.d.ts.map
--- +++ @@ -0,0 +1,122 @@+import { ModifierFlags, SyntaxKind, } from "../../ast/index.js";+import { HEADER_OFFSET_HASH_HI0, HEADER_OFFSET_HASH_HI1, HEADER_OFFSET_HASH_LO0, HEADER_OFFSET_HASH_LO1, HEADER_OFFSET_PARSE_OPTIONS, NODE_DATA_TYPE_CHILDREN, NODE_DATA_TYPE_EXTENDED, NODE_DATA_TYPE_STRING, NODE_OFFSET_DATA, NODE_OFFSET_END, NODE_OFFSET_KIND, NODE_OFFSET_NEXT, NODE_OFFSET_PARENT, NODE_OFFSET_POS, } from "./protocol.js";+// ═══════════════════════════════════════════════════════════════════════════+// Constants+// ═══════════════════════════════════════════════════════════════════════════+export const popcount8 = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8];+export const NODE_DATA_TYPE_MASK = 0xc0_00_00_00;+export const NODE_CHILD_MASK = 0x00_00_00_ff;+export const NODE_STRING_INDEX_MASK = 0x00_ff_ff_ff;+export const NODE_EXTENDED_DATA_MASK = 0x00_ff_ff_ff;+// ═══════════════════════════════════════════════════════════════════════════+// Free functions+// ═══════════════════════════════════════════════════════════════════════════+/**+ * Read the 128-bit content hash from a source file binary response as a hex string.+ */+export function readSourceFileHash(data) {+ const lo0 = data.getUint32(HEADER_OFFSET_HASH_LO0, true);+ const lo1 = data.getUint32(HEADER_OFFSET_HASH_LO1, true);+ const hi0 = data.getUint32(HEADER_OFFSET_HASH_HI0, true);+ const hi1 = data.getUint32(HEADER_OFFSET_HASH_HI1, true);+ return hex8(hi1) + hex8(hi0) + hex8(lo1) + hex8(lo0);+}+/**+ * Read the per-file parse options key from a source file binary response.+ * This encodes the ExternalModuleIndicatorOptions bitmask as a string,+ * allowing the client to distinguish files parsed with different options.+ */+export function readParseOptionsKey(data) {+ return data.getUint32(HEADER_OFFSET_PARSE_OPTIONS, true).toString();+}+function hex8(n) {+ return (n >>> 0).toString(16).padStart(8, "0");+}+export function modifierToFlag(kind) {+ switch (kind) {+ case SyntaxKind.StaticKeyword:+ return ModifierFlags.Static;+ case SyntaxKind.PublicKeyword:+ return ModifierFlags.Public;+ case SyntaxKind.ProtectedKeyword:+ return ModifierFlags.Protected;+ case SyntaxKind.PrivateKeyword:+ return ModifierFlags.Private;+ case SyntaxKind.AbstractKeyword:+ return ModifierFlags.Abstract;+ case SyntaxKind.AccessorKeyword:+ return ModifierFlags.Accessor;+ case SyntaxKind.ExportKeyword:+ return ModifierFlags.Export;+ case SyntaxKind.DeclareKeyword:+ return ModifierFlags.Ambient;+ case SyntaxKind.ConstKeyword:+ return ModifierFlags.Const;+ case SyntaxKind.DefaultKeyword:+ return ModifierFlags.Default;+ case SyntaxKind.AsyncKeyword:+ return ModifierFlags.Async;+ case SyntaxKind.ReadonlyKeyword:+ return ModifierFlags.Readonly;+ case SyntaxKind.OverrideKeyword:+ return ModifierFlags.Override;+ case SyntaxKind.InKeyword:+ return ModifierFlags.In;+ case SyntaxKind.OutKeyword:+ return ModifierFlags.Out;+ case SyntaxKind.Decorator:+ return ModifierFlags.Decorator;+ default:+ return ModifierFlags.None;+ }+}+// ═══════════════════════════════════════════════════════════════════════════+// RemoteNodeBase+// ═══════════════════════════════════════════════════════════════════════════+export class RemoteNodeBase {+ parent; // RemoteNode at runtime+ view;+ index;+ _byteIndex;+ constructor(view, index, parent, byteIndex) {+ this.view = view;+ this.index = index;+ this.parent = parent;+ this._byteIndex = byteIndex;+ }+ get kind() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_KIND, true);+ }+ get pos() {+ return this.view.getInt32(this._byteIndex + NODE_OFFSET_POS, true);+ }+ get end() {+ return this.view.getInt32(this._byteIndex + NODE_OFFSET_END, true);+ }+ get next() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_NEXT, true);+ }+ get parentIndex() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_PARENT, true);+ }+ get data() {+ return this.view.getUint32(this._byteIndex + NODE_OFFSET_DATA, true);+ }+ get dataType() {+ return (this.data & NODE_DATA_TYPE_MASK);+ }+ get childMask() {+ if (this.dataType !== NODE_DATA_TYPE_CHILDREN) {+ return -1;+ }+ return this.data & NODE_CHILD_MASK;+ }+ getFileText(start, end) {+ return this.sourceFile._decoder.decode(new Uint8Array(this.view.buffer, this.view.byteOffset + this.sourceFile._offsetStringTable + start, end - start));+ }+ get sourceFile() {+ // Overridden in RemoteNode; exists here for getFileText access+ throw new Error("sourceFile not available on base");+ }+}+//# sourceMappingURL=node.infrastructure.js.map
--- +++ @@ -0,0 +1,298 @@+import { computeLineStarts, NodeFlags, SyntaxKind, TokenFlags, } from "../../ast/index.js";+import { MsgpackReader } from "./msgpack.js";+import { RemoteNode, RemoteNodeList, } from "./node.generated.js";+import { NODE_EXTENDED_DATA_MASK, } from "./node.infrastructure.js";+import { HEADER_OFFSET_EXTENDED_DATA, HEADER_OFFSET_NODES, HEADER_OFFSET_STRING_TABLE, HEADER_OFFSET_STRING_TABLE_OFFSETS, HEADER_OFFSET_STRUCTURED_DATA, KIND_NODE_LIST, NODE_LEN, NODE_OFFSET_KIND, NODE_OFFSET_PARENT, } from "./protocol.js";+import { Wtf8Decoder } from "./wtf8.js";+// Re-export everything consumers need from the other two files.+export { RemoteNode, RemoteNodeList } from "./node.generated.js";+export { readParseOptionsKey, readSourceFileHash, RemoteNodeBase } from "./node.infrastructure.js";+// ═══════════════════════════════════════════════════════════════════════════+// RemoteSourceFile+// ═══════════════════════════════════════════════════════════════════════════+const NO_STRUCTURED_DATA = 0xFFFFFFFF;+export class RemoteSourceFile extends RemoteNode {+ nodes;+ _offsetNodes;+ _offsetStringTableOffsets;+ _offsetStringTable;+ _offsetExtendedData;+ _offsetStructuredData;+ _decoder;+ _timing;+ _lineStarts;+ _cachedText;+ _cachedReferencedFiles;+ _cachedTypeReferenceDirectives;+ _cachedLibReferenceDirectives;+ _cachedImports;+ _cachedModuleAugmentations;+ _cachedAmbientModuleNames;+ constructor(data, decoder, timing) {+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);+ const offsetNodes = view.getUint32(HEADER_OFFSET_NODES, true);+ super(view, 1, undefined, undefined, offsetNodes);+ this._sourceFile = this;+ this._offsetNodes = offsetNodes;+ this._offsetStringTableOffsets = view.getUint32(HEADER_OFFSET_STRING_TABLE_OFFSETS, true);+ this._offsetStringTable = view.getUint32(HEADER_OFFSET_STRING_TABLE, true);+ this._offsetExtendedData = view.getUint32(HEADER_OFFSET_EXTENDED_DATA, true);+ this._offsetStructuredData = view.getUint32(HEADER_OFFSET_STRUCTURED_DATA, true);+ this._decoder = decoder;+ this._timing = timing;+ this.nodes = Array((view.byteLength - offsetNodes) / NODE_LEN);+ this.nodes[1] = this;+ // Every node slot is materializable on demand except the nil sentinel at+ // index 0 and the source-file node at index 1, which is pre-materialized.+ timing?.recordSourceFileFetched(Math.max(0, this.nodes.length - 2));+ }+ readFileReferences(structuredDataOffset) {+ if (structuredDataOffset === NO_STRUCTURED_DATA) {+ return [];+ }+ const buf = new Uint8Array(this.view.buffer, this.view.byteOffset, this.view.byteLength);+ const reader = new MsgpackReader(buf, this._offsetStructuredData + structuredDataOffset);+ const count = reader.readArrayHeader();+ const result = [];+ for (let i = 0; i < count; i++) {+ reader.readArrayHeader(); // 5-element tuple+ const pos = reader.readUint();+ const end = reader.readUint();+ const fileName = reader.readString();+ const resolutionMode = reader.readUint();+ const preserve = reader.readBool();+ result.push({ pos, end, fileName, resolutionMode, preserve });+ }+ return result;+ }+ readNodeIndexArray(structuredDataOffset) {+ if (structuredDataOffset === NO_STRUCTURED_DATA) {+ return [];+ }+ const buf = new Uint8Array(this.view.buffer, this.view.byteOffset, this.view.byteLength);+ const reader = new MsgpackReader(buf, this._offsetStructuredData + structuredDataOffset);+ const count = reader.readArrayHeader();+ const result = [];+ for (let i = 0; i < count; i++) {+ const nodeIndex = reader.readUint();+ result.push(this.getOrCreateNodeAtIndex(nodeIndex));+ }+ return result;+ }+ readStringArray(structuredDataOffset) {+ if (structuredDataOffset === NO_STRUCTURED_DATA) {+ return [];+ }+ const buf = new Uint8Array(this.view.buffer, this.view.byteOffset, this.view.byteLength);+ const reader = new MsgpackReader(buf, this._offsetStructuredData + structuredDataOffset);+ const count = reader.readArrayHeader();+ const result = [];+ for (let i = 0; i < count; i++) {+ result.push(reader.readString());+ }+ return result;+ }+ /** @internal */+ getOrCreateNodeAtIndex(index) {+ let node = this.nodes[index];+ if (!node) {+ // Resolve the real parent so that nodes looked up directly by index (e.g. via+ // NodeHandle.resolve) report the correct `parent`, rather than always pointing at+ // the source file. The stored parent index can refer to a synthetic NodeList+ // container; skip those to mirror normal traversal, where list elements take the+ // list's parent. The walk terminates at the source file, which occupies index 1+ // and is already cached.+ let parentIndex = this.view.getUint32(this._offsetNodes + index * NODE_LEN + NODE_OFFSET_PARENT, true);+ while (parentIndex !== index &&+ this.view.getUint32(this._offsetNodes + parentIndex * NODE_LEN + NODE_OFFSET_KIND, true) === KIND_NODE_LIST) {+ parentIndex = this.view.getUint32(this._offsetNodes + parentIndex * NODE_LEN + NODE_OFFSET_PARENT, true);+ }+ const parent = parentIndex === index ? this : this.getOrCreateNodeAtIndex(parentIndex);+ node = new RemoteNode(this.view, index, parent, this, this._offsetNodes);+ this.nodes[index] = node;+ this._timing?.recordMaterialization();+ }+ return node;+ }+ // ═══ SourceFile-specific extended data getters ═══+ get extendedDataOffset() {+ return this._offsetExtendedData + (this.data & NODE_EXTENDED_DATA_MASK);+ }+ get fileName() {+ const stringIndex = this.view.getUint32(this.extendedDataOffset + 4, true);+ return this.getString(stringIndex);+ }+ get path() {+ const stringIndex = this.view.getUint32(this.extendedDataOffset + 8, true);+ return this.getString(stringIndex);+ }+ get languageVariant() {+ return this.view.getUint32(this.extendedDataOffset + 12, true);+ }+ get scriptKind() {+ return this.view.getUint32(this.extendedDataOffset + 16, true);+ }+ get referencedFiles() {+ if (this._cachedReferencedFiles !== undefined)+ return this._cachedReferencedFiles;+ const offset = this.view.getUint32(this.extendedDataOffset + 20, true);+ const files = this.readFileReferences(offset);+ this._cachedReferencedFiles = files;+ return files;+ }+ get typeReferenceDirectives() {+ if (this._cachedTypeReferenceDirectives !== undefined)+ return this._cachedTypeReferenceDirectives;+ const offset = this.view.getUint32(this.extendedDataOffset + 24, true);+ const directives = this.readFileReferences(offset);+ this._cachedTypeReferenceDirectives = directives;+ return directives;+ }+ get libReferenceDirectives() {+ if (this._cachedLibReferenceDirectives !== undefined)+ return this._cachedLibReferenceDirectives;+ const offset = this.view.getUint32(this.extendedDataOffset + 28, true);+ const directives = this.readFileReferences(offset);+ this._cachedLibReferenceDirectives = directives;+ return directives;+ }+ get imports() {+ if (this._cachedImports !== undefined)+ return this._cachedImports;+ const offset = this.view.getUint32(this.extendedDataOffset + 32, true);+ const imports = this.readNodeIndexArray(offset);+ this._cachedImports = imports;+ return imports;+ }+ get moduleAugmentations() {+ if (this._cachedModuleAugmentations !== undefined)+ return this._cachedModuleAugmentations;+ const offset = this.view.getUint32(this.extendedDataOffset + 36, true);+ const moduleAugmentations = this.readNodeIndexArray(offset);+ this._cachedModuleAugmentations = moduleAugmentations;+ return moduleAugmentations;+ }+ get ambientModuleNames() {+ if (this._cachedAmbientModuleNames !== undefined)+ return this._cachedAmbientModuleNames;+ const offset = this.view.getUint32(this.extendedDataOffset + 40, true);+ const names = this.readStringArray(offset);+ this._cachedAmbientModuleNames = names;+ return names;+ }+ get externalModuleIndicator() {+ const nodeIndex = this.view.getUint32(this.extendedDataOffset + 44, true);+ if (nodeIndex === 0)+ return undefined;+ if (nodeIndex === this.index)+ return true;+ return this.getOrCreateNodeAtIndex(nodeIndex);+ }+ get isDeclarationFile() {+ return (this.flags & NodeFlags.Ambient) !== 0;+ }+ get text() {+ if (this._cachedText !== undefined)+ return this._cachedText;+ const text = super.text;+ this._cachedText = text;+ return text;+ }+ // ═══ Line/character position mapping ═══+ getLineStarts() {+ return this._lineStarts ??= computeLineStarts(this.text ?? "");+ }+ getLineAndCharacterOfPosition(position) {+ const lineStarts = this.getLineStarts();+ const line = computeLineOfPosition(lineStarts, position);+ return { line, character: position - lineStarts[line] };+ }+ getPositionOfLineAndCharacter(line, character) {+ const lineStarts = this.getLineStarts();+ if (line < 0 || line >= lineStarts.length) {+ throw new Error(`Bad line number. Line: ${line}, lineStarts.length: ${lineStarts.length}`);+ }+ return lineStarts[line] + character;+ }+}+/**+ * Find the 0-based line number containing the given position via binary search.+ * Assumes the first line starts at position 0 and `position` is non-negative.+ */+function computeLineOfPosition(lineStarts, position) {+ let low = 0;+ let high = lineStarts.length - 1;+ while (low <= high) {+ const middle = low + ((high - low) >> 1);+ const value = lineStarts[middle];+ if (value < position) {+ low = middle + 1;+ }+ else if (value > position) {+ high = middle - 1;+ }+ else {+ return middle;+ }+ }+ return low - 1;+}+/**+ * Find a descendant node at a specific position with matching kind and end position.+ */+export function findDescendant(root, pos, end, kind) {+ if (root.pos === pos && root.end === end && root.kind === kind) {+ return root;+ }+ // Search children
… 51 more lines (truncated)
@typescript-eslint/eslint-plugin npm DELETIONBURST ×7
8.59.0
8.59.1
8.59.2
8.59.3
8.59.4
8.60.0
8.60.1
8.61.0
8.61.1
8.62.0
8.62.1
8.63.0
DELETION
1.10.0 published then removed
high · registry-verified · 2019-06-09 · 7y ago
BURST
2 releases in 31m: 1.10.0, 1.10.1
info · registry-verified · 2019-06-09 · 7y ago
BURST
3 releases in 59m: 5.30.1, 5.30.2, 5.30.3
info · registry-verified · 2022-07-01 · 4y ago
BURST
2 releases in 44m: 5.35.0, 5.35.1
info · registry-verified · 2022-08-24 · 3y ago
BURST
2 releases in 45m: 5.59.10, 5.59.11
info · registry-verified · 2023-06-12 · 3y ago
BURST
2 releases in 41m: 5.62.0, 6.0.0
info · registry-verified · 2023-07-10 · 3y ago
BURST
2 releases in 30m: 7.0.0, 7.0.1
info · registry-verified · 2024-02-12 · 2y ago
BURST
2 releases in 20m: 7.14.0, 7.14.1
info · registry-verified · 2024-06-24 · 2y ago
release diff 8.62.1 → 8.63.0
+0 added · -0 removed · ~7 modified
--- +++ @@ -56,3 +56,3 @@ $ref: '#/items/0/$defs/directiveConfigSchema',- description: 'Whether allow ts-check directives, and with which restrictions.',+ description: 'Whether to allow ts-check directives, and with which restrictions.', },@@ -60,3 +60,3 @@ $ref: '#/items/0/$defs/directiveConfigSchema',- description: 'Whether and when expect-error directives, and with which restrictions.',+ description: 'Whether to allow ts-expect-error directives, and with which restrictions.', },@@ -64,3 +64,3 @@ $ref: '#/items/0/$defs/directiveConfigSchema',- description: 'Whether allow ts-ignore directives, and with which restrictions.',+ description: 'Whether to allow ts-ignore directives, and with which restrictions.', },@@ -68,3 +68,3 @@ $ref: '#/items/0/$defs/directiveConfigSchema',- description: 'Whether allow ts-nocheck directives, and with which restrictions.',+ description: 'Whether to allow ts-nocheck directives, and with which restrictions.', },
--- +++ @@ -1,3 +1,3 @@ export type Options = [('method' | 'property')?];-export type MessageIds = 'errorMethod' | 'errorProperty';+export type MessageIds = 'convertToMethodSignature' | 'errorMethod' | 'errorProperty'; declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageIds, Options, import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
--- +++ @@ -12,3 +12,5 @@ fixable: 'code',+ hasSuggestions: true, messages: {+ convertToMethodSignature: 'Convert to a method signature. This removes the `readonly` modifier, allowing the member to be reassigned.', errorMethod: 'Shorthand method signature is forbidden. Use a function property instead.',@@ -33,5 +35,2 @@ key = `${key}?`;- }- if (node.readonly) {- key = `readonly ${key}`; }@@ -166,2 +165,22 @@ }+ const fix = fixer => {+ const key = getMethodKey(propertyNode);+ const params = getMethodParams(typeNode);+ const returnType = getMethodReturnType(typeNode);+ const delimiter = getDelimiter(propertyNode);+ return fixer.replaceText(propertyNode, `${key}${params}: ${returnType}${delimiter}`);+ };+ // There is no syntax for a `readonly` method signature, so converting+ // a `readonly` function-typed property drops the `readonly` modifier.+ // That is a behavioral change (a method may be reassigned, a+ // `readonly` property may not), so it is offered as a suggestion+ // rather than applied as an autofix.+ if (propertyNode.readonly) {+ context.report({+ node: propertyNode,+ messageId: 'errorProperty',+ suggest: [{ messageId: 'convertToMethodSignature', fix }],+ });+ return;+ } context.report({@@ -169,9 +188,3 @@ messageId: 'errorProperty',- fix: fixer => {- const key = getMethodKey(propertyNode);- const params = getMethodParams(typeNode);- const returnType = getMethodReturnType(typeNode);- const delimiter = getDelimiter(propertyNode);- return fixer.replaceText(propertyNode, `${key}${params}: ${returnType}${delimiter}`);- },+ fix, });
--- +++ @@ -236,3 +236,3 @@ // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum- const variable = scope.set.get('String');+ const variable = utils_1.ASTUtils.findVariable(scope, 'String'); return !variable?.defs.length;
--- +++ @@ -342,6 +342,22 @@ const tsNode = services.esTreeNodeToTSNodeMap.get(node);- if (tsNode.initializer == null ||- node.init == null ||- node.id.typeAnnotation == null) {- return;+ if (tsNode.initializer == null || node.init == null) {+ return;+ }+ if (node.parent.kind === 'using' &&+ hasWellKnownSymbolWithThenableReturn(checker, tsNode.initializer, checker.getTypeAtLocation(tsNode.initializer), 'dispose')) {+ context.report({+ node: node.init,+ messageId: 'voidReturnVariable',+ });+ }+ if (node.id.typeAnnotation == null) {+ return;+ }+ const variableType = services.getTypeAtLocation(node.id);+ if (hasWellKnownSymbolWithVoidReturn(checker, tsNode.name, variableType, 'dispose') &&+ hasWellKnownSymbolWithThenableReturn(checker, tsNode.initializer, checker.getTypeAtLocation(tsNode.initializer), 'dispose')) {+ context.report({+ node: node.init,+ messageId: 'voidReturnVariable',+ }); }@@ -765 +781,23 @@ }+function hasWellKnownSymbolWithThenableReturn(checker, node, type, symbolName) {+ return tsutils+ .unionConstituents(checker.getApparentType(type))+ .some(typePart => {+ const symbol = tsutils.getWellKnownSymbolPropertyOfType(typePart, symbolName, checker);+ if (symbol == null) {+ return false;+ }+ return isThenableReturningFunctionType(checker, node, checker.getTypeOfSymbolAtLocation(symbol, node));+ });+}+function hasWellKnownSymbolWithVoidReturn(checker, node, type, symbolName) {+ return tsutils+ .unionConstituents(checker.getApparentType(type))+ .some(typePart => {+ const symbol = tsutils.getWellKnownSymbolPropertyOfType(typePart, symbolName, checker);+ if (symbol == null) {+ return false;+ }+ return isVoidReturningFunctionType(checker, node, checker.getTypeOfSymbolAtLocation(symbol, node));+ });+}
--- +++ @@ -416,3 +416,7 @@ }- const calleeType = checker.getTypeAtLocation(services.esTreeNodeToTSNodeMap.get(parent.callee));+ // An optional-chained callee (`foo?.bar(...)`) types as `<method> | undefined`,+ // and a union exposes no call signatures — strip the nullability first.+ const calleeType = services+ .getTypeAtLocation(parent.callee)+ .getNonNullableType(); const signatures = calleeType.getCallSignatures();
--- +++ @@ -2,3 +2,3 @@ "name": "@typescript-eslint/eslint-plugin",- "version": "8.62.1",+ "version": "8.63.0", "description": "TypeScript plugin for ESLint",@@ -51,6 +51,6 @@ "ts-api-utils": "^2.5.0",- "@typescript-eslint/scope-manager": "8.62.1",- "@typescript-eslint/utils": "8.62.1",- "@typescript-eslint/type-utils": "8.62.1",- "@typescript-eslint/visitor-keys": "8.62.1"+ "@typescript-eslint/scope-manager": "8.63.0",+ "@typescript-eslint/type-utils": "8.63.0",+ "@typescript-eslint/utils": "8.63.0",+ "@typescript-eslint/visitor-keys": "8.63.0" },@@ -78,4 +78,4 @@ "vitest": "^4.0.18",- "@typescript-eslint/rule-schema-to-typescript-types": "8.62.1",- "@typescript-eslint/rule-tester": "8.62.1"+ "@typescript-eslint/rule-schema-to-typescript-types": "8.63.0",+ "@typescript-eslint/rule-tester": "8.63.0" },@@ -84,3 +84,3 @@ "typescript": ">=4.8.4 <6.1.0",- "@typescript-eslint/parser": "^8.62.1"+ "@typescript-eslint/parser": "^8.63.0" },
@typescript-eslint/parser npm DELETIONBURST ×7
8.59.0
8.59.1
8.59.2
8.59.3
8.59.4
8.60.0
8.60.1
8.61.0
8.61.1
8.62.0
8.62.1
8.63.0
DELETION
1.10.0 published then removed
high · registry-verified · 2019-06-09 · 7y ago
BURST
2 releases in 31m: 1.10.0, 1.10.1
info · registry-verified · 2019-06-09 · 7y ago
BURST
3 releases in 59m: 5.30.1, 5.30.2, 5.30.3
info · registry-verified · 2022-07-01 · 4y ago
BURST
2 releases in 44m: 5.35.0, 5.35.1
info · registry-verified · 2022-08-24 · 3y ago
BURST
2 releases in 45m: 5.59.10, 5.59.11
info · registry-verified · 2023-06-12 · 3y ago
BURST
2 releases in 41m: 5.62.0, 6.0.0
info · registry-verified · 2023-07-10 · 3y ago
BURST
2 releases in 30m: 7.0.0, 7.0.1
info · registry-verified · 2024-02-12 · 2y ago
BURST
2 releases in 20m: 7.14.0, 7.14.1
info · registry-verified · 2024-06-24 · 2y ago
release diff 8.62.1 → 8.63.0
+0 added · -0 removed · ~1 modified
--- +++ @@ -2,3 +2,3 @@ "name": "@typescript-eslint/parser",- "version": "8.62.1",+ "version": "8.63.0", "description": "An ESLint custom parser which leverages TypeScript ESTree",@@ -44,6 +44,6 @@ "debug": "^4.4.3",- "@typescript-eslint/scope-manager": "8.62.1",- "@typescript-eslint/typescript-estree": "8.62.1",- "@typescript-eslint/types": "8.62.1",- "@typescript-eslint/visitor-keys": "8.62.1"+ "@typescript-eslint/scope-manager": "8.63.0",+ "@typescript-eslint/types": "8.63.0",+ "@typescript-eslint/typescript-estree": "8.63.0",+ "@typescript-eslint/visitor-keys": "8.63.0" },
ua-parser-js npm DELETION ×3BURST ×11
2.0.1
2.0.2
2.0.3
2.0.4
0.7.41
1.0.41
2.0.5
2.0.6
2.0.7
2.0.8
2.0.9
2.0.10
DELETION
0.7.29 published then removed
high · registry-verified · 2021-10-22 · 4y ago
DELETION
0.8.0 published then removed
high · registry-verified · 2021-10-22 · 4y ago
DELETION
1.0.0 published then removed
high · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 0.7.29, 0.8.0, 1.0.0
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 10m: 0.7.30, 0.8.1, 1.0.1
info · registry-verified · 2021-10-22 · 4y ago
BURST
2 releases in 0m: 0.7.32, 1.0.32
info · registry-verified · 2022-10-15 · 3y ago
BURST
2 releases in 0m: 1.0.33, 0.7.33
info · registry-verified · 2023-01-22 · 3y ago
BURST
2 releases in 0m: 0.7.34, 1.0.34
info · registry-verified · 2023-03-05 · 3y ago
BURST
2 releases in 0m: 0.7.35, 1.0.35
info · registry-verified · 2023-04-01 · 3y ago
BURST
2 releases in 3m: 0.7.36, 1.0.36
info · registry-verified · 2023-09-09 · 2y ago
BURST
2 releases in 4m: 0.7.37, 1.0.37
info · registry-verified · 2023-10-27 · 2y ago
BURST
2 releases in 1m: 0.7.38, 1.0.38
info · registry-verified · 2024-05-28 · 2y ago
BURST
2 releases in 5m: 0.7.40, 1.0.40
info · registry-verified · 2024-12-21 · 1y ago
BURST
2 releases in 1m: 0.7.41, 1.0.41
info · registry-verified · 2025-08-19 · 10mo ago
release diff 2.0.9 → 2.0.10
+0 added · -0 removed · ~27 modified
--- +++ @@ -1,4 +1,4 @@-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10 Copyright © 2012-2026 Faisal Salman <[email protected]> AGPLv3 License */-((i,c)=>{function A(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function B(i){return Ti(i)?Oi(/[^\d\.]/g,i).split(".")[0]:c}function H(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):c:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):c:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):c):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):c:this[r[0]]=s?r[1].call(this,s,r[2]):c):this[r]=s||c;n+=2}}function p(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Ei(e[t][o],i))return"?"===t?c:t}else if(Ei(e[t],i))return"?"===t?c:t;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var t=Ai.init[i],o=Ai.isIgnore[i]||0,r=Ai.isIgnoreRgx[i]||0,a=Ai.toString[i]||0;function s(){D.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(oi).then(function(i){return e.setCH(new Bi(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=v&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ei(o,e)&&q(r?Oi(r,this[e]):this[e])==q(r?Oi(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var V="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",u="cpu",m="device",f="engine",g="os",v="result",k="name",x="type",y="vendor",C="version",N="architecture",j="major",E="model",P="console",S="mobile",t="tablet",e="smarttv",o="wearable",R="xr",G="embedded",r="inapp",L="brands",T="formFactors",$="fullVersionList",I="platform",W="platformVersion",J="bitness",a="sec-ch-ua",X=a+"-full-version-list",Y=a+"-arch",Z=a+"-"+J,Q=a+"-form-factors",K=a+"-"+S,ii=a+"-"+E,ei=a+"-"+I,ti=ei+"-version",oi=[L,$,S,E,I,W,N,T,J],ri="Amazon",s="Apple",ai="ASUS",si="BlackBerry",n="Google",ni="Huawei",wi="Lenovo",bi="Honor",di="Microsoft",li="Motorola",ci="OnePlus",pi="OPPO",hi="Samsung",ui="Sony",mi="Xiaomi",fi="Zebra",gi="Chromium",w="Chromecast",vi="Edge",ki="Firefox",b="Opera",xi="Facebook",O="Mobile ",yi=" Browser",Ci="Windows",Ni=typeof i!==l.UNDEFINED,U=Ni&&i.navigator?i.navigator:c,_=U&&U.userAgentData?U.userAgentData:c,Ei=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(q(e)==q(i[t]))return!0;return!1}return!!Ti(i)&&q(e)==q(i)},Si=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Si(i[t])},Ti=function(i){return typeof i===l.STRING},Ii=function(i){if(!i)return c;for(var e,t=[],o=Oi(/\\?\"/g,i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=_i(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=_i(o[r]);return t},q=function(i){return Ti(i)?i.toLowerCase():i},D=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=c);return this},Oi=function(i,e){return Ti(e)?e.replace(i,d):e},Ui=function(i){return Oi(/\\?\"/g,i)},_i=function(i,e){return i=Oi(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},qi={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Di={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":c},Fi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},zi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[C,[k,O+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[C,[k,vi+" WebView"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[C,[k,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[k,C],[/opios[\/ ]+([\w\.]+)/i],[C,[k,b+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[C,[k,b+" GX"]],[/\bopr\/([\w\.]+)/i],[C,[k,b]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[C,[k,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[C,[k,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[k,C],[/quark(?:pc)?\/([-\w\.]+)/i],[C,[k,"Quark"]],[/\bddg\/([\w\.]+)/i],[C,[k,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[C,[k,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[C,[k,"WeChat"]],[/konqueror\/([\w\.]+)/i],[C,[k,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[C,[k,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[C,[k,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[C,[k,"Smart "+wi+yi]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[k,/(.+)/,"$1 Secure"+yi],C],[/norton\/([\w\.]+)/i],[C,[k,"Norton Private"+yi]],[/\bfocus\/([\w\.]+)/i],[C,[k,ki+" Focus"]],[/ mms\/([\w\.]+)$/i],[C,[k,b+" Neon"]],[/ opt\/([\w\.]+)$/i],[C,[k,b+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[C,[k,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[C,[k,"Dolphin"]],[/coast\/([\w\.]+)/i],[C,[k,b+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[C,[k,"MIUI"+yi]],[/fxios\/([\w\.-]+)/i],[C,[k,O+ki]],[/\bqihoobrowser\/?([\w\.]*)/i],[C,[k,"360"]],[/\b(qq)\/([\w\.]+)/i],[[k,/(.+)/,"$1Browser"],C],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[k,/(.+)/,"$1"+yi],C],[/samsungbrowser\/([\w\.]+)/i],[C,[k,hi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[C,[k,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[k,"Sogou Mobile"],C],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[k,C],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[k],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[C,k],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[k,xi],C,[x,r]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[k,C,[x,r]],[/\bgsa\/([\w\.]+) .*safari\//i],[C,[k,"GSA"],[x,r]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[C,[k,"TikTok"],[x,r]],[/\[(linkedin)app\]/i],[k,[x,r]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[k,/(.+)/,"Zalo"],C,[x,r]],[/(chromium)[\/ ]([-\w\.]+)/i],[k,C],[/ome-(lighthouse)$/i],[k,[x,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[C,[k,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[C,[k,vi+" WebView2"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[k,"Chrome WebView"],C],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[C,[k,"Android"+yi]],[/chrome\/([\w\.]+) mobile/i],[C,[k,O+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[k,C],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[C,[k,O+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[k,O+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[C,k],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[k,[C,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[k,C],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[k,O+ki],C],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[k,"Netscape"],C],[/(wolvic|librewolf)\/([\w\.]+)/i],[k,C],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[C,[k,ki+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[k,[C,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[k,[C,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[N,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[N,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[N,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[N,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[N,"arm"]],[/ sun4\w[;\)]/i],[[N,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[N,/ower/,d,q]],[/mc680.0/i],[[N,"68k"]],[/winnt.+\[axp/i],[[N,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[y,hi],[x,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[y,hi],[x,S]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[y,s],[x,S]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[y,s],[x,t]],[/(macintosh);/i],[E,[y,s]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[y,"Sharp"],[x,S]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[y,bi],[x,t]],[/honor([-\w ]+)[;\)]/i],[E,[y,bi],[x,S]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[y,ni],[x,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[y,ni],[x,S]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[y,mi],[x,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[y,mi],[x,S]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[y,ci],[x,S]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[y,pi],[x,S]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[y,p,{OnePlus:["203","304","403","404","413","415"],"*":pi}],[x,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[y,"BLU"],[x,S]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[y,"Vivo"],[x,S]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[y,"Realme"],[x,S]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[y,wi],[x,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[y,wi],[x,S]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[y,li],[x,S]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[y,li],[x,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[y,"LG"],[x,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[y,"LG"],[x,S]],[/(nokia) (t[12][01])/i],[y,E,[x,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[x,S],[y,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[y,n],[x,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[y,n],[x,S]],[/(google) (pixelbook( go)?)/i],[y,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[y,ui],[x,S]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[y,ui],[x,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[y,ri],[x,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[y,ri],[x,S]],[/(playbook);[-\w\),; ]+(rim)/i],[E,y,[x,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[y,si],[x,S]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[y,ai],[x,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[y,ai],[x,S]],[/(nexus 9)/i],[E,[y,"HTC"],[x,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[y,[E,/_/g," "],[x,S]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,S]],[/(itel) ((\w+))/i],[[y,q],E,[x,p,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[y,"Acer"],[x,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[y,"Meizu"],[x,S]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[y,"Ulefone"],[x,S]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[y,"Energizer"],[x,S]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[y,"Cat"],[x,S]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[y,"Smartfren"],[x,S]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[y,"Nothing"],[x,S]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[y,"Archos"],[x,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[y,"Archos"],[x,S]],[/; (n159v)/i],[E,[y,"HMD"],[x,S]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[y,E,[x,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[y,E,[x,S]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[y,E,[x,t]],[/(surface duo)/i],[E,[y,di],[x,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[y,"Fairphone"],[x,S]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[y,"Nvidia"],[x,t]],[/(sprint) (\w+)/i],[y,E,[x,S]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[y,di],[x,S]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[y,fi],[x,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[y,fi],[x,S]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[y,[x,e]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[y,hi],[x,e]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[y,E,[x,e]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[y,"LG"],[x,e]],[/(apple) ?tv/i],[y,[E,s+" TV"],[x,e]],[/crkey.*devicetype\/chromecast/i],[[E,w+" Third Generation"],[y,n],[x,e]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[y,n],[x,e]],[/fuchsia.*crkey/i],[[E,w+" Nest Hub"],[y,n],[x,e]],[/crkey/i],[[E,w],[y,n],[x,e]],[/(portaltv)/i],[E,[y,xi],[x,e]],[/droid.+aft(\w+)( bui|\))/i],[E,[y,ri],[x,e]],[/(shield \w+ tv)/i],[E,[y,"Nvidia"],[x,e]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[y,"Sharp"],[x,e]],[/(bravia[\w ]+)( bui|\))/i],[E,[y,ui],[x,e]],[/(mi(tv|box)-?\w+) bui/i],[E,[y,mi],[x,e]],[/Hbbtv.*(technisat) (.*);/i],[y,E,[x,e]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[y,/.+\/(\w+)/,"$1",p,{LG:"lge"}],[E,_i],[x,e]],[/(playstation \w+)/i],[E,[y,ui],[x,P]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[y,di],[x,P]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[y,p,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[x,P]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[y,hi],[x,o]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[y,E,[x,o]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[y,pi],[x,o]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[y,s],[x,o]],[/(opwwe\d{3})/i],[E,[y,ci],[x,o]],[/(moto 360)/i],[E,[y,li],[x,o]],[/(smartwatch 3)/i],[E,[y,ui],[x,o]],[/(g watch r)/i],[E,[y,"LG"],[x,o]],[/droid.+; (wt63?0{2,3})\)/i],[E,[y,fi],[x,o]],[/droid.+; (glass) \d/i],[E,[y,n],[x,R]],[/(pico) ([\w ]+) os\d/i],[y,E,[x,R]],[/(quest( \d| pro)?s?).+vr/i],[E,[y,xi],[x,R]],[/mobile vr; rv.+firefox/i],[[x,R]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[y,[x,G]],[/(aeobc)\b/i],[E,[y,ri],[x,G]],[/(homepod).+mac os/i],[E,[y,s],[x,G]],[/windows iot/i],[[x,G]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[x,e]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[x,e]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[x,p,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[x,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[x,S]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[y,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[C,[k,vi+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[k,C],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[C,[k,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[k,C],[/ladybird\//i],[[k,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[C,k]],os:[[/(windows nt) (6\.[23]); arm/i],[[k,/N/,"R"],[C,p,qi]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[k,C],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[C,/(;|\))/g,"",p,qi],[k,Ci]],[/(windows ce)\/?([\d\.]*)/i],[k,C],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[C,/_/g,"."],[k,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[k,"macOS"],[C,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[C,[k,w+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[C,[k,w+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[C,[k,w+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[C,[k,w+" Linux"]],[/crkey\/([\d\.]+)/i],[C,[k,w]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[C,k],[/(ubuntu) ([\w\.]+) like android/i],[[k,/(.+)/,"$1 Touch"],C],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[k,C],[/\(bb(10);/i],[C,[k,si]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[C,[k,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[C,[k,ki+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[C,[k,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[C,p,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[k,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[C,[k,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[C,[k,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[C,[k,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[k,C],[/(sunos) ?([\d\.]*)/i],[[k,"Solaris"],C],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[k,C]]},Ai=(b={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},D.call(b.init,[[h,[k,C,j,x]],[u,[N]],[m,[x,E,y]],[f,[k,C]],[g,[k,C]]]),D.call(b.isIgnore,[[h,[C,j]],[f,[C]],[g,[C]]]),D.call(b.isIgnoreRgx,[[h,/ ?browser$/i],[g,/ ?os$/i]]),D.call(b.toString,[[h,[k,C]],[u,[N]],[m,[y,E]],[f,[k,C]],[g,[k,C]]]),b);function Bi(i,e){if(i=i||{},D.call(this,oi),e)D.call(this,[[L,Ii(i[a])],[$,Ii(i[X])],[S,/\?1/.test(i[K])],[E,Ui(i[ii])],[I,Ui(i[ei])],[W,Ui(i[ti])],[N,Ui(i[Y])],[T,Ii(i[Q])],[J,Ui(i[Z])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return D.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",M(this,i)]]),this}function z(i,e,t){if(typeof i===l.OBJECT?(e=Si(i,!0)?(typeof e===l.OBJECT&&(t=e),i):(t=i,c),i=c):typeof i!==l.STRING||Si(e,!0)||(t=e,e=c),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof z?(s=typeof i===l.STRING?i:t&&t[V]?t[V]:U&&U.userAgent?U.userAgent:d,n=new Bi(t,!0),w=e?((i,e)=>{var t,o={},r=e;if(!Si(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(zi,e):zi,D.call(this,[["getBrowser",(b=function(i){return i==v?function(){return new F(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(u,this.getCPU()).set(m,this.getDevice()).set(f,this.getEngine()).set(g,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",b(u)],["getDevice",b(m)],["getEngine",b(f)],["getOS",b(g)],["getResult",b(v)],["getUA",function(){return s}],["setUA",function(i){return Ti(i)&&(s=_i(i,500)),this}]]).setUA(s),this):new z(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:c:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(U&&U.userAgent==this.ua)switch(this.itemType){case h:U.brave&&typeof U.brave.isBrave==l.FUNCTION&&this.set(k,"Brave");break;case m:!this.get(x)&&_&&_[S]&&this.set(x,S),"Macintosh"==this.get(E)&&U&&typeof U.standalone!==l.UNDEFINED&&U.maxTouchPoints&&2<U.maxTouchPoints&&this.set(E,"iPad").set(x,t);break;case g:!this.get(k)&&_&&_[I]&&this.set(k,_[I]);break;case v:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(u,i(u)).set(m,i(m)).set(f,i(f)).set(g,i(g))}return this},F.prototype.parseUA=function(){switch(this.itemType!=v&&H.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(j,B(this.get(C)));break;case g:var i;"iOS"==this.get(k)&&"18.6"==this.get(C)&&(i=/\) Version\/([\d\.]+)/.exec(this.ua))&&26<=parseInt(i[1].substring(0,2),10)&&this.set(C,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case h:case f:var o,r=e[$]||e[L];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=gi||o==vi&&/WebView2/.test(s))&&(s=p(s,Fi),(o=this.get(k))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(k,s).set(C,n).set(j,B(n)),o=s),this.itemType==f&&s==gi&&this.set(C,n)}break;case u:var w=e[N];w&&("64"==e[J]&&(w+="64"),H.call(this.data,w+";",t));break;case m:if(e[S]&&this.set(x,S),e[E]&&(this.set(E,e[E]),this.get(x)&&this.get(y)||(H.call(w={},"droid 9; "+e[E]+")",t),!this.get(x)&&w.type&&this.set(x,w.type),!this.get(y)&&w.vendor&&this.set(y,w.vendor))),e[T]){if("string"!=typeof e[T])for(var b=0;!i&&b<e[T].length;)i=p(e[T][b++],Di);else i=p(e[T],Di);this.set(x,i)}break;case g:var d,w=e[I];w&&(d=e[W],w==Ci&&(d=13<=parseInt(B(d),10)?"11":"10"),this.set(k,w).set(C,d)),this.get(k)==Ci&&"Xbox"==e[E]&&this.set(k,"Xbox").set(C,c);break;case v:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(u,w(u)).set(m,w(m)).set(f,w(f)).set(g,w(g))}return this},z.VERSION="2.0.9",z.BROWSER=A([k,C,j,x]),z.CPU=A([N]),z.DEVICE=A([E,y,x,P,S,e,t,o,G]),z.ENGINE=z.OS=A([k,C]),typeof exports!==l.UNDEFINED?(exports=typeof module!==l.UNDEFINED&&module.exports?module.exports=z:exports).UAParser=z:typeof define===l.FUNCTION&&define.amd?define(function(){return z}):Ni&&(i.UAParser=z);var Hi,Mi=Ni&&(i.jQuery||i.Zepto);Mi&&!Mi.ua&&(Hi=new z,Mi.ua=Hi.getResult(),Mi.ua.get=function(){return Hi.getUA()},Mi.ua.set=function(i){Hi.setUA(i);var e,t=Hi.getResult();for(e in t)Mi.ua[e]=t[e]})})("object"==typeof window?window:this);+((i,c)=>{function B(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function H(i){return Ii(i)?_i(/[^\d\.]/g,i).split(".")[0]:c}function A(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):c:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):c:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):c):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):c:this[r[0]]=s?r[1].call(this,s,r[2]):c):this[r]=s||c;n+=2}}function p(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Si(e[t][o],i))return"?"===t?c:t}else if(Si(e[t],i))return"?"===t?c:t;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var t=Hi.init[i],o=Hi.isIgnore[i]||0,r=Hi.isIgnoreRgx[i]||0,a=Hi.toString[i]||0;function s(){D.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ri).then(function(i){return e.setCH(new Ai(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=v&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Si(o,e)&&q(r?_i(r,this[e]):this[e])==q(r?_i(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var P=500,V="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},u="browser",h="cpu",m="device",f="engine",g="os",v="result",k="name",x="type",y="vendor",C="version",N="architecture",j="major",E="model",R="console",S="mobile",t="tablet",e="smarttv",o="wearable",G="xr",L="embedded",r="inapp",$="brands",T="formFactors",W="fullVersionList",I="platform",J="platformVersion",X="bitness",a="sec-ch-ua",Y=a+"-full-version-list",Z=a+"-arch",Q=a+"-"+X,K=a+"-form-factors",ii=a+"-"+S,ei=a+"-"+E,ti=a+"-"+I,oi=ti+"-version",ri=[$,W,S,E,I,J,N,T,X],ai="Amazon",s="Apple",si="ASUS",ni="BlackBerry",n="Google",wi="Huawei",bi="Lenovo",di="Honor",li="Microsoft",ci="Motorola",pi="OnePlus",ui="OPPO",hi="Samsung",mi="Sony",fi="Xiaomi",gi="Zebra",vi="Chromium",w="Chromecast",ki="Edge",xi="Firefox",b="Opera",yi="Facebook",Ci="Mobile ",O=" Browser",Ni="Windows",Ei=typeof i!==l.UNDEFINED,U=Ei&&i.navigator?i.navigator:c,_=U&&U.userAgentData?U.userAgentData:c,Si=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(q(e)==q(i[t]))return!0;return!1}return!!Ii(i)&&q(e)==q(i)},Ti=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Ti(i[t])},Ii=function(i){return typeof i===l.STRING},Oi=function(i){if(!i)return c;for(var e,t=[],o=Ui(i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=qi(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=qi(o[r]);return t},q=function(i){return Ii(i)?i.toLowerCase():i},Ui=function(i){return Ii(i)?qi(_i(/\\?\"/g,i),P):c},D=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=c);return this},_i=function(i,e){return Ii(e)?e.replace(i,d):e},qi=function(i,e){return i=_i(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},Di={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Fi={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":c},zi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},Bi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[C,[k,Ci+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[C,[k,ki+" WebView"],[x,r]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[C,[k,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[k,C],[/opios[\/ ]+([\w\.]+)/i],[C,[k,b+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[C,[k,b+" GX"]],[/\bopr\/([\w\.]+)/i],[C,[k,b]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[C,[k,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[C,[k,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[k,C],[/quark(?:pc)?\/([-\w\.]+)/i],[C,[k,"Quark"]],[/\bddg\/([\w\.]+)/i],[C,[k,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i],[C,[k,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[C,[k,"WeChat"]],[/konqueror\/([\w\.]+)/i],[C,[k,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[C,[k,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[C,[k,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[C,[k,"Smart "+bi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[k,/(.+)/,"$1 Secure"+O],C],[/norton\/([\w\.]+)/i],[C,[k,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[C,[k,xi+" Focus"]],[/ mms\/([\w\.]+)$/i],[C,[k,b+" Neon"]],[/ opt\/([\w\.]+)$/i],[C,[k,b+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[C,[k,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[C,[k,"Dolphin"]],[/coast\/([\w\.]+)/i],[C,[k,b+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[C,[k,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[C,[k,Ci+xi]],[/\bqihoobrowser\/?([\w\.]*)/i],[C,[k,"360"]],[/\b(qq)\/([\w\.]+)/i],[[k,/(.+)/,"$1Browser"],C],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[k,/(.+)/,"$1"+O],C],[/ HBPC\/([\w\.]+)/],[C,[k,wi+O]],[/samsungbrowser\/([\w\.]+)/i],[C,[k,hi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[C,[k,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[k,"Sogou Mobile"],C],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[k,C],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[k],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[C,k],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[k,yi],C,[x,r]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[k,C,[x,r]],[/\bgsa\/([\w\.]+) .*safari\//i],[C,[k,"GSA"],[x,r]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[C,[k,"TikTok"],[x,r]],[/\[(linkedin)app\]/i],[k,[x,r]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[k,/(.+)/,"Zalo"],C,[x,r]],[/(chromium)[\/ ]([-\w\.]+)/i],[k,C],[/ome-(lighthouse)$/i],[k,[x,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[C,[k,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[C,[k,ki+" WebView2"],[x,r]],[/; wv\).+(chrome)\/([\w\.]+)/i],[[k,"Chrome WebView"],C,[x,r]],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[C,[k,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[C,[k,Ci+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[k,C],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[C,[k,Ci+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[k,Ci+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[C,k],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[k,[C,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[k,C],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[k,Ci+xi],C],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[k,"Netscape"],C],[/(wolvic|librewolf)\/([\w\.]+)/i],[k,C],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[C,[k,xi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[k,[C,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[k,[C,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[N,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[N,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[N,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[N,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[N,"arm"]],[/ sun4\w[;\)]/i],[[N,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[N,/ower/,d,q]],[/mc680.0/i],[[N,"68k"]],[/winnt.+\[axp/i],[[N,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[y,hi],[x,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[y,hi],[x,S]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[y,s],[x,S]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[y,s],[x,t]],[/(macintosh);/i],[E,[y,s]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[y,"Sharp"],[x,S]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[y,di],[x,t]],[/honor([-\w ]+)[;\)]/i],[E,[y,di],[x,S]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[y,wi],[x,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[y,wi],[x,S]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[y,fi],[x,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/; ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[y,fi],[x,S]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[y,pi],[x,S]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[y,ui],[x,S]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[y,p,{OnePlus:["203","304","403","404","413","415"],"*":ui}],[x,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[y,"BLU"],[x,S]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[y,"Vivo"],[x,S]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[y,"Realme"],[x,S]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[y,bi],[x,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[y,bi],[x,S]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[y,ci],[x,S]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[y,ci],[x,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[y,"LG"],[x,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[y,"LG"],[x,S]],[/(nokia) (t[12][01])/i],[y,E,[x,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[x,S],[y,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[y,n],[x,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[y,n],[x,S]],[/(google) (pixelbook( go)?)/i],[y,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[y,mi],[x,S]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[y,mi],[x,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[y,ai],[x,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[y,ai],[x,S]],[/(playbook);[-\w\),; ]+(rim)/i],[E,y,[x,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[y,ni],[x,S]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[y,si],[x,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[y,si],[x,S]],[/(nexus 9)/i],[E,[y,"HTC"],[x,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[y,[E,/_/g," "],[x,S]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,S]],[/(itel) ((\w+))/i],[[y,q],E,[x,p,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[y,"Acer"],[x,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[y,"Meizu"],[x,S]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[y,"Ulefone"],[x,S]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[y,"Energizer"],[x,S]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[y,"Cat"],[x,S]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[y,"Smartfren"],[x,S]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[y,"Nothing"],[x,S]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[y,"Archos"],[x,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[y,"Archos"],[x,S]],[/blackview ([-\w ]+)( b|\))/i,/; (bv\d{4}[-\w ]*)( b|\))/i],[E,[y,"Blackview"],[x,S]],[/; (n159v)/i],[E,[y,"HMD"],[x,S]],[/((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i],[E,[x,function(i,e){return e.test.test(i)?e.ifTrue:e.ifFalse},{test:/ta?b/i,ifTrue:t,ifFalse:S}],[y,"T-Mobile"]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[y,E,[x,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[y,E,[x,S]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[y,E,[x,t]],[/(surface duo)/i],[E,[y,li],[x,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[y,"Fairphone"],[x,S]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[y,"Nvidia"],[x,t]],[/(sprint) (\w+)/i],[y,E,[x,S]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[y,li],[x,S]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[y,gi],[x,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[y,gi],[x,S]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[y,[x,e]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[y,hi],[x,e]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[y,E,[x,e]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[y,"LG"],[x,e]],[/(apple) ?tv/i],[y,[E,s+" TV"],[x,e]],[/crkey.*devicetype\/chromecast/i],[[E,w+" Third Generation"],[y,n],[x,e]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[y,n],[x,e]],[/fuchsia.*crkey/i],[[E,w+" Nest Hub"],[y,n],[x,e]],[/crkey/i],[[E,w],[y,n],[x,e]],[/(portaltv)/i],[E,[y,yi],[x,e]],[/droid.+aft(\w+)( bui|\))/i],[E,[y,ai],[x,e]],[/(shield \w+ tv)/i],[E,[y,"Nvidia"],[x,e]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[y,"Sharp"],[x,e]],[/(bravia[\w ]+)( bui|\))/i],[E,[y,mi],[x,e]],[/(mi(tv|box)-?\w+) bui/i],[E,[y,fi],[x,e]],[/Hbbtv.*(technisat) (.*);/i],[y,E,[x,e]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[y,/.+\/(\w+)/,"$1",p,{LG:"lge"}],[E,qi],[x,e]],[/(playstation \w+)/i],[E,[y,mi],[x,R]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[y,li],[x,R]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[y,p,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[x,R]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[y,hi],[x,o]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[y,E,[x,o]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[y,ui],[x,o]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[y,s],[x,o]],[/(opwwe\d{3})/i],[E,[y,pi],[x,o]],[/(moto 360)/i],[E,[y,ci],[x,o]],[/(smartwatch 3)/i],[E,[y,mi],[x,o]],[/(g watch r)/i],[E,[y,"LG"],[x,o]],[/droid.+; (wt63?0{2,3})\)/i],[E,[y,gi],[x,o]],[/droid.+; (glass) \d/i],[E,[y,n],[x,G]],[/(pico) ([\w ]+) os\d/i],[y,E,[x,G]],[/(quest( \d| pro)?s?).+vr/i],[E,[y,yi],[x,G]],[/mobile vr; rv.+firefox/i],[[x,G]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[y,[x,L]],[/(aeobc)\b/i],[E,[y,ai],[x,L]],[/(homepod).+mac os/i],[E,[y,s],[x,L]],[/windows iot/i],[[x,L]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[x,e]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[x,e]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[x,p,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[x,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[x,S]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[y,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[C,[k,ki+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[k,C],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[C,[k,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[k,C],[/ladybird\//i],[[k,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[C,k]],os:[[/(windows nt) (6\.[23]); arm/i],[[k,/N/,"R"],[C,p,Di]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[k,C],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[C,/(;|\))/g,"",p,Di],[k,Ni]],[/(windows ce)\/?([\d\.]*)/i],[k,C],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[C,/_/g,"."],[k,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[k,"macOS"],[C,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[C,[k,w+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[C,[k,w+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[C,[k,w+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[C,[k,w+" Linux"]],[/crkey\/([\d\.]+)/i],[C,[k,w]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[C,k],[/(ubuntu) ([\w\.]+) like android/i],[[k,/(.+)/,"$1 Touch"],C],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[k,C],[/\(bb(10);/i],[C,[k,ni]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[C,[k,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[C,[k,xi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[C,[k,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[C,p,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[k,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[C,[k,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[C,[k,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[C,[k,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[k,C],[/(sunos) ?([\d\.]*)/i],[[k,"Solaris"],C],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[k,C]]},Hi=(b={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},D.call(b.init,[[u,[k,C,j,x]],[h,[N]],[m,[x,E,y]],[f,[k,C]],[g,[k,C]]]),D.call(b.isIgnore,[[u,[C,j]],[f,[C]],[g,[C]]]),D.call(b.isIgnoreRgx,[[u,/ ?browser$/i],[g,/ ?os$/i]]),D.call(b.toString,[[u,[k,C]],[h,[N]],[m,[y,E]],[f,[k,C]],[g,[k,C]]]),b);function Ai(i,e){if(i=i||{},D.call(this,ri),e)D.call(this,[[$,Oi(i[a])],[W,Oi(i[Y])],[S,/\?1/.test(i[ii])],[E,Ui(i[ei])],[I,Ui(i[ti])],[J,Ui(i[oi])],[N,Ui(i[Z])],[T,Oi(i[K])],[X,Ui(i[Q])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return D.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",M(this,i)]]),this}function z(i,e,t){if(typeof i===l.OBJECT?(e=Ti(i,!0)?(typeof e===l.OBJECT&&(t=e),i):(t=i,c),i=c):typeof i!==l.STRING||Ti(e,!0)||(t=e,e=c),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof z?(s=typeof i===l.STRING?i:t&&t[V]?t[V]:U&&U.userAgent?U.userAgent:d,n=new Ai(t,!0),w=Bi,D.call(this,[["getBrowser",(b=function(i){return i==v?function(){return new F(i,s,w,n).set("ua",s).set(u,this.getBrowser()).set(h,this.getCPU()).set(m,this.getDevice()).set(f,this.getEngine()).set(g,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(u)],["getCPU",b(h)],["getDevice",b(m)],["getEngine",b(f)],["getOS",b(g)],["getResult",b(v)],["getUA",function(){return s}],["setUA",function(i){return Ii(i)&&(s=qi(i,P)),this}],["useExtension",function(i){return i&&(w=((i,e)=>{var t,o={},r=e;if(!Ti(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(w,i)),this}]]).setUA(s).useExtension(e),this):new z(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:c:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(U&&U.userAgent==this.ua)switch(this.itemType){case u:U.brave&&typeof U.brave.isBrave==l.FUNCTION&&this.set(k,"Brave");break;case m:!this.get(x)&&_&&_[S]&&this.set(x,S),"Macintosh"==this.get(E)&&U&&typeof U.standalone!==l.UNDEFINED&&U.maxTouchPoints&&2<U.maxTouchPoints&&this.set(E,"iPad").set(x,t);break;case g:!this.get(k)&&_&&_[I]&&this.set(k,_[I]);break;case v:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(u,i(u)).set(h,i(h)).set(m,i(m)).set(f,i(f)).set(g,i(g))}return this},F.prototype.parseUA=function(){switch(this.itemType!=v&&A.call(this.data,this.ua,this.rgxMap),this.itemType){case u:this.set(j,H(this.get(C)));break;case g:var i;"iOS"==this.get(k)&&this.get(C)&&/^1[89][^\d]/.exec(this.get(C))&&(i=/\) Version\/((\d+)[\d\.]*)/.exec(this.ua))&&26<=parseInt(i[2],10)&&this.set(C,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case u:case f:var o,r=e[W]||e[$];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==u&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=vi||o==ki&&/WebView2/.test(s))&&(s=p(s,zi),(o=this.get(k))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(k,s).set(C,n).set(j,H(n)),o=s),this.itemType==f&&s==vi&&this.set(C,n)}break;case h:var w=e[N];w&&("64"==e[X]&&(w+="64"),A.call(this.data,w+";",t));break;case m:if(e[S]&&this.set(x,S),e[E]&&(this.set(E,e[E]),this.get(x)&&this.get(y)||(A.call(w={},"droid 9; "+e[E]+")",t),!this.get(x)&&w.type&&this.set(x,w.type),!this.get(y)&&w.vendor&&this.set(y,w.vendor))),e[T]){if("string"!=typeof e[T])for(var b=0;!i&&b<e[T].length;)i=p(e[T][b++],Fi);else i=p(e[T],Fi);this.set(x,i)}break;case g:var d,w=e[I];w&&(d=e[J],w==Ni&&(d=13<=parseInt(H(d),10)?"11":"10"),this.set(k,w).set(C,d)),this.get(k)==Ni&&"Xbox"==e[E]&&this.set(k,"Xbox").set(C,c);break;case v:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(u,w(u)).set(h,w(h)).set(m,w(m)).set(f,w(f)).set(g,w(g))}return this},z.VERSION="2.0.10",z.BROWSER=B([k,C,j,x]),z.CPU=B([N]),z.DEVICE=B([E,y,x,R,S,e,t,o,L]),z.ENGINE=z.OS=B([k,C]),typeof exports!==l.UNDEFINED?(exports=typeof module!==l.UNDEFINED&&module.exports?module.exports=z:exports).UAParser=z:typeof define===l.FUNCTION&&define.amd?define(function(){return z}):Ei&&(i.UAParser=z);var Mi,Pi=Ei&&(i.jQuery||i.Zepto);Pi&&!Pi.ua&&(Mi=new z,Pi.ua=Mi.getResult(),Pi.ua.get=function(){return Mi.getUA()},Pi.ua.set=function(i){Mi.setUA(i);var e,t=Mi.getResult();for(e in t)Pi.ua[e]=t[e]})})("object"==typeof window?window:this);
--- +++ @@ -1,4 +1,4 @@-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10 Copyright © 2012-2026 Faisal Salman <[email protected]> AGPLv3 License */-function B(i){for(var e={},o=0;o<i.length;o++)e[i[o].toUpperCase()]=i[o];return e}function H(i){return Si(i)?z(/[^\d\.]/g,i).split(".")[0]:void 0}function A(i,e){if(i&&e)for(var o,t,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],d=e[n+1],b=o=0;b<w.length&&!a&&w[b];)if(a=w[b++].exec(i))for(t=0;t<d.length;t++)s=a[++o],typeof(r=d[t])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):void 0:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):void 0:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):void 0):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):void 0:this[r[0]]=s?r[1].call(this,s,r[2]):void 0):this[r]=s||void 0;n+=2}}function c(i,e){for(var o in e)if(typeof e[o]===l.OBJECT&&0<e[o].length){for(var t=0;t<e[o].length;t++)if(Ni(e[o][t],i))return"?"===o?void 0:o}else if(Ni(e[o],i))return"?"===o?void 0:o;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var o=Di.init[i],t=Di.isIgnore[i]||0,r=Di.isIgnoreRgx[i]||0,a=Di.toString[i]||0;function s(){U.call(this,o)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ti).then(function(i){return e.setCH(new Fi(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=f&&(s.prototype.is=function(i){var e,o=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ni(t,e)&&q(r?z(r,this[e]):this[e])==q(r?z(r,i):i)){if(o=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&o){o=!o;break}return o},s.prototype.toString=function(){var i,e=b;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":b)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in o)o.hasOwnProperty(i)&&(this[i]=o[i])}var o=this,t=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(t),t},new s}var V="user-agent",b="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",p="cpu",u="device",m="engine",g="os",f="result",v="name",k="type",x="vendor",y="version",C="architecture",P="major",N="model",j="console",E="mobile",o="tablet",i="smarttv",e="wearable",R="xr",G="embedded",t="inapp",L="brands",S="formFactors",$="fullVersionList",T="platform",W="platformVersion",J="bitness",r="sec-ch-ua",X=r+"-full-version-list",Y=r+"-arch",Z=r+"-"+J,K=r+"-form-factors",Q=r+"-"+E,ii=r+"-"+N,ei=r+"-"+T,oi=ei+"-version",ti=[L,$,E,N,T,W,C,S,J],ri="Amazon",a="Apple",ai="ASUS",si="BlackBerry",s="Google",ni="Huawei",wi="Lenovo",di="Honor",bi="LG",li="Microsoft",ci="Motorola",hi="OnePlus",pi="OPPO",ui="Samsung",mi="Sony",gi="Xiaomi",fi="Zebra",vi="Chromium",n="Chromecast",ki="Edge",xi="Firefox",w="Opera",yi="Facebook",d="Mobile ",O=" Browser",Ci="Windows",I=typeof window!==l.UNDEFINED&&window.navigator?window.navigator:void 0,_=I&&I.userAgentData?I.userAgentData:void 0,Ni=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var o in i)if(q(e)==q(i[o]))return!0;return!1}return!!Si(i)&&q(e)==q(i)},Ei=function(i,e){for(var o in i)return/^(browser|cpu|device|engine|os)$/.test(o)||!!e&&Ei(i[o])},Si=function(i){return typeof i===l.STRING},Ti=function(i){if(i){for(var e,o=[],t=z(/\\?\"/g,i).split(","),r=0;r<t.length;r++)-1<t[r].indexOf(";")?(e=Ii(t[r]).split(";v="),o[r]={brand:e[0],version:e[1]}):o[r]=Ii(t[r]);return o}},q=function(i){return Si(i)?i.toLowerCase():i},U=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=void 0);return this},z=function(i,e){return Si(e)?e.replace(i,b):e},Oi=function(i){return z(/\\?\"/g,i)},Ii=function(i,e){return i=z(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},_i={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},qi={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":void 0},Ui={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},zi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[y,[v,d+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[y,[v,ki+" WebView"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[y,[v,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[v,y],[/opios[\/ ]+([\w\.]+)/i],[y,[v,w+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[y,[v,w+" GX"]],[/\bopr\/([\w\.]+)/i],[y,[v,w]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[y,[v,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[y,[v,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[v,y],[/quark(?:pc)?\/([-\w\.]+)/i],[y,[v,"Quark"]],[/\bddg\/([\w\.]+)/i],[y,[v,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[y,[v,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[y,[v,"WeChat"]],[/konqueror\/([\w\.]+)/i],[y,[v,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[y,[v,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[y,[v,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[y,[v,"Smart "+wi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[v,/(.+)/,"$1 Secure"+O],y],[/norton\/([\w\.]+)/i],[y,[v,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[y,[v,xi+" Focus"]],[/ mms\/([\w\.]+)$/i],[y,[v,w+" Neon"]],[/ opt\/([\w\.]+)$/i],[y,[v,w+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[y,[v,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[y,[v,"Dolphin"]],[/coast\/([\w\.]+)/i],[y,[v,w+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[y,[v,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[y,[v,d+xi]],[/\bqihoobrowser\/?([\w\.]*)/i],[y,[v,"360"]],[/\b(qq)\/([\w\.]+)/i],[[v,/(.+)/,"$1Browser"],y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[v,/(.+)/,"$1"+O],y],[/samsungbrowser\/([\w\.]+)/i],[y,[v,ui+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[y,[v,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[v,"Sogou Mobile"],y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[v,y],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[v],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[y,v],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[v,yi],y,[k,t]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[v,y,[k,t]],[/\bgsa\/([\w\.]+) .*safari\//i],[y,[v,"GSA"],[k,t]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[y,[v,"TikTok"],[k,t]],[/\[(linkedin)app\]/i],[v,[k,t]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[v,/(.+)/,"Zalo"],y,[k,t]],[/(chromium)[\/ ]([-\w\.]+)/i],[v,y],[/ome-(lighthouse)$/i],[v,[k,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[y,[v,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[y,[v,ki+" WebView2"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[v,"Chrome WebView"],y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[y,[v,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[y,[v,d+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[v,y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[y,[v,d+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[v,d+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[y,v],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[v,[y,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[v,y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[v,d+xi],y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[v,"Netscape"],y],[/(wolvic|librewolf)\/([\w\.]+)/i],[v,y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[y,[v,xi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[v,[y,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[v,[y,/[^\d\.]+./,b]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[C,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[C,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[C,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[C,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[C,"arm"]],[/ sun4\w[;\)]/i],[[C,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[C,/ower/,b,q]],[/mc680.0/i],[[C,"68k"]],[/winnt.+\[axp/i],[[C,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[N,[x,ui],[k,o]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[N,[x,ui],[k,E]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[N,[x,a],[k,E]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[N,[x,a],[k,o]],[/(macintosh);/i],[N,[x,a]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[N,[x,"Sharp"],[k,E]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[N,[x,di],[k,o]],[/honor([-\w ]+)[;\)]/i],[N,[x,di],[k,E]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[N,[x,ni],[k,o]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[N,[x,ni],[k,E]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[N,/_/g," "],[x,gi],[k,o]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[N,/_/g," "],[x,gi],[k,E]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[N,[x,hi],[k,E]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[N,[x,pi],[k,E]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[N,[x,c,{OnePlus:["203","304","403","404","413","415"],"*":pi}],[k,o]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[N,[x,"BLU"],[k,E]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[N,[x,"Vivo"],[k,E]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[N,[x,"Realme"],[k,E]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[N,[x,wi],[k,o]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[N,[x,wi],[k,E]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[N,[x,ci],[k,E]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[N,[x,ci],[k,o]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[N,[x,bi],[k,o]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[N,[x,bi],[k,E]],[/(nokia) (t[12][01])/i],[x,N,[k,o]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[N,/_/g," "],[k,E],[x,"Nokia"]],[/(pixel (c|tablet))\b/i],[N,[x,s],[k,o]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[N,[x,s],[k,E]],[/(google) (pixelbook( go)?)/i],[x,N],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[N,[x,mi],[k,E]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[N,"Xperia Tablet"],[x,mi],[k,o]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[N,[x,ri],[k,o]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[N,/(.+)/g,"Fire Phone $1"],[x,ri],[k,E]],[/(playbook);[-\w\),; ]+(rim)/i],[N,x,[k,o]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[N,[x,si],[k,E]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[N,[x,ai],[k,o]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[N,[x,ai],[k,E]],[/(nexus 9)/i],[N,[x,"HTC"],[k,o]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[x,[N,/_/g," "],[k,E]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[N,[x,"TCL"],[k,o]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[N,[x,"TCL"],[k,E]],[/(itel) ((\w+))/i],[[x,q],N,[k,c,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[N,[x,"Acer"],[k,o]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[N,[x,"Meizu"],[k,E]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[N,[x,"Ulefone"],[k,E]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[N,[x,"Energizer"],[k,E]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[N,[x,"Cat"],[k,E]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[N,[x,"Smartfren"],[k,E]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[N,[x,"Nothing"],[k,E]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[N,[x,"Archos"],[k,o]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[N,[x,"Archos"],[k,E]],[/; (n159v)/i],[N,[x,"HMD"],[k,E]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[x,N,[k,o]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[x,N,[k,E]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[x,N,[k,o]],[/(surface duo)/i],[N,[x,li],[k,o]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[N,[x,"Fairphone"],[k,E]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[N,[x,"Nvidia"],[k,o]],[/(sprint) (\w+)/i],[x,N,[k,E]],[/(kin\.[onetw]{3})/i],[[N,/\./g," "],[x,li],[k,E]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[N,[x,fi],[k,o]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[N,[x,fi],[k,E]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[x,[k,i]],[/hbbtv.+maple;(\d+)/i],[[N,/^/,"SmartTV"],[x,ui],[k,i]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[x,N,[k,i]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[x,bi],[k,i]],[/(apple) ?tv/i],[x,[N,a+" TV"],[k,i]],[/crkey.*devicetype\/chromecast/i],[[N,n+" Third Generation"],[x,s],[k,i]],[/crkey.*devicetype\/([^/]*)/i],[[N,/^/,"Chromecast "],[x,s],[k,i]],[/fuchsia.*crkey/i],[[N,n+" Nest Hub"],[x,s],[k,i]],[/crkey/i],[[N,n],[x,s],[k,i]],[/(portaltv)/i],[N,[x,yi],[k,i]],[/droid.+aft(\w+)( bui|\))/i],[N,[x,ri],[k,i]],[/(shield \w+ tv)/i],[N,[x,"Nvidia"],[k,i]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[N,[x,"Sharp"],[k,i]],[/(bravia[\w ]+)( bui|\))/i],[N,[x,mi],[k,i]],[/(mi(tv|box)-?\w+) bui/i],[N,[x,gi],[k,i]],[/Hbbtv.*(technisat) (.*);/i],[x,N,[k,i]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[x,/.+\/(\w+)/,"$1",c,{LG:"lge"}],[N,Ii],[k,i]],[/(playstation \w+)/i],[N,[x,mi],[k,j]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[N,[x,li],[k,j]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[x,c,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],N,[k,j]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[N,[x,ui],[k,e]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[x,N,[k,e]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[N,[x,pi],[k,e]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[N,[x,a],[k,e]],[/(opwwe\d{3})/i],[N,[x,hi],[k,e]],[/(moto 360)/i],[N,[x,ci],[k,e]],[/(smartwatch 3)/i],[N,[x,mi],[k,e]],[/(g watch r)/i],[N,[x,bi],[k,e]],[/droid.+; (wt63?0{2,3})\)/i],[N,[x,fi],[k,e]],[/droid.+; (glass) \d/i],[N,[x,s],[k,R]],[/(pico) ([\w ]+) os\d/i],[x,N,[k,R]],[/(quest( \d| pro)?s?).+vr/i],[N,[x,yi],[k,R]],[/mobile vr; rv.+firefox/i],[[k,R]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[x,[k,G]],[/(aeobc)\b/i],[N,[x,ri],[k,G]],[/(homepod).+mac os/i],[N,[x,a],[k,G]],[/windows iot/i],[[k,G]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[N,[k,i]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[k,i]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[N,[k,c,{mobile:"Mobile",xr:"VR","*":o}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[k,o]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[k,E]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[N,[x,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[y,[v,ki+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[v,y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[y,[v,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[v,y],[/ladybird\//i],[[v,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[y,v]],os:[[/(windows nt) (6\.[23]); arm/i],[[v,/N/,"R"],[y,c,_i]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[v,y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[y,/(;|\))/g,"",c,_i],[v,Ci]],[/(windows ce)\/?([\d\.]*)/i],[v,y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[y,/_/g,"."],[v,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[v,"macOS"],[y,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[y,[v,n+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[y,[v,n+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[y,[v,n+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[y,[v,n+" Linux"]],[/crkey\/([\d\.]+)/i],[y,[v,n]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[y,v],[/(ubuntu) ([\w\.]+) like android/i],[[v,/(.+)/,"$1 Touch"],y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[v,y],[/\(bb(10);/i],[y,[v,si]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[y,[v,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[y,[v,xi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[y,[v,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[y,c,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[v,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[y,[v,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[y,[v,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[y,[v,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[v,y],[/(sunos) ?([\d\.]*)/i],[[v,"Solaris"],y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[v,y]]},Di=(w={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},U.call(w.init,[[h,[v,y,P,k]],[p,[C]],[u,[k,N,x]],[m,[v,y]],[g,[v,y]]]),U.call(w.isIgnore,[[h,[y,P]],[m,[y]],[g,[y]]]),U.call(w.isIgnoreRgx,[[h,/ ?browser$/i],[g,/ ?os$/i]]),U.call(w.toString,[[h,[v,y]],[p,[C]],[u,[x,N]],[m,[v,y]],[g,[v,y]]]),w);function Fi(i,e){if(i=i||{},U.call(this,ti),e)U.call(this,[[L,Ti(i[r])],[$,Ti(i[X])],[E,/\?1/.test(i[Q])],[N,Oi(i[ii])],[T,Oi(i[ei])],[W,Oi(i[oi])],[C,Oi(i[Y])],[S,Ti(i[K])],[J,Oi(i[Z])]]);else for(var o in i)this.hasOwnProperty(o)&&typeof i[o]!==l.UNDEFINED&&(this[o]=i[o])}function D(i,e,o,t){return U.call(this,[["itemType",i],["ua",e],["uaCH",t],["rgxMap",o],["data",M(this,i)]]),this}function F(i,e,o){if(typeof i===l.OBJECT?(e=Ei(i,!0)?(typeof e===l.OBJECT&&(o=e),i):void(o=i),i=void 0):typeof i!==l.STRING||Ei(e,!0)||(o=e,e=void 0),o)if(typeof o.append===l.FUNCTION){var t={};o.forEach(function(i,e){t[String(e).toLowerCase()]=i}),o=t}else{var r,a={};for(r in o)o.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=o[r]);o=a}var s,n,w,d;return this instanceof F?(s=typeof i===l.STRING?i:o&&o[V]?o[V]:I&&I.userAgent?I.userAgent:b,n=new Fi(o,!0),w=e?((i,e)=>{var o,t={},r=e;if(!Ei(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(o in i)t[o]=r[o]&&r[o].length%2==0?r[o].concat(i[o]):i[o];return t})(zi,e):zi,U.call(this,[["getBrowser",(d=function(i){return i==f?function(){return new D(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(p,this.getCPU()).set(u,this.getDevice()).set(m,this.getEngine()).set(g,this.getOS()).get()}:function(){return new D(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",d(p)],["getDevice",d(u)],["getEngine",d(m)],["getOS",d(g)],["getResult",d(f)],["getUA",function(){return s}],["setUA",function(i){return Si(i)&&(s=Ii(i,500)),this}]]).setUA(s),this):new F(i,e,o).getResult()}D.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:void 0:this.data},D.prototype.set=function(i,e){return this.data[i]=e,this},D.prototype.setCH=function(i){return this.uaCH=i,this},D.prototype.detectFeature=function(){if(I&&I.userAgent==this.ua)switch(this.itemType){case h:I.brave&&typeof I.brave.isBrave==l.FUNCTION&&this.set(v,"Brave");break;case u:!this.get(k)&&_&&_[E]&&this.set(k,E),"Macintosh"==this.get(N)&&I&&typeof I.standalone!==l.UNDEFINED&&I.maxTouchPoints&&2<I.maxTouchPoints&&this.set(N,"iPad").set(k,o);break;case g:!this.get(v)&&_&&_[T]&&this.set(v,_[T]);break;case f:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(p,i(p)).set(u,i(u)).set(m,i(m)).set(g,i(g))}return this},D.prototype.parseUA=function(){switch(this.itemType!=f&&A.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(P,H(this.get(y)));break;case g:var i;"iOS"==this.get(v)&&"18.6"==this.get(y)&&(i=/\) Version\/([\d\.]+)/.exec(this.ua))&&26<=parseInt(i[1].substring(0,2),10)&&this.set(y,i[1])}return this},D.prototype.parseCH=function(){var i,e=this.uaCH,o=this.rgxMap;switch(this.itemType){case h:case m:var t,r=e[$]||e[L];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!t||/Chrom/.test(t)&&s!=vi||t==ki&&/WebView2/.test(s))&&(s=c(s,Ui),(t=this.get(v))&&!/Chrom/.test(t)&&/Chrom/.test(s)||this.set(v,s).set(y,n).set(P,H(n)),t=s),this.itemType==m&&s==vi&&this.set(y,n)}break;case p:var w=e[C];w&&("64"==e[J]&&(w+="64"),A.call(this.data,w+";",o));break;case u:if(e[E]&&this.set(k,E),e[N]&&(this.set(N,e[N]),this.get(k)&&this.get(x)||(A.call(w={},"droid 9; "+e[N]+")",o),!this.get(k)&&w.type&&this.set(k,w.type),!this.get(x)&&w.vendor&&this.set(x,w.vendor))),e[S]){if("string"!=typeof e[S])for(var d=0;!i&&d<e[S].length;)i=c(e[S][d++],qi);else i=c(e[S],qi);this.set(k,i)}break;case g:var b,w=e[T];w&&(b=e[W],w==Ci&&(b=13<=parseInt(H(b),10)?"11":"10"),this.set(v,w).set(y,b)),this.get(v)==Ci&&"Xbox"==e[N]&&this.set(v,"Xbox").set(y,void 0);break;case f:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(p,w(p)).set(u,w(u)).set(m,w(m)).set(g,w(g))}return this},F.VERSION="2.0.9",F.BROWSER=B([v,y,P,k]),F.CPU=B([C]),F.DEVICE=B([N,x,k,j,E,i,o,e,G]),F.ENGINE=F.OS=B([v,y]);export{F as UAParser};+function D(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function H(i){return q(i)?Ii(/[^\d\.]/g,i).split(".")[0]:void 0}function M(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):void 0:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):void 0:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):void 0):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):void 0:this[r[0]]=s?r[1].call(this,s,r[2]):void 0):this[r]=s||void 0;n+=2}}function c(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Ni(e[t][o],i))return"?"===t?void 0:t}else if(Ni(e[t],i))return"?"===t?void 0:t;return e.hasOwnProperty("*")?e["*"]:i}function A(e,i){var t=Bi.init[i],o=Bi.isIgnore[i]||0,r=Bi.isIgnoreRgx[i]||0,a=Bi.toString[i]||0;function s(){z.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ri).then(function(i){return e.setCH(new Di(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=g&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ni(o,e)&&U(r?Ii(r,this[e]):this[e])==U(r?Ii(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var V=500,P="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",p="cpu",u="device",m="engine",f="os",g="result",v="name",k="type",x="vendor",y="version",C="architecture",j="major",E="model",R="console",N="mobile",t="tablet",i="smarttv",e="wearable",G="xr",L="embedded",o="inapp",$="brands",S="formFactors",W="fullVersionList",T="platform",J="platformVersion",X="bitness",r="sec-ch-ua",Y=r+"-full-version-list",Z=r+"-arch",K=r+"-"+X,Q=r+"-form-factors",ii=r+"-"+N,ei=r+"-"+E,ti=r+"-"+T,oi=ti+"-version",ri=[$,W,N,E,T,J,C,S,X],ai="Amazon",a="Apple",si="ASUS",ni="BlackBerry",s="Google",wi="Huawei",bi="Lenovo",di="Honor",li="LG",ci="Microsoft",hi="Motorola",pi="OnePlus",ui="OPPO",mi="Samsung",fi="Sony",gi="Xiaomi",vi="Zebra",ki="Chromium",n="Chromecast",xi="Edge",yi="Firefox",w="Opera",Ci="Facebook",b="Mobile ",O=" Browser",Ei="Windows",I=typeof window!==l.UNDEFINED&&window.navigator?window.navigator:void 0,_=I&&I.userAgentData?I.userAgentData:void 0,Ni=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(U(e)==U(i[t]))return!0;return!1}return!!q(i)&&U(e)==U(i)},Si=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Si(i[t])},q=function(i){return typeof i===l.STRING},Ti=function(i){if(i){for(var e,t=[],o=Oi(i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=_i(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=_i(o[r]);return t}},U=function(i){return q(i)?i.toLowerCase():i},Oi=function(i){return q(i)?_i(Ii(/\\?\"/g,i),V):void 0},z=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=void 0);return this},Ii=function(i,e){return q(e)?e.replace(i,d):e},_i=function(i,e){return i=Ii(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},qi={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Ui={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":void 0},zi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},Fi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[y,[v,b+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[y,[v,xi+" WebView"],[k,o]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[y,[v,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[v,y],[/opios[\/ ]+([\w\.]+)/i],[y,[v,w+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[y,[v,w+" GX"]],[/\bopr\/([\w\.]+)/i],[y,[v,w]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[y,[v,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[y,[v,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[v,y],[/quark(?:pc)?\/([-\w\.]+)/i],[y,[v,"Quark"]],[/\bddg\/([\w\.]+)/i],[y,[v,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i],[y,[v,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[y,[v,"WeChat"]],[/konqueror\/([\w\.]+)/i],[y,[v,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[y,[v,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[y,[v,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[y,[v,"Smart "+bi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[v,/(.+)/,"$1 Secure"+O],y],[/norton\/([\w\.]+)/i],[y,[v,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[y,[v,yi+" Focus"]],[/ mms\/([\w\.]+)$/i],[y,[v,w+" Neon"]],[/ opt\/([\w\.]+)$/i],[y,[v,w+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[y,[v,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[y,[v,"Dolphin"]],[/coast\/([\w\.]+)/i],[y,[v,w+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[y,[v,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[y,[v,b+yi]],[/\bqihoobrowser\/?([\w\.]*)/i],[y,[v,"360"]],[/\b(qq)\/([\w\.]+)/i],[[v,/(.+)/,"$1Browser"],y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[v,/(.+)/,"$1"+O],y],[/ HBPC\/([\w\.]+)/],[y,[v,wi+O]],[/samsungbrowser\/([\w\.]+)/i],[y,[v,mi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[y,[v,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[v,"Sogou Mobile"],y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[v,y],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[v],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[y,v],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[v,Ci],y,[k,o]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[v,y,[k,o]],[/\bgsa\/([\w\.]+) .*safari\//i],[y,[v,"GSA"],[k,o]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[y,[v,"TikTok"],[k,o]],[/\[(linkedin)app\]/i],[v,[k,o]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[v,/(.+)/,"Zalo"],y,[k,o]],[/(chromium)[\/ ]([-\w\.]+)/i],[v,y],[/ome-(lighthouse)$/i],[v,[k,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[y,[v,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[y,[v,xi+" WebView2"],[k,o]],[/; wv\).+(chrome)\/([\w\.]+)/i],[[v,"Chrome WebView"],y,[k,o]],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[y,[v,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[y,[v,b+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[v,y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[y,[v,b+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[v,b+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[y,v],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[v,[y,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[v,y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[v,b+yi],y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[v,"Netscape"],y],[/(wolvic|librewolf)\/([\w\.]+)/i],[v,y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[y,[v,yi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[v,[y,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[v,[y,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[C,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[C,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[C,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[C,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[C,"arm"]],[/ sun4\w[;\)]/i],[[C,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[C,/ower/,d,U]],[/mc680.0/i],[[C,"68k"]],[/winnt.+\[axp/i],[[C,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[x,mi],[k,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[x,mi],[k,N]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[x,a],[k,N]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[x,a],[k,t]],[/(macintosh);/i],[E,[x,a]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[x,"Sharp"],[k,N]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[x,di],[k,t]],[/honor([-\w ]+)[;\)]/i],[E,[x,di],[k,N]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[x,wi],[k,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[x,wi],[k,N]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[x,gi],[k,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/; ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[x,gi],[k,N]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[x,pi],[k,N]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[x,ui],[k,N]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[x,c,{OnePlus:["203","304","403","404","413","415"],"*":ui}],[k,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[x,"BLU"],[k,N]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[x,"Vivo"],[k,N]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[x,"Realme"],[k,N]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[x,bi],[k,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[x,bi],[k,N]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[x,hi],[k,N]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[x,hi],[k,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[x,li],[k,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[x,li],[k,N]],[/(nokia) (t[12][01])/i],[x,E,[k,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[k,N],[x,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[x,s],[k,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[x,s],[k,N]],[/(google) (pixelbook( go)?)/i],[x,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[x,fi],[k,N]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[x,fi],[k,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[x,ai],[k,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[x,ai],[k,N]],[/(playbook);[-\w\),; ]+(rim)/i],[E,x,[k,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[x,ni],[k,N]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[x,si],[k,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[x,si],[k,N]],[/(nexus 9)/i],[E,[x,"HTC"],[k,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[x,[E,/_/g," "],[k,N]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[x,"TCL"],[k,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[x,"TCL"],[k,N]],[/(itel) ((\w+))/i],[[x,U],E,[k,c,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[x,"Acer"],[k,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[x,"Meizu"],[k,N]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[x,"Ulefone"],[k,N]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[x,"Energizer"],[k,N]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[x,"Cat"],[k,N]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[x,"Smartfren"],[k,N]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[x,"Nothing"],[k,N]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[x,"Archos"],[k,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[x,"Archos"],[k,N]],[/blackview ([-\w ]+)( b|\))/i,/; (bv\d{4}[-\w ]*)( b|\))/i],[E,[x,"Blackview"],[k,N]],[/; (n159v)/i],[E,[x,"HMD"],[k,N]],[/((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i],[E,[k,function(i,e){return e.test.test(i)?e.ifTrue:e.ifFalse},{test:/ta?b/i,ifTrue:t,ifFalse:N}],[x,"T-Mobile"]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[x,E,[k,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[x,E,[k,N]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[x,E,[k,t]],[/(surface duo)/i],[E,[x,ci],[k,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[x,"Fairphone"],[k,N]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[x,"Nvidia"],[k,t]],[/(sprint) (\w+)/i],[x,E,[k,N]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[x,ci],[k,N]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[x,vi],[k,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[x,vi],[k,N]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[x,[k,i]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[x,mi],[k,i]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[x,E,[k,i]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[x,li],[k,i]],[/(apple) ?tv/i],[x,[E,a+" TV"],[k,i]],[/crkey.*devicetype\/chromecast/i],[[E,n+" Third Generation"],[x,s],[k,i]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[x,s],[k,i]],[/fuchsia.*crkey/i],[[E,n+" Nest Hub"],[x,s],[k,i]],[/crkey/i],[[E,n],[x,s],[k,i]],[/(portaltv)/i],[E,[x,Ci],[k,i]],[/droid.+aft(\w+)( bui|\))/i],[E,[x,ai],[k,i]],[/(shield \w+ tv)/i],[E,[x,"Nvidia"],[k,i]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[x,"Sharp"],[k,i]],[/(bravia[\w ]+)( bui|\))/i],[E,[x,fi],[k,i]],[/(mi(tv|box)-?\w+) bui/i],[E,[x,gi],[k,i]],[/Hbbtv.*(technisat) (.*);/i],[x,E,[k,i]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[x,/.+\/(\w+)/,"$1",c,{LG:"lge"}],[E,_i],[k,i]],[/(playstation \w+)/i],[E,[x,fi],[k,R]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[x,ci],[k,R]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[x,c,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[k,R]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[x,mi],[k,e]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[x,E,[k,e]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[x,ui],[k,e]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[x,a],[k,e]],[/(opwwe\d{3})/i],[E,[x,pi],[k,e]],[/(moto 360)/i],[E,[x,hi],[k,e]],[/(smartwatch 3)/i],[E,[x,fi],[k,e]],[/(g watch r)/i],[E,[x,li],[k,e]],[/droid.+; (wt63?0{2,3})\)/i],[E,[x,vi],[k,e]],[/droid.+; (glass) \d/i],[E,[x,s],[k,G]],[/(pico) ([\w ]+) os\d/i],[x,E,[k,G]],[/(quest( \d| pro)?s?).+vr/i],[E,[x,Ci],[k,G]],[/mobile vr; rv.+firefox/i],[[k,G]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[x,[k,L]],[/(aeobc)\b/i],[E,[x,ai],[k,L]],[/(homepod).+mac os/i],[E,[x,a],[k,L]],[/windows iot/i],[[k,L]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[k,i]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[k,i]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[k,c,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[k,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[k,N]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[x,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[y,[v,xi+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[v,y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[y,[v,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[v,y],[/ladybird\//i],[[v,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[y,v]],os:[[/(windows nt) (6\.[23]); arm/i],[[v,/N/,"R"],[y,c,qi]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[v,y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[y,/(;|\))/g,"",c,qi],[v,Ei]],[/(windows ce)\/?([\d\.]*)/i],[v,y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[y,/_/g,"."],[v,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[v,"macOS"],[y,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[y,[v,n+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[y,[v,n+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[y,[v,n+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[y,[v,n+" Linux"]],[/crkey\/([\d\.]+)/i],[y,[v,n]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[y,v],[/(ubuntu) ([\w\.]+) like android/i],[[v,/(.+)/,"$1 Touch"],y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[v,y],[/\(bb(10);/i],[y,[v,ni]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[y,[v,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[y,[v,yi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[y,[v,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[y,c,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[v,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[y,[v,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[y,[v,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[y,[v,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[v,y],[/(sunos) ?([\d\.]*)/i],[[v,"Solaris"],y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[v,y]]},Bi=(w={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},z.call(w.init,[[h,[v,y,j,k]],[p,[C]],[u,[k,E,x]],[m,[v,y]],[f,[v,y]]]),z.call(w.isIgnore,[[h,[y,j]],[m,[y]],[f,[y]]]),z.call(w.isIgnoreRgx,[[h,/ ?browser$/i],[f,/ ?os$/i]]),z.call(w.toString,[[h,[v,y]],[p,[C]],[u,[x,E]],[m,[v,y]],[f,[v,y]]]),w);function Di(i,e){if(i=i||{},z.call(this,ri),e)z.call(this,[[$,Ti(i[r])],[W,Ti(i[Y])],[N,/\?1/.test(i[ii])],[E,Oi(i[ei])],[T,Oi(i[ti])],[J,Oi(i[oi])],[C,Oi(i[Z])],[S,Ti(i[Q])],[X,Oi(i[K])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return z.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",A(this,i)]]),this}function B(i,e,t){if(typeof i===l.OBJECT?(e=Si(i,!0)?(typeof e===l.OBJECT&&(t=e),i):void(t=i),i=void 0):typeof i!==l.STRING||Si(e,!0)||(t=e,e=void 0),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof B?(s=typeof i===l.STRING?i:t&&t[P]?t[P]:I&&I.userAgent?I.userAgent:d,n=new Di(t,!0),w=Fi,z.call(this,[["getBrowser",(b=function(i){return i==g?function(){return new F(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(p,this.getCPU()).set(u,this.getDevice()).set(m,this.getEngine()).set(f,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",b(p)],["getDevice",b(u)],["getEngine",b(m)],["getOS",b(f)],["getResult",b(g)],["getUA",function(){return s}],["setUA",function(i){return q(i)&&(s=_i(i,V)),this}],["useExtension",function(i){return i&&(w=((i,e)=>{var t,o={},r=e;if(!Si(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(w,i)),this}]]).setUA(s).useExtension(e),this):new B(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:void 0:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(I&&I.userAgent==this.ua)switch(this.itemType){case h:I.brave&&typeof I.brave.isBrave==l.FUNCTION&&this.set(v,"Brave");break;case u:!this.get(k)&&_&&_[N]&&this.set(k,N),"Macintosh"==this.get(E)&&I&&typeof I.standalone!==l.UNDEFINED&&I.maxTouchPoints&&2<I.maxTouchPoints&&this.set(E,"iPad").set(k,t);break;case f:!this.get(v)&&_&&_[T]&&this.set(v,_[T]);break;case g:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(p,i(p)).set(u,i(u)).set(m,i(m)).set(f,i(f))}return this},F.prototype.parseUA=function(){switch(this.itemType!=g&&M.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(j,H(this.get(y)));break;case f:var i;"iOS"==this.get(v)&&this.get(y)&&/^1[89][^\d]/.exec(this.get(y))&&(i=/\) Version\/((\d+)[\d\.]*)/.exec(this.ua))&&26<=parseInt(i[2],10)&&this.set(y,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case h:case m:var o,r=e[W]||e[$];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=ki||o==xi&&/WebView2/.test(s))&&(s=c(s,zi),(o=this.get(v))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(v,s).set(y,n).set(j,H(n)),o=s),this.itemType==m&&s==ki&&this.set(y,n)}break;case p:var w=e[C];w&&("64"==e[X]&&(w+="64"),M.call(this.data,w+";",t));break;case u:if(e[N]&&this.set(k,N),e[E]&&(this.set(E,e[E]),this.get(k)&&this.get(x)||(M.call(w={},"droid 9; "+e[E]+")",t),!this.get(k)&&w.type&&this.set(k,w.type),!this.get(x)&&w.vendor&&this.set(x,w.vendor))),e[S]){if("string"!=typeof e[S])for(var b=0;!i&&b<e[S].length;)i=c(e[S][b++],Ui);else i=c(e[S],Ui);this.set(k,i)}break;case f:var d,w=e[T];w&&(d=e[J],w==Ei&&(d=13<=parseInt(H(d),10)?"11":"10"),this.set(v,w).set(y,d)),this.get(v)==Ei&&"Xbox"==e[E]&&this.set(v,"Xbox").set(y,void 0);break;case g:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(p,w(p)).set(u,w(u)).set(m,w(m)).set(f,w(f))}return this},B.VERSION="2.0.10",B.BROWSER=D([v,y,j,k]),B.CPU=D([C]),B.DEVICE=D([E,x,k,R,N,i,t,e,L]),B.ENGINE=B.OS=D([v,y]);export{B as UAParser};
--- +++ @@ -1,3 +1,3 @@ /////////////////////////////////////////////////////////////////////////////////-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10 Copyright © 2012-2026 Faisal Salman <[email protected]>@@ -21,3 +21,3 @@ - var LIBVERSION = '2.0.9',+ var LIBVERSION = '2.0.10', UA_MAX_LENGTH = 500,@@ -172,3 +172,3 @@ var arr = [];- var tokens = strip(/\\?\"/g, header).split(',');+ var tokens = normalizeHeaderValue(header).split(','); for (var i = 0; i < tokens.length; i++) {@@ -189,2 +189,5 @@ },+ normalizeHeaderValue = function (str) {+ return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;+ }, setProps = function (arr) {@@ -204,5 +207,2 @@ return isString(str) ? str.replace(pattern, EMPTY) : str;- },- stripQuotes = function (str) {- return strip(/\\?\"/g, str); },@@ -280,2 +280,6 @@ + strTest = function (str, map) {+ return map.test.test(str) ? map.ifTrue : map.ifFalse;+ },+ strMapper = function (str, map) {@@ -350,3 +354,3 @@ /webview.+edge\/([\w\.]+)/i // Microsoft Edge- ], [VERSION, [NAME, EDGE+' WebView']], [+ ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [ /edg(?:e|ios|a)?\/([\w\.]+)/i @@ -390,3 +394,3 @@ ], [VERSION, [NAME, 'DuckDuckGo']], [- /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser+ /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i // UCBrowser ], [VERSION, [NAME, 'UCBrowser']], [@@ -429,3 +433,5 @@ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/VivoBrowser/PicoBrowser+ / HBPC\/([\w\.]+)/ // Huawei Browser+ ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [ /samsungbrowser\/([\w\.]+)/i // Samsung Internet@@ -477,6 +483,6 @@ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2- ], [VERSION, [NAME, EDGE+' WebView2']], [-- / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView- ], [[NAME, CHROME+' WebView'], VERSION], [+ ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [++ /; wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView+ ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [ @@ -614,3 +620,3 @@ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,- / ([\w ]+) miui\/v?\d/i+ /; ([\w ]+) miui\/v?\d/i ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [@@ -769,2 +775,7 @@ + // Blackview+ /blackview ([-\w ]+)( b|\))/i,+ /; (bv\d{4}[-\w ]*)( b|\))/i+ ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [+ // HMD@@ -772,2 +783,6 @@ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [++ // T-Mobile+ /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i+ ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [ @@ -780,4 +795,4 @@ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan- // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko- /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,+ // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko+ /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i, /(hp) ([\w ]+\w)/i, // HP iPAQ@@ -1189,8 +1204,8 @@ [MOBILE, /\?1/.test(uach[CH_MOBILE])],- [MODEL, stripQuotes(uach[CH_MODEL])],- [PLATFORM, stripQuotes(uach[CH_PLATFORM])],- [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],- [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],+ [MODEL, normalizeHeaderValue(uach[CH_MODEL])],+ [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],+ [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],+ [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])], [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],- [BITNESS, stripQuotes(uach[CH_BITNESS])]+ [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])] ]);@@ -1282,7 +1297,13 @@ case OS:- if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {- // Based on the assumption that iOS version is tightly coupled with Safari version- var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version- if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {- this.set(VERSION, realVersion[1]); // Set as iOS version+ // Since iOS 26, Safari's UA reports the OS version as frozen at 18:+ // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string+ if (this.get(NAME) == 'iOS' && this.get(VERSION)) {+ // Only perform this if iOS version is 18/19+ if (/^1[89][^\d]/.exec(this.get(VERSION))) {+ // Based on the assumption that "iOS" version is tightly coupled with "Safari" version+ var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);+ if (realVersion && parseInt(realVersion[2], 10) >= 26) {+ // iOS version = Safari version+ this.set(VERSION, realVersion[1]);+ } }@@ -1442,5 +1463,3 @@ httpUACH = new UACHData(headers, true),- regexMap = extensions ? - extend(defaultRegexes, extensions) : - defaultRegexes,+ regexMap = defaultRegexes, @@ -1479,5 +1498,10 @@ return this;+ }],+ ['useExtension', function (exts) {+ if (exts) regexMap = extend(regexMap, exts);+ return this; }] ])- .setUA(userAgent);+ .setUA(userAgent)+ .useExtension(extensions);
--- +++ @@ -5,3 +5,3 @@ /////////////////////////////////////////////////////////////////////////////////-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10 Copyright © 2012-2026 Faisal Salman <[email protected]>@@ -23,3 +23,3 @@ - var LIBVERSION = '2.0.9',+ var LIBVERSION = '2.0.10', UA_MAX_LENGTH = 500,@@ -174,3 +174,3 @@ var arr = [];- var tokens = strip(/\\?\"/g, header).split(',');+ var tokens = normalizeHeaderValue(header).split(','); for (var i = 0; i < tokens.length; i++) {@@ -191,2 +191,5 @@ },+ normalizeHeaderValue = function (str) {+ return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;+ }, setProps = function (arr) {@@ -206,5 +209,2 @@ return isString(str) ? str.replace(pattern, EMPTY) : str;- },- stripQuotes = function (str) {- return strip(/\\?\"/g, str); },@@ -282,2 +282,6 @@ + strTest = function (str, map) {+ return map.test.test(str) ? map.ifTrue : map.ifFalse;+ },+ strMapper = function (str, map) {@@ -352,3 +356,3 @@ /webview.+edge\/([\w\.]+)/i // Microsoft Edge- ], [VERSION, [NAME, EDGE+' WebView']], [+ ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [ /edg(?:e|ios|a)?\/([\w\.]+)/i @@ -392,3 +396,3 @@ ], [VERSION, [NAME, 'DuckDuckGo']], [- /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser+ /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i // UCBrowser ], [VERSION, [NAME, 'UCBrowser']], [@@ -431,3 +435,5 @@ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/VivoBrowser/PicoBrowser+ / HBPC\/([\w\.]+)/ // Huawei Browser+ ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [ /samsungbrowser\/([\w\.]+)/i // Samsung Internet@@ -479,6 +485,6 @@ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2- ], [VERSION, [NAME, EDGE+' WebView2']], [-- / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView- ], [[NAME, CHROME+' WebView'], VERSION], [+ ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [++ /; wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView+ ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [ @@ -616,3 +622,3 @@ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,- / ([\w ]+) miui\/v?\d/i+ /; ([\w ]+) miui\/v?\d/i ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [@@ -771,2 +777,7 @@ + // Blackview+ /blackview ([-\w ]+)( b|\))/i,+ /; (bv\d{4}[-\w ]*)( b|\))/i+ ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [+ // HMD@@ -774,2 +785,6 @@ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [++ // T-Mobile+ /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i+ ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [ @@ -782,4 +797,4 @@ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan- // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko- /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,+ // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko+ /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i, /(hp) ([\w ]+\w)/i, // HP iPAQ@@ -1191,8 +1206,8 @@ [MOBILE, /\?1/.test(uach[CH_MOBILE])],- [MODEL, stripQuotes(uach[CH_MODEL])],- [PLATFORM, stripQuotes(uach[CH_PLATFORM])],- [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],- [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],+ [MODEL, normalizeHeaderValue(uach[CH_MODEL])],+ [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],+ [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],+ [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])], [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],- [BITNESS, stripQuotes(uach[CH_BITNESS])]+ [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])] ]);@@ -1284,7 +1299,13 @@ case OS:- if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {- // Based on the assumption that iOS version is tightly coupled with Safari version- var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version- if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {- this.set(VERSION, realVersion[1]); // Set as iOS version+ // Since iOS 26, Safari's UA reports the OS version as frozen at 18:+ // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string+ if (this.get(NAME) == 'iOS' && this.get(VERSION)) {+ // Only perform this if iOS version is 18/19+ if (/^1[89][^\d]/.exec(this.get(VERSION))) {+ // Based on the assumption that "iOS" version is tightly coupled with "Safari" version+ var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);+ if (realVersion && parseInt(realVersion[2], 10) >= 26) {+ // iOS version = Safari version+ this.set(VERSION, realVersion[1]);+ } }@@ -1444,5 +1465,3 @@ httpUACH = new UACHData(headers, true),- regexMap = extensions ? - extend(defaultRegexes, extensions) : - defaultRegexes,+ regexMap = defaultRegexes, @@ -1481,5 +1500,10 @@ return this;+ }],+ ['useExtension', function (exts) {+ if (exts) regexMap = extend(regexMap, exts);+ return this; }] ])- .setUA(userAgent);+ .setUA(userAgent)+ .useExtension(extensions);
--- +++ @@ -3,3 +3,3 @@ "name": "ua-parser-js",- "version": "2.0.9",+ "version": "2.0.10", "author": "Faisal Salman <[email protected]> (http://faisalman.com)",@@ -25,4 +25,6 @@ "contributors": [+ "23tux <[email protected]>", "Aamir Poonawalla <[email protected]>", "Admas <[email protected]>",+ "Aidan Nulman <[email protected]>", "Aiyush <[email protected]>",@@ -41,4 +43,7 @@ "Benjamin Urban <[email protected]>",+ "Benxamin <[email protected]>", "boneyao <[email protected]>",+ "carel155 <[email protected]>", "Carl C Von Lewin <[email protected]>",+ "Casey Grimes <[email protected]>", "CESAR RAMOS <[email protected]>",@@ -77,2 +82,3 @@ "Germán M. Bravo <[email protected]>",+ "giantyo26 <[email protected]>", "Grigory Dmitrenko <[email protected]>",@@ -81,2 +87,3 @@ "Harald Reingruber <[email protected]>",+ "Harlan Brawer <[email protected]>", "Hendrik Helwich <[email protected]>",@@ -85,2 +92,3 @@ "Hyewon Kang <[email protected]>",+ "Hyper-Z11 <[email protected]>", "Hyunbin <[email protected]>",@@ -114,2 +122,3 @@ "Lukas Eipert <[email protected]>",+ "Maksim Otto <[email protected]>", "Malash <[email protected]>",@@ -157,2 +166,3 @@ "Sandro Sonntag <[email protected]>",+ "Sébastien Règne <[email protected]>", "sgautrea <[email protected]>",@@ -167,2 +177,3 @@ "sUP <[email protected]>",+ "Suryaansh Chawla <[email protected]>", "Sylvain Gizard <[email protected]>",@@ -172,3 +183,5 @@ "Ulrich Schmidt <[email protected]>",+ "undefined <[email protected]>", "Vadim Kurachevsky <[email protected]>",+ "Valentina <[email protected]>", "Varun Sharma <[email protected]>",@@ -229,2 +242,3 @@ "bin": "./script/cli.js",+ "sideEffects": false, "scripts": {@@ -232,3 +246,2 @@ "build+test": "npm run build && npm run test",- "fuzz": "jazzer ./test/fuzz/redos.js --sync", "test": "./script/test-all.sh",@@ -236,2 +249,3 @@ "test:eslint": "eslint --no-config-lookup src",+ "test:fuzz": "jazzer ./test/fuzz/redos.js --sync", "test:jshint": "jshint src/main",@@ -239,2 +253,3 @@ "test:mocha": "mocha --recursive test/unit",+ "test:nyc": "nyc --timeout=50000 --include=src/**/*.js npm run test", "test:playwright": "npx playwright install && playwright test test/e2e --browser all"@@ -249,2 +264,3 @@ "@babel/traverse": "7.23.2",+ "@jazzer.js/core": "^4.0.0", "@playwright/test": "^1.57.0",@@ -254,2 +270,3 @@ "mocha": "~8.2.0",+ "nyc": "^18.0.0", "requirejs": "2.3.2",
--- +++ @@ -1,2 +1,2 @@-// Type definitions for bot-detection submodule of UAParser.js v2.0.9+// Type definitions for bot-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js@@ -4,4 +4,6 @@ -export function isAIAssistant(ua: string): boolean;-export function isAICrawler(ua: string): boolean;-export function isBot(ua: string): boolean;+import type { IResult } from "../main/ua-parser";++export function isAIAssistant(resultOrUA: IResult | string): boolean;+export function isAICrawler(resultOrUA: IResult | string): boolean;+export function isBot(resultOrUA: IResult | string): boolean;
--- +++ @@ -1,3 +1,3 @@ //////////////////////////////////////////////////-/* bot-detection submodule of UAParser.js v2.0.9+/* bot-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -139,2 +139,3 @@ Crawler.META_EXTERNALAGENT,+ Crawler.META_WEBINDEXER,
--- +++ @@ -5,3 +5,3 @@ //////////////////////////////////////////////////-/* bot-detection submodule of UAParser.js v2.0.9+/* bot-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -143,2 +143,3 @@ Crawler.META_EXTERNALAGENT,+ Crawler.META_WEBINDEXER,
--- +++ @@ -1,2 +1,2 @@-// Type definitions for browser-detection submodule of UAParser.js v2.0.9+// Type definitions for browser-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
--- +++ @@ -1,3 +1,3 @@ //////////////////////////////////////////////////////-/* browser-detection submodule of UAParser.js v2.0.9+/* browser-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -21,4 +21,7 @@ const isElectron = () => !!(- process?.versions?.hasOwnProperty('electron') || // node.js- / electron\//i.test(navigator?.userAgent)); // browser+ // in node.js environment+ (typeof process !== 'undefined' && process.versions?.hasOwnProperty('electron')) ||+ // in browser environment+ (typeof navigator !== 'undefined' && / electron\//i.test(navigator.userAgent))+);
--- +++ @@ -5,3 +5,3 @@ //////////////////////////////////////////////////////-/* browser-detection submodule of UAParser.js v2.0.9+/* browser-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -25,4 +25,7 @@ const isElectron = () => !!(- process?.versions?.hasOwnProperty('electron') || // node.js- / electron\//i.test(navigator?.userAgent)); // browser+ // in node.js environment+ (typeof process !== 'undefined' && process.versions?.hasOwnProperty('electron')) ||+ // in browser environment+ (typeof navigator !== 'undefined' && / electron\//i.test(navigator.userAgent))+);
--- +++ @@ -1,2 +1,2 @@-// Type definitions for device-detection submodule of UAParser.js v2.0.9+// Type definitions for device-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
--- +++ @@ -1,3 +1,3 @@ /////////////////////////////////////////////////////-/* device-detection submodule of UAParser.js v2.0.9+/* device-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js
--- +++ @@ -5,3 +5,3 @@ /////////////////////////////////////////////////////-/* device-detection submodule of UAParser.js v2.0.9+/* device-detection submodule of UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/* Enums for UAParser.js v2.0.9+/* Enums for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -222,3 +222,2 @@ CONSOLE: 'console',- DESKTOP: 'desktop', EMBEDDED: 'embedded',@@ -228,3 +227,7 @@ WEARABLE: 'wearable',- XR: 'xr'+ XR: 'xr',+ /**+ * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+ */+ DESKTOP: 'desktop' }>;@@ -247,4 +250,7 @@ BLACKBERRY: 'BlackBerry',+ BLACKVIEW: 'Blackview', BLU: 'BLU', CAT: 'Cat',+ COOLPAD: 'Coolpad',+ CUBOT: 'CUBOT', DELL: 'Dell',@@ -303,2 +309,3 @@ TESLA: 'Tesla',+ T_MOBILE: 'T-Mobile', ULEFONE: 'Ulefone',@@ -475,2 +482,3 @@ AMAZON_CONTXBOT: 'contxbot',+ AMAZON_SEARCHBOT: 'Amzn-SearchBot', ANTHROPIC_AI: 'anthropic-ai',@@ -479,4 +487,8 @@ ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+ ARCHIVEORG_BOT: 'archive.org_bot', ATLASSIAN_BOT: 'atlassian-bot',- ARCHIVEORG_BOT: 'archive.org_bot',+ AUDISTO_CRAWLER: 'Audisto Crawler',+ AWARIO_BOT: 'AwarioBot',+ AWARIO_SMARTBOT: 'AwarioSmartBot',+ AWARIO_RSSBOT: 'AwarioRssBot', BAIDU_ADS: 'Baidu-ADS',@@ -493,2 +505,3 @@ BRAVE_BOT: 'Bravebot',+ BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler', BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -500,2 +513,3 @@ COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+ COMSCORE_PROXIMIC: 'proximic', COTOYOGI: 'Cotoyogi',@@ -533,2 +547,3 @@ GOOGLE_STOREBOT: 'Storebot-Google',+ HEADLINE: 'Headline', HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -536,2 +551,3 @@ HUAWEI_PETALBOT: 'PetalBot',+ HUBSPOT_CRAWLER: 'HubSpot Crawler', HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -546,2 +562,3 @@ MARGINALIA: 'marginalia',+ META_EXTERNALADS: 'meta-externalads', META_EXTERNALAGENT: 'meta-externalagent',@@ -550,2 +567,3 @@ META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+ META_WEBINDEXER: 'meta-webindexer', MAJESTIC_MJ12BOT: 'MJ12bot',@@ -589,2 +607,3 @@ XAI_BOT: 'xAI-Bot',+ YACY_BOT: 'yacybot', YAHOO_JAPAN: 'Y!J-BRW',@@ -695,2 +714,3 @@ AMAZON_NOVA_ACT: 'NovaAct',+ AMAZON_USER: 'Amzn-User', ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -704,4 +724,6 @@ DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+ FEEDLY: 'Feedly', FLIPBOARD_PROXY: 'FlipboardProxy', GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+ GOOGLE_DOCS: 'GoogleDocs', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -735,2 +757,3 @@ UPTIMEROBOT: 'UptimeRobot',+ UPTIMEBOT: 'UptimeBot', VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -740,2 +763,3 @@ VERCEL_TRACING: 'verceltracing',+ VIRUSTOTAL: 'virustotal', X_TWITTERBOT: 'Twitterbot',@@ -794,2 +818,3 @@ OCAML_COHTTP: 'ocaml-cohttp',+ PHP_CRAWL: 'phpcrawl', PHP_SOAP: 'PHP-SOAP',
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/* Enums for UAParser.js v2.0.9+/* Enums for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -218,3 +218,2 @@ CONSOLE: 'console',- DESKTOP: 'desktop', EMBEDDED: 'embedded',@@ -224,3 +223,7 @@ WEARABLE: 'wearable',- XR: 'xr'+ XR: 'xr',+ /**+ * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+ */+ DESKTOP: 'desktop' });@@ -243,4 +246,7 @@ BLACKBERRY: 'BlackBerry',+ BLACKVIEW: 'Blackview', BLU: 'BLU', CAT: 'Cat',+ COOLPAD: 'Coolpad',+ CUBOT: 'CUBOT', DELL: 'Dell',@@ -299,2 +305,3 @@ TESLA: 'Tesla',+ T_MOBILE: 'T-Mobile', ULEFONE: 'Ulefone',@@ -471,2 +478,3 @@ AMAZON_CONTXBOT: 'contxbot',+ AMAZON_SEARCHBOT: 'Amzn-SearchBot', ANTHROPIC_AI: 'anthropic-ai',@@ -475,4 +483,8 @@ ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+ ARCHIVEORG_BOT: 'archive.org_bot', ATLASSIAN_BOT: 'atlassian-bot',- ARCHIVEORG_BOT: 'archive.org_bot',+ AUDISTO_CRAWLER: 'Audisto Crawler',+ AWARIO_BOT: 'AwarioBot',+ AWARIO_SMARTBOT: 'AwarioSmartBot',+ AWARIO_RSSBOT: 'AwarioRssBot', BAIDU_ADS: 'Baidu-ADS',@@ -489,2 +501,3 @@ BRAVE_BOT: 'Bravebot',+ BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler', BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -496,2 +509,3 @@ COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+ COMSCORE_PROXIMIC: 'proximic', COTOYOGI: 'Cotoyogi',@@ -529,2 +543,3 @@ GOOGLE_STOREBOT: 'Storebot-Google',+ HEADLINE: 'Headline', HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -532,2 +547,3 @@ HUAWEI_PETALBOT: 'PetalBot',+ HUBSPOT_CRAWLER: 'HubSpot Crawler', HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -542,2 +558,3 @@ MARGINALIA: 'marginalia',+ META_EXTERNALADS: 'meta-externalads', META_EXTERNALAGENT: 'meta-externalagent',@@ -546,2 +563,3 @@ META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+ META_WEBINDEXER: 'meta-webindexer', MAJESTIC_MJ12BOT: 'MJ12bot',@@ -585,2 +603,3 @@ XAI_BOT: 'xAI-Bot',+ YACY_BOT: 'yacybot', YAHOO_JAPAN: 'Y!J-BRW',@@ -691,2 +710,3 @@ AMAZON_NOVA_ACT: 'NovaAct',+ AMAZON_USER: 'Amzn-User', ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -700,4 +720,6 @@ DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+ FEEDLY: 'Feedly', FLIPBOARD_PROXY: 'FlipboardProxy', GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+ GOOGLE_DOCS: 'GoogleDocs', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -731,2 +753,3 @@ UPTIMEROBOT: 'UptimeRobot',+ UPTIMEBOT: 'UptimeBot', VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -736,2 +759,3 @@ VERCEL_TRACING: 'verceltracing',+ VIRUSTOTAL: 'virustotal', X_TWITTERBOT: 'Twitterbot',@@ -790,2 +814,3 @@ OCAML_COHTTP: 'ocaml-cohttp',+ PHP_CRAWL: 'phpcrawl', PHP_SOAP: 'PHP-SOAP',
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/* Enums for UAParser.js v2.0.9+/* Enums for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -222,3 +222,2 @@ CONSOLE: 'console',- DESKTOP: 'desktop', EMBEDDED: 'embedded',@@ -228,3 +227,7 @@ WEARABLE: 'wearable',- XR: 'xr'+ XR: 'xr',+ /**+ * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+ */+ DESKTOP: 'desktop' });@@ -247,4 +250,7 @@ BLACKBERRY: 'BlackBerry',+ BLACKVIEW: 'Blackview', BLU: 'BLU', CAT: 'Cat',+ COOLPAD: 'Coolpad',+ CUBOT: 'CUBOT', DELL: 'Dell',@@ -303,2 +309,3 @@ TESLA: 'Tesla',+ T_MOBILE: 'T-Mobile', ULEFONE: 'Ulefone',@@ -475,2 +482,3 @@ AMAZON_CONTXBOT: 'contxbot',+ AMAZON_SEARCHBOT: 'Amzn-SearchBot', ANTHROPIC_AI: 'anthropic-ai',@@ -479,4 +487,8 @@ ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+ ARCHIVEORG_BOT: 'archive.org_bot', ATLASSIAN_BOT: 'atlassian-bot',- ARCHIVEORG_BOT: 'archive.org_bot',+ AUDISTO_CRAWLER: 'Audisto Crawler',+ AWARIO_BOT: 'AwarioBot',+ AWARIO_SMARTBOT: 'AwarioSmartBot',+ AWARIO_RSSBOT: 'AwarioRssBot', BAIDU_ADS: 'Baidu-ADS',@@ -493,2 +505,3 @@ BRAVE_BOT: 'Bravebot',+ BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler', BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -500,2 +513,3 @@ COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+ COMSCORE_PROXIMIC: 'proximic', COTOYOGI: 'Cotoyogi',@@ -533,2 +547,3 @@ GOOGLE_STOREBOT: 'Storebot-Google',+ HEADLINE: 'Headline', HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -536,2 +551,3 @@ HUAWEI_PETALBOT: 'PetalBot',+ HUBSPOT_CRAWLER: 'HubSpot Crawler', HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -546,2 +562,3 @@ MARGINALIA: 'marginalia',+ META_EXTERNALADS: 'meta-externalads', META_EXTERNALAGENT: 'meta-externalagent',@@ -550,2 +567,3 @@ META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+ META_WEBINDEXER: 'meta-webindexer', MAJESTIC_MJ12BOT: 'MJ12bot',@@ -589,2 +607,3 @@ XAI_BOT: 'xAI-Bot',+ YACY_BOT: 'yacybot', YAHOO_JAPAN: 'Y!J-BRW',@@ -695,2 +714,3 @@ AMAZON_NOVA_ACT: 'NovaAct',+ AMAZON_USER: 'Amzn-User', ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -704,4 +724,6 @@ DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+ FEEDLY: 'Feedly', FLIPBOARD_PROXY: 'FlipboardProxy', GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+ GOOGLE_DOCS: 'GoogleDocs', GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -735,2 +757,3 @@ UPTIMEROBOT: 'UptimeRobot',+ UPTIMEBOT: 'UptimeBot', VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -740,2 +763,3 @@ VERCEL_TRACING: 'verceltracing',+ VIRUSTOTAL: 'virustotal', X_TWITTERBOT: 'Twitterbot',@@ -794,2 +818,3 @@ OCAML_COHTTP: 'ocaml-cohttp',+ PHP_CRAWL: 'phpcrawl', PHP_SOAP: 'PHP-SOAP',
--- +++ @@ -1,2 +1,2 @@-// Type definitions for Helpers submodule of UAParser.js v2.0.9+// Type definitions for Helpers submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/* Extensions for UAParser.js v2.0.9+/* Extensions for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -57,2 +57,3 @@ // Amazonbot - https://developer.amazon.com/amazonbot+ // Awario - https://awario.com/bots.html // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0@@ -81,3 +82,3 @@ // YepBot - https://yep.com/yepbot/- /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,+ /((?:adidx|ahrefs|amazon|(?:amzn|oai)-search|awario(?:smart|rss)?|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i, @@ -98,4 +99,4 @@ - // Daum- /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,+ // Daum / HubSpot Crawler+ /(daum(?:oa)?(?:-image)?|hubspot crawler)[ \/]([\w\.]+)/i, @@ -103,3 +104,3 @@ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers- /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,+ /(facebook(?:externalhit|catalog)|meta-(?:externalagent|externalads|webindexer))\/([\w\.]+)/i, @@ -132,8 +133,14 @@ - // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot+ // aiHitBot / Algolia Crawler / Audisto Crawler / BLEXBot / BrightEdge Crawler / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/ // Freespoke - https://docs.freespoke.com/search/bot/- /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i+ /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:audisto |brightedge |magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i ], [NAME, VERSION, [TYPE, CRAWLER]],++ [+ // Headline - https://headline.com/legal/crawler+ /(ev-crawler)\/([\w\.]+)/i+ ],+ [[NAME, 'Headline'], VERSION, [TYPE, CRAWLER]], @@ -158,3 +165,3 @@ // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider- /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i+ /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0|yacy)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|proximic|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i ], @@ -308,2 +315,3 @@ // DuckAssistBot - https://duckduckgo.com/duckassistbot/+ // Feedly - https://feedly.com/fetcher.html // FlipboardProxy - https://about.flipboard.com/proxy-service/@@ -314,3 +322,3 @@ // Yandex Bots - https://yandex.com/bots- /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,+ /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:amzn|chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptime(?:ro)?|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i, @@ -318,2 +326,5 @@ /(bluesky) cardyb\/([\w\.]+)/i,++ // Feedly+ /(feedly)(?:bot)?\/([\w\.]+)/i, @@ -332,3 +343,3 @@ // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots- /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i+ /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:docs|imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|virustotal(?=cloud)|yandex(?:sitelinks|userproxy))/i ], @@ -442,3 +453,3 @@ ], [NAME, VERSION, [TYPE, LIBRARY]], [- /(node-fetch|undici)/i+ /(node-fetch|phpcrawl|undici)/i ], [NAME, [TYPE, LIBRARY]]
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/* Extensions for UAParser.js v2.0.9+/* Extensions for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -61,2 +61,3 @@ // Amazonbot - https://developer.amazon.com/amazonbot+ // Awario - https://awario.com/bots.html // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0@@ -85,3 +86,3 @@ // YepBot - https://yep.com/yepbot/- /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,+ /((?:adidx|ahrefs|amazon|(?:amzn|oai)-search|awario(?:smart|rss)?|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i, @@ -102,4 +103,4 @@ - // Daum- /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,+ // Daum / HubSpot Crawler+ /(daum(?:oa)?(?:-image)?|hubspot crawler)[ \/]([\w\.]+)/i, @@ -107,3 +108,3 @@ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers- /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,+ /(facebook(?:externalhit|catalog)|meta-(?:externalagent|externalads|webindexer))\/([\w\.]+)/i, @@ -136,8 +137,14 @@ - // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot+ // aiHitBot / Algolia Crawler / Audisto Crawler / BLEXBot / BrightEdge Crawler / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/ // Freespoke - https://docs.freespoke.com/search/bot/- /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i+ /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:audisto |brightedge |magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i ], [NAME, VERSION, [TYPE, CRAWLER]],++ [+ // Headline - https://headline.com/legal/crawler+ /(ev-crawler)\/([\w\.]+)/i+ ],+ [[NAME, 'Headline'], VERSION, [TYPE, CRAWLER]], @@ -162,3 +169,3 @@ // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider- /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i+ /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0|yacy)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|proximic|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i ], @@ -312,2 +319,3 @@ // DuckAssistBot - https://duckduckgo.com/duckassistbot/+ // Feedly - https://feedly.com/fetcher.html // FlipboardProxy - https://about.flipboard.com/proxy-service/@@ -318,3 +326,3 @@ // Yandex Bots - https://yandex.com/bots- /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,+ /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:amzn|chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptime(?:ro)?|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i, @@ -322,2 +330,5 @@ /(bluesky) cardyb\/([\w\.]+)/i,++ // Feedly+ /(feedly)(?:bot)?\/([\w\.]+)/i, @@ -336,3 +347,3 @@ // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots- /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i+ /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:docs|imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|virustotal(?=cloud)|yandex(?:sitelinks|userproxy))/i ], @@ -446,3 +457,3 @@ ], [NAME, VERSION, [TYPE, LIBRARY]], [- /(node-fetch|undici)/i+ /(node-fetch|phpcrawl|undici)/i ], [NAME, [TYPE, LIBRARY]]
--- +++ @@ -1,2 +1,2 @@-// Type definitions for Helpers submodule of UAParser.js v2.0.9+// Type definitions for Helpers submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/* Helpers for UAParser.js v2.0.9+/* Helpers for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -43,3 +43,3 @@ */-const isElectron = () => _isElectron;+const isElectron = _isElectron;
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/* Helpers for UAParser.js v2.0.9+/* Helpers for UAParser.js v2.0.10 https://github.com/faisalman/ua-parser-js@@ -47,3 +47,3 @@ */-const isElectron = () => _isElectron;+const isElectron = _isElectron;
--- +++ @@ -1,2 +1,2 @@-// Type definitions for UAParser.js v2.0.9+// Type definitions for UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js@@ -7,2 +7,7 @@ declare namespace UAParser {++ type BrowserTypes = typeof BrowserType[keyof typeof BrowserType];+ type CPUArchs = typeof CPUArch[keyof typeof CPUArch];+ type DeviceTypes = typeof DeviceType[keyof typeof DeviceType];+ type EngineNames = typeof EngineName[keyof typeof EngineName]; @@ -19,3 +24,3 @@ major?: string;- type?: typeof BrowserType[keyof typeof BrowserType];+ type?: BrowserTypes; }@@ -23,3 +28,3 @@ interface ICPU extends IData<ICPU> {- architecture?: typeof CPUArch[keyof typeof CPUArch];+ architecture?: CPUArchs; }@@ -27,3 +32,3 @@ interface IDevice extends IData<IDevice> {- type?: typeof DeviceType[keyof typeof DeviceType];+ type?: DeviceTypes; vendor?: string;@@ -33,3 +38,3 @@ interface IEngine extends IData<IEngine> {- name?: typeof EngineName[keyof typeof EngineName];+ name?: EngineNames; version?: string;@@ -107,2 +112,3 @@ setUA(uastring: string): UAParser;+ useExtension(extensions: UAParserExt): UAParser; }
webpack npm critical-tier DELETIONBURST ×33
5.105.4
5.106.0
5.106.1
5.106.2
5.107.0
5.107.1
5.107.2
5.108.0
5.108.1
5.108.2
5.108.3
5.108.4
DELETION
1.0.2 published then removed
high · registry-verified · 2014-02-27 · 12y ago
BURST
5 releases in 45m: 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4
info · registry-verified · 2012-03-11 · 14y ago
BURST
2 releases in 16m: 0.2.1, 0.2.2
info · registry-verified · 2012-03-14 · 14y ago
BURST
2 releases in 9m: 0.2.6, 0.2.7
info · registry-verified · 2012-03-19 · 14y ago
BURST
2 releases in 3m: 0.3.3, 0.3.4
info · registry-verified · 2012-04-07 · 14y ago
BURST
2 releases in 10m: 0.3.6, 0.3.7
info · registry-verified · 2012-05-01 · 14y ago
BURST
2 releases in 9m: 0.3.10, 0.3.11
info · registry-verified · 2012-05-02 · 14y ago
BURST
2 releases in 46m: 0.3.16, 0.3.17
info · registry-verified · 2012-05-12 · 14y ago
BURST
3 releases in 19m: 0.3.18, 0.3.19, 0.3.20
info · registry-verified · 2012-05-13 · 14y ago
BURST
2 releases in 7m: 0.4.5, 0.4.6
info · registry-verified · 2012-05-20 · 14y ago
BURST
2 releases in 8m: 0.4.17, 0.4.18
info · registry-verified · 2012-07-11 · 14y ago
BURST
2 releases in 13m: 0.5.0, 0.5.1
info · registry-verified · 2012-08-06 · 13y ago
BURST
2 releases in 45m: 0.5.2, 0.5.3
info · registry-verified · 2012-08-07 · 13y ago
BURST
4 releases in 50m: 0.5.4, 0.5.5, 0.5.6, 0.5.7
info · registry-verified · 2012-08-07 · 13y ago
BURST
2 releases in 56m: 0.7.0, 0.7.1
info · registry-verified · 2012-10-08 · 13y ago
BURST
2 releases in 4m: 0.7.4, 0.7.5
info · registry-verified · 2012-10-21 · 13y ago
BURST
2 releases in 53m: 0.7.6, 0.7.7
info · registry-verified · 2012-10-25 · 13y ago
BURST
4 releases in 23m: 0.7.13, 0.7.14, 0.7.15, 0.7.16
info · registry-verified · 2012-11-05 · 13y ago
BURST
2 releases in 17m: 0.11.1, 0.11.2
info · registry-verified · 2013-11-03 · 12y ago
BURST
2 releases in 26m: 0.11.4, 0.11.5
info · registry-verified · 2013-11-06 · 12y ago
BURST
2 releases in 17m: 0.11.17, 0.11.18
info · registry-verified · 2013-12-31 · 12y ago
BURST
2 releases in 9m: 1.0.2, 1.0.3
info · registry-verified · 2014-02-27 · 12y ago
BURST
2 releases in 23m: 1.3.4, 1.3.5
info · registry-verified · 2014-08-25 · 11y ago
BURST
2 releases in 3m: 1.5.2, 1.5.3
info · registry-verified · 2015-01-21 · 11y ago
BURST
2 releases in 44m: 1.9.1, 1.9.2
info · registry-verified · 2015-05-10 · 11y ago
BURST
2 releases in 59m: 1.10.4, 1.10.5
info · registry-verified · 2015-07-23 · 10y ago
BURST
2 releases in 60m: 1.12.7, 1.12.8
info · registry-verified · 2015-11-20 · 10y ago
BURST
2 releases in 31m: 4.4.0, 4.4.1
info · registry-verified · 2018-03-29 · 8y ago
BURST
2 releases in 11m: 4.35.1, 4.35.2
info · registry-verified · 2019-07-01 · 7y ago
BURST
2 releases in 9m: 4.40.3, 4.41.0
info · registry-verified · 2019-09-24 · 6y ago
BURST
2 releases in 54m: 5.2.1, 5.3.0
info · registry-verified · 2020-10-27 · 5y ago
BURST
2 releases in 5m: 4.45.0, 5.12.0
info · registry-verified · 2021-01-08 · 5y ago
BURST
2 releases in 43m: 5.31.1, 5.31.2
info · registry-verified · 2021-04-09 · 5y ago
BURST
2 releases in 40m: 5.33.0, 5.33.1
info · registry-verified · 2021-04-14 · 5y ago
release diff 5.108.3 → 5.108.4
+0 added · -0 removed · ~24 modified
--- +++ @@ -385,5 +385,5 @@ let tagNameEnd = -1;- let attrNameStart = -1;- let attrNameEnd = -1;- let attrValueStart = -1;+ let attributeNameStart = -1;+ let attributeNameEnd = -1;+ let attributeValueStart = -1; let attrQuoteType = QUOTE_NONE;@@ -528,9 +528,9 @@ let nextPos = attrQuoteType === QUOTE_NONE ? endPos : endPos + 1;- if (callbacks.attribute !== undefined && attrNameStart !== -1) {+ if (callbacks.attribute !== undefined && attributeNameStart !== -1) { nextPos = callbacks.attribute( input,- attrNameStart,- attrNameEnd,- attrValueStart,- attrValueStart === -1 ? -1 : endPos,+ attributeNameStart,+ attributeNameEnd,+ attributeValueStart,+ attributeValueStart === -1 ? -1 : endPos, attrQuoteType@@ -538,5 +538,5 @@ }- if (attrNameStart !== -1) tagHasAttributes = true;- attrNameStart = -1;- attrValueStart = -1;+ if (attributeNameStart !== -1) tagHasAttributes = true;+ attributeNameStart = -1;+ attributeValueStart = -1; attrQuoteType = QUOTE_NONE;@@ -808,3 +808,3 @@ );- attrNameStart = pos;+ attributeNameStart = pos; state = STATE_ATTRIBUTE_NAME;@@ -815,3 +815,3 @@ // and value to the empty string. Reconsume in the attribute name state.- attrNameStart = pos;+ attributeNameStart = pos; state = STATE_ATTRIBUTE_NAME;@@ -833,3 +833,3 @@ if (isSpace(cc) || cc === CC_SOLIDUS || cc === CC_GREATER_THAN) {- attrNameEnd = pos;+ attributeNameEnd = pos; state = STATE_AFTER_ATTRIBUTE_NAME;@@ -837,3 +837,3 @@ } else if (cc === CC_EQUALS) {- attrNameEnd = pos;+ attributeNameEnd = pos; state = STATE_BEFORE_ATTRIBUTE_VALUE;@@ -917,3 +917,3 @@ emitAttribute(pos);- attrNameStart = pos;+ attributeNameStart = pos; state = STATE_ATTRIBUTE_NAME;@@ -936,3 +936,3 @@ // Switch to the attribute value (double-quoted) state.- attrValueStart = pos + 1;+ attributeValueStart = pos + 1; attrQuoteType = QUOTE_DOUBLE;@@ -943,3 +943,3 @@ // Switch to the attribute value (single-quoted) state.- attrValueStart = pos + 1;+ attributeValueStart = pos + 1; attrQuoteType = QUOTE_SINGLE;@@ -954,3 +954,3 @@ reportError("missing-attribute-value", pos, pos + 1, "warning");- attrValueStart = pos;+ attributeValueStart = pos; attrQuoteType = QUOTE_NONE;@@ -968,3 +968,3 @@ // Reconsume in the attribute value (unquoted) state.- attrValueStart = pos;+ attributeValueStart = pos; attrQuoteType = QUOTE_NONE;@@ -1303,3 +1303,16 @@ }- pos++;+ // Fast-forward ordinary comment text without re-entering the+ // state switch; stop on the significant code points above.+ pos++;+ while (pos < len) {+ const c2 = input.charCodeAt(pos);+ if (+ c2 === CC_LESS_THAN ||+ c2 === CC_HYPHEN_MINUS ||+ c2 === CC_NULL+ ) {+ break;+ }+ pos++;+ } }@@ -3177,21 +3190,21 @@ let matchedWithSemicolon = false;- // Slice the candidate run from `input` once; prefixes are taken from- // this short string instead of re-slicing the (potentially huge)- // input per length.- const run = input.slice(pos, pos + runLen);- for (let n = runLen; n > 0; n--) {- const bare = n === runLen ? run : run.slice(0, n);- // Try with trailing `;` first if one is present after the run.- if (- n === runLen &&- hasSemicolon &&- HTML_ENTITIES[`${bare};`] !== undefined- ) {- namedEntityConsumed = n + 1;+ // Try the full run with its trailing `;` first — the overwhelmingly+ // common case (`&`, ` `, …) then needs exactly one slice.+ if (hasSemicolon && runLen > 0) {+ const withSemicolon = input.slice(pos, pos + runLen + 1);+ if (HTML_ENTITIES[withSemicolon] !== undefined) {+ namedEntityConsumed = runLen + 1; matchedWithSemicolon = true;- break; }- if (HTML_ENTITIES[bare] !== undefined) {- namedEntityConsumed = n;- break;+ }+ if (namedEntityConsumed === 0) {+ // Slice the candidate run once; prefixes come from this short+ // string instead of re-slicing the input per length.+ const run = input.slice(pos, pos + runLen);+ for (let n = runLen; n > 0; n--) {+ const bare = n === runLen ? run : run.slice(0, n);+ if (HTML_ENTITIES[bare] !== undefined) {+ namedEntityConsumed = n;+ break;+ } }@@ -3210,8 +3223,6 @@ returnState === STATE_ATTRIBUTE_VALUE_UNQUOTED;- if (- !(- inAttribute &&- (next === CC_EQUALS || isAsciiAlphanumeric(next))- )- ) {+ if (!(+ inAttribute &&+ (next === CC_EQUALS || isAsciiAlphanumeric(next))+ )) { reportError(@@ -3472,7 +3483,7 @@ // If we hit EOF mid-attribute-name, the name runs to EOF. Set- // attrNameEnd here so the emitted attribute range is valid.- if (state === STATE_ATTRIBUTE_NAME && attrNameStart !== -1) {- attrNameEnd = len;- }- if (attrNameStart !== -1) emitAttribute(len);+ // attributeNameEnd here so the emitted attribute range is valid.+ if (state === STATE_ATTRIBUTE_NAME && attributeNameStart !== -1) {+ attributeNameEnd = len;+ }+ if (attributeNameStart !== -1) emitAttribute(len); // If we hit EOF before the tag-name end was recorded, the name runs@@ -3699,2 +3710,11 @@ +// Hoisted `replace` callbacks (one per `isAttribute` mode) — no closure+// per decode call, and the callback stays monomorphic.+/** @type {(match: string, offset: number, source: string) => string} */+const _decodeReferenceInText = (match, offset, source) =>+ decodeOneReference(match, source.charCodeAt(offset + match.length), false);+/** @type {(match: string, offset: number, source: string) => string} */+const _decodeReferenceInAttribute = (match, offset, source) =>+ decodeOneReference(match, source.charCodeAt(offset + match.length), true);+ /**@@ -3717,8 +3737,5 @@ - return str.replace(CHARACTER_REFERENCE_REGEXP, (match, offset, source) =>- decodeOneReference(- match,- source.charCodeAt(offset + match.length),- isAttribute- )+ return str.replace(+ CHARACTER_REFERENCE_REGEXP,+ isAttribute ? _decodeReferenceInAttribute : _decodeReferenceInText );@@ -3781,2 +3798,350 @@ /**+ * AST node `type` discriminators. Numeric for the same reason as the CSS+ * `NodeType`: compact integer `===` dispatch on the tree-construction and+ * visitor-walk hot paths.+ * @type {{ Document: 1, DocumentFragment: 2, Element: 3, Text: 4, Comment: 5, Doctype: 6 }}+ */+const NodeType = {+ Document: 1,+ DocumentFragment: 2,+ Element: 3,+ Text: 4,+ Comment: 5,+ Doctype: 6+};++/**+ * A contiguous run of attribute ids in the attribute columns — how a start-tag+ * token and an element refer to their attributes. `start` is the first id+ * (`count` 0 = none).+ * @typedef {{ start: number, count: number }} AttributeRun+ */++// Shared frozen empty run for attributeless elements and synthesized tags.+const EMPTY_ATTRS = /** @type {AttributeRun} */ (+ Object.freeze({ start: 0, count: 0 })+);++// === Struct-of-arrays AST backend ===+// One AST node = one integer id (`HtmlNodeRef`) indexing the parallel columns+// below — no per-node object and no per-parent children array. Tree shape+// lives in the four link columns (parent / firstChild / lastChild /+// nextSibling); the only heap references are the string payload / attribute+// name-and-value side arrays. Columns are module-level and reused+// across parses (grown, never shrunk — the CSS parser's `_soa*` strategy), so+// a steady-state parse allocates almost nothing per node; consumers must fully+// read a tree before the next `buildHtmlAst` call. Id 0 is reserved as+// "no node" so the link columns can use 0 as null.+let _hCap = 0;+let _hN = 0;+/** `NodeType` per node */+let _hTy = new Uint8Array(0);+/** bits 0-1 namespace (`NS_*`), bit 2 self-closing (void element) */+let _hFl = new Uint8Array(0);+let _hSt = new Int32Array(0);+let _hEn = new Int32Array(0);+/** end offset of an element's opening tag (after `>`) */+let _hTagEnd = new Int32Array(0);+/** end offset of an element's tag name */+let _hNameEnd = new Int32Array(0);+/** under `skip.text`, end offset of a raw-text element's body (`HtmlAstSkip`) */+let _hCEnd = new Int32Array(0);+/** a `<template>`'s content DocumentFragment (0 = none) */+let _hTc = new Int32Array(0);+let _hParent = new Int32Array(0);+let _hFirst = new Int32Array(0);+let _hLast = new Int32Array(0);+let _hNext = new Int32Array(0);+/** @type {string[]} tag name / text data / comment data / doctype name */+const _hStr = [];+/** first attribute id of an element's contiguous run */+let _hAStart = new Int32Array(0);+/** attribute count of an element's run */
… 2421 more lines (truncated)
--- +++ @@ -1396,6 +1396,3 @@ - /**- * @private- * @type {LazyBarrelController}- */+ /** @type {LazyBarrelController} */ this._lazyBarrelController = new LazyBarrelController(this);
--- +++ @@ -9,2 +9,3 @@ const Queue = require("./util/Queue");+const createHash = require("./util/createHash"); @@ -18,2 +19,4 @@ /** @typedef {import("./ExportsInfo").RestoreProvidedData} RestoreProvidedData */+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */+/** @typedef {import("./LazyBarrel")} LazyBarrelController */ /** @typedef {import("./Module")} Module */@@ -23,2 +26,20 @@ const PLUGIN_LOGGER_NAME = `webpack.${PLUGIN_NAME}`;++/** @typedef {{ etag: string, data: RestoreProvidedData }} MemCacheEntry */++/**+ * @param {Module} module the module+ * @param {LazyBarrelController} lazyBarrelController the compilation's lazy barrel controller+ * @param {HashFunction} hashFunction hash function for long keys+ * @returns {string} the hash+ */+const getLazyRequestsHash = (module, lazyBarrelController, hashFunction) => {+ const lazyKeys = lazyBarrelController.getLazyRequests(module);+ if (!lazyKeys) return "";+ const joined = [...lazyKeys].join("|");+ if (joined.length < 100) return joined;+ const hash = createHash(hashFunction);+ hash.update(joined);+ return /** @type {string} */ (hash.digest("hex"));+}; @@ -34,2 +55,4 @@ const cache = compilation.getCache(PLUGIN_NAME);+ const lazyBarrelController = compilation._lazyBarrelController;+ const hashFunction = compilation.outputOptions.hashFunction; compilation.hooks.finishModules.tapAsync(@@ -82,12 +105,24 @@ const memCache = moduleMemCaches && moduleMemCaches.get(module);- const memCacheValue = memCache && memCache.get(this);- if (memCacheValue !== undefined) {+ /** @type {MemCacheEntry | undefined} */+ const memCacheEntry = memCache && memCache.get(this);+ const hash = getLazyRequestsHash(+ module,+ lazyBarrelController,+ hashFunction+ );+ // validated by the still-lazy request keys: reference-change+ // detection cannot invalidate the mem cache when the un-lazied+ // connections are unsafe-cached (they are skipped when comparing+ // references)+ if (memCacheEntry !== undefined && memCacheEntry.etag === hash) { statRestoredFromMemCache++;- exportsInfo.restoreProvided(memCacheValue);+ exportsInfo.restoreProvided(memCacheEntry.data); return callback(); }+ const buildHash = /** @type {string} */ (+ /** @type {BuildInfo} */ (module.buildInfo).hash+ ); cache.get( module.identifier(),- /** @type {BuildInfo} */- (module.buildInfo).hash,+ hash ? `${buildHash}|${hash}` : buildHash, (err, result) => {@@ -423,9 +458,21 @@ moduleMemCaches && moduleMemCaches.get(module);+ const hash = getLazyRequestsHash(+ module,+ lazyBarrelController,+ hashFunction+ ); if (memCache) {- memCache.set(this, cachedData);- }+ /** @type {MemCacheEntry} */+ const entry = {+ etag: hash,+ data: cachedData+ };+ memCache.set(this, entry);+ }+ const buildHash = /** @type {string} */ (+ /** @type {BuildInfo} */ (module.buildInfo).hash+ ); cache.store( module.identifier(),- /** @type {BuildInfo} */- (module.buildInfo).hash,+ hash ? `${buildHash}|${hash}` : buildHash, cachedData,
--- +++ @@ -70,3 +70,3 @@ this._terminalIds = undefined;- /** @type {Set<string> | undefined} request keys of star re-exports */+ /** @type {Set<string> | undefined} requests of star re-exports */ this._fallbackRequests = undefined;@@ -125,2 +125,10 @@ return this._requestToDepGroup.size === 0;+ }++ /**+ * Returns the requests of the still-lazy groups.+ * @returns {Iterable<string>} still-lazy requests+ */+ getLazyRequests() {+ return this._requestToDepGroup.keys(); }@@ -204,4 +212,5 @@ /**- * Releases all per-module deferral state. Lazy barrel only acts while the- * module graph is built, so the bookkeeping is dead weight once make is done.+ * Releases all per-module deferral state. The last consumer is+ * `FlagDependencyExportsPlugin`'s cache key during `finishModules`, so the+ * bookkeeping is dead weight once sealing starts. */@@ -209,2 +218,20 @@ this._modules = new WeakMap();+ }++ /**+ * requests of the re-export targets `module` still keeps lazy.+ * `FlagDependencyExportsPlugin` folds them into its provided-exports cache+ * key, so a barrel whose built targets differ from a cached run does not+ * reuse that run's stale exports.+ * @param {Module} module the module+ * @returns {Iterable<string> | undefined} still-lazy requests, if any+ */+ getLazyRequests(module) {+ const factoryMeta = module.factoryMeta;+ if (factoryMeta === undefined || !factoryMeta.sideEffectFree) return;+ const state = this._modules.get(module);+ if (state === undefined) return;+ const info = state.lazyBarrelInfo;+ if (info === undefined || info.isEmpty()) return;+ return info.getLazyRequests(); }
--- +++ @@ -256,8 +256,6 @@ state = true;- } else if (- !(- refModule.buildMeta !== undefined &&- refModule.buildMeta.sideEffectFree- )- ) {+ } else if (!(+ refModule.buildMeta !== undefined &&+ refModule.buildMeta.sideEffectFree+ )) { state = true;@@ -278,8 +276,6 @@ }- } else if (- !(- refModule.buildMeta !== undefined &&- refModule.buildMeta.sideEffectFree- )- ) {+ } else if (!(+ refModule.buildMeta !== undefined &&+ refModule.buildMeta.sideEffectFree+ )) { state = true;
--- +++ @@ -1731,5 +1731,5 @@ if (tp.globalThis) return "globalThis";- // For universal target (i.e. code can be run in browser/node/worker etc.)- // `tp.module` is unset for a version-less universal target, so key off ESM output- if (tp.web === null && tp.node === null && output.module) {+ // Universal target (web + node) with no reported accessor: `globalThis`+ // is the only one defined everywhere (`null` = mixed support → `self`).+ if (tp.web === null && tp.node === null && tp.globalThis === undefined) { return "globalThis";
--- +++ @@ -50,3 +50,4 @@ /** @typedef {import("../DependencyTemplate").CssData} CssData */-/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} CssDependencyTemplateContext */ /** @typedef {import("../Generator").GenerateContext} GenerateContext */@@ -193,10 +194,8 @@ * Processes the provided module.- * @param {NormalModule} module the current module * @param {Dependency} dependency the dependency to generate- * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments * @param {ReplaceSource} source the current replace source which can be modified- * @param {GenerateContext & { cssData: CssData }} generateContext the render context+ * @param {DependencyTemplateContext & { cssData: CssData, type: string }} templateContext the template context (shared across all dependencies of the module) * @returns {void} */- sourceDependency(module, dependency, initFragments, source, generateContext) {+ sourceDependency(dependency, source, templateContext) { const constructor =@@ -204,3 +203,3 @@ (dependency.constructor);- const template = generateContext.dependencyTemplates.get(constructor);+ const template = templateContext.dependencyTemplates.get(constructor); if (!template) {@@ -211,6 +210,19 @@ - /** @type {DependencyTemplateContext} */+ template.apply(dependency, source, templateContext);+ }++ /**+ * Processes the provided module.+ * @param {NormalModule} module the module to generate+ * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments+ * @param {ReplaceSource} source the current replace source which can be modified+ * @param {GenerateContext & { cssData: CssData }} generateContext the generateContext+ * @returns {void}+ */+ sourceModule(module, initFragments, source, generateContext) {+ // Only `dependency` varies across `template.apply` calls, so one context+ // (and one lazy `chunkInitFragments` getter) serves the whole module. /** @type {InitFragment<GenerateContext>[] | undefined} */ let chunkInitFragments;- /** @type {DependencyTemplateContext} */+ /** @type {CssDependencyTemplateContext} */ const templateContext = {@@ -246,22 +258,4 @@ - template.apply(dependency, source, templateContext);- }-- /**- * Processes the provided module.- * @param {NormalModule} module the module to generate- * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments- * @param {ReplaceSource} source the current replace source which can be modified- * @param {GenerateContext & { cssData: CssData }} generateContext the generateContext- * @returns {void}- */- sourceModule(module, initFragments, source, generateContext) { for (const dependency of module.dependencies) {- this.sourceDependency(- module,- dependency,- initFragments,- source,- generateContext- );+ this.sourceDependency(dependency, source, templateContext); }@@ -270,9 +264,3 @@ for (const dependency of module.presentationalDependencies) {- this.sourceDependency(- module,- dependency,- initFragments,- source,- generateContext- );+ this.sourceDependency(dependency, source, templateContext); }@@ -625,2 +613,5 @@ let hasCssText = false;+ // Uncached per call (#20800) — the common link case stops scanning once+ // js is seen; `hasCssText` only matters for exports-only / non-link.+ const needsCssText = this._exportsOnly || exportType !== "link"; const connections = this._moduleGraph.getIncomingConnections(module);@@ -628,3 +619,3 @@ for (const connection of connections) {- if (hasJs && hasCssText) break;+ if (hasJs && (hasCssText || !needsCssText)) break; if (@@ -706,11 +697,11 @@ }- const exports = cssData.exports;- /** @type {Record<string, string>} */- const exportsObj = {};- for (const [key, value] of exports) {- exportsObj[key] = value;- }- const stringifiedExports = JSON.stringify(exportsObj);-- return stringifiedExports.length + 42;+ // `JSON.stringify({...exports}).length` computed entry-wise, without+ // materializing the object or the full string.+ let length = 2 + (cssData.exports.size - 1);+ for (const [key, value] of cssData.exports) {+ length +=+ JSON.stringify(key).length + 1 + JSON.stringify(value).length;+ }++ return length + 42; }
--- +++ @@ -134,2 +134,38 @@ const publicPathPlaceholderPlans = new WeakMap();++/**+ * Memoized inheritance chain per module, revalidated against its source+ * fields — `updateCacheModule` reassigns them on watch rebuilds.+ * @type {WeakMap<CssModule, { cssLayer: CssModule["cssLayer"], supports: CssModule["supports"], media: CssModule["media"], inheritance: CssModule["inheritance"], chain: Inheritance }>}+ */+const moduleInheritanceCache = new WeakMap();++/**+ * Gets the memoized inheritance chain of a css module.+ * @param {CssModule} module css module+ * @returns {Inheritance} inheritance chain including the module's own entry+ */+const getModuleInheritance = (module) => {+ const entry = moduleInheritanceCache.get(module);+ if (+ entry !== undefined &&+ entry.cssLayer === module.cssLayer &&+ entry.supports === module.supports &&+ entry.media === module.media &&+ entry.inheritance === module.inheritance+ ) {+ return entry.chain;+ }+ /** @type {Inheritance} */+ const chain = [[module.cssLayer, module.supports, module.media]];+ if (module.inheritance) chain.push(...module.inheritance);+ moduleInheritanceCache.set(module, {+ cssLayer: module.cssLayer,+ supports: module.supports,+ media: module.media,+ inheritance: module.inheritance,+ chain+ });+ return chain;+}; @@ -859,51 +895,51 @@ - return /** @type {CssModule[]} */ ([- ...orderModules(- chunkGraph.getOrderedChunkModulesIterableBySourceType(- chunk,- CSS_IMPORT_TYPE,- compareModulesByFullName(compilation.compiler)- )- ),- ...orderModules(- chunkGraph.getOrderedChunkModulesIterableBySourceType(- chunk,- CSS_TYPE,- compareModulesByFullName(compilation.compiler)- )- ).map((module) => {+ const comparator = compareModulesByFullName(compilation.compiler);+ const importModules = orderModules(+ chunkGraph.getOrderedChunkModulesIterableBySourceType(+ chunk,+ CSS_IMPORT_TYPE,+ comparator+ )+ );+ const cssModules = orderModules(+ chunkGraph.getOrderedChunkModulesIterableBySourceType(+ chunk,+ CSS_TYPE,+ comparator+ )+ );+ for (const module of cssModules) {+ if (+ typeof (+ /** @type {CssModuleBuildInfo} */ (module.buildInfo).charset+ ) !== "undefined"+ ) { if (- typeof (+ typeof charset !== "undefined" &&+ charset !== /** @type {CssModuleBuildInfo} */ (module.buildInfo).charset- ) !== "undefined" ) {- if (- typeof charset !== "undefined" &&- charset !==+ const err = new WebpackError(+ `Conflicting @charset at-rules detected: the module ${module.readableIdentifier(+ compilation.requestShortener+ )} (in chunk ${chunk.name || chunk.id}) specifies "${ /** @type {CssModuleBuildInfo} */ (module.buildInfo).charset- ) {- const err = new WebpackError(- `Conflicting @charset at-rules detected: the module ${module.readableIdentifier(- compilation.requestShortener- )} (in chunk ${chunk.name || chunk.id}) specifies "${- /** @type {CssModuleBuildInfo} */ (module.buildInfo).charset- }", but "${charset}" was expected, all modules must use the same character set`- );-- err.chunk = chunk;- err.module = module;- err.hideStack = true;-- compilation.warnings.push(err);- }-- if (typeof charset === "undefined") {- charset = /** @type {CssModuleBuildInfo} */ (module.buildInfo)- .charset;- }+ }", but "${charset}" was expected, all modules must use the same character set`+ );++ err.chunk = chunk;+ err.module = module;+ err.hideStack = true;++ compilation.warnings.push(err); } - return module;- })- ]);+ if (typeof charset === "undefined") {+ charset = /** @type {CssModuleBuildInfo} */ (module.buildInfo)+ .charset;+ }+ }+ }++ return /** @type {CssModule[]} */ ([...importModules, ...cssModules]); }@@ -922,7 +958,3 @@ - /** @type {Inheritance} */- const inheritance = [[module.cssLayer, module.supports, module.media]];- if (module.inheritance) {- inheritance.push(...module.inheritance);- }+ const inheritance = getModuleInheritance(module); @@ -934,10 +966,4 @@ cacheEntry.hash === hash &&- cacheEntry.inheritance.length === inheritance.length &&- cacheEntry.inheritance.every(([layer, supports, media], i) => {- const item = inheritance[i];- if (Array.isArray(item)) {- return layer === item[0] && supports === item[1] && media === item[2];- }- return false;- })+ // Memoized per module, so identity implies equal entries.+ cacheEntry.inheritance === inheritance ) {
--- +++ @@ -34,2 +34,3 @@ SourceProcessor,+ buildSkipSet, equalsLowerCase,@@ -95,4 +96,28 @@ const OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE = /^@(?:-\w+-)?keyframes$/;+const VENDOR_PREFIX = /^-\w+-/; const COMPOSES_PROPERTY = /^(?:composes|compose-with)$/i; const IS_MODULES = /\.modules?\.[^.]+$/i;++// Skip options for a non-CSS-Modules parse: drop the selector prelude (never+// walked without modules) plus value / function-arg leaves nothing reads (the+// `Ident` visitor no-ops, the `Declaration` visitor returns early, no ICSS).+// `url` / functions / strings / blocks / commas are kept — they carry url()+// rewrites and image-set fences. At-rule preludes are kept (`@media` / `@import`+// are read). CSS-Modules parses skip nothing: selectors are walked and ICSS+// `:export { k: v }` captures each value's byte range from its first / last node.+const SKIP_NON_MODULES = {+ types: buildSkipSet([+ NodeType.Number,+ NodeType.Dimension,+ NodeType.Percentage,+ NodeType.Ident,+ NodeType.Hash,+ NodeType.Colon,+ NodeType.Delim,+ // Nothing reads value/arg whitespace either — consumers use+ // `nextNonWhitespace` / type checks that tolerate its absence.+ NodeType.Whitespace+ ]),+ selectorPrelude: true+}; const CSS_COMMENT = /\/\*((?!\*\/)[\s\S]*?)\*\//g;@@ -185,2 +210,105 @@ identifier.startsWith("--") && identifier.length >= 3;++/**+ * `s.toLowerCase()` that returns `s` itself (no allocation) when it can't+ * change — no ASCII uppercase and no non-ASCII (whose Unicode case mapping is+ * left to the real `toLowerCase`).+ * @param {string} s string+ * @returns {string} lowercased string+ */+const toLowerCaseIfNeeded = (s) => {+ for (let i = 0; i < s.length; i++) {+ const c = s.charCodeAt(i);+ if ((c >= 65 && c <= 90) || c > 127) return s.toLowerCase();+ }+ return s;+};++/**+ * Case-sensitive equality of a source range against a literal — no slice.+ * @param {string} input source+ * @param {number} start range start+ * @param {number} end range end (exclusive)+ * @param {string} lit literal to match+ * @returns {boolean} true when the range equals `lit`+ */+const rangeEquals = (input, start, end, lit) =>+ end - start === lit.length && input.startsWith(lit, start);++/**+ * ASCII case-insensitive equality of a source range against a lowercase ASCII literal — no slice.+ * @param {string} input source+ * @param {number} start range start+ * @param {number} end range end (exclusive)+ * @param {string} lit lowercase ASCII literal to match+ * @returns {boolean} true when the range equals `lit` ignoring ASCII case+ */+const rangeEqualsLowerCase = (input, start, end, lit) => {+ if (end - start !== lit.length) return false;+ for (let i = 0; i < lit.length; i++) {+ let c = input.charCodeAt(start + i);+ if (c >= 65 && c <= 90) c |= 0x20;+ if (c !== lit.charCodeAt(i)) return false;+ }+ return true;+};++/**+ * Range-keyed index over a known-properties table: ASCII-case-folded 31-hash+ * of the name bytes → canonical key(s). Lets the Declaration visitor answer+ * "is this a known property" (and get the canonical lowercase name) without+ * slicing the property name out of the source per declaration.+ * @type {WeakMap<Map<string, Record<string, number>>, Map<number, string | string[]>>}+ */+const KNOWN_PROPERTY_INDEX_CACHE = new WeakMap();++/**+ * Gets (or builds) the hash index for a known-properties table.+ * @param {Map<string, Record<string, number>>} knownProperties known properties table+ * @returns {Map<number, string | string[]>} hash → canonical name(s)+ */+const getKnownPropertyIndex = (knownProperties) => {+ let index = KNOWN_PROPERTY_INDEX_CACHE.get(knownProperties);+ if (index === undefined) {+ index = new Map();+ for (const name of knownProperties.keys()) {+ let h = name.length;+ for (let i = 0; i < name.length; i++) {+ h = ((h << 5) - h + name.charCodeAt(i)) | 0;+ }+ const hit = index.get(h);+ if (hit === undefined) index.set(h, name);+ else if (typeof hit === "string") index.set(h, [hit, name]);+ else hit.push(name);+ }+ KNOWN_PROPERTY_INDEX_CACHE.set(knownProperties, index);+ }+ return index;+};++/**+ * Canonical known-property name for a source range (ASCII case-insensitive), without slicing.+ * @param {Map<number, string | string[]>} index hash index from `getKnownPropertyIndex`+ * @param {string} input source+ * @param {number} start name start+ * @param {number} end name end (exclusive)+ * @returns {string | undefined} canonical lowercase name, or undefined when unknown+ */+const knownPropertyForRange = (index, input, start, end) => {+ let h = end - start;+ for (let i = start; i < end; i++) {+ let c = input.charCodeAt(i);+ if (c >= 65 && c <= 90) c |= 0x20;+ h = ((h << 5) - h + c) | 0;+ }+ const hit = index.get(h);+ if (hit === undefined) return undefined;+ if (typeof hit === "string") {+ return rangeEqualsLowerCase(input, start, end, hit) ? hit : undefined;+ }+ for (let i = 0; i < hit.length; i++) {+ if (rangeEqualsLowerCase(input, start, end, hit[i])) return hit[i];+ }+ return undefined;+}; @@ -600,3 +728,3 @@ !hasDirectDecl &&- !isPureBodyAtRule(`@${A.name(child).toLowerCase()}`) &&+ !isPureBodyAtRule(`@${toLowerCaseIfNeeded(A.name(child))}`) && scanRuleBody(atDecls, atChildRules).hasDirectDecl@@ -918,2 +1046,4 @@ ) => {+ // Flat location numbers — the nested loc objects were the parser's+ // hottest allocation (3 objects per exported name). cssExportEntries.push({@@ -925,3 +1055,6 @@ exportType,- loc: { start: { line: sl, column: sc }, end: { line: el, column: ec } }+ locStartLine: sl,+ locStartColumn: sc,+ locEndLine: el,+ locEndColumn: ec });@@ -942,4 +1075,8 @@ + /** @type {Map<string, boolean>} */+ const selfReferenceCache = new Map();+ /** * Whether a relative `from "<request>"` resolves back to the current module (matching query/fragment too).+ * Memoized per parse — `composes … from "./x.css"` repeats the same request many times per file. * @param {string} request request string from `from "<request>"`@@ -948,2 +1085,15 @@ const isSelfReferenceRequest = (request) => {+ const cached = selfReferenceCache.get(request);+ if (cached !== undefined) return cached;+ const result = isSelfReferenceRequestUncached(request);+ selfReferenceCache.set(request, result);+ return result;+ };++ /**+ * Uncached `isSelfReferenceRequest`.+ * @param {string} request request string from `from "<request>"`+ * @returns {boolean} true if request resolves to the current module+ */+ const isSelfReferenceRequestUncached = (request) => { if (!RELATIVE_REQUEST.test(request)) return false;@@ -971,2 +1121,3 @@ });+ const knownPropertyIndex = getKnownPropertyIndex(knownProperties); @@ -1244,14 +1395,13 @@ /**- * Comment callback: push every comment-token (in source order) onto the local `comments`, read back by `advanceCommentCursor` (pure-mode flags) and `parseCommentOptions` (magic comments).- * @param {string} input input- * @param {number} start start- * @param {number} end end- * @returns {number} end- */- const comment = (input, start, end) => {+ * Comment visitor (`NodeType.Comment`): push every comment (in source order) onto the local `comments`, read back by `advanceCommentCursor` (pure-mode flags) and `parseCommentOptions` (magic comments).+ * @param {import("./syntax").CssPath} path walk path at the comment node+ */+ const commentVisitor = (path) => {+ const node = path.node;+ const start = A.start(node);+ const end = A.end(node); comments.push({- value: input.slice(start + 2, end - 2),+ value: source.slice(start + 2, end - 2), range: [start, end] });- return end; };@@ -1518,6 +1668,5 @@ let identifier = A.unescaped(cv);- const {- start: { line: sl, column: sc },- end: { line: el, column: ec }- } = A.loc(cv);+ // Cursor reads instead of `A.loc` — no location objects allocated.+ const { line: sl, column: sc } = locConverter.get(A.start(cv));+ const { line: el, column: ec } = locConverter.get(A.end(cv)); const isDashedIdent = isDashedIdentifier(identifier);@@ -1562,6 +1711,4 @@ const value = A.unescaped(cv);- const {- start: { line: sl, column: sc },- end: { line: el, column: ec }- } = A.loc(cv);+ const { line: sl, column: sc } = locConverter.get(A.start(cv));+ const { line: el, column: ec } = locConverter.get(A.end(cv)); addCssExport(@@ -1592,6 +1739,4 @@ }- const {- start: { line: sl, column: sc },- end: { line: el, column: ec }- } = A.loc(cv);+ const { line: sl, column: sc } = locConverter.get(A.start(cv));+ const { line: el, column: ec } = locConverter.get(A.end(cv)); addCssExport(@@ -1616,5 +1761,8 @@ const fn = /** @type {FunctionNode} */ (cv);- const fname = A.unescapedName(fn).toLowerCase();- const type =- fname === "local" ? 1 : fname === "global" ? 2 : undefined;+ const fname = A.unescapedName(fn);+ const type = equalsLowerCase(fname, "local")+ ? 1+ : equalsLowerCase(fname, "global")+ ? 2+ : undefined;
… 326 more lines (truncated)
--- +++ @@ -299,2 +299,11 @@ +// Whitespace membership table for the run-consumption loop — one load instead+// of up to five compares per char. EOF (NaN) / non-ASCII index to undefined.+const _wsTable = new Uint8Array(128);+_wsTable[CC_SPACE] = 1;+_wsTable[CC_TAB] = 1;+_wsTable[CC_LINE_FEED] = 1;+_wsTable[CC_CARRIAGE_RETURN] = 1;+_wsTable[CC_FORM_FEED] = 1;+ /**@@ -614,3 +623,3 @@ const start = pos - 1;- while (_isWhiteSpace(input.charCodeAt(pos))) pos++;+ while (_wsTable[input.charCodeAt(pos)] === 1) pos++; return fill(out, TT_WHITESPACE, start, pos);@@ -1168,3 +1177,6 @@ QualifiedRule: 25,- Stylesheet: 26+ Stylesheet: 26,+ // Comments are never tree nodes; this type exists only so a `NodeType.Comment`+ // visitor can be registered (fired during tokenization — see `grammar`).+ Comment: 27 };@@ -1196,3 +1208,4 @@ QualifiedRule: T_QUALIFIED_RULE,- Stylesheet: T_STYLESHEET+ Stylesheet: T_STYLESHEET,+ Comment: T_COMMENT } = NodeType;@@ -1595,2 +1608,19 @@ let _lc = /** @type {LocConverter} */ (/** @type {unknown} */ (null));++// Active skip state (from `CssProcessOptions.skip`), applied by the grammar.+// `_skipTypes` is indexed by `NodeType` (1 = skip): drop that component-value+// leaf / container from declaration value and function-arg lists. The two+// prelude flags scan a rule's prelude without materializing its tree (url tokens+// / functions kept, so `url()` in a selector or `@import url(…)` still resolves).+// A skipped node is still tokenized (positions stay correct) but never pushed,+// so it is never walked or read — the caller must only skip what nothing reads.+// `useObjectBackend` restores the defaults so `parseA*` build the full tree.+const _NO_SKIP_TYPES = new Uint8Array(32);+/** @type {Uint8Array} */+let _skipTypes = _NO_SKIP_TYPES;+// Fast-path flag: true only when a real skip set is active, so the (dominant)+// no-skip parses pay one boolean test instead of a node-type lookup per value.+let _skipActive = false;+let _skipSelectorPrelude = false;+let _skipAtRulePrelude = false; @@ -1658,2 +1688,7 @@ _lc = lc;+ // `parseA*` return the full tree, so nothing is skipped.+ _skipTypes = _NO_SKIP_TYPES;+ _skipActive = false;+ _skipSelectorPrelude = false;+ _skipAtRulePrelude = false; _mkLeaf = _objLeaf;@@ -1775,2 +1810,4 @@ // so 0 must stay reserved for "no node".+ // Leaves never read the flag / list slots — `_soaAllocContainer` clears+ // them instead, keeping the dominant leaf allocation at three writes. const i = _soaN + 1;@@ -1780,2 +1817,9 @@ _soaEn[i] = end;+ _soaN = i;+ return _ref(i);+};+/** @type {(type: number, start: number, end: number) => Node} */+const _soaAllocContainer = (type, start, end) => {+ const r = _soaAlloc(type, start, end);+ const i = _ix(r); _soaFl[i] = 0;@@ -1785,4 +1829,3 @@ _soaL2[i] = null;- _soaN = i;- return _ref(i);+ return r; };@@ -1818,4 +1861,4 @@ };- _mkContainer = (type, start, end) => _soaAlloc(type, start, end);- _mkStylesheet = (start) => _soaAlloc(T_STYLESHEET, start, start);+ _mkContainer = (type, start, end) => _soaAllocContainer(type, start, end);+ _mkStylesheet = (start) => _soaAllocContainer(T_STYLESHEET, start, start); // name / nameStart are derived from start + nameEnd; only nameEnd is stored.@@ -1920,8 +1963,8 @@ // Single reused token the lexer writes into on the `next` path — see- // `MutableToken`. `_next` points at it when a token is cached, else- // `undefined` (re-tokenize on next read).+ // `MutableToken`. `_hasNext` marks it cached — a boolean instead of an+ // object slot, so caching a token never pays a GC write barrier. /** @type {MutableToken} */ this._tok = createToken();- /** @type {MutableToken | undefined} the next token, lazily tokenized */- this._next = undefined;+ /** @type {boolean} whether `_tok` holds the (lazily tokenized) next token */+ this._hasNext = false; /** @type {number[]} byte offsets to rewind to */@@ -1939,3 +1982,3 @@ next() {- if (this._next === undefined) {+ if (!this._hasNext) { const input = this.input;@@ -1946,3 +1989,3 @@ if (t === undefined) {- this._next = fill(tok, TT_EOF, input.length, input.length);+ fill(tok, TT_EOF, input.length, input.length); break;@@ -1957,7 +2000,7 @@ }- this._next = t; break; }- }- return /** @type {MutableToken} */ (this._next);+ this._hasNext = true;+ }+ return this._tok; }@@ -1974,3 +2017,3 @@ this._pos = t.end;- this._next = undefined;+ this._hasNext = false; }@@ -1988,3 +2031,3 @@ this._pos = t.end;- this._next = undefined;+ this._hasNext = false; }@@ -2008,3 +2051,3 @@ this._pos = /** @type {number} */ (this._marks.pop());- this._next = undefined;+ this._hasNext = false; }@@ -2307,2 +2350,7 @@ + // Like `consumeAQualifiedRule`: skip mode scans the prelude without+ // materializing it (url tokens / functions kept so `@import url(…)` still+ // resolves); the block boundary is found by scanning, not the prelude nodes.+ const skip = _skipAtRulePrelude;+ // Process input@@ -2327,3 +2375,4 @@ }- prelude.push(consumeATokenAsNode(ts));+ const node = consumeATokenAsNode(ts);+ if (!skip) prelude.push(node); continue;@@ -2342,3 +2391,8 @@ // Consume a component value from input and append the returned value to rule’s prelude.- prelude.push(consumeAComponentValue(ts, t));+ const node = consumeAComponentValue(ts, t);+ if (!skip) {+ prelude.push(node);+ } else if (_nType(node) === T_FUNCTION || _nType(node) === T_URL) {+ prelude.push(node);+ } }@@ -2378,2 +2432,9 @@ + // Skip mode leaves `prelude` empty (selector text is recovered from the+ // rule's byte range, not its nodes); `first`/`second` still track the first+ // two non-whitespace tokens the `--foo: {` disambiguation below needs.+ const skip = _skipSelectorPrelude;+ let first = /** @type {Node} */ (/** @type {unknown} */ (0));+ let second = /** @type {Node} */ (/** @type {unknown} */ (0));+ // Process input@@ -2391,3 +2452,9 @@ if (nested) return undefined;- prelude.push(consumeATokenAsNode(ts));+ const node = consumeATokenAsNode(ts);+ if (skip) {+ if (!first) first = node;+ else if (!second) second = node;+ } else {+ prelude.push(node);+ } continue;@@ -2401,19 +2468,21 @@ else if (t.type === TT_LEFT_CURLY_BRACKET) {- let firstIdx = 0;- /* istanbul ignore next -- @preserve: leading whitespace is discarded before the rule, so the prelude never starts with it */- while (- firstIdx < prelude.length &&- _nType(prelude[firstIdx]) === T_WHITESPACE- ) {- firstIdx++;+ if (!skip) {+ let firstIdx = 0;+ /* istanbul ignore next -- @preserve: leading whitespace is discarded before the rule, so the prelude never starts with it */+ while (+ firstIdx < prelude.length &&+ _nType(prelude[firstIdx]) === T_WHITESPACE+ ) {+ firstIdx++;+ }+ let secondIdx = firstIdx + 1;+ while (+ secondIdx < prelude.length &&+ _nType(prelude[secondIdx]) === T_WHITESPACE+ ) {+ secondIdx++;+ }+ first = prelude[firstIdx];+ second = prelude[secondIdx]; }- let secondIdx = firstIdx + 1;- while (- secondIdx < prelude.length &&- _nType(prelude[secondIdx]) === T_WHITESPACE- ) {- secondIdx++;- }- const first = prelude[firstIdx];- const second = prelude[secondIdx]; if (@@ -2444,3 +2513,17 @@ // Consume a component value from input and append the result to rule’s prelude.- prelude.push(consumeAComponentValue(ts, t));+ const node = consumeAComponentValue(ts, t);+ if (skip) {+ // Keep only url-bearing nodes (url tokens, or functions that may hold a+ // url like `:unknown(url(x))`) so the url visitor still rewrites them;+ // other selector tokens have no non-modules consumer, so drop them.+ const ty = _nType(node);+ if (ty === T_FUNCTION || ty === T_URL) prelude.push(node);+ // Track the first two non-whitespace tokens for the disambiguation above.+ if (t.type !== TT_WHITESPACE) {+ if (!first) first = node;+ else if (!second) second = node;+ }+ } else {+ prelude.push(node);+ } }@@ -2468,3 +2551,4 @@ /**- * 2-token lookahead: is the next non-whitespace pair `<ident> <colon>` (the prerequisite for consume-a-declaration steps 1 + 3)? Used by `consumeABlocksContents` to skip a declaration attempt that would otherwise call consume-the-remnants-of-a-bad-declaration and be undone by `restoreMark`. A webpack fast-path, not a spec algorithm — so the implementation is free to peek cheaply. It scans raw code points after the cached ident for the next significant one (skipping whitespace + comments) rather than tokenizing them, and never advances the stream: the ident stays cached in `_next` for `consumeADeclaration` to reuse instead of re-tokenizing the property name. Comments skipped here fire `onComment` later, when the chosen consume algorithm tokenizes past them (once, in source order, as before).+ * 2-token lookahead: is the next non-whitespace pair `<ident> <colon>`?+ * Peeks raw code points without advancing; comments still fire `onComment` later. * @param {TokenStream} ts token stream@@ -2712,3 +2796,6 @@ if (nested) return values;- values.push(consumeATokenAsNode(ts));+ const closer = consumeATokenAsNode(ts);
… 494 more lines (truncated)
--- +++ @@ -247,3 +247,6 @@ * @property {ExportType} exportType export type- * @property {DependencyLocation=} loc per-export source location (for export source maps)+ * @property {number} locStartLine per-export source start line (1-based; flat numbers instead of a nested `DependencyLocation` — entries are per-export hot allocations)+ * @property {number} locStartColumn per-export source start column+ * @property {number} locEndLine per-export source end line+ * @property {number} locEndColumn per-export source end column * @property {string[]=} _conventionNames memoized convention names for `name`@@ -414,4 +417,10 @@ // Per-entry loc so Compilation attributes the warning precisely- // (it can't use the consolidated dependency's single loc).- if (entry.loc) error.loc = entry.loc;+ // (it can't use the consolidated dependency's single loc). Built+ // on demand — entries carry flat numbers, not location objects.+ if (entry.locStartLine > 0) {+ error.loc = {+ start: { line: entry.locStartLine, column: entry.locStartColumn },+ end: { line: entry.locEndLine, column: entry.locEndColumn }+ };+ } if (warnings === null) warnings = [];@@ -466,3 +475,6 @@ write(entry.exportType);- write(entry.loc);+ write(entry.locStartLine);+ write(entry.locStartColumn);+ write(entry.locEndLine);+ write(entry.locEndColumn); }@@ -488,3 +500,6 @@ exportType: /** @type {ExportType} */ (read()),- loc: /** @type {DependencyLocation=} */ (read())+ locStartLine: /** @type {number} */ (read()),+ locStartColumn: /** @type {number} */ (read()),+ locEndLine: /** @type {number} */ (read()),+ locEndColumn: /** @type {number} */ (read()) });@@ -809,7 +824,4 @@ - const depLocStart =- entry.loc &&- /** @type {{ start?: { line: number, column: number } }} */ (- entry.loc- ).start;+ const depLocLine = entry.locStartLine;+ const depLocColumn = entry.locStartColumn; for (const used of allNames) {@@ -819,3 +831,3 @@ if (- depLocStart &&+ depLocLine > 0 && cssData.exportLocs &&@@ -824,4 +836,4 @@ cssData.exportLocs.set(used, {- line: depLocStart.line,- column: depLocStart.column+ line: depLocLine,+ column: depLocColumn });@@ -838,3 +850,3 @@ if (- depLocStart &&+ depLocLine > 0 && cssData.exportLocs &&@@ -843,4 +855,4 @@ cssData.exportLocs.set(used, {- line: depLocStart.line,- column: depLocStart.column+ line: depLocLine,+ column: depLocColumn });
--- +++ @@ -14,3 +14,2 @@ const { getInnerGraphUtils } = require("../optimize/InnerGraph");-const memoize = require("../util/memoize"); const ConstDependency = require("./ConstDependency");@@ -24,2 +23,6 @@ } = require("./HarmonyImportDependency");+const {+ attachDependencyGuards,+ isPresentByGuards+} = require("./HarmonyImportGuard"); const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");@@ -48,6 +51,2 @@ -/** @typedef {Map<string, Set<string>>} Guards Map of import root to guarded member keys */--const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));- const harmonySpecifierTag = Symbol("harmony import");@@ -138,2 +137,8 @@ /** @type {Expression} */ (node.object)+ );+ case "BinaryExpression":+ // `"x" in ns` presence guard+ return (+ node.operator === "in" &&+ findImportSpecifier(parser, /** @type {Expression} */ (node.right)) );@@ -177,2 +182,6 @@ + if (this.exportPresenceMode === ExportPresenceModes.NONE) {+ return this.exportPresenceMode;+ }+ const stack = /** @type {GuardFrame[] | undefined} */ (@@ -180,14 +189,7 @@ );- if (stack !== undefined) {- const name = harmonySettings.name;- const member = ids[0];- for (let i = stack.length - 1; i >= 0; i--) {- const presence = stack[i].presence;- if (presence !== undefined) {- const members = presence.get(name);- if (members !== undefined && members.has(member)) {- return ExportPresenceModes.NONE;- }- }- }+ if (+ stack !== undefined &&+ isPresentByGuards(parser, stack, harmonySettings.name, ids[0])+ ) {+ return ExportPresenceModes.NONE; }@@ -356,3 +358,3 @@ parser.state.module.addDependency(dep);- getHarmonyImportGuard().attachDependencyGuards(parser, dep);+ attachDependencyGuards(parser, dep); getInnerGraphUtils(parser.state.compilation).onUsage(@@ -408,3 +410,3 @@ parser.state.module.addDependency(dep);- getHarmonyImportGuard().attachDependencyGuards(parser, dep);+ attachDependencyGuards(parser, dep); getInnerGraphUtils(parser.state.compilation).onUsage(@@ -465,3 +467,3 @@ parser.state.module.addDependency(dep);- getHarmonyImportGuard().attachDependencyGuards(parser, dep);+ attachDependencyGuards(parser, dep); if (args) parser.walkExpressions(args);@@ -545,76 +547,2 @@ - // Presence guards: `"x" in ns` checks that suppress export-presence errors- // (consequent only).- /** @type {Guards | undefined} */- let presence;- if (this.exportPresenceMode !== ExportPresenceModes.NONE) {- /** @type {Guards} */- const guards = new Map();-- /**- * Processes the provided expression.- * @param {Expression} expression expression- * @param {boolean} needTruthy need to be truthy- */- const collect = (expression, needTruthy) => {- if (- expression.type === "UnaryExpression" &&- expression.operator === "!"- ) {- collect(expression.argument, !needTruthy);- return;- } else if (expression.type === "LogicalExpression" && needTruthy) {- if (expression.operator === "&&") {- collect(expression.left, true);- collect(expression.right, true);- } else if (expression.operator === "||") {- const leftEvaluation = parser.evaluateExpression(expression.left);- const leftBool = leftEvaluation.asBool();- if (leftBool === false) {- collect(expression.right, true);- }- } else if (expression.operator === "??") {- const leftEvaluation = parser.evaluateExpression(expression.left);- const leftNullish = leftEvaluation.asNullish();- if (leftNullish === true) {- collect(expression.right, true);- }- }- return;- }- if (!needTruthy) return;-- // Direct `"x" in ns` guards- if (- expression.type === "BinaryExpression" &&- expression.operator === "in"- ) {- if (expression.right.type !== "Identifier") {- return;- }- const info = getInOperatorHarmonyImportInfo(- parser,- expression.left,- expression.right- );- if (!info) return;-- const { settings, leftPart, members } = info;- // Only direct namespace guards- if (members.length > 0) return;- const guarded = guards.get(settings.name);- if (guarded) {- guarded.add(leftPart);- return;- }-- guards.set(settings.name, new Set([leftPart]));- }- };-- collect(expression, true);-- if (guards.size > 0) presence = guards;- }- const hasSpecifier = findImportSpecifier(parser, expression);@@ -624,3 +552,3 @@ - if (presence === undefined && depStart === undefined) return;+ if (depStart === undefined) return; @@ -628,3 +556,2 @@ const consequent = {- presence, test: expression,
--- +++ @@ -17,2 +17,3 @@ /** @typedef {import("./CommonJsRequireDependency")} CommonJsRequireDependency */+/** @typedef {import("./HarmonyEvaluatedImportSpecifierDependency")} HarmonyEvaluatedImportSpecifierDependency */ /** @typedef {import("./HarmonyImportSpecifierDependency")} HarmonyImportSpecifierDependency */@@ -22,3 +23,5 @@ // aliases so the recursive references resolve through array/object types.+// `v` = dependency-liveness atom, `p` = `"x" in ns` presence atom. /** @typedef {["v", Dependency]} GuardAtom */+/** @typedef {["p", HarmonyEvaluatedImportSpecifierDependency]} GuardPresenceAtom */ /** @typedef {["?"]} GuardUnknown */@@ -26,3 +29,3 @@ /** @typedef {["&&" | "||" | "??", GuardFormula, GuardFormula]} GuardLogical */-/** @typedef {GuardAtom | GuardUnknown | GuardNot | GuardLogical} GuardFormula */+/** @typedef {GuardAtom | GuardPresenceAtom | GuardUnknown | GuardNot | GuardLogical} GuardFormula */ /** @typedef {{ formula: GuardFormula, value: boolean }} DependencyGuard branch guard: the dependency is live only when the formula evaluates to `value` */@@ -35,3 +38,2 @@ * @typedef {object} GuardFrame- * @property {Map<string, Set<string>>=} presence `"x" in ns` presence guards active in this branch * @property {Expression=} test the conditional test (for the lazily built formula)@@ -39,3 +41,4 @@ * @property {boolean=} condition branch truthiness the dependency guard is live for- * @property {GuardFormula | null=} formula memoized formula (null = no knowable atom)+ * @property {GuardFormula | null=} formula memoized dependency-guard formula (null = no knowable atom)+ * @property {GuardFormula | null=} presenceFormula memoized presence formula (null = no presence atom) */@@ -44,2 +47,5 @@ require("./HarmonyImportSpecifierDependency")+);+const getHarmonyEvaluatedImportSpecifierDependency = memoize(() =>+ require("./HarmonyEvaluatedImportSpecifierDependency") );@@ -64,3 +70,3 @@ /**- * Build a guard formula from a conditional test AST.+ * Build a liveness formula from a conditional test AST. * @param {Expression} test conditional test expression@@ -69,3 +75,3 @@ */-const buildGuardFormula = (test, depByRangeStart) => {+const buildLivenessFormula = (test, depByRangeStart) => { /**@@ -106,2 +112,3 @@ case "v":+ case "p": return true;@@ -124,3 +131,3 @@ */-const evalNode = (formula, moduleGraph, runtime) => {+const evalLivenessFormula = (formula, moduleGraph, runtime) => { switch (formula[0]) {@@ -147,3 +154,3 @@ return {- t: flip(evalNode(formula[1], moduleGraph, runtime).t),+ t: flip(evalLivenessFormula(formula[1], moduleGraph, runtime).t), n: FALSE@@ -151,4 +158,4 @@ case "&&": {- const l = evalNode(formula[1], moduleGraph, runtime);- const r = evalNode(formula[2], moduleGraph, runtime);+ const l = evalLivenessFormula(formula[1], moduleGraph, runtime);+ const r = evalLivenessFormula(formula[2], moduleGraph, runtime); const t =@@ -162,4 +169,4 @@ case "||": {- const l = evalNode(formula[1], moduleGraph, runtime);- const r = evalNode(formula[2], moduleGraph, runtime);+ const l = evalLivenessFormula(formula[1], moduleGraph, runtime);+ const r = evalLivenessFormula(formula[2], moduleGraph, runtime); const t =@@ -173,4 +180,4 @@ case "??": {- const l = evalNode(formula[1], moduleGraph, runtime);- const r = evalNode(formula[2], moduleGraph, runtime);+ const l = evalLivenessFormula(formula[1], moduleGraph, runtime);+ const r = evalLivenessFormula(formula[2], moduleGraph, runtime); // `l ?? r` is l when l non-nullish, else r.@@ -194,3 +201,3 @@ for (const guard of guards) {- const t = evalNode(guard.formula, moduleGraph, runtime).t;+ const t = evalLivenessFormula(guard.formula, moduleGraph, runtime).t; if (t !== UNKNOWN && t !== (guard.value ? TRUE : FALSE)) return true;@@ -201,4 +208,4 @@ /**- * Builds (once) the dependency-guard formula for a frame from the import- * specifier deps created while walking the test.+ * Builds (once) the liveness formula for a frame from the import specifier deps+ * created while walking the test. * @param {JavascriptParser} parser the parser@@ -207,5 +214,7 @@ */-const buildFrameFormula = (parser, frame) => {+const buildFrameLivenessFormula = (parser, frame) => { const HarmonyImportSpecifierDependency = getHarmonyImportSpecifierDependency();+ const HarmonyEvaluatedImportSpecifierDependency =+ getHarmonyEvaluatedImportSpecifierDependency(); const deps = /** @type {Module} */ (parser.state.module).dependencies;@@ -215,3 +224,8 @@ const dep = deps[i];- if (dep instanceof HarmonyImportSpecifierDependency && dep.range) {+ // Exclude `"x" in ns` evaluated deps; those feed the presence formula only.+ if (+ dep instanceof HarmonyImportSpecifierDependency &&+ !(dep instanceof HarmonyEvaluatedImportSpecifierDependency) &&+ dep.range+ ) { depByRangeStart.set(dep.range[0], dep);@@ -219,3 +233,3 @@ }- return buildGuardFormula(+ return buildLivenessFormula( /** @type {Expression} */ (frame.test),@@ -223,2 +237,159 @@ );+};++/**+ * Build a presence formula from a conditional test AST. Statically-decided+ * `||`/`??` operands are folded away at build time, so the result contains only+ * `"x" in ns` presence atoms (plus `&&`/`!`).+ * @param {JavascriptParser} parser the parser+ * @param {Expression} test conditional test expression+ * @param {Map<number, HarmonyEvaluatedImportSpecifierDependency>} depByRangeStart in-operator deps in the test, keyed by range start+ * @returns {GuardFormula | null} formula, or null when it has no presence atom+ */+const buildPresenceFormula = (parser, test, depByRangeStart) => {+ /**+ * @param {Expression} node ast node+ * @returns {GuardFormula} formula node+ */+ const build = (node) => {+ if (node.type === "UnaryExpression" && node.operator === "!") {+ return ["!", build(/** @type {Expression} */ (node.argument))];+ }+ if (node.type === "LogicalExpression") {+ if (node.operator === "&&") {+ return [+ "&&",+ build(/** @type {Expression} */ (node.left)),+ build(/** @type {Expression} */ (node.right))+ ];+ }++ if (node.operator === "||") {+ if (parser.evaluateExpression(node.left).asBool() === false) {+ return build(/** @type {Expression} */ (node.right));+ }+ if (parser.evaluateExpression(node.right).asBool() === false) {+ return build(/** @type {Expression} */ (node.left));+ }+ return ["?"];+ }++ if (node.operator === "??") {+ const nullish = parser.evaluateExpression(node.left).asNullish();+ if (nullish === true) {+ return build(/** @type {Expression} */ (node.right));+ }+ if (nullish === false) {+ return build(/** @type {Expression} */ (node.left));+ }+ return ["?"];+ }+ }+ const dep =+ node.range && depByRangeStart.get(/** @type {number} */ (node.range[0]));+ return dep ? ["p", dep] : ["?"];+ };++ const formula = build(test);+ return hasAtom(formula) ? formula : null;+};++/**+ * Whether a presence formula guarantees `ns.member` is present. "Must be truthy"+ * semantics: the member is guaranteed when some `"member" in ns` atom must hold+ * for the branch condition. Statically-dead branches never reach here — the+ * parser eliminates them before the branch body is walked.+ * @param {GuardFormula} formula presence formula+ * @param {string} name namespace binding name+ * @param {string} member member key+ * @param {boolean} needTruthy whether the formula must be truthy+ * @returns {boolean} true when the member is guaranteed present+ */+const evalPresenceFormula = (formula, name, member, needTruthy) => {+ switch (formula[0]) {+ case "p": {+ const dep = /** @type {HarmonyEvaluatedImportSpecifierDependency} */ (+ formula[1]+ );+ return (+ needTruthy &&+ dep.directImport === true &&+ dep.name === name &&+ dep.ids.length === 1 &&+ dep.ids[0] === member+ );+ }+ case "!":+ return evalPresenceFormula(formula[1], name, member, !needTruthy);+ case "&&":+ return (+ needTruthy &&+ (evalPresenceFormula(formula[1], name, member, true) ||+ evalPresenceFormula(formula[2], name, member, true))+ );+ default:+ return false;+ }+};++/**+ * Builds (once) the presence formula for a frame from the in-operator deps+ * created while walking the test.+ * @param {JavascriptParser} parser the parser+ * @param {GuardFrame} frame guard frame+ * @returns {GuardFormula | null} formula, or null when it has no presence atom+ */+const buildFramePresenceFormula = (parser, frame) => {+ const HarmonyEvaluatedImportSpecifierDependency =+ getHarmonyEvaluatedImportSpecifierDependency();+ const deps = /** @type {Module} */ (parser.state.module).dependencies;+ /** @type {Map<number, HarmonyEvaluatedImportSpecifierDependency>} */+ const depByRangeStart = new Map();+ for (let i = /** @type {number} */ (frame.depStart); i < deps.length; i++) {+ const dep = deps[i];+ if (dep instanceof HarmonyEvaluatedImportSpecifierDependency && dep.range) {+ depByRangeStart.set(dep.range[0], dep);+ }+ }+ return buildPresenceFormula(+ parser,+ /** @type {Expression} */ (frame.test),+ depByRangeStart+ );+};++/**+ * Whether an active presence guard proves `ns.member` present, suppressing+ * export-presence errors. Each frame is evaluated against its branch condition,+ * so the `else` of `if (!("x" in ns))` also guards `ns.x`.+ * @param {JavascriptParser} parser the parser+ * @param {GuardFrame[]} stack the guard stack+ * @param {string} name namespace binding name+ * @param {string} member member key+ * @returns {boolean} true when a guard proves the member present+ */+const isPresentByGuards = (parser, stack, name, member) => {
… 32 more lines (truncated)
--- +++ @@ -437,11 +437,9 @@ if (importOptions.webpackExports !== undefined) {- if (- !(- typeof importOptions.webpackExports === "string" ||- (Array.isArray(importOptions.webpackExports) &&- importOptions.webpackExports.every(- (item) => typeof item === "string"- ))- )- ) {+ if (!(+ typeof importOptions.webpackExports === "string" ||+ (Array.isArray(importOptions.webpackExports) &&+ importOptions.webpackExports.every(+ (item) => typeof item === "string"+ ))+ )) { parser.state.module.addWarning(
--- +++ @@ -16,3 +16,7 @@ const Template = require("../Template");+const memoize = require("../util/memoize"); const { PUBLIC_PATH_AUTO } = require("../util/publicPathPlaceholder");++// Lazy so loading the HTML generator doesn't pull in the whole CSS pipeline.+const getCssModulesPlugin = memoize(() => require("../css/CssModulesPlugin")); @@ -33,2 +37,3 @@ /** @typedef {import("../NormalModule")} NormalModule */+/** @typedef {import("./HtmlModule").HtmlModuleBuildInfo} HtmlModuleBuildInfo */ /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */@@ -96,5 +101,3 @@ if (contentHashType === "css") {- const CssModulesPlugin = require("../css/CssModulesPlugin");-- filenameTemplate = CssModulesPlugin.getChunkFilenameTemplate(+ filenameTemplate = getCssModulesPlugin().getChunkFilenameTemplate( chunk,@@ -240,10 +243,8 @@ * Processes the provided module.- * @param {NormalModule} module the current module * @param {Dependency} dependency the dependency to generate- * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments * @param {ReplaceSource} source the current replace source which can be modified- * @param {GenerateContext} generateContext the render context+ * @param {DependencyTemplateContext} templateContext the template context (shared across all dependencies of the module) * @returns {void} */- sourceDependency(module, dependency, initFragments, source, generateContext) {+ sourceDependency(dependency, source, templateContext) { const constructor =@@ -251,3 +252,3 @@ (dependency.constructor);- const template = generateContext.dependencyTemplates.get(constructor);+ const template = templateContext.dependencyTemplates.get(constructor); if (!template) {@@ -258,3 +259,33 @@ - /** @type {DependencyTemplateContext} */+ template.apply(dependency, source, templateContext);+ }++ /**+ * Processes the provided dependencies block.+ * @param {import("../DependenciesBlock")} block the dependencies block which will be processed+ * @param {ReplaceSource} source the current replace source which can be modified+ * @param {DependencyTemplateContext} templateContext the template context+ * @returns {void}+ */+ sourceBlock(block, source, templateContext) {+ for (const dependency of block.dependencies) {+ this.sourceDependency(dependency, source, templateContext);+ }++ for (const childBlock of block.blocks) {+ this.sourceBlock(childBlock, source, templateContext);+ }+ }++ /**+ * Processes the provided module.+ * @param {NormalModule} module the module to generate+ * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments+ * @param {ReplaceSource} source the current replace source which can be modified+ * @param {GenerateContext} generateContext the generateContext+ * @returns {void}+ */+ sourceModule(module, initFragments, source, generateContext) {+ // Only `dependency` varies across `template.apply` calls, so one context+ // (and one lazy `chunkInitFragments` getter) serves the whole module. /** @type {InitFragment<GenerateContext>[] | undefined} */@@ -291,53 +322,4 @@ - template.apply(dependency, source, templateContext);- }-- /**- * Processes the provided dependencies block.- * @param {NormalModule} module the module to generate- * @param {import("../DependenciesBlock")} block the dependencies block which will be processed- * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments- * @param {ReplaceSource} source the current replace source which can be modified- * @param {GenerateContext} generateContext the generateContext- * @returns {void}- */- sourceBlock(module, block, initFragments, source, generateContext) {- for (const dependency of block.dependencies) {- this.sourceDependency(- module,- dependency,- initFragments,- source,- generateContext- );- }-- for (const childBlock of block.blocks) {- this.sourceBlock(- module,- childBlock,- initFragments,- source,- generateContext- );- }- }-- /**- * Processes the provided module.- * @param {NormalModule} module the module to generate- * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments- * @param {ReplaceSource} source the current replace source which can be modified- * @param {GenerateContext} generateContext the generateContext- * @returns {void}- */- sourceModule(module, initFragments, source, generateContext) { for (const dependency of module.dependencies) {- this.sourceDependency(- module,- dependency,- initFragments,- source,- generateContext- );+ this.sourceDependency(dependency, source, templateContext); }@@ -346,9 +328,3 @@ for (const dependency of module.presentationalDependencies) {- this.sourceDependency(- module,- dependency,- initFragments,- source,- generateContext- );+ this.sourceDependency(dependency, source, templateContext); }@@ -357,9 +333,3 @@ for (const childBlock of module.blocks) {- this.sourceBlock(- module,- childBlock,- initFragments,- source,- generateContext- );+ this.sourceBlock(childBlock, source, templateContext); }@@ -405,3 +375,8 @@ // stay for `HtmlModulesPlugin`'s `JavascriptModulesPlugin.render` tap.- return rawContent.split(PUBLIC_PATH_AUTO).join(undoPath);+ if (!rawContent.includes(PUBLIC_PATH_AUTO)) return rawContent;+ // A relative `<base href>` prepends `../`s so the base can't misdirect+ // the rewritten URLs (see `HtmlParser`).+ const basePrefix =+ /** @type {HtmlModuleBuildInfo} */ (module.buildInfo).baseUrlPrefix || "";+ return rawContent.split(PUBLIC_PATH_AUTO).join(basePrefix + undoPath); }@@ -605,6 +580,8 @@ // only for `"inline"` (exposes html, but does not emit), so hash both.- if (this._shouldExposeHtmlType(updateHashContext.module)) {+ // One `_shouldExtract` walk covers both checks (expose = extract ∪ inline).+ const extract = this._shouldExtract(updateHashContext.module);+ if (extract || this.options.extract === "inline") { hash.update("html-type"); }- if (this._shouldExtract(updateHashContext.module)) {+ if (extract) { hash.update("extract");
--- +++ @@ -17,2 +17,3 @@ * @property {Record<string, EntryScriptInfo[]>=} htmlEntryScripts entries collected from the document, grouped by kind+ * @property {string=} baseUrlPrefix `../` per `<base href>` path segment, prepended to the auto-public-path undo path so a relative base doesn't misdirect bundled URLs */
--- +++ @@ -570,10 +570,17 @@ // `output.path` root.- const undoPath = getUndoPath(- filename,- /** @type {string} */ (outputOptions.path),- false- );- const finalContent = resolvedContent- .split(autoPlaceholder)- .join(undoPath);+ // A relative `<base href>` prepends `../`s so the base can't+ // misdirect the rewritten URLs (see `HtmlParser`).+ const basePrefix =+ /** @type {HtmlModuleBuildInfo} */ (normalModule.buildInfo)+ .baseUrlPrefix || "";+ const undoPath =+ basePrefix ++ getUndoPath(+ filename,+ /** @type {string} */ (outputOptions.path),+ false+ );+ const finalContent = resolvedContent.includes(autoPlaceholder)+ ? resolvedContent.split(autoPlaceholder).join(undoPath)+ : resolvedContent; const finalSource = new RawSource(finalContent);@@ -587,7 +594,11 @@ // asset cache can't reuse one variant's bytes at- // another variant's URL.- const finalContentHash = HtmlModulesPlugin.computeContentHash(- finalContent,- outputOptions- );+ // another variant's URL. Unchanged content reuses+ // the memoized hash instead of re-digesting.+ const finalContentHash =+ finalContent === resolvedContent+ ? contentHash+ : HtmlModulesPlugin.computeContentHash(+ finalContent,+ outputOptions+ );
--- +++ @@ -37,2 +37,3 @@ const {+ NS_HTML, NS_SVG,@@ -41,6 +42,4 @@ SourceProcessor,- buildHtmlAst, decodeHtmlEntities, decodeHtmlEntitiesWithMap,- findAttr, parseSrcset@@ -115,2 +114,6 @@ +// A URL carrying its own scheme (`https:`, `data:`, …) ignores the document+// base per the URL spec, so `<base href>` never rewrites it.+const ABSOLUTE_URL_SCHEME_REGEXP = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;+ // CSP/fetch attributes copied verbatim onto a synthesized sibling `<link>` /@@ -122,2 +125,3 @@ const CC_APOSTROPHE = "'".charCodeAt(0);+const CC_SLASH = "/".charCodeAt(0); @@ -127,15 +131,18 @@ * tokenizer's end-of-attribute rule (`valueEnd + 1` past the closing quote).+ * @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads) * @param {string} source HTML source- * @param {import("./syntax").HtmlAttribute} attr attribute+ * @param {import("./syntax").HtmlAttributeRef} attr attribute ref * @returns {string} the attribute's source slice */-const attrSourceSpan = (source, attr) => {+const attrSourceSpan = (path, source, attr) => {+ const valueStart = path.attributeValueStart(attr);+ const valueEnd = path.attributeValueEnd(attr); const end =- attr.valueStart === -1- ? attr.nameEnd- : source.charCodeAt(attr.valueStart - 1) === CC_QUOTATION ||- source.charCodeAt(attr.valueStart - 1) === CC_APOSTROPHE- ? attr.valueEnd + 1- : attr.valueEnd;- return source.slice(attr.nameStart - 1, end);+ valueStart === -1+ ? path.attributeNameEnd(attr)+ : source.charCodeAt(valueStart - 1) === CC_QUOTATION ||+ source.charCodeAt(valueStart - 1) === CC_APOSTROPHE+ ? valueEnd + 1+ : valueEnd;+ return source.slice(path.attributeNameStart(attr) - 1, end); };@@ -911,2 +918,19 @@ + // `<base href>` resolves the relative URLs that follow it. A relative base+ // (`./assets/`) rewrites them into a subdirectory — still bundled; a+ // root-relative or absolute base (`/`, `https://cdn/`) points them outside+ // the build, so those URLs are left untouched. Resolved in the walk below+ // from the first `<base href>` seen (`documentBase` undefined until then).+ /** @type {string | undefined} */+ let documentBase;+ /** @type {string | undefined} */+ let baseDir;+ let baseIsExternal = false;+ // Prepended to the emitted URLs' auto-public-path undo path so the base+ // doesn't misdirect them: the browser resolves rewritten (relative)+ // output URLs against the base dir, so one `../` per base segment cancels+ // it. Undefined for absolute publicPath (no undo path is emitted).+ /** @type {string | undefined} */+ let baseUrlPrefix;+ /**@@ -922,3 +946,4 @@ /**- * @param {import("./syntax").HtmlAttribute | undefined} typeAttr type attribute+ * @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads)+ * @param {import("./syntax").HtmlAttributeRef} typeAttr type attribute ref (0 = none) * @param {number} nameEnd end offset of the tag name@@ -927,11 +952,11 @@ */- const reconcileScriptTypeAttr = (typeAttr, nameEnd, type, input) => {+ const reconcileScriptTypeAttr = (path, typeAttr, nameEnd, type, input) => {+ const valueStart =+ typeAttr !== 0 ? path.attributeValueStart(typeAttr) : -1;+ const valueEnd = typeAttr !== 0 ? path.attributeValueEnd(typeAttr) : -1; if (outputModule && type === "script") { // Chunk is an ES module; upgrade the tag.- if (typeAttr && typeAttr.valueStart !== -1) {+ if (typeAttr !== 0 && valueStart !== -1) { module.addPresentationalDependency(- new ConstDependency("module", [- typeAttr.valueStart,- typeAttr.valueEnd- ])+ new ConstDependency("module", [valueStart, valueEnd]) );@@ -942,3 +967,3 @@ }- } else if (!outputModule && type === "script-module" && typeAttr) {+ } else if (!outputModule && type === "script-module" && typeAttr !== 0) { // Chunk is a classic IIFE; drop `type="module"` so the@@ -946,13 +971,10 @@ let attrEnd;- if (typeAttr.valueStart === -1) {- attrEnd = typeAttr.nameEnd;- } else if (- input[typeAttr.valueEnd] === '"' ||- input[typeAttr.valueEnd] === "'"- ) {- attrEnd = typeAttr.valueEnd + 1;+ if (valueStart === -1) {+ attrEnd = path.attributeNameEnd(typeAttr);+ } else if (input[valueEnd] === '"' || input[valueEnd] === "'") {+ attrEnd = valueEnd + 1; } else {- attrEnd = typeAttr.valueEnd;+ attrEnd = valueEnd; }- let attrStart = typeAttr.nameStart;+ let attrStart = path.attributeNameStart(typeAttr); if (@@ -988,2 +1010,74 @@ + /**+ * Classifies the first `<base href>` seen in the walk, setting+ * `documentBase`/`baseDir`/`baseIsExternal`/`baseUrlPrefix` for the URLs+ * that follow it.+ * @param {import("./syntax").HtmlPath} path walk path (for attribute reads)+ * @param {import("./syntax").HtmlAttributeRef} hrefAttr the base's href attribute+ */+ const resolveDocumentBase = (path, hrefAttr) => {+ documentBase = decodeHtmlEntities(+ path.attributeValue(hrefAttr),+ true+ ).trim();+ if (!documentBase) return;+ if (+ ABSOLUTE_URL_SCHEME_REGEXP.test(documentBase) ||+ documentBase.charCodeAt(0) === CC_SLASH+ ) {+ baseIsExternal = true;+ return;+ }+ // Normalize the base path into its descending directory segments,+ // resolving `.`/`..` like the URL spec. The final segment is the+ // referenced file (dropped) unless the href ends with `/` or a+ // dot-segment; `up` counts `..`s that climb above the document dir.+ const parts = documentBase.split("/");+ /** @type {string[]} */+ const dirs = [];+ let up = 0;+ for (let i = 0; i < parts.length; i++) {+ const part = parts[i];+ if (part === "" || part === ".") continue;+ if (part === "..") {+ if (dirs.length > 0) dirs.pop();+ else up++;+ continue;+ }+ // A trailing plain segment (no following `/`) is the file, not a dir.+ if (i === parts.length - 1) continue;+ dirs.push(part);+ }+ baseDir = `${"../".repeat(up)}${dirs.length > 0 ? `${dirs.join("/")}/` : ""}`;+ // A base above the document dir can't be cancelled with `../` (the+ // document's own dir name is unknown) — leave the output URLs+ // un-prefixed; they still resolve under an absolute publicPath.+ if (up === 0 && dirs.length > 0) {+ baseUrlPrefix = "../".repeat(dirs.length);+ }+ };++ // Lazy decoded-attribute map for the current element — parse-scoped+ // to avoid a closure and memo slot per element.+ /** @type {import("./syntax").HtmlPath | undefined} */+ let attrMapPath;+ let attrMapCount = 0;+ /** @type {Map<string, string> | undefined} */+ let currentAttributesMap;+ const getAttributesMap = () => {+ if (currentAttributesMap) return currentAttributesMap;+ currentAttributesMap = new Map();+ const path = /** @type {import("./syntax").HtmlPath} */ (attrMapPath);+ for (let i = 0; i < attrMapCount; i++) {+ const attr = path.attributeAt(i);+ // Decoded values — filters and type resolvers compare what+ // the browser sees (e.g. `rel="icon"` means `icon`)+ currentAttributesMap.set(+ path.attributeName(attr),+ decodeHtmlEntities(path.attributeValue(attr), true)+ );+ }+ return currentAttributesMap;+ };+ // TODO implement full HTML parser (WASM)@@ -994,14 +1088,15 @@ .use({- [NodeType.Comment]: (n) => {- const node = /** @type {import("./syntax").HtmlComment} */ (n);+ [NodeType.Comment]: (path) => {+ const start = path.start();+ const end = path.end(); // Only proper `<!-- ... -->` comments carry magic comments. if (- node.end - node.start < 7 ||- source.charCodeAt(node.start) !== 0x3c ||- source.charCodeAt(node.start + 1) !== 0x21 ||- source.charCodeAt(node.start + 2) !== 0x2d ||- source.charCodeAt(node.start + 3) !== 0x2d ||- source.charCodeAt(node.end - 1) !== 0x3e ||- source.charCodeAt(node.end - 2) !== 0x2d ||- source.charCodeAt(node.end - 3) !== 0x2d+ end - start < 7 ||+ source.charCodeAt(start) !== 0x3c ||+ source.charCodeAt(start + 1) !== 0x21 ||+ source.charCodeAt(start + 2) !== 0x2d ||+ source.charCodeAt(start + 3) !== 0x2d ||+ source.charCodeAt(end - 1) !== 0x3e ||+ source.charCodeAt(end - 2) !== 0x2d ||+ source.charCodeAt(end - 3) !== 0x2d ) {@@ -1010,3 +1105,3 @@ }- const value = node.data;+ const value = path.data(); if (!webpackCommentRegExp.test(value)) {@@ -1020,4 +1115,4 @@ } catch (err) {- const { line: sl, column: sc } = locConverter.get(node.start);- const { line: el, column: ec } = locConverter.get(node.end);+ const { line: sl, column: sc } = locConverter.get(start);+ const { line: el, column: ec } = locConverter.get(end); module.addWarning(@@ -1041,4 +1136,4 @@ if (typeof options.webpackIgnore !== "boolean") {- const { line: sl, column: sc } = locConverter.get(node.start);- const { line: el, column: ec } = locConverter.get(node.end);+ const { line: sl, column: sc } = locConverter.get(start);+ const { line: el, column: ec } = locConverter.get(end); module.addWarning(@@ -1064,4 +1159,3 @@ // `webpackIgnore` once they're done.- enter: (n) => {- const node = /** @type {import("./syntax").HtmlElement} */ (n);+ enter: (path) => { const ignore = pendingWebpackIgnore === true;@@ -1073,20 +1167,22 @@ - const elementName = node.tagName;
… 260 more lines (truncated)
--- +++ @@ -1385,2 +1385,12 @@ return handleConstOperation((l, r) => l >= r);+ } else if (expr.operator === "in") {+ // `x in y` always evaluates to a boolean, so it is never nullish+ const left = this.evaluateExpression(expr.left);+ const right = this.evaluateExpression(expr.right);+ return new BasicEvaluatedExpression()+ .setNullish(false)+ .setSideEffects(+ left.couldHaveSideEffects() || right.couldHaveSideEffects()+ )+ .setRange(/** @type {Range} */ (expr.range)); }
--- +++ @@ -58,2 +58,28 @@ +/**+ * Whether the request points to a directory and thus can't be an asset.+ * @param {string} request request+ * @returns {boolean} true when the request is a directory reference+ */+const isDirectoryRequest = (request) =>+ request === "." || request === ".." || request.endsWith("/");++/**+ * Replaces `import.meta.url` with the runtime base URI, leaving the+ * `new URL(...)` construction untouched so it's evaluated at runtime.+ * @param {JavascriptParser} parser parser+ * @param {NewExpressionNode} expr expression+ * @returns {void}+ */+const keepNewURL = (parser, expr) => {+ const [, arg2] = expr.arguments;+ const dep = new ConstDependency(+ RuntimeGlobals.baseURI,+ /** @type {Range} */ (arg2.range),+ [RuntimeGlobals.baseURI]+ );+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);+ parser.state.module.addPresentationalDependency(dep);+};+ /** @type {WeakMap<NewExpressionNode, BasicEvaluatedExpression | undefined>} */@@ -159,9 +185,3 @@ - const dep = new ConstDependency(- RuntimeGlobals.baseURI,- /** @type {Range} */ (arg2.range),- [RuntimeGlobals.baseURI]- );- dep.loc = /** @type {DependencyLocation} */ (expr.loc);- parser.state.module.addPresentationalDependency(dep);+ keepNewURL(parser, expr); @@ -179,2 +199,8 @@ if ((request = evaluatedExpr.asString())) {+ // A directory is not an asset; keep `new URL(...)` as-is, matching Node/browsers.+ if (isDirectoryRequest(request)) {+ keepNewURL(parser, expr);+ return true;+ }+ const [arg1, arg2] = expr.arguments;
--- +++ @@ -31,13 +31,14 @@ if (this.pos < pos) {- const str = this._input.slice(this.pos, pos);- let i = str.lastIndexOf("\n");- if (i === -1) {- this.column += str.length;- } else {- this.column = str.length - i - 1;- this.line++;- while (i > 0 && (i = str.lastIndexOf("\n", i - 1)) !== -1) {+ // Advance: delta-bounded scan of [this.pos, pos), allocation-free+ // (unbounded index scans go quadratic on newline-free input).+ const input = this._input;+ let last = -1;+ for (let j = this.pos; j < pos; j++) {+ if (input.charCodeAt(j) === 10) { this.line++;+ last = j; } }+ this.column =+ last === -1 ? this.column + (pos - this.pos) : pos - last - 1; } else {
--- +++ @@ -8,25 +8,29 @@ * Babel-style visitor map keyed by a numeric node-type discriminator; a bucket- * is a function (enter-only) or `{ enter?, exit? }`. `ctx.skipChildren()`- * (enter only) stops the walker descending into the node's children.- * @typedef {{ skipChildren(): void }} VisitorContext+ * is a function (enter-only) or `{ enter?, exit? }`.+ *+ * A visitor receives a single `path` argument (the Babel `path` shape): the+ * language's AST accessor with the current position on it — `path.node`,+ * `path.parent` (null at a root) — plus `path.skipChildren()` (enter only)+ * to stop the walk descending, and every field-read method (which defaults+ * to the current node). The path is one reused object rebound before each callback:+ * it is only valid during the callback, and future per-node functionality+ * lands on it without changing any visitor signature.+ * @template TPath+ * @typedef {(path: TPath) => void} VisitorFn */ /**- * @template TNode- * @typedef {(node: TNode, parent: TNode | null, ctx: VisitorContext) => void} VisitorFn+ * @template TPath+ * @typedef {VisitorFn<TPath> | { enter?: VisitorFn<TPath>, exit?: VisitorFn<TPath> }} VisitorBucket */ /**- * @template TNode- * @typedef {VisitorFn<TNode> | { enter?: VisitorFn<TNode>, exit?: VisitorFn<TNode> }} VisitorBucket+ * @template TPath+ * @typedef {{ [nodeType: number]: VisitorBucket<TPath> }} VisitorMap */ /**- * @template TNode- * @typedef {{ [nodeType: number]: VisitorBucket<TNode> }} VisitorMap+ * @template TPath+ * @typedef {{ enter: VisitorFn<TPath>[], exit: VisitorFn<TPath>[] }} CompiledVisitorBucket */ /**- * @template TNode- * @typedef {{ enter: VisitorFn<TNode>[], exit: VisitorFn<TNode>[] }} CompiledVisitorBucket- */-/**- * @template TNode- * @typedef {CompiledVisitorBucket<TNode>[]} CompiledVisitorMap a sparse array indexed by node type+ * @template TPath+ * @typedef {CompiledVisitorBucket<TPath>[]} CompiledVisitorMap a sparse array indexed by node type */@@ -34,6 +38,7 @@ * A language grammar: parse `input` and fire the compiled visitors in source- * order (the grammar owns tokenizing, parsing, and walking).- * @template TNode+ * order (the grammar owns tokenizing, parsing, walking — and the `path`+ * object each visitor receives).+ * @template TPath * @template TProcessOptions- * @typedef {(input: string, visitors: CompiledVisitorMap<TNode>, options: TProcessOptions) => void} Grammar+ * @typedef {(input: string, visitors: CompiledVisitorMap<TPath>, options: TProcessOptions) => void} Grammar */@@ -46,6 +51,6 @@ * ```- * processor.use({ [NodeType.X]: (node) => {}, [NodeType.Y]: { enter, exit } });+ * processor.use({ [NodeType.X]: (path) => {}, [NodeType.Y]: { enter, exit } }); * processor.process(source); * ```- * @template TNode+ * @template TPath * @template [TProcessOptions=object]@@ -54,9 +59,12 @@ /**- * @param {Grammar<TNode, TProcessOptions>} grammar the grammar to drive over the source+ * @param {Grammar<TPath, TProcessOptions>} grammar the grammar to drive over the source+ * @param {TProcessOptions=} options default process options (e.g. `skip`) merged under each `process` call's own options */- constructor(grammar) {- /** @type {Grammar<TNode, TProcessOptions>} */+ constructor(grammar, options) {+ /** @type {Grammar<TPath, TProcessOptions>} */ this._grammar = grammar;- /** @type {CompiledVisitorMap<TNode>} */+ /** @type {CompiledVisitorMap<TPath>} */ this._visitors = [];+ /** @type {TProcessOptions | undefined} */+ this._options = options; }@@ -66,4 +74,4 @@ * A bucket is a function (= `{ enter }`) or `{ enter?, exit? }`.- * @param {VisitorMap<TNode>} map visitor map keyed by node type- * @returns {SourceProcessor<TNode, TProcessOptions>} `this`, for chaining+ * @param {VisitorMap<TPath>} map visitor map keyed by node type+ * @returns {SourceProcessor<TPath, TProcessOptions>} `this`, for chaining */@@ -92,3 +100,3 @@ * Run the grammar over `input`, firing visitors in source order. No- * AST retained.+ * AST retained. Per-call `options` override the instance defaults. * @param {string} input source text@@ -97,2 +105,3 @@ process(input, options) {+ const defaults = this._options; this._grammar(@@ -100,3 +109,7 @@ this._visitors,- options || /** @type {TProcessOptions} */ ({})+ defaults+ ? options+ ? { ...defaults, ...options }+ : defaults+ : options || /** @type {TProcessOptions} */ ({}) );
--- +++ @@ -2,3 +2,3 @@ "name": "webpack",- "version": "5.108.3",+ "version": "5.108.4", "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.",@@ -178,3 +178,3 @@ "open-cli": "^9.0.0",- "oxc-parser": "^0.137.0",+ "oxc-parser": "^0.138.0", "pkg-pr-new": "^0.0.75",@@ -199,3 +199,3 @@ "terser": "^5.46.2",- "three": "^0.184.0",+ "three": "^0.185.1", "tinybench": "^6.0.1",
--- +++ @@ -426,5 +426,3 @@ type AssetFilterItemTypes =- | string- | RegExp- | ((name: string, asset: StatsAsset) => boolean);+ string | RegExp | ((name: string, asset: StatsAsset) => boolean); declare abstract class AssetGenerator extends Generator {@@ -984,10 +982,3 @@ asCompileTimeValue():- | undefined- | null- | string- | number- | bigint- | boolean- | RegExp- | any[];+ undefined | null | string | number | bigint | boolean | RegExp | any[]; isTruthy(): boolean;@@ -1428,4 +1419,3 @@ filename?:- | string- | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string);+ string | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string); idHint?: string;@@ -1570,7 +1560,5 @@ filenameTemplate?:- | string- | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string);+ string | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string); cssFilenameTemplate?:- | string- | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string);+ string | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string); runtime: RuntimeSpec;@@ -1843,4 +1831,3 @@ type ChunkFilenameTemplate =- | string- | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string);+ string | ((pathData: PathDataChunk, assetInfo?: AssetInfo) => string); declare class ChunkGraph {@@ -2823,4 +2810,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (@@ -2834,4 +2820,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (@@ -2846,4 +2831,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (@@ -2858,4 +2842,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (source: Source, chunk: Chunk) => Source@@ -2866,4 +2849,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (hash: Hash) => void@@ -2874,4 +2856,3 @@ options:- | string- | (TapOptions & { name: string } & IfSet<AdditionalOptions>),+ string | (TapOptions & { name: string } & IfSet<AdditionalOptions>), fn: (@@ -3125,10 +3106,3 @@ type CodeValuePrimitive =- | undefined- | null- | string- | number- | bigint- | boolean- | Function- | RegExp;+ undefined | null | string | number | bigint | boolean | Function | RegExp; declare interface Colors {@@ -3772,4 +3746,3 @@ assetInfoUpdateOrFunction?:- | AssetInfo- | ((assetInfo?: AssetInfo) => undefined | AssetInfo)+ AssetInfo | ((assetInfo?: AssetInfo) => undefined | AssetInfo) ): void;@@ -4409,6 +4382,3 @@ exportsTypeStrict?:- | "namespace"- | "dynamic"- | "default-only"- | "default-with-named";+ "namespace" | "dynamic" | "default-only" | "default-with-named"; @@ -4418,6 +4388,3 @@ exportsTypeNonStrict?:- | "namespace"- | "dynamic"- | "default-only"- | "default-with-named";+ "namespace" | "dynamic" | "default-only" | "default-with-named"; }@@ -4789,5 +4756,3 @@ type ConnectionState =- | boolean- | typeof CIRCULAR_CONNECTION- | typeof TRANSITIVE_ONLY;+ boolean | typeof CIRCULAR_CONNECTION | typeof TRANSITIVE_ONLY; declare class ConstDependency extends NullDependency {@@ -5037,8 +5002,3 @@ type ContextMode =- | "eager"- | "weak"- | "lazy"- | "lazy-once"- | "sync"- | "async-weak";+ "eager" | "weak" | "lazy" | "lazy-once" | "sync" | "async-weak"; type ContextModuleBuildInfo = KnownBuildInfo &@@ -5358,7 +5318,8 @@ sourceDependency(- module: NormalModule, dependency: Dependency,- initFragments: InitFragment<GenerateContext>[], source: ReplaceSource,- generateContext: GenerateContext & { cssData: CssData }+ templateContext: DependencyTemplateContext & {+ cssData: CssData;+ type: string;+ } ): void;@@ -6220,7 +6181,5 @@ type DevtoolFallbackModuleFilenameTemplate =- | string- | ((context: ModuleFilenameTemplateContext) => string);+ string | ((context: ModuleFilenameTemplateContext) => string); type DevtoolModuleFilenameTemplate =- | string- | ((context: ModuleFilenameTemplateContext) => string);+ string | ((context: ModuleFilenameTemplateContext) => string); @@ -6951,4 +6910,3 @@ type EntryNormalized =- | (() => Promise<EntryStaticNormalized>)- | EntryStaticNormalized;+ (() => Promise<EntryStaticNormalized>) | EntryStaticNormalized; @@ -7072,8 +7030,3 @@ type EnumValue =- | null- | string- | number- | boolean- | EnumValueObject- | EnumValue[];+ null | string | number | boolean | EnumValueObject | EnumValue[]; declare interface EnumValueObject {@@ -7247,4 +7200,3 @@ moduleFilenameTemplate?:- | string- | ((context: ModuleFilenameTemplateContext) => string);+ string | ((context: ModuleFilenameTemplateContext) => string); }@@ -7959,6 +7911,3 @@ type ExportsType =- | "namespace"- | "dynamic"- | "default-only"- | "default-with-named";+ "namespace" | "dynamic" | "default-only" | "default-with-named"; type Exposes = (string | ExposesObject)[] | ExposesObject;@@ -8117,5 +8066,3 @@ dependencyMeta?:- | ImportDependencyMeta- | CssImportDependencyMeta- | AssetDependencyMeta+ ImportDependencyMeta | CssImportDependencyMeta | AssetDependencyMeta );@@ -8125,5 +8072,3 @@ dependencyMeta?:- | ImportDependencyMeta- | CssImportDependencyMeta- | AssetDependencyMeta;+ ImportDependencyMeta | CssImportDependencyMeta | AssetDependencyMeta; @@ -8226,6 +8171,3 @@ exportsTypeStrict?:- | "namespace"- | "dynamic"- | "default-only"- | "default-with-named";+ "namespace" | "dynamic" | "default-only" | "default-with-named"; @@ -8235,6 +8177,3 @@ exportsTypeNonStrict?:- | "namespace"- | "dynamic"- | "default-only"- | "default-with-named";+ "namespace" | "dynamic" | "default-only" | "default-with-named"; }@@ -8701,5 +8640,3 @@ resolvedContextTimestamp?:- | null- | "ignore"- | ResolvedContextFileSystemInfoEntry+ null | "ignore" | ResolvedContextFileSystemInfoEntry ) => void@@ -8786,6 +8723,3 @@ type FileTimestamp =- | null- | "ignore"- | FileSystemInfoEntry- | ExistenceOnlyTimeEntryFileSystemInfo;+ null | "ignore" | FileSystemInfoEntry | ExistenceOnlyTimeEntryFileSystemInfo; type FilterItemTypes = string | RegExp | ((value: string) => boolean);@@ -9455,7 +9389,5 @@ sourceDependency(- module: NormalModule, dependency: Dependency,- initFragments: InitFragment<GenerateContext>[], source: ReplaceSource,- generateContext: GenerateContext+ templateContext: DependencyTemplateContext ): void;@@ -9466,7 +9398,5 @@ sourceBlock(- module: NormalModule, block: DependenciesBlock,- initFragments: InitFragment<GenerateContext>[], source: ReplaceSource,- generateContext: GenerateContext+ templateContext: DependencyTemplateContext ): void;@@ -10054,8 +9984,3 @@ type ImportSource =- | undefined- | null- | string
… 268 more lines (truncated)
@babel/core npm critical-tier BURST ×2
7.27.4
7.27.7
7.28.0
7.28.3
7.28.4
7.28.5
7.28.6
7.29.0
7.29.6
7.29.7
8.0.0
8.0.1
BURST
2 releases in 33m: 7.22.18, 7.22.19
info · registry-verified · 2023-09-14 · 2y ago
BURST
2 releases in 22m: 7.29.6, 7.29.7
info · registry-verified · 2026-05-25 · 1mo ago
release diff 8.0.0 → 8.0.1
+0 added · -0 removed · ~3 modified
--- +++ @@ -2918,3 +2918,3 @@ -const version = "8.0.0";+const version = "8.0.1"; const resolvePlugin = (name, dirname) => resolvers.resolvePlugin(name, dirname, false).filepath;
--- +++ @@ -2,3 +2,3 @@ "name": "@babel/core",- "version": "8.0.0",+ "version": "8.0.1", "description": "Babel compiler core.",@@ -59,8 +59,8 @@ "@babel/helper-transform-fixture-test-runner": "^8.0.0",- "@babel/plugin-syntax-flow": "^8.0.0",- "@babel/plugin-syntax-jsx": "^8.0.0",- "@babel/plugin-transform-flow-strip-types": "^8.0.0",- "@babel/plugin-transform-modules-commonjs": "^8.0.0",- "@babel/preset-env": "^8.0.0",- "@babel/preset-typescript": "^8.0.0",+ "@babel/plugin-syntax-flow": "^8.0.1",+ "@babel/plugin-syntax-jsx": "^8.0.1",+ "@babel/plugin-transform-flow-strip-types": "^8.0.1",+ "@babel/plugin-transform-modules-commonjs": "^8.0.1",+ "@babel/preset-env": "^8.0.1",+ "@babel/preset-typescript": "^8.0.1", "@cspotcode/source-map-support": "^0.8.1",
babel-loader npm critical-tier BURST ×6
9.1.0
8.3.0
9.1.1
9.1.2
9.1.3
8.4.0
9.2.0
8.4.1
9.2.1
10.0.0
10.1.0
10.1.1
BURST
2 releases in 59m: 5.2.1, 5.2.2
info · registry-verified · 2015-06-25 · 11y ago
BURST
2 releases in 8m: 5.4.1, 5.4.2
info · registry-verified · 2016-07-25 · 9y ago
BURST
2 releases in 26m: 9.1.0, 8.3.0
info · registry-verified · 2022-11-03 · 3y ago
BURST
2 releases in 5m: 9.1.1, 9.1.2
info · registry-verified · 2023-01-04 · 3y ago
BURST
2 releases in 1m: 8.4.0, 9.2.0
info · registry-verified · 2024-09-16 · 1y ago
BURST
2 releases in 3m: 8.4.1, 9.2.1
info · registry-verified · 2024-09-16 · 1y ago
release diff 10.1.0 → 10.1.1
+1 added · -0 removed · ~2 modified
--- +++ @@ -10,3 +10,2 @@ */-const nodeModule = require("node:module"); const os = require("os");@@ -54,10 +53,2 @@ const gzip = promisify(zlib.gzip);-const findRootPackageJSON = () => {- if (nodeModule.findPackageJSON) {- return nodeModule.findPackageJSON("..", __filename);- } else {- // todo: remove this fallback when dropping support for Node.js < 22.14- return findUpSync("package.json");- }-}; @@ -272,3 +263,3 @@ }- const rootPkgJSONPath = findRootPackageJSON();+ const rootPkgJSONPath = findUpSync("package.json"); if (rootPkgJSONPath) {
--- +++ @@ -2,3 +2,3 @@ "name": "babel-loader",- "version": "10.1.0",+ "version": "10.1.1", "description": "babel module loader for webpack",
@babel/preset-env npm no findings
7.28.0
7.28.3
7.28.5
7.28.6
7.29.0
7.29.2
7.29.3
7.29.5
7.29.7
8.0.0
8.0.1
8.0.2
CLEAN
no findings — nominal
release diff 8.0.1 → 8.0.2
+0 added · -0 removed · ~1 modified
--- +++ @@ -2,3 +2,3 @@ "name": "@babel/preset-env",- "version": "8.0.1",+ "version": "8.0.2", "description": "A Babel preset for each environment.",@@ -67,3 +67,3 @@ "@babel/plugin-transform-property-literals": "^8.0.1",- "@babel/plugin-transform-regenerator": "^8.0.1",+ "@babel/plugin-transform-regenerator": "^8.0.2", "@babel/plugin-transform-regexp-modifiers": "^8.0.1",@@ -79,4 +79,4 @@ "@babel/plugin-transform-unicode-sets-regex": "^8.0.1",- "@babel/preset-modules": "0.1.6-no-external-plugins",- "babel-plugin-polyfill-corejs3": "^1.0.0-rc.2",+ "@babel/preset-modules": "^0.2.0",+ "babel-plugin-polyfill-corejs3": "^1.0.0", "core-js-compat": "^3.48.0",
chai npm BURST ×7
5.2.1
5.2.2
5.3.0
5.3.1
5.3.2
6.0.0
6.0.1
5.3.3
6.1.0
6.2.0
6.2.1
6.2.2
BURST
2 releases in 23m: 0.1.5, 0.1.6
info · registry-verified · 2012-01-02 · 14y ago
BURST
2 releases in 7m: 0.2.2, 0.2.3
info · registry-verified · 2012-02-02 · 14y ago
BURST
2 releases in 35m: 0.3.0, 0.3.1
info · registry-verified · 2012-02-07 · 14y ago
BURST
2 releases in 4m: 4.3.2, 4.3.3
info · registry-verified · 2021-03-03 · 5y ago
BURST
2 releases in 1m: 5.0.2, 5.0.3
info · registry-verified · 2024-01-25 · 2y ago
BURST
3 releases in 9m: 5.2.2, 5.3.0, 5.3.1
info · registry-verified · 2025-08-18 · 10mo ago
BURST
2 releases in 29m: 6.0.1, 5.3.3
info · registry-verified · 2025-08-22 · 10mo ago
release diff 6.2.1 → 6.2.2
+0 added · -0 removed · ~2 modified
--- +++ @@ -699,4 +699,4 @@ var symbolsSupported = typeof Symbol === "function" && typeof Symbol.for === "function";-var chaiInspect = symbolsSupported ? Symbol.for("chai/inspect") : "@@chai/inspect";-var nodeInspect = Symbol.for("nodejs.util.inspect.custom");+var chaiInspect = symbolsSupported ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";+var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom"); var constructorMap = /* @__PURE__ */ new WeakMap();@@ -2960,3 +2960,3 @@ new Assertion(expected, flagMsg, ssfi, true).is.numeric;- const abs = /* @__PURE__ */ __name((x) => x < 0n ? -x : x, "abs");+ const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs"); const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");@@ -4172,246 +4172 @@ };-/*!- * Chai - flag utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - test utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - expectTypes utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getActual utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - message composition utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - transferFlags utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * chai- * http://chaijs.com- * Copyright(c) 2011-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - events utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - isProxyEnabled helper- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addProperty utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addLengthGuard utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getProperties utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - proxify utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteProperty utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addChainingMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteChainableMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - compareByInspect utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getOwnEnumerablePropertySymbols utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getOwnEnumerableProperties utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - isNaN utility- * Copyright(c) 2012-2015 Sakthipriyan Vairamani <[email protected]>- * MIT Licensed- */-/*!- * chai- * Copyright(c) 2011 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * chai- * Copyright(c) 2011-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*! Bundled license information:--deep-eql/index.js:- (*!- * deep-eql- * Copyright(c) 2013 Jake Luer <[email protected]>- * MIT Licensed- *)- (*!- * Check to see if the MemoizeMap has recorded a result of the two operands- *- * @param {Mixed} leftHandOperand- * @param {Mixed} rightHandOperand- * @param {MemoizeMap} memoizeMap- * @returns {Boolean|null} result- *)- (*!- * Set the result of the equality into the MemoizeMap- *- * @param {Mixed} leftHandOperand- * @param {Mixed} rightHandOperand- * @param {MemoizeMap} memoizeMap- * @param {Boolean} result- *)- (*!- * Primary Export- *)- (*!- * The main logic of the `deepEqual` function.- *- * @param {Mixed} leftHandOperand- * @param {Mixed} rightHandOperand- * @param {Object} [options] (optional) Additional options- * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.- * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of- complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular- references to blow the stack.- * @return {Boolean} equal match- *)- (*!- * Compare two Regular Expressions for equality.- *- * @param {RegExp} leftHandOperand- * @param {RegExp} rightHandOperand- * @return {Boolean} result- *)- (*!- * Compare two Sets/Maps for equality. Faster than other equality functions.- *- * @param {Set} leftHandOperand- * @param {Set} rightHandOperand- * @param {Object} [options] (Optional)- * @return {Boolean} result- *)- (*!- * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers.- *- * @param {Iterable} leftHandOperand- * @param {Iterable} rightHandOperand- * @param {Object} [options] (Optional)- * @return {Boolean} result- *)- (*!- * Simple equality for generator objects such as those returned by generator functions.- *- * @param {Iterable} leftHandOperand- * @param {Iterable} rightHandOperand- * @param {Object} [options] (Optional)- * @return {Boolean} result- *)- (*!- * Determine if the given object has an @@iterator function.- *- * @param {Object} target- * @return {Boolean} `true` if the object has an @@iterator function.- *)- (*!- * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array.- * This will consume the iterator - which could have side effects depending on the @@iterator implementation.- *- * @param {Object} target- * @returns {Array} an array of entries from the @@iterator function- *)- (*!- * Gets all entries from a Generator. This will consume the generator - which could have side effects.- *- * @param {Generator} target- * @returns {Array} an array of entries from the Generator.- *)- (*!- * Gets all own and inherited enumerable keys from a target.- *- * @param {Object} target- * @returns {Array} an array of own and inherited enumerable keys from the target.- *)- (*!- * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of- * each key. If any value of the given key is not equal, the function will return false (early).- *- * @param {Mixed} leftHandOperand- * @param {Mixed} rightHandOperand- * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against- * @param {Object} [options] (Optional)- * @return {Boolean} result- *)- (*!- * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual`- * for each enumerable key in the object.- *- * @param {Mixed} leftHandOperand- * @param {Mixed} rightHandOperand- * @param {Object} [options] (Optional)- * @return {Boolean} result
… 11 more lines (truncated)
--- +++ @@ -24,3 +24,3 @@ ],- "version": "6.2.1",+ "version": "6.2.2", "repository": {@@ -34,3 +34,3 @@ "scripts": {- "build": "esbuild --bundle --format=esm --target=es2021 --keep-names --outfile=index.js lib/chai.js",+ "build": "esbuild --bundle --format=esm --target=es2021 --keep-names --legal-comments=none --outfile=index.js lib/chai.js", "prebuild": "npm run clean",
jest npm critical-tier BURST ×8
30.0.3
30.0.4
30.0.5
30.1.0
30.1.1
30.1.2
30.1.3
30.2.0
30.3.0
30.4.0
30.4.1
30.4.2
BURST
2 releases in 1m: 0.0.7, 0.0.61
info · registry-verified · 2012-03-05 · 14y ago
BURST
2 releases in 19m: 0.0.86, 0.0.87
info · registry-verified · 2012-04-30 · 14y ago
BURST
2 releases in 4m: 0.0.90, 0.0.91
info · registry-verified · 2012-05-06 · 14y ago
BURST
2 releases in 7m: 12.1.0, 12.1.1
info · registry-verified · 2016-05-20 · 10y ago
BURST
3 releases in 36m: 13.1.2, 13.1.3, 13.2.0
info · registry-verified · 2016-07-07 · 10y ago
BURST
2 releases in 13m: 13.2.1, 13.2.2
info · registry-verified · 2016-07-07 · 10y ago
BURST
2 releases in 7m: 20.0.2, 20.0.3
info · registry-verified · 2017-05-17 · 9y ago
BURST
2 releases in 28m: 29.1.0, 29.1.1
info · registry-verified · 2022-09-28 · 3y ago
release diff 30.4.1 → 30.4.2
+0 added · -0 removed · ~1 modified
--- +++ @@ -3,3 +3,3 @@ "description": "Delightful JavaScript Testing.",- "version": "30.4.1",+ "version": "30.4.2", "main": "./build/index.js",@@ -17,6 +17,6 @@ "dependencies": {- "@jest/core": "30.4.1",+ "@jest/core": "30.4.2", "@jest/types": "30.4.1", "import-local": "^3.2.0",- "jest-cli": "30.4.1"+ "jest-cli": "30.4.2" },@@ -70,3 +70,3 @@ },- "gitHead": "b3b4a09ed3005369dacc7466d1d2122797283785"+ "gitHead": "746f2a0f57c56e3bba555280f0587d40f3db95c0" }
lodash npm BURST ×4
4.17.13
4.17.14
4.17.15
4.17.16
4.17.17
4.17.18
4.17.19
4.17.20
4.17.21
4.17.23
4.18.0
4.18.1
BURST
6 releases in 30m: 0.9.0, 0.9.1, 0.9.2, 0.10.0, 1.0.0, 1.0.1
info · registry-verified · 2013-08-31 · 12y ago
BURST
6 releases in 2m: 1.1.0, 1.1.1, 1.2.0, 1.2.1, 1.3.0, 1.3.1
info · registry-verified · 2013-09-04 · 12y ago
BURST
2 releases in 49m: 4.8.0, 4.8.1
info · registry-verified · 2016-04-04 · 10y ago
BURST
2 releases in 23m: 4.17.9, 4.17.10
info · registry-verified · 2018-04-24 · 8y ago
release diff 4.18.0 → 4.18.1
+0 added · -0 removed · ~9 modified
--- +++ @@ -25,3 +25,2 @@ // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh- // https://github.com/lodash/lodash/security/advisories/GHSA-w36w-cm3g-pc62 var index = -1,
--- +++ @@ -3,3 +3,3 @@ * Lodash (Custom Build) <https://lodash.com/>- * Build: `lodash core -o ./core.js`+ * Build: `lodash core --repo lodash/lodash#4.18.1 -o ./core.js` * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>@@ -15,3 +15,3 @@ /** Used as the semantic version number. */- var VERSION = '4.18.0';+ var VERSION = '4.18.1';
--- +++ @@ -1 +1,3 @@+var baseAssignValue = require('./_baseAssignValue');+ /**
--- +++ @@ -14,3 +14,3 @@ /** Used as the semantic version number. */- var VERSION = '4.18.0';+ var VERSION = '4.18.1'; @@ -4381,3 +4381,2 @@ // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh- // https://github.com/lodash/lodash/security/advisories/GHSA-w36w-cm3g-pc62 var index = -1,
--- +++ @@ -2,3 +2,3 @@ "name": "lodash",- "version": "4.18.0",+ "version": "4.18.1", "description": "Lodash modular utilities.",@@ -15,3 +15,5 @@ ],- "scripts": { "test": "echo \"See https://travis-ci.org/lodash-archive/lodash-cli for testing details.\"" }+ "scripts": {+ "test": "echo \"See https://travis-ci.org/lodash-archive/lodash-cli for testing details.\""+ } }
--- +++ @@ -1,2 +1,4 @@-var attempt = require('./attempt'),+var arrayEach = require('./_arrayEach'),+ assignWith = require('./assignWith'),+ attempt = require('./attempt'), baseValues = require('./_baseValues'),
prettier npm critical-tier BURST ×8
3.8.0
3.8.1
3.8.2
3.8.3
3.8.4
3.8.5
3.9.0
3.9.1
3.9.2
3.9.3
3.9.4
3.9.5
BURST
2 releases in 46m: 0.0.1, 0.0.2
info · registry-verified · 2017-01-10 · 9y ago
BURST
2 releases in 15m: 0.14.0, 0.14.1
info · registry-verified · 2017-01-30 · 9y ago
BURST
3 releases in 48m: 1.0.0, 1.0.1, 1.0.2
info · registry-verified · 2017-04-13 · 9y ago
BURST
2 releases in 58m: 1.2.0, 1.2.1
info · registry-verified · 2017-04-19 · 9y ago
BURST
2 releases in 50m: 1.4.3, 1.4.4
info · registry-verified · 2017-06-07 · 9y ago
BURST
2 releases in 19m: 1.10.0, 1.10.1
info · registry-verified · 2018-01-10 · 8y ago
BURST
2 releases in 9m: 1.13.1, 1.13.2
info · registry-verified · 2018-05-29 · 8y ago
BURST
2 releases in 9m: 3.9.2, 3.9.3 · ACTIVE
info · registry-verified · 2026-06-29 · 13d ago
release diff 3.9.4 → 3.9.5
+0 added · -0 removed · ~21 modified
+19 more files not shown
--- +++ @@ -1,23 +1,23 @@-(function(f){function e(){var i=f();return i.default||i}if(typeof exports=="object"&&typeof module=="object")module.exports=e();else if(typeof define=="function"&&define.amd)define(e);else{var t=typeof globalThis<"u"?globalThis:typeof global<"u"?global:typeof self<"u"?self:this||{};t.prettierPlugins=t.prettierPlugins||{},t.prettierPlugins.estree=e()}})(function(){"use strict";var Eo=Object.defineProperty;var zp=Object.getOwnPropertyDescriptor;var Zp=Object.getOwnPropertyNames;var ec=Object.prototype.hasOwnProperty;var Co=(e,t)=>{for(var r in t)Eo(e,r,{get:t[r],enumerable:!0})},tc=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zp(t))!ec.call(e,o)&&o!==r&&Eo(e,o,{get:()=>t[o],enumerable:!(n=zp(t,o))||n.enumerable});return e};var rc=e=>tc(Eo({},"__esModule",{value:!0}),e);var yy={};Co(yy,{languages:()=>Dy,options:()=>Xp,printers:()=>fy});var Mi=[{name:"JavaScript",type:"programming",aceMode:"javascript",extensions:[".js","._js",".bones",".cjs",".es",".es6",".gs",".jake",".javascript",".jsb",".jscad",".jsfl",".jslib",".jsm",".jspre",".jss",".mjs",".njs",".pac",".sjs",".ssjs",".xsjs",".xsjslib",".start.frag",".end.frag",".wxs"],filenames:["Jakefile","start.frag","end.frag"],tmScope:"source.js",aliases:["js","node"],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",interpreters:["bun","chakra","d8","deno","gjs","js","node","nodejs","qjs","rhino","v8","v8-shell","zx"],parsers:["babel","acorn","espree","meriyah","babel-flow","babel-ts","flow","typescript"],vscodeLanguageIds:["javascript","mongo"],linguistLanguageId:183},{name:"Flow",type:"programming",aceMode:"javascript",extensions:[".js.flow"],filenames:[],tmScope:"source.js",aliases:[],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",interpreters:["bun","chakra","d8","deno","gjs","js","node","nodejs","qjs","rhino","v8","v8-shell"],parsers:["flow","babel-flow"],vscodeLanguageIds:["javascript"],linguistLanguageId:183},{name:"JSX",type:"programming",aceMode:"javascript",extensions:[".jsx"],filenames:void 0,tmScope:"source.js.jsx",aliases:void 0,codemirrorMode:"jsx",codemirrorMimeType:"text/jsx",interpreters:void 0,parsers:["babel","babel-flow","babel-ts","flow","typescript","espree","meriyah"],vscodeLanguageIds:["javascriptreact"],group:"JavaScript",linguistLanguageId:183},{name:"TypeScript",type:"programming",aceMode:"typescript",extensions:[".ts",".cts",".mts"],tmScope:"source.ts",aliases:["ts"],codemirrorMode:"javascript",codemirrorMimeType:"application/typescript",interpreters:["bun","deno","ts-node","tsx"],parsers:["typescript","babel-ts"],vscodeLanguageIds:["typescript"],linguistLanguageId:378},{name:"TSX",type:"programming",aceMode:"tsx",extensions:[".tsx"],tmScope:"source.tsx",aliases:["typescriptreact"],codemirrorMode:"jsx",codemirrorMimeType:"text/typescript-jsx",group:"TypeScript",parsers:["typescript","babel-ts"],vscodeLanguageIds:["typescriptreact"],linguistLanguageId:94901924}];var Bi={};Co(Bi,{estree:()=>Si});function nc(e){return Array.isArray(e)&&e.length>0}var j=nc;var oc=()=>{},ve=oc;function B(e){let t=new Set(e);return r=>t.has(r?.type)}var Qt=(e,t)=>(r,n,...o)=>r|1&&n==null?void 0:(t.call(n)??n[e]).apply(n,o);function ic(e){return this[e<0?this.length+e:e]}var sc=Qt("at",function(){if(Array.isArray(this)||typeof this=="string")return ic}),L=sc;function Z(e,t,r){if(!e.has(t)){let n=r(t);e.set(t,n)}return e.get(t)}function uc(e){let t=[];return e.this&&t.push(e.this),t.push(...e.params),e.rest&&t.push(e.rest),t}var ac=new WeakMap;function ee(e){return Z(ac,e,uc)}function _i(e,t){let{node:r}=e,n=0,o=()=>t(e,n++);r.this&&e.call(o,"this"),e.each(o,"params"),r.rest&&e.call(o,"rest")}function Ni(e){if(e.rest)return!0;let t=ee(e);return L(0,t,-1)?.type==="RestElement"}var ji=e=>e?.type==="TSAsExpression"&&e.typeAnnotation.type==="TSTypeReference"&&e.typeAnnotation.typeName.type==="Identifier"&&e.typeAnnotation.typeName.name==="const";function zt({node:e,parent:t}){return e?.type!=="EmptyStatement"?!1:t.type==="IfStatement"?t.consequent===e||t.alternate===e:t.type==="DoWhileStatement"||t.type==="ForInStatement"||t.type==="ForOfStatement"||t.type==="ForStatement"||t.type==="LabeledStatement"||t.type==="WithStatement"||t.type==="WhileStatement"?t.body===e:!1}function Ke(e){return e.method&&e.kind==="init"||e.kind==="get"||e.kind==="set"}var xo=e=>Number.isSafeInteger(e)&&e>=0;function It(e){return e.range?.[1]??e.end}function b(e){let t=e.range?.[0]??e.start,r=(e.declaration?.decorators??e.decorators)?.[0];return r?Math.min(b(r),t):t}var pc=5,cc=8,lc=8,vi=e=>t=>t.label?S(t.label):b(t)+e,mc=e=>e.__contentEnd??It(e),Ri=["ExpressionStatement","Directive","ImportDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExportAllDeclaration","ReturnStatement","ThrowStatement","DoWhileStatement"],fc=new Map([["BreakStatement",vi(pc)],["ContinueStatement",vi(cc)],["DebuggerStatement",e=>b(e)+lc],["VariableDeclaration",e=>S(L(0,e.declarations,-1))],...Ri.map(e=>[e,mc])]),Wi=B(Ri),Pr=e=>{if(Wi(e)&&e.__contentEnd)return!0;let{type:t}=e;return t==="BreakStatement"||t==="ContinueStatement"||t==="DebuggerStatement"||t==="VariableDeclaration"?!0:t==="IfStatement"?Pr(e.alternate??e.consequent):t==="ForInStatement"||t==="ForOfStatement"||t==="ForStatement"||t==="LabeledStatement"||t==="WithStatement"||t==="WhileStatement"?Pr(e.body):!1};function S(e){let{type:t}=e;return t==="IfStatement"?S(e.alternate??e.consequent):t==="ForInStatement"||t==="ForOfStatement"||t==="ForStatement"||t==="LabeledStatement"||t==="WithStatement"||t==="WhileStatement"?S(e.body):fc.get(t)?.(e)??It(e)}function kt(e,t){let r=b(e);return xo(r)&&r===b(t)}function Dc(e,t){let r=S(e);return xo(r)&&r===S(t)}function Ao(e,t){return kt(e,t)&&Dc(e,t)}function ye(e){return e.extra?.raw??e.raw}function Ji(e){return e.type==="BigIntLiteral"||e.type==="Literal"&&!!e.bigint}function Gi(e){return e.type==="BooleanLiteral"||e.type==="Literal"&&typeof e.value=="boolean"}function Ee(e){return e.type==="NumericLiteral"||e.type==="Literal"&&typeof e.value=="number"}function Xr(e){return e.type==="RegExpLiteral"||e.type==="Literal"&&!!e.regex}function q(e){return e?.type==="StringLiteral"||e?.type==="Literal"&&typeof e.value=="string"}var de=B(["TSAsExpression","TSSatisfiesExpression","AsExpression","AsConstExpression","SatisfiesExpression"]),Ui=B(["SatisfiesExpression","TSSatisfiesExpression"]),pe=B(["TSUnionType","UnionTypeAnnotation"]),At=B(["TSIntersectionType","IntersectionTypeAnnotation"]),Zt=B(["TupleTypeAnnotation","TSTupleType"]),$e=B(["TSConditionalType","ConditionalTypeAnnotation"]),Vr=B(["TSTypeAliasDeclaration","TypeAlias"]),ut=B(["ReturnStatement","ThrowStatement"]),qi=B(["ExportDefaultDeclaration","DeclareExportDeclaration","ExportNamedDeclaration","ExportAllDeclaration","DeclareExportAllDeclaration"]),Y=B(["ArrayExpression"]),ie=B(["ObjectExpression"]),er=B(["Literal","BooleanLiteral","BigIntLiteral","DirectiveLiteral","NullLiteral","NumericLiteral","RegExpLiteral","StringLiteral"]),Ue=B(["ObjectTypeAnnotation","TSTypeLiteral","TSMappedType"]),wt=B(["FunctionExpression","ArrowFunctionExpression"]),H=B(["JSXElement","JSXFragment"]),Be=B(["BinaryExpression","LogicalExpression","NGPipeExpression"]),M=B(["CallExpression","OptionalCallExpression"]),N=B(["MemberExpression","OptionalMemberExpression"]),Tt=B(["CallExpression","OptionalCallExpression","NewExpression"]),Dt=B(["CallExpression","OptionalCallExpression","NewExpression","ImportExpression"]),Re=B(["ChainExpression","TSNonNullExpression"]),Yi=B(["TSArrayType","ArrayTypeAnnotation"]),Hi=B(["TSTypeParameterInstantiation","TypeParameterInstantiation"]);function Ir(e){if(e.type!=="ImportSpecifier"&&e.type!=="ExportSpecifier")return!1;let{local:t,[e.type==="ImportSpecifier"?"imported":"exported"]:r}=e;return t.type!==r.type||!Ao(t,r)?!1:q(t)?t.value===r.value&&ye(t)===ye(r):t.type==="Identifier"?t.name===r.name:!1}var yc=B(["File","TemplateElement","TSEmptyBodyFunctionExpression","ChainExpression"]),Ec=(e,[t])=>t?.type==="ComponentParameter"&&t.shorthand&&t.name===e&&t.local!==t.name||t?.type==="MatchObjectPatternProperty"&&t.shorthand&&t.key===e||t?.type==="ObjectProperty"&&t.shorthand&&t.key===e&&t.value!==t.key||t?.type==="Property"&&t.shorthand&&t.key===e&&!Ke(t)&&t.value!==t.key||t?.type==="ImportSpecifier"&&Ir(t)&&t.imported===e&&t.imported!==t.local||t?.type==="ExportSpecifier"&&Ir(t)&&t.local===e&&t.local!==t.exported,dc=(e,[t])=>!!(e.type==="FunctionExpression"&&t.type==="MethodDefinition"&&t.value===e&&ee(e).length===0&&!e.returnType&&!j(e.typeParameters)&&e.body),Xi=(e,[t])=>t?.typeAnnotation===e&&ji(t),Cc=(e,[t,...r])=>Xi(e,[t])||t?.typeName===e&&Xi(t,r);function Fc(e,t){return yc(e)||Ec(e,t)||dc(e,t)?!1:e.type==="EmptyStatement"?zt({node:e,parent:t[0]}):!(Cc(e,t)||e.type==="TSTypeAnnotation"&&t[0].type==="TSPropertySignature")}var Vi=Fc;function xc(e){let t=e.type||e.kind||"(unknown type)",r=String(e.name||e.id&&(typeof e.id=="object"?e.id.name:e.id)||e.key&&(typeof e.key=="object"?e.key.name:e.key)||e.value&&(typeof e.value=="object"?"":String(e.value))||e.operator||"");return r.length>20&&(r=r.slice(0,19)+"\u2026"),t+(r?" "+r:"")}function To(e,t){(e.comments??(e.comments=[])).push(t),t.printed=!1,t.nodeDescription=xc(e)}function K(e,t){t.leading=!0,t.trailing=!1,To(e,t)}function be(e,t,r){t.leading=!1,t.trailing=!1,r&&(t.marker=r),To(e,t)}function X(e,t){t.leading=!1,t.trailing=!0,To(e,t)}function Kr(e){return(t,r,n)=>{if(r===!1)return!1;let o=!!n?.backwards,{length:i}=t,s=r;for(;s>=0&&s<i;){let u=t.charAt(s);if(e instanceof RegExp){if(!e.test(u))return s}else if(!e.includes(u))return s;o?s--:s++}return s===-1||s===i?s:!1}}var DE=Kr(/\s/),at=Kr(" "),Ki=Kr(",; "),$i=Kr(/[^\n\r]/);function Ac(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let r=t+2;r<e.length;++r)if(e.charAt(r)==="*"&&e.charAt(r+1)==="/")return r+2}return t}var tr=Ac;var Qi=e=>e===`-`||e==="\r"||e==="\u2028"||e==="\u2029";function Tc(e,t,r){if(t===!1)return!1;let n=!!r?.backwards,o=e.charAt(t);if(n){if(e.charAt(t-1)==="\r"&&o===`-`)return t-2;if(Qi(o))return t-1}else{if(o==="\r"&&e.charAt(t+1)===`-`)return t+2;if(Qi(o))return t+1}return t}var pt=Tc;function gc(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?$i(e,t):t}var rr=gc;function hc(e,t){let r=null,n=t;for(;n!==r;)r=n,n=at(e,n),n=tr(e,n),n=rr(e,n),n=pt(e,n);return n}var Wt=hc;function Sc(e,t){let r=Wt(e,t);return r===!1?"":e.charAt(r)}var Qe=Sc;function Bc(e,t,r={}){let n=at(e,r.backwards?t-1:t,r),o=pt(e,n,r);return n!==o}var J=Bc;function bc(e,t,r){for(let n=t;n<r;++n)if(e.charAt(n)===`-`)return!0;return!1}var te=bc;var Pc=new WeakMap;function Ic(e){let t;return e.type==="ImportExpression"||e.type==="TSImportType"?(t=[e.source],e.options&&t.push(e.options)):e.type==="TSExternalModuleReference"?t=[e.expression]:t=e.arguments,t}function se(e){return Z(Pc,e,Ic)}function kr(e,t){let{node:r}=e;r.type==="ImportExpression"||r.type==="TSImportType"?(e.call(()=>t(e,0),"source"),r.options&&e.call(()=>t(e,1),"options")):r.type==="TSExternalModuleReference"?e.call(()=>t(e,0),"expression"):e.each(t,"arguments")}function go(e,t){if(e.type==="ImportExpression"||e.type==="TSImportType"){if(t===0||t===(e.options?-2:-1))return["source"];if(e.options&&(t===1||t===-1))return["options"];throw new RangeError("Invalid argument index")}if(e.type==="TSExternalModuleReference"){if(t===0||t===-1)return["expression"]}else if(t<0&&(t=e.arguments.length+t),t>=0&&t<e.arguments.length)return["arguments",t];throw new RangeError("Invalid argument index")}var zi=Symbol.for("comments");var kc=String.prototype.replaceAll??function(e,t){return e.global?this.replace(e,t):this.split(e).join(t)},wc=Qt("replaceAll",function(){if(typeof this=="string")return kc}),V=wc;function Lc(e){return V(0,e,/[^\n]/g," ")}var Zi=Lc;function Oc(e,t){for(let r of t){let n=b(r),o=S(r);e=e.slice(0,n)+Zi(e.slice(n,o))+e.slice(o)}return e}var Mc=new WeakMap;function ce(e){let t=e[zi];return Z(Mc,t,r=>Oc(e.originalText,r))}function es(e,t){let r=S(e)-1;if(t.originalText[r]===")")return r}function _c(e,t){if(es(e,t)===void 0)return;let n=ce(t),o=S(e.typeArguments??e.callee),i=n.indexOf("(",o);if(i!==-1)return i}function ts(e,t,r){let n=es(e,r);if(n===void 0||S(t)>n)return!1;let o=_c(e,r);return o===void 0?!1:b(t)>o}var le=B(["Block","CommentBlock","MultiLine"]),qe=B(["Line","CommentLine","SingleLine","HashbangComment","HTMLOpen","HTMLClose","Hashbang","InterpreterDirective"]);function We(e){return e?.type==="ObjectProperty"||e?.type==="Property"&&!Ke(e)}function yt(e){return e.value.trim()==="prettier-ignore"&&!e.unignore}var Nc=new WeakMap;function nr(e){return Z(Nc,e,t=>le(t)&&t.value[0]==="*"&&/@(?:type|satisfies)\b/.test(t.value))}function $r({comment:e,enclosingNode:t,followingNode:r,options:n}){if((t?.type==="ForInStatement"||t?.type==="ForOfStatement"||t?.type==="ForStatement")&&r&&r===t.body){let o=ce(n).lastIndexOf(")",b(r));if(b(e)>o)return K(r,e),!0}return!1}var ho=(e,t)=>le(e)&&!te(t,b(e),S(e)),wr=(e,t)=>qe(e)||ho(e,t);function Qr(e,t){e.type==="BlockStatement"?or(e,t):K(e,t)}function or(e,t){let r=(e.body||e.properties).find(({type:n})=>n!=="EmptyStatement");r?K(r,t):be(e,t)}function zr({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){return r?.type!=="IfStatement"||!n?!1:Qe(o,S(e))===")"?(X(t,e),!0):n===r.consequent?(K(n,e),!0):t===r.consequent&&n===r.alternate?jc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}):!1}function jc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){let s=ce(i).indexOf("else",S(r.consequent));return b(e)>=s?(K(n,e),!0):!(t.type==="BlockStatement")&&wr(e,o)&&!te(o,S(t),b(e))?(X(t,e),!0):(be(r,e),!0)}function Zr({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return(r?.type==="WhileStatement"||r?.type==="WithStatement")&&n?Qe(o,S(e))===")"?(X(t,e),!0):r.body===n?(K(n,e),!0):!1:!1}function So(e,{comment:t,text:r,options:n}){if(pe(e)&&ho(t,r)&&!yt(t)){let i=ce(n).slice(S(t),b(e));return/^[ \t]*$/.test(i)}return!1}function Bo(e,t){return K(So(e,t)?e.types[0]:e,t.comment),!0}function vc(e){return[bo,fs,is,ps,Gc,zr,Zr,os,ss,$r,Kc,$c,Po,ls,zc,us,cs,Uc,il,Io,ko,ys].some(t=>t(e))}function Rc(e){return[bo,Jc,ps,is,ls,zr,Zr,os,ss,$r,cs,Vc,Qc,Po,ms,nl,ol,sl,Io,pl,Ds,ul,ko].some(t=>t(e))}function Wc(e){return[bo,fs,zr,Zr,$r,us,Po,ms,Io,Hc,Yc,tl,Ds,ko,ys].some(t=>t(e))}function Jc({comment:e,followingNode:t}){return t&&nr(e)?(K(t,e),!0):!1}function os({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return r?.type!=="TryStatement"&&r?.type!=="CatchClause"||!n?!1:r.type==="CatchClause"&&t?(X(t,e),!0):n.type==="BlockStatement"?(or(n,e),!0):n.type==="TryStatement"?(Qr(n.finalizer,e),!0):n.type==="CatchClause"?(Qr(n.body,e),!0):!1}function Gc({comment:e,enclosingNode:t,followingNode:r}){return N(t)&&r?.type==="Identifier"?(K(t,e),!0):!1}function Uc({comment:e,enclosingNode:t,followingNode:r,options:n}){return!n.experimentalTernaries||!(t?.type==="ConditionalExpression"||$e(t))?!1:r?.type==="ConditionalExpression"||$e(r)?(be(t,e),!0):!1}function is({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){let s=t&&!te(o,S(t),b(e));return(!t||!s)&&(r?.type==="ConditionalExpression"||$e(r))&&n?i.experimentalTernaries&&r.alternate===n&&!(le(e)&&!te(i.originalText,b(e),S(e)))?(be(r,e),!0):(K(n,e),!0):!1}var qc=B(["ClassDeclaration","ClassExpression","DeclareClass","DeclareInterface","InterfaceDeclaration","TSInterfaceDeclaration"]);function ss({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){if(qc(r)){let{decorators:o}=r;if(j(o)&&n?.type!=="Decorator")return X(L(0,o,-1),e),!0;if(r.body&&n===r.body)return or(r.body,e),!0;if(n){let{superClass:i}=r;if(i&&n===i&&t&&(t===r.id||t===r.typeParameters))return X(t,e),!0;for(let s of["implements","extends","mixins"])if(r[s]&&n===r[s][0])return t&&(t===r.id||t===r.typeParameters||t===i)?X(t,e):be(r,e,s),!0}}return!1}var rs=B(["ClassMethod","ClassProperty","PropertyDefinition","TSAbstractPropertyDefinition","TSAbstractMethodDefinition","TSDeclareMethod","MethodDefinition","ClassAccessorProperty","AccessorProperty","TSAbstractAccessorProperty","TSParameterProperty"]);function us({placement:e,comment:t,precedingNode:r,enclosingNode:n,followingNode:o,text:i}){return n&&r&&Qe(i,S(t))==="("&&(n.type==="Property"||n.type==="TSDeclareMethod"||n.type==="TSAbstractMethodDefinition")&&r.type==="Identifier"&&n.key===r&&Qe(i,S(r))!==":"?(X(r,t),!0):rs(n)&&!o&&e==="remaining"?(X(Qe(i,S(t))==="("?r:n,t),!0):r?.type==="Decorator"&&rs(n)&&(qe(t)||e==="ownLine")?(X(r,t),!0):!1}var as=B(["FunctionDeclaration","FunctionExpression","ClassMethod","MethodDefinition","ObjectMethod"]);function Yc({comment:e,precedingNode:t,enclosingNode:r,text:n}){return Qe(n,S(e))!=="("?!1:t&&as(r)?(X(t,e),!0):!1}function Hc({comment:e,enclosingNode:t,text:r}){if(t?.type!=="ArrowFunctionExpression")return!1;let n=Wt(r,S(e));return n!==!1&&r.slice(n,n+2)==="=>"?(be(t,e,"commentBeforeArrow"),!0):!1}function ns(e,t,r){let n=b(t),o=S(e);if(n>=o)return!1;let i=S(t),s=b(e);if(i<=s)return!1;let u=ce(r);return u.slice(0,b(t)).trimEnd().endsWith("(")&&u.slice(S(t)).trimStart().startsWith(")")}var Xc=B(["ComponentDeclaration","DeclareComponent","ComponentTypeAnnotation"]);function bo({comment:e,enclosingNode:t,options:r}){if(!t)return!1;if(Dt(t)&&se(t).length===0&&ns(t,e,r))return be(t,e),!0;let n=Es(t)||Xc(t)||t.type==="HookTypeAnnotation"?t:t.type==="MethodDefinition"||t.type==="TSAbstractMethodDefinition"||t.type==="Property"&&Ke(t)?t.value:void 0;return n&&ee(n).length===0&&ns(n,e,r)?(be(n,e),!0):!1}function ps({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return t?.type==="FunctionTypeParam"&&r?.type==="FunctionTypeAnnotation"&&n?.type!=="FunctionTypeParam"?(X(t,e),!0):t?.type==="ComponentTypeParameter"&&(r?.type==="DeclareComponent"||r?.type==="ComponentTypeAnnotation")&&n?.type!=="ComponentTypeParameter"?(X(t,e),!0):(t?.type==="Identifier"||t?.type==="AssignmentPattern"||t?.type==="ObjectPattern"||t?.type==="ArrayPattern"||t?.type==="RestElement"||t?.type==="TSParameterProperty")&&(Es(r)||(r?.type==="TSAbstractMethodDefinition"||r?.type==="MethodDefinition")&&r.value.type==="TSEmptyBodyFunctionExpression")&&Qe(o,S(e))===")"?(X(t,e),!0):(t?.type==="ComponentParameter"||t?.type==="RestElement")&&(r?.type==="ComponentDeclaration"||r?.type==="DeclareComponent")&&Qe(o,S(e))===")"?(X(t,e),!0):!le(e)&&n?.type==="BlockStatement"&&as(r)&&(r.type==="MethodDefinition"?r.value.body:r.body)===n&&Wt(o,S(e))===b(n)?(or(n,e),!0):!1}function cs({comment:e,enclosingNode:t}){return t?.type==="LabeledStatement"?(K(t,e),!0):!1}function Vc({comment:e,precedingNode:t,enclosingNode:r,options:n}){return Tt(r)&&r.callee===t&&r.arguments.length>0&&ts(r,e,n)?(K(r.arguments[0],e),!0):!1}function Kc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return pe(r)?(yt(e)&&(n.prettierIgnore=!0,e.unignore=!0),t?(X(t,e),!0):!1):(pe(n)&&yt(e)&&(n.types[0].prettierIgnore=!0,e.unignore=!0),!1)}function $c({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return r&&r.type==="MatchOrPattern"?(yt(e)&&(n.prettierIgnore=!0,e.unignore=!0),t?(X(t,e),!0):!1):(n&&n.type==="MatchOrPattern"&&yt(e)&&(n.types[0].prettierIgnore=!0,e.unignore=!0),!1)}function Qc({comment:e,enclosingNode:t}){return We(t)?(K(t,e),!0):!1}function Po({comment:e,enclosingNode:t,ast:r,isLastComment:n}){return r?.body?.length===0?(n?be(r,e):K(r,e),!0):t?.type==="Program"&&t.body.length===0&&!j(t.directives)?(n?be(t,e):K(t,e),!0):!1}function ls({comment:e,precedingNode:t,enclosingNode:r,text:n}){if(r?.type==="ImportSpecifier"||r?.type==="ExportSpecifier")return K(r,e),!0;let o=t?.type==="ImportSpecifier"&&r?.type==="ImportDeclaration",i=t?.type==="ExportSpecifier"&&r?.type==="ExportNamedDeclaration";return(o||i)&&J(n,S(e))?(X(t,e),!0):!1}function zc({comment:e,enclosingNode:t}){return t?.type==="AssignmentPattern"?(K(t,e),!0):!1}var Zc=B(["VariableDeclarator","AssignmentExpression","TypeAlias","TSTypeAliasDeclaration"]),el=B(["ObjectExpression","ArrayExpression","TemplateLiteral","TaggedTemplateExpression","ObjectTypeAnnotation","TSTypeLiteral"]);function ms(e){let{comment:t,enclosingNode:r,followingNode:n,options:o,placement:i}=e;if(Zc(r)&&n&&i==="endOfLine"&&(el(n)||le(t)))return Bo(n,e);if(Vr(r)&&n){let s=r.id,u=ce(o).indexOf("=",S(s));if(b(t)>=u)return Bo(n,e)}return!1}function tl({comment:e,enclosingNode:t,precedingNode:r,followingNode:n,text:o}){return!n&&(t?.type==="TSMethodSignature"||t?.type==="TSDeclareFunction"||t?.type==="TSAbstractMethodDefinition")&&(!r||r!==t.returnType)&&Qe(o,S(e))===";"?(X(t,e),!0):!1}function fs({comment:e,enclosingNode:t,followingNode:r}){if(yt(e)&&t?.type==="TSMappedType"&&r===t.key)return t.prettierIgnore=!0,e.unignore=!0,!0}function rl(e,t,r){let n=ce(r).indexOf("[",b(e));return S(t)<n}function Io({comment:e,enclosingNode:t,options:r}){if(t?.type==="TSMappedType"&&rl(t,e,r))return be(t,e),!0}function nl({comment:e,enclosingNode:t,followingNode:r}){return!t||t.type!=="SwitchCase"||t.test||!r||r!==t.consequent[0]?!1:(r.type==="BlockStatement"&&qe(e)?or(r,e):be(t,e),!0)}function ol({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return pe(t)&&(Yi(r)&&!n||At(r)||pe(r))?(X(L(0,t.types,-1),e),!0):!1}function il({comment:e,enclosingNode:t,precedingNode:r,followingNode:n}){if((t?.type==="ObjectPattern"||t?.type==="ArrayPattern")&&n?.type==="TSTypeAnnotation")return r?X(r,e):be(t,e),!0}function sl({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return!n&&r?.type==="UnaryExpression"&&(t?.type==="LogicalExpression"||t?.type==="BinaryExpression")&&te(o,b(r.argument),b(t.right))&&wr(e,o)&&!te(o,b(t.right),b(e))?(X(t.right,e),!0):!1}function ul({enclosingNode:e,followingNode:t,comment:r}){if(e&&(e.type==="TSPropertySignature"||e.type==="ObjectTypeProperty")&&(pe(t)||At(t)))return K(t,r),!0}function ko({enclosingNode:e,precedingNode:t,followingNode:r,comment:n,text:o}){if(de(e)&&t===e.expression&&!wr(n,o))return r?K(r,n):X(e,n),!0}function al(e,t,r){let n=ce(r).lastIndexOf("=>",b(t.body));return S(e)<n}function pl({comment:e,enclosingNode:t,followingNode:r,precedingNode:n,options:o}){return t?.type!=="ArrowFunctionExpression"||!r||!n||al(e,t,o)?!1:(Qr(r,e),!0)}function Ds({comment:e,enclosingNode:t,precedingNode:r,followingNode:n}){if(!n&&t&&r){if(t.type==="ExpressionStatement"&&t.expression===r)return X(t,e),!0;let o=r.type==="SequenceExpression",i=r.type==="AssignmentExpression";if((o||i)&&(t.type==="ArrowFunctionExpression"&&t.body===r||t.type==="VariableDeclarator"&&t.init===r||t.type==="ReturnStatement"&&t.argument===r||t.type==="AssignmentExpression"&&t.right===r))return X(o?L(0,r.expressions,-1):r.right,e),!0}return!1}function ys(e){let{followingNode:t,comment:r}=e;return So(t,e)?(K(t.types[0],r),!0):!1}var Es=B(["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration","ObjectMethod","ClassMethod","TSDeclareFunction","TSCallSignatureDeclaration","TSConstructSignatureDeclaration","TSMethodSignature","TSConstructorType","TSFunctionType","TSDeclareMethod","HookDeclaration"]),cl={endOfLine:Rc,ownLine:vc,remaining:Wc},ds=cl;function ll(e,{parser:t}){if(t==="flow"||t==="hermes"||t==="babel-flow")return e=V(0,e,/[\s(]/g,""),e===""||e==="/*"||e==="/*::"}var Cs=ll;var T={Leading:2,Trailing:4,Dangling:8,Block:16,Line:32,PrettierIgnore:64,First:128,Last:256},Fs=(e,t)=>{if(typeof e=="function"&&(t=e,e=0),e||t)return(r,n,o)=>!(e&T.Leading&&!r.leading||e&T.Trailing&&!r.trailing||e&T.Dangling&&(r.leading||r.trailing)||e&T.Block&&!le(r)||e&T.Line&&!qe(r)||e&T.First&&n!==0||e&T.Last&&n!==o.length-1||e&T.PrettierIgnore&&!yt(r)||t&&!t(r))};function C(e,t,r){if(!j(e?.comments))return!1;let n=Fs(t,r);return n?e.comments.some(n):!0}function oe(e,t,r){if(!Array.isArray(e?.comments))return[];let n=Fs(t,r);return n?e.comments.filter(n):e.comments}function Lt(e){return e?.prettierIgnore||C(e,T.PrettierIgnore)}function en(e){let{node:t}=e;return(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression")&&(e.key==="callee"&&M(e.parent)||e.key==="tag"&&e.parent.type==="TaggedTemplateExpression")}var ml=new Map([["|>"],["??"],["||"],["&&"],["|"],["^"],["&"],["==","===","!=","!=="],["<",">","<=",">=","in","instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"],["**"]].flatMap((e,t)=>e.map(r=>[r,t])));function ir(e){return ml.get(e)}var xs={"==":!0,"!=":!0,"===":!0,"!==":!0},tn={"*":!0,"/":!0,"%":!0},rn={">>":!0,">>>":!0,"<<":!0};function Lr(e,t){return!(ir(t)!==ir(e)||e==="**"||xs[e]&&xs[t]||t==="%"&&tn[e]||e==="%"&&tn[t]||t!==e&&tn[t]&&tn[e]||rn[e]&&rn[t])}function As(e){return!!rn[e]||e==="|"||e==="^"||e==="&"}function Ts(e){return e.type==="LogicalExpression"&&e.operator==="??"}function Ce(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":case"AssignmentExpression":case"NGPipeExpression":return Ce(e.left,t);case"MemberExpression":case"OptionalMemberExpression":return Ce(e.object,t);case"TaggedTemplateExpression":return e.tag.type==="FunctionExpression"?!1:Ce(e.tag,t);case"CallExpression":case"OptionalCallExpression":return e.callee.type==="FunctionExpression"?!1:Ce(e.callee,t);case"ConditionalExpression":return Ce(e.test,t);case"UpdateExpression":return!e.prefix&&Ce(e.argument,t);case"BindExpression":return e.object&&Ce(e.object,t);case"SequenceExpression":return Ce(e.expressions[0],t);case"ChainExpression":case"TSNonNullExpression":case"TSSatisfiesExpression":case"TSAsExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return Ce(e.expression,t);default:return t(e)}}function fl(e){let{key:t,parent:r}=e;return t==="expression"&&r.type==="TSNonNullExpression"||t==="object"&&r.type==="MemberExpression"&&!r.optional||t==="callee"&&r.type==="CallExpression"&&!r.optional||t==="callee"&&r.type==="NewExpression"||t==="tag"&&r.type==="TaggedTemplateExpression"}var gs=e=>e.extra?.parenthesized,Dl=B(["OptionalCallExpression","OptionalMemberExpression"]);function yl(e){let{node:t}=e,r=t;for(;r.type==="TSNonNullExpression";)if(r=r.expression,gs(r))return!1;return Dl(r)?gs(t)?!0:!(e.key==="expression"&&e.parent.type==="TSNonNullExpression"):!1}function hs(e){return(e.node.type==="ChainExpression"||yl(e))&&fl(e)}function Ss(e){let{node:t}=e;if(t.type!=="Identifier")return!1;if(t.extra?.parenthesized&&/^PRETTIER_HTML_PLACEHOLDER_\d+_\d+_IN_JS$/.test(t.name))return!0;let{key:r,parent:n}=e;if(r==="left"&&(t.name==="async"&&!n.await||t.name==="let")&&n.type==="ForOfStatement")return!0;if(t.name==="let"){let o=e.findAncestor(i=>i.type==="ForOfStatement"||i.type==="ForInStatement")?.left;if(o&&Ce(o,i=>i===t))return!0}if(r==="object"&&t.name==="let"&&n.type==="MemberExpression"&&n.computed&&!n.optional){let o=e.findAncestor(s=>s.type==="ExpressionStatement"||s.type==="ForStatement"||s.type==="ForInStatement"),i=o?o.type==="ExpressionStatement"?o.expression:o.type==="ForStatement"?o.init:o.left:void 0;if(i&&Ce(i,s=>s===t))return!0}if(r==="expression")switch(t.name){case"await":case"interface":case"module":case"using":case"yield":case"let":case"component":case"hook":case"type":{let o=e.findAncestor(i=>!de(i));if(o!==n&&o.type==="ExpressionStatement")return!0}}return!1}function El(e){return e!==null&&typeof e=="object"}var nn=El;function*dl(e,t){let{getVisitorKeys:r,filter:n=()=>!0}=t,o=i=>nn(i)&&n(i);for(let i of r(e)){let s=e[i];if(Array.isArray(s))for(let u of s)o(u)&&(yield u);else o(s)&&(yield s)}}function*Cl(e,t){let r=[e];for(let n=0;n<r.length;n++){let o=r[n];for(let i of dl(o,t))yield i,r.push(i)}}function Bs(e,{getVisitorKeys:t,predicate:r}){for(let n of Cl(e,{getVisitorKeys:t}))if(r(n))return!0;return!1}var Or=null;function Mr(e){if(Or!==null&&typeof Or.property){let t=Or;return Or=Mr.prototype=null,t}return Or=Mr.prototype=e??Object.create(null),new Mr}var Fl=10;for(let e=0;e<=Fl;e++)Mr();function wo(e){return Mr(e)}function xl(e,t="type"){wo(e);function r(n){let o=n[t],i=e[o];if(!Array.isArray(i))throw Object.assign(new Error(`Missing visitor keys for '${o}'.`),{node:n});return i}return r}var on=xl;var l=[["elements"],["left","right"],["value"],["directives","body"],["label"],["callee","typeArguments","arguments"],["test","consequent","alternate"],["body","test"],["expression"],["left","right","body"],["id","typeParameters","params","predicate","returnType","body"],["object","property"],["properties"],["decorators","key","typeParameters","params","returnType","body"],["decorators","key","value"],["argument"],["expressions"],["id","init"],["body"],["decorators","id","typeParameters","superClass","superTypeArguments","mixins","implements","body"],["declaration","specifiers","source","attributes"],["local"],["exported"],["decorators","variance","key","typeAnnotation","value"],["id"],["key","value"],["elementType"],["id","typeParameters"],["id","typeParameters","extends","body"],["id","body"],["typeAnnotation"],["id","typeParameters","right"],["name","typeAnnotation"],["types"],["qualification","id"],["elementTypes"],["expression","typeAnnotation"],["params"],["members"],["objectType","indexType"],["decorators","key","typeAnnotation","value"],["id","typeParameters","params","returnType","body"],["key","typeParameters","params","returnType"],["typeParameters","params","returnType"],["parameterName","typeAnnotation"],["checkType","extendsType","trueType","falseType"],["typeParameter"],["literal"],["expression","typeArguments"],["decorators","key","typeAnnotation"],["argument","cases"],["pattern","body","guard"],["properties","rest"],["node"]],bs={ArrayExpression:l[0],AssignmentExpression:l[1],BinaryExpression:l[1],InterpreterDirective:[],Directive:l[2],DirectiveLiteral:[],BlockStatement:l[3],BreakStatement:l[4],CallExpression:l[5],CatchClause:["param","body"],ConditionalExpression:l[6],ContinueStatement:l[4],DebuggerStatement:[],DoWhileStatement:l[7],EmptyStatement:[],ExpressionStatement:l[8],File:["program"],ForInStatement:l[9],ForStatement:["init","test","update","body"],FunctionDeclaration:l[10],FunctionExpression:l[10],Identifier:["typeAnnotation","decorators"],IfStatement:l[6],LabeledStatement:["label","body"],StringLiteral:[],NumericLiteral:[],NullLiteral:[],BooleanLiteral:[],RegExpLiteral:[],LogicalExpression:l[1],MemberExpression:l[11],NewExpression:l[5],Program:l[3],ObjectExpression:l[12],ObjectMethod:l[13],ObjectProperty:l[14],RestElement:["argument","typeAnnotation","decorators"],ReturnStatement:l[15],SequenceExpression:l[16],ParenthesizedExpression:l[8],SwitchCase:["test","consequent"],SwitchStatement:["discriminant","cases"],ThisExpression:[],ThrowStatement:l[15],TryStatement:["block","handler","finalizer"],UnaryExpression:l[15],UpdateExpression:l[15],VariableDeclaration:["declarations"],VariableDeclarator:l[17],WhileStatement:l[7],WithStatement:["object","body"],AssignmentPattern:["left","right","decorators","typeAnnotation"],ArrayPattern:["elements","typeAnnotation","decorators"],ArrowFunctionExpression:["typeParameters","params","predicate","returnType","body"],ClassBody:l[18],ClassExpression:l[19],ClassDeclaration:l[19],ExportAllDeclaration:["source","attributes","exported"],ExportDefaultDeclaration:["declaration"],ExportNamedDeclaration:l[20],ExportSpecifier:["local","exported"],ForOfStatement:l[9],ImportDeclaration:["specifiers","source","attributes"],ImportDefaultSpecifier:l[21],ImportNamespaceSpecifier:l[21],ImportSpecifier:["imported","local"],MetaProperty:["meta","property"],ClassMethod:l[13],ObjectPattern:["decorators","properties","typeAnnotation"],SpreadElement:l[15],Super:[],TaggedTemplateExpression:["tag","typeArguments","quasi"],TemplateElement:[],TemplateLiteral:["quasis","expressions"],YieldExpression:l[15],AwaitExpression:l[15],ImportExpression:["source","options"],BigIntLiteral:[],ExportNamespaceSpecifier:l[22],OptionalMemberExpression:l[11],OptionalCallExpression:l[5],ClassProperty:l[23],ClassPrivateProperty:l[23],ClassPrivateMethod:l[13],PrivateName:l[24],StaticBlock:l[18],ImportAttribute:l[25],AnyTypeAnnotation:[],ArrayTypeAnnotation:l[26],BooleanTypeAnnotation:[],BooleanLiteralTypeAnnotation:[],NullLiteralTypeAnnotation:[],ClassImplements:l[27],DeclareClass:["id","typeParameters","extends","mixins","implements","body"],DeclareFunction:["id","predicate"],DeclareInterface:l[28],DeclareModule:l[29],DeclareModuleExports:l[30],DeclareTypeAlias:l[31],DeclareOpaqueType:["id","typeParameters","supertype","lowerBound","upperBound"],DeclareVariable:["id","declarations"],DeclareExportDeclaration:l[20],DeclareExportAllDeclaration:["source","attributes"],DeclaredPredicate:l[2],ExistsTypeAnnotation:[],FunctionTypeAnnotation:["typeParameters","this","params","rest","returnType"],FunctionTypeParam:l[32],GenericTypeAnnotation:l[27],InferredPredicate:[],InterfaceExtends:l[27],InterfaceDeclaration:l[28],InterfaceTypeAnnotation:["extends","body"],IntersectionTypeAnnotation:l[33],MixedTypeAnnotation:[],EmptyTypeAnnotation:[],NullableTypeAnnotation:l[30],NumberLiteralTypeAnnotation:[],BigIntLiteralTypeAnnotation:[],NumberTypeAnnotation:[],ObjectTypeAnnotation:["properties","indexers","callProperties","internalSlots"],ObjectTypeInternalSlot:["id","value"],ObjectTypeCallProperty:l[2],ObjectTypeIndexer:["variance","id","key","value"],ObjectTypeProperty:["key","value","variance"],ObjectTypeSpreadProperty:l[15],OpaqueType:["id","typeParameters","supertype","impltype","lowerBound","upperBound"],QualifiedTypeIdentifier:l[34],StringLiteralTypeAnnotation:[],StringTypeAnnotation:[],SymbolTypeAnnotation:[],ThisTypeAnnotation:[],TupleTypeAnnotation:l[35],TypeofTypeAnnotation:["argument","typeArguments"],TypeAlias:l[31],TypeAnnotation:l[30],TypeCastExpression:l[36],TypeParameter:["bound","default","variance"],TypeParameterDeclaration:l[37],TypeParameterInstantiation:l[37],UnionTypeAnnotation:l[33],Variance:[],VoidTypeAnnotation:[],EnumDeclaration:l[29],EnumBooleanBody:l[38],EnumNumberBody:l[38],EnumStringBody:l[38],EnumSymbolBody:l[38],EnumBooleanMember:l[17],EnumNumberMember:l[17],EnumStringMember:l[17],EnumDefaultedMember:l[24],IndexedAccessType:l[39],OptionalIndexedAccessType:l[39],JSXAttribute:["name","value"],JSXClosingElement:["name"],JSXElement:["openingElement","children","closingElement"],JSXEmptyExpression:[],JSXExpressionContainer:l[8],JSXSpreadChild:l[8],JSXIdentifier:[],JSXMemberExpression:l[11],JSXNamespacedName:["namespace","name"],JSXOpeningElement:["name","typeArguments","attributes"],JSXSpreadAttribute:l[15],JSXText:[],JSXFragment:["openingFragment","children","closingFragment"],JSXOpeningFragment:[],JSXClosingFragment:[],Placeholder:[],V8IntrinsicIdentifier:[],ArgumentPlaceholder:[],BindExpression:["object","callee"],ClassAccessorProperty:l[40],Decorator:l[8],DoExpression:l[18],ExportDefaultSpecifier:l[22],ModuleExpression:l[18],TopicReference:[],VoidPattern:[],TSParameterProperty:["parameter","decorators"],TSDeclareFunction:l[41],TSDeclareMethod:l[42],TSQualifiedName:l[1],TSCallSignatureDeclaration:l[43],TSConstructSignatureDeclaration:l[43],TSPropertySignature:["key","typeAnnotation"],TSMethodSignature:l[42],TSIndexSignature:["parameters","typeAnnotation"],TSAnyKeyword:[],TSBooleanKeyword:[],TSBigIntKeyword:[],TSIntrinsicKeyword:[],TSNeverKeyword:[],TSNullKeyword:[],TSNumberKeyword:[],TSObjectKeyword:[],TSStringKeyword:[],TSSymbolKeyword:[],TSUndefinedKeyword:[],TSUnknownKeyword:[],TSVoidKeyword:[],TSThisType:[],TSFunctionType:l[43],TSConstructorType:l[43],TSTypeReference:["typeName","typeArguments"],TSTypePredicate:l[44],TSTypeQuery:["exprName","typeArguments"],TSTypeLiteral:l[38],TSArrayType:l[26],TSTupleType:l[35],TSOptionalType:l[30],TSRestType:l[30],TSNamedTupleMember:["label","elementType"],TSUnionType:l[33],TSIntersectionType:l[33],TSConditionalType:l[45],TSInferType:l[46],TSParenthesizedType:l[30],TSTypeOperator:l[30],TSIndexedAccessType:l[39],TSMappedType:["key","constraint","nameType","typeAnnotation"],TSTemplateLiteralType:["quasis","types"],TSLiteralType:l[47],TSClassImplements:l[48],TSInterfaceHeritage:l[48],TSInterfaceDeclaration:l[28],TSInterfaceBody:l[18],TSTypeAliasDeclaration:["id","typeParameters","typeAnnotation"],TSInstantiationExpression:l[48],TSAsExpression:l[36],TSSatisfiesExpression:l[36],TSTypeAssertion:l[36],TSEnumBody:l[38],TSEnumDeclaration:l[29],TSEnumMember:["id","initializer"],TSModuleDeclaration:l[29],TSModuleBlock:l[18],TSImportType:["source","options","qualifier","typeArguments"],TSImportEqualsDeclaration:["id","moduleReference"],TSExternalModuleReference:l[8],TSNonNullExpression:l[8],TSExportAssignment:l[8],TSNamespaceExportDeclaration:l[24],TSTypeAnnotation:l[30],TSTypeParameterInstantiation:l[37],TSTypeParameterDeclaration:l[37],TSTypeParameter:["name","constraint","default"],ChainExpression:l[8],Literal:[],MethodDefinition:l[14],PrivateIdentifier:[],Property:l[25],PropertyDefinition:l[23],AccessorProperty:l[40],TSAbstractAccessorProperty:l[49],TSAbstractKeyword:[],TSAbstractMethodDefinition:l[25],TSAbstractPropertyDefinition:l[49],TSAsyncKeyword:[],TSDeclareKeyword:[],TSEmptyBodyFunctionExpression:["id","typeParameters","params","returnType"],TSExportKeyword:[],TSPrivateKeyword:[],TSProtectedKeyword:[],TSPublicKeyword:[],TSReadonlyKeyword:[],TSStaticKeyword:[],AsConstExpression:l[8],AsExpression:l[36],BigIntTypeAnnotation:[],ComponentDeclaration:["id","params","body","typeParameters","rendersType"],ComponentParameter:["name","local"],ComponentTypeAnnotation:["params","rest","typeParameters","rendersType"],ComponentTypeParameter:l[32],ConditionalTypeAnnotation:l[45],DeclareComponent:["id","params","rest","typeParameters","rendersType"],DeclareEnum:l[29],DeclareHook:l[24],DeclareNamespace:l[29],EnumBigIntBody:l[38],EnumBigIntMember:l[17],EnumBody:l[38],HookDeclaration:l[41],HookTypeAnnotation:["params","returnType","rest","typeParameters"],InferTypeAnnotation:l[46],KeyofTypeAnnotation:l[15],MatchArrayPattern:["elements","rest"],MatchAsPattern:["pattern","target"],MatchBindingPattern:l[24],MatchExpression:l[50],MatchExpressionCase:l[51],MatchIdentifierPattern:l[24],MatchInstanceObjectPattern:l[52],MatchInstancePattern:["targetConstructor","properties"],MatchLiteralPattern:l[47],MatchMemberPattern:["base","property"],MatchObjectPattern:l[52],MatchObjectPatternProperty:["key","pattern"],MatchOrPattern:["patterns"],MatchRestPattern:l[15],MatchStatement:l[50],MatchStatementCase:l[51],MatchUnaryPattern:l[15],MatchWildcardPattern:[],NeverTypeAnnotation:[],ObjectTypeMappedTypeProperty:["keyTparam","propType","sourceType","variance"],QualifiedTypeofIdentifier:l[34],RecordDeclaration:["id","typeParameters","implements","body"],RecordDeclarationBody:l[0],RecordDeclarationImplements:["id","typeArguments"],RecordDeclarationProperty:["key","typeAnnotation","defaultValue"],RecordDeclarationStaticProperty:["key","typeAnnotation","value"],RecordExpression:["recordConstructor","typeArguments","properties"],RecordExpressionProperties:l[12],SatisfiesExpression:l[36],TupleTypeLabeledElement:["label","elementType","variance"],TupleTypeSpreadElement:["label","typeAnnotation"],TypeOperator:l[30],TypePredicate:l[44],UndefinedTypeAnnotation:[],UnknownTypeAnnotation:[],NGChainedExpression:l[16],NGEmptyExpression:[],NGPipeExpression:["left","right","arguments"],NGMicrosyntax:l[18],NGMicrosyntaxAs:["key","alias"],NGMicrosyntaxExpression:["expression","alias"],NGMicrosyntaxKey:[],NGMicrosyntaxKeyedExpression:["key","expression"],NGMicrosyntaxLet:l[25],NGRoot:l[53],JsExpressionRoot:l[53],JsonRoot:l[53],TSJSDocAllType:[],TSJSDocUnknownType:[],TSJSDocNullableType:l[30],TSJSDocNonNullableType:l[30]};var Al=on(bs),sn=Al;function _r(e,t){return t(e)||Bs(e,{getVisitorKeys:sn,predicate:t})}function sr(e){return e.type==="AssignmentExpression"||e.type==="BinaryExpression"||e.type==="LogicalExpression"||e.type==="NGPipeExpression"||e.type==="ConditionalExpression"||M(e)||N(e)||e.type==="SequenceExpression"||e.type==="TaggedTemplateExpression"||e.type==="BindExpression"||e.type==="UpdateExpression"&&!e.prefix||de(e)||Re(e)}function Ps(e){return e.expressions?e.expressions[0]:e.left??e.test??e.callee??e.object??e.tag??e.argument??e.expression}function un(e){if(e.expressions)return["expressions",0];if(e.left)return["left"];if(e.test)return["test"];if(e.object)return["object"];if(e.callee)return["callee"];if(e.tag)return["tag"];if(e.argument)return["argument"];if(e.expression)return["expression"];throw new Error("Unexpected node has no left side.")}function Le(e,t){return H(t)?Lt(t):C(t,T.Leading,r=>J(e,S(r)))}function Tl(e,t){if(Le(t.originalText,e)||C(e,T.Leading,r=>te(t.originalText,b(r),S(r)))&&!H(e))return!0;if(sr(e)){let r=e,n;for(;n=Ps(r);)if(r=n,Le(t.originalText,r))return!0}return!1}var gl=new WeakMap;function an(e,t){return Z(gl,e,r=>Tl(r,t))}function Pe(e){for(;Re(e);)e=e.expression;return e}function Is(e,t,r){let{node:n,key:o,parent:i}=e;switch(i.type){case"ReturnStatement":case"ThrowStatement":if(hl(e,t))return!1;break;case"ParenthesizedExpression":return!1;case"ClassDeclaration":case"ClassExpression":if(o==="superClass"){let s=Pe(n);if(s.type==="ArrowFunctionExpression"||s.type==="AssignmentExpression"||s.type==="AwaitExpression"||s.type==="BinaryExpression"||s.type==="ConditionalExpression"||s.type==="LogicalExpression"||s.type==="NewExpression"||s.type==="ObjectExpression"||s.type==="SequenceExpression"||s.type==="TaggedTemplateExpression"||s.type==="UnaryExpression"||s.type==="UpdateExpression"||s.type==="YieldExpression"||s.type==="ClassExpression"&&j(s.decorators))return!0}break;case"ExportDefaultDeclaration":if(ks(e,t,r))return!0;break;case"Decorator":if(o==="expression"&&!Sl(n))return!0;break;case"TypeAnnotation":if(e.match(void 0,void 0,(s,u)=>u==="returnType"&&s.type==="ArrowFunctionExpression")&&!(n.type==="NullableTypeAnnotation"&&e.call(()=>r(e,t),"typeAnnotation"))&&Bl(n))return!0;break;case"VariableDeclarator":if(o==="init"&&e.match(void 0,void 0,(s,u)=>u==="declarations"&&s.type==="VariableDeclaration",(s,u)=>u==="left"&&s.type==="ForInStatement"))return!0;break;case"TSInstantiationExpression":if(o==="expression"&&(n.type==="AwaitExpression"||n.type==="YieldExpression"))return!0;break}}function hl(e,t){let{key:r,parent:n}=e;if(!(r==="argument"&&ut(n)))return!1;let{node:o}=e;return!!((o.type==="SequenceExpression"||o.type==="AssignmentExpression")&&an(o,t))}function ks(e,t,r){let{node:n,parent:o}=e;return n.type==="FunctionExpression"||n.type==="ClassExpression"?o.type==="ExportDefaultDeclaration"||!r(e,t):!sr(n)||o.type!=="ExportDefaultDeclaration"&&r(e,t)?!1:e.call(()=>ks(e,t,r),...un(n))}function Sl(e){return e.type==="ChainExpression"&&(e=e.expression),Lo(e)||M(e)&&!e.optional&&Lo(e.callee)}function Lo(e){return e.type==="Identifier"?!0:N(e)?!e.computed&&!e.optional&&e.property.type==="Identifier"&&Lo(e.object):!1}function Bl(e){return _r(e,t=>t.type==="ObjectTypeAnnotation"&&_r(t,r=>r.type==="FunctionTypeAnnotation"))}function ws(e,t){if(e.isRoot)return!1;let{node:r,key:n,parent:o}=e;if(t.__isInHtmlInterpolation&&!t.bracketSpacing&&Il(r)&&Nr(e))return!0;if(bl(r))return!1;if(r.type==="Identifier")return Ss(e);if(r.type==="ObjectExpression"||r.type==="FunctionExpression"||r.type==="ClassExpression"||r.type==="DoExpression"){let s=e.findAncestor(u=>u.type==="ExpressionStatement")?.expression;if(s&&Ce(s,u=>u===r))return!0}if(r.type==="ObjectExpression"){let s=e.findAncestor(u=>u.type==="ArrowFunctionExpression")?.body;if(s&&s.type!=="SequenceExpression"&&s.type!=="AssignmentExpression"&&Ce(s,u=>u===r))return!0}let i=Is(e,t,ws);if(typeof i=="boolean")return i;switch(r.type){case"UpdateExpression":if(o.type==="UnaryExpression")return r.prefix&&(r.operator==="++"&&o.operator==="+"||r.operator==="--"&&o.operator==="-");case"UnaryExpression":switch(o.type){case"UnaryExpression":return r.operator===o.operator&&(r.operator==="+"||r.operator==="-");case"BindExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"TaggedTemplateExpression":return!0;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"BinaryExpression":return n==="left"&&r.type==="UnaryExpression"&&(o.operator==="in"||o.operator==="instanceof")?!0:n==="left"&&o.operator==="**";case"TSNonNullExpression":return!0;default:return!1}case"BinaryExpression":if(o.type==="UpdateExpression"||r.operator==="in"&&Pl(e))return!0;if(r.operator==="|>"&&r.extra?.parenthesized){let s=e.grandparent;if(s.type==="BinaryExpression"&&s.operator==="|>")return!0}case"TSTypeAssertion":case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"LogicalExpression":switch(o.type){case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return!de(r);case"ConditionalExpression":return de(r)||Ts(r);case"CallExpression":case"NewExpression":case"OptionalCallExpression":return n==="callee";case"ClassExpression":case"ClassDeclaration":return n==="superClass";case"TSTypeAssertion":case"TaggedTemplateExpression":case"JSXSpreadAttribute":case"SpreadElement":case"BindExpression":case"AwaitExpression":case"TSNonNullExpression":case"UpdateExpression":return!0;case"UnaryExpression":if(!C(r))return!0;break;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"AssignmentExpression":case"AssignmentPattern":return n==="left"&&(r.type==="TSTypeAssertion"||de(r));case"LogicalExpression":if(r.type==="LogicalExpression")return o.operator!==r.operator;case"BinaryExpression":{let{operator:s,type:u}=r;if(!s&&u!=="TSTypeAssertion")return!0;let a=ir(s),c=o.operator,m=ir(c);return!!(m>a||n==="right"&&m===a||m===a&&!Lr(c,s)||m<a&&s==="%"&&(c==="+"||c==="-")||As(c))}default:return!1}break;case"SequenceExpression":return o.type!=="ForStatement";case"YieldExpression":if(o.type==="AwaitExpression"||o.type==="TSTypeAssertion")return!0;case"AwaitExpression":switch(o.type){case"TaggedTemplateExpression":case"UnaryExpression":case"LogicalExpression":case"SpreadElement":case"TSAsExpression":case"TSSatisfiesExpression":case"TSNonNullExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"BindExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"ConditionalExpression":return n==="test";case"BinaryExpression":return!(!r.argument&&o.operator==="|>");default:return!1}case"TSFunctionType":if(e.match(s=>s.type==="TSFunctionType",(s,u)=>u==="typeAnnotation"&&s.type==="TSTypeAnnotation",(s,u)=>u==="returnType"&&s.type==="ArrowFunctionExpression"))return!0;case"TSConditionalType":case"TSConstructorType":case"ConditionalTypeAnnotation":if(n==="extendsType"&&$e(r)&&o.type===r.type||n==="constraint"&&r.type==="TSConditionalType"&&o.type==="TSTypeParameter"||n==="typeAnnotation"&&r.type==="ConditionalTypeAnnotation"&&o.type==="TypeAnnotation"&&e.grandparent.type==="TypeParameter"&&e.grandparent.bound===o&&e.grandparent.usesExtendsBound||n==="checkType"&&$e(o))return!0;if(n==="extendsType"&&o.type==="TSConditionalType"){let{typeAnnotation:s}=r.returnType||r.typeAnnotation;if(s.type==="TSTypePredicate"&&s.typeAnnotation&&(s=s.typeAnnotation.typeAnnotation),s.type==="TSInferType"&&s.typeParameter.constraint)return!0}case"TSUnionType":case"TSIntersectionType":if(pe(o)||At(o))return!0;case"TSInferType":if(r.type==="TSInferType"){if(o.type==="TSRestType")return!1;if(n==="types"&&(o.type==="TSUnionType"||o.type==="TSIntersectionType")&&r.typeParameter.type==="TSTypeParameter"&&r.typeParameter.constraint)return!0}case"TSTypeOperator":return o.type==="TSArrayType"||o.type==="TSOptionalType"||o.type==="TSRestType"||n==="objectType"&&o.type==="TSIndexedAccessType"||o.type==="TSTypeOperator"||o.type==="TSTypeAnnotation"&&e.grandparent.type.startsWith("TSJSDoc");case"TSTypeQuery":return n==="objectType"&&o.type==="TSIndexedAccessType"||n==="elementType"&&o.type==="TSArrayType";case"TypeOperator":return o.type==="ArrayTypeAnnotation"||o.type==="NullableTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType")||o.type==="TypeOperator";case"TypeofTypeAnnotation":case"KeyofTypeAnnotation":return n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType")||n==="elementType"&&o.type==="ArrayTypeAnnotation";case"ArrayTypeAnnotation":return o.type==="NullableTypeAnnotation";case"IntersectionTypeAnnotation":case"UnionTypeAnnotation":return o.type==="TypeOperator"||o.type==="KeyofTypeAnnotation"||o.type==="ArrayTypeAnnotation"||o.type==="NullableTypeAnnotation"||o.type==="IntersectionTypeAnnotation"||o.type==="UnionTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType");case"InferTypeAnnotation":case"NullableTypeAnnotation":if(o.type==="ArrayTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType"))return!0;break;case"ComponentTypeAnnotation":case"FunctionTypeAnnotation":{if(r.type==="ComponentTypeAnnotation"&&(r.rendersType===null||r.rendersType===void 0))return!1;if(e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression")||e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="NullableTypeAnnotation",(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression")||e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="TypePredicate",(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression"))return!0;let s=o.type==="NullableTypeAnnotation"?e.grandparent:o;return s.type==="UnionTypeAnnotation"||s.type==="IntersectionTypeAnnotation"||s.type==="ArrayTypeAnnotation"||n==="objectType"&&(s.type==="IndexedAccessType"||s.type==="OptionalIndexedAccessType")||n==="checkType"&&o.type==="ConditionalTypeAnnotation"||n==="extendsType"&&o.type==="ConditionalTypeAnnotation"&&r.returnType?.type==="InferTypeAnnotation"&&r.returnType.typeParameter.bound||s.type==="NullableTypeAnnotation"||o.type==="FunctionTypeParam"&&o.name===null&&ee(r).some(u=>u.typeAnnotation?.type==="NullableTypeAnnotation")}case"OptionalIndexedAccessType":return n==="objectType"&&o.type==="IndexedAccessType";case"StringLiteral":case"NumericLiteral":case"Literal":if(typeof r.value=="string"&&o.type==="ExpressionStatement"&&typeof o.directive!="string"){let s=e.grandparent;return s.type==="Program"||s.type==="BlockStatement"}return n==="object"&&N(o)&&Ee(r);case"AssignmentExpression":return!((n==="init"||n==="update")&&o.type==="ForStatement"||n==="expression"&&r.left.type!=="ObjectPattern"&&o.type==="ExpressionStatement"||n==="key"&&o.type==="TSPropertySignature"||o.type==="AssignmentExpression"||n==="expressions"&&o.type==="SequenceExpression"&&e.match(void 0,void 0,(s,u)=>(u==="init"||u==="update")&&s.type==="ForStatement")||n==="value"&&o.type==="Property"&&e.match(void 0,void 0,(s,u)=>u==="properties"&&s.type==="ObjectPattern")||o.type==="NGChainedExpression"||n==="node"&&o.type==="JsExpressionRoot");case"ConditionalExpression":switch(o.type){case"TaggedTemplateExpression":case"UnaryExpression":case"SpreadElement":case"BinaryExpression":case"LogicalExpression":case"NGPipeExpression":case"AwaitExpression":case"JSXSpreadAttribute":case"TSTypeAssertion":case"TypeCastExpression":case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"TSNonNullExpression":return!0;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"ConditionalExpression":return t.experimentalTernaries?!1:n==="test";case"MemberExpression":case"OptionalMemberExpression":return n==="object";default:return!1}case"FunctionExpression":switch(o.type){case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"TaggedTemplateExpression":return!0;case"ExportDefaultDeclaration":return n==="declaration";default:return!1}case"ArrowFunctionExpression":switch(o.type){case"BinaryExpression":return o.operator!=="|>"||r.extra?.parenthesized;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"TSNonNullExpression":case"BindExpression":case"TaggedTemplateExpression":case"UnaryExpression":case"LogicalExpression":case"AwaitExpression":case"TSTypeAssertion":case"MatchExpressionCase":return!0;case"TSInstantiationExpression":return n==="expression";case"ConditionalExpression":return n==="test";default:return!1}case"ClassExpression":switch(o.type){case"NewExpression":return n==="callee";case"ExportDefaultDeclaration":return n==="declaration";default:return!1}case"OptionalMemberExpression":case"OptionalCallExpression":case"ChainExpression":case"TSNonNullExpression":if(hs(e))return!0;case"CallExpression":case"MemberExpression":case"TaggedTemplateExpression":case"ImportExpression":if(n==="callee"&&(o.type==="BindExpression"||o.type==="NewExpression")){let s=r;for(;s;)switch(s.type){case"CallExpression":case"ImportExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":case"BindExpression":s=s.object;break;case"TaggedTemplateExpression":s=s.tag;break;case"TSNonNullExpression":s=s.expression;break;default:return!1}}return!1;case"BindExpression":return n==="callee"&&(o.type==="BindExpression"||o.type==="NewExpression")||n==="object"&&N(o);case"NGPipeExpression":return!(o.type==="NGRoot"||o.type==="NGMicrosyntaxExpression"||o.type==="ObjectProperty"&&!r.extra?.parenthesized||Y(o)||n==="arguments"&&M(o)||n==="right"&&o.type==="NGPipeExpression"||n==="property"&&o.type==="MemberExpression"||o.type==="AssignmentExpression");case"JSXFragment":case"JSXElement":return n==="callee"||n==="left"&&o.type==="BinaryExpression"&&o.operator==="<"||!Y(o)&&o.type!=="ArrowFunctionExpression"&&o.type!=="AssignmentExpression"&&o.type!=="AssignmentPattern"&&o.type!=="BinaryExpression"&&o.type!=="ConditionalExpression"&&o.type!=="ExpressionStatement"&&o.type!=="JsExpressionRoot"&&o.type!=="JSXAttribute"&&o.type!=="JSXElement"&&o.type!=="JSXExpressionContainer"&&o.type!=="JSXFragment"&&o.type!=="LogicalExpression"&&!Tt(o)&&!We(o)&&!ut(o)&&o.type!=="TypeCastExpression"&&o.type!=="VariableDeclarator"&&o.type!=="YieldExpression"&&o.type!=="MatchExpressionCase"&&!(n==="declaration"&&o.type==="ExportDefaultDeclaration");case"TSInstantiationExpression":return n==="object"&&N(o);case"MatchOrPattern":return o.type==="MatchAsPattern"}return!1}var bl=B(["BlockStatement","BreakStatement","ComponentDeclaration","ClassBody","ClassDeclaration","ClassMethod","ClassProperty","PropertyDefinition","ClassPrivateProperty","ContinueStatement","DebuggerStatement","DeclareComponent","DeclareClass","DeclareExportAllDeclaration","DeclareExportDeclaration","DeclareFunction","DeclareHook","DeclareInterface","DeclareModule","DeclareModuleExports","DeclareNamespace","DeclareVariable","DeclareEnum","DoWhileStatement","EnumDeclaration","ExportAllDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExpressionStatement","ForInStatement","ForOfStatement","ForStatement","FunctionDeclaration","HookDeclaration","IfStatement","ImportDeclaration","InterfaceDeclaration","LabeledStatement","MethodDefinition","ReturnStatement","SwitchStatement","ThrowStatement","TryStatement","TSDeclareFunction","TSEnumDeclaration","TSImportEqualsDeclaration","TSInterfaceDeclaration","TSModuleDeclaration","TSNamespaceExportDeclaration","TypeAlias","VariableDeclaration","WhileStatement","WithStatement"]);function Pl(e){let t=0,{node:r}=e;for(;r;){let n=e.getParentNode(t++);if(n?.type==="ForStatement"&&n.init===r)return!0;r=n}return!1}function Il(e){return ie(e)}function Nr(e){let{parent:t,key:r}=e;switch(t.type){case"NGPipeExpression":if(r==="arguments"&&e.isLast)return e.callParent(Nr);break;case"ObjectProperty":if(r==="value")return e.callParent(()=>e.key==="properties"&&e.isLast);break;case"BinaryExpression":case"LogicalExpression":if(r==="right")return e.callParent(Nr);break;case"ConditionalExpression":if(r==="alternate")return e.callParent(Nr);break;case"UnaryExpression":if(t.prefix&&e.callParent(Nr))return!0;break}return!1}var ne=ws;var ze="string",Oe="array",ct="cursor",Ze="indent",et="align",lt="trim",Te="group",Je="fill",Me="if-break",tt="indent-if-break",rt="line-suffix",Ye="line-suffix-boundary",Fe="line",_e="label",Ge="break-parent",pn=new Set([ct,Ze,et,lt,Te,Je,Me,tt,rt,Ye,Fe,_e,Ge]);function kl(e){if(typeof e=="string")return ze;if(Array.isArray(e))return Oe;if(!e)return;let{type:t}=e;if(pn.has(t))return t}var He=kl;var wl=e=>new Intl.ListFormat("en-US",{type:"disjunction"}).format(e);function Ll(e){let t=e===null?"null":typeof e;if(t!=="string"&&t!=="object")return`Unexpected doc '${t}', -Expected it to be 'string' or 'object'.`;if(He(e))throw new Error("doc is valid.");let r=Object.prototype.toString.call(e);if(r!=="[object Object]")return`Unexpected doc '${r}'.`;let n=wl([...pn].map(o=>`'${o}'`));return`Unexpected doc.type '${e.type}'.-Expected it to be ${n}.`}var Oo=class extends Error{name="InvalidDocError";constructor(t){super(Ll(t)),this.doc=t}},Ot=Oo;var Ls={};function Ol(e,t,r,n){let o=[e];for(;o.length>0;){let i=o.pop();if(i===Ls){r(o.pop());continue}r&&o.push(i,Ls);let s=He(i);if(!s)throw new Ot(i);if(t?.(i)!==!1)switch(s){case Oe:case Je:{let u=s===Oe?i:i.parts;for(let a=u.length,c=a-1;c>=0;--c)o.push(u[c]);break}case Me:o.push(i.flatContents,i.breakContents);break;case Te:if(n&&i.expandedStates)for(let u=i.expandedStates.length,a=u-1;a>=0;--a)o.push(i.expandedStates[a]);else o.push(i.contents);break;case et:case Ze:case tt:case _e:case rt:o.push(i.contents);break;case ze:case ct:case lt:case Ye:case Fe:case Ge:break;default:throw new Ot(i)}}}var cn=Ol;function gt(e,t){if(typeof e=="string")return t(e);let r=new Map;return n(e);function n(i){return Z(r,i,o)}function o(i){switch(He(i)){case Oe:return t(i.map(n));case Je:return t({...i,parts:i.parts.map(n)});case Me:return t({...i,breakContents:n(i.breakContents),flatContents:n(i.flatContents)});case Te:{let{expandedStates:s,contents:u}=i;return s?(s=s.map(n),u=s[0]):u=n(u),t({...i,contents:u,expandedStates:s})}case et:case Ze:case tt:case _e:case rt:return t({...i,contents:n(i.contents)});case ze:case ct:case lt:case Ye:case Fe:case Ge:return t(i);default:throw new Ot(i)}}}function Ms(e,t,r){let n=r,o=!1;function i(s){if(o)return!1;let u=t(s);u!==void 0&&(o=!0,n=u)}return cn(e,i),n}function Ml(e){if(e.type===Te&&e.break||e.type===Fe&&e.hard||e.type===Ge)return!0}function ue(e){return Ms(e,Ml,!1)}function Os(e){if(e.length>0){let t=L(0,e,-1);!t.expandedStates&&!t.break&&(t.break="propagated")}return null}function _s(e){let t=new Set,r=[];function n(i){if(i.type===Ge&&Os(r),i.type===Te){if(r.push(i),t.has(i))return!1;t.add(i)}}function o(i){i.type===Te&&r.pop().break&&Os(r)}cn(e,n,o,!0)}function _l(e){return e.type===Fe&&!e.hard?e.soft?"":" ":e.type===Me?e.flatContents:e}function Jt(e){return gt(e,_l)}function Nl(e){switch(He(e)){case Je:{let{parts:t}=e;if(t.every(r=>r===""))return"";if(t.length===1)return t[0];break}case Te:if(!e.contents&&!e.id&&!e.break&&!e.expandedStates)return"";if(e.contents.type===Te&&e.contents.id===e.id&&e.contents.break===e.break&&e.contents.expandedStates===e.expandedStates)return e.contents;break;case et:case Ze:case tt:case rt:if(!e.contents)return"";break;case Me:if(!e.flatContents&&!e.breakContents)return"";break;case Oe:{let t=[];for(let r of e){if(!r)continue;let[n,...o]=Array.isArray(r)?r:[r];typeof n=="string"&&typeof L(0,t,-1)=="string"?t[t.length-1]+=n:t.push(n),t.push(...o)}return t.length===0?"":t.length===1?t[0]:t}case ze:case ct:case lt:case Ye:case Fe:case _e:case Ge:break;default:throw new Ot(e)}return e}function ur(e){return gt(e,t=>Nl(t))}function Xe(e,t=ar){return gt(e,r=>typeof r=="string"?w(t,r.split(`-`)):r)}function jl(e){if(e.type===Fe)return!0}function Ns(e){return Ms(e,jl,!1)}function ln(e,t){return e.type===_e?{...e,contents:t(e.contents)}:t(e)}function js(e){let t=!0;return cn(e,r=>{switch(He(r)){case ze:if(r==="")break;case lt:case Ye:case Fe:case Ge:return t=!1,!1}}),t}var ge=ve,mn=ve,vs=ve,Rs=ve;function f(e){return ge(e),{type:Ze,contents:e}}function he(e,t){return Rs(e),ge(t),{type:et,contents:t,n:e}}function Ws(e){return he(Number.NEGATIVE_INFINITY,e)}function Js(e){return he({type:"root"},e)}function fn(e){return he(-1,e)}function Gs(e,t,r){ge(e);let n=e;if(t>0){for(let o=0;o<Math.floor(t/r);++o)n=f(n);n=he(t%r,n),n=he(Number.NEGATIVE_INFINITY,n)}return n}var Ne={type:Ge};var jr={type:ct};function Dn(e){return vs(e),{type:Je,parts:e}}function p(e,t={}){return ge(e),mn(t.expandedStates,!0),{type:Te,id:t.id,contents:e,break:!!t.shouldBreak,expandedStates:t.expandedStates}}function mt(e,t){return p(e[0],{...t,expandedStates:e})}function O(e,t="",r={}){return ge(e),t!==""&&ge(t),{type:Me,breakContents:e,flatContents:t,groupId:r.groupId}}function ht(e,t){return ge(e),{type:tt,contents:e,groupId:t.groupId,negate:t.negate}}function w(e,t){ge(e),mn(t);let r=[];for(let n=0;n<t.length;n++)n!==0&&r.push(e),r.push(t[n]);return r}function Et(e,t){return ge(t),e?{type:_e,label:e,contents:t}:t}var g={type:Fe},D={type:Fe,soft:!0},Mo={type:Fe,hard:!0},d=[Mo,Ne],vl={type:Fe,hard:!0,literal:!0},ar=[vl,Ne];function _o(e){return ge(e),{type:rt,contents:e}}var Se={type:Ye};var Rl="cr",Wl="crlf";var Jl="\r",Gl=`\r-`,Ul=`-`,ql=Ul;function Us(e){return e===Rl?Jl:e===Wl?Gl:ql}var qs=()=>/[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;var Ys=12288,Hs=65510,Xs=[12288,12288,65281,65376,65504,65510];var Vs=4352,Ks=262141,No=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var jo=(e,t)=>{let r=0,n=Math.floor(e.length/2)-1;for(;r<=n;){let o=Math.floor((r+n)/2),i=o*2;if(t<e[i])n=o-1;else if(t>e[i+1])r=o+1;else return!0}return!1};var $s=19968,[Yl,Hl]=Xl(No);function Xl(e){let t=e[0],r=e[1];for(let n=0;n<e.length;n+=2){let o=e[n],i=e[n+1];if($s>=o&&$s<=i)return[o,i];i-o>r-t&&(t=o,r=i)}return[t,r]}var vo=e=>e<Ys||e>Hs?!1:jo(Xs,e);var Ro=e=>e>=Yl&&e<=Hl?!0:e<Vs||e>Ks?!1:jo(No,e);var Vl=/^(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27A1\u2934\u2935\u2B05-\u2B07]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF3\uDFF5\uDFF7]|\uD83D[\uDC3F\uDC41\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])$/,Qs=e=>Vl.test(e);var Kl=/[^\x20-\x7F]/;function $l(e){if(!e)return 0;if(!Kl.test(e))return e.length;let t=0;e=e.replace(qs(),r=>(t+=Qs(r)?1:2,""));for(let r of e){let n=r.codePointAt(0);n<=31||n>=127&&n<=159||n>=768&&n<=879||n>=65024&&n<=65039||(t+=vo(n)||Ro(n)?2:1)}return t}var dt=$l;var Ql={type:0},zl={type:1},Wo={value:"",length:0,queue:[],get root(){return Wo}};function zs(e,t,r){let n=t.type===1?e.queue.slice(0,-1):[...e.queue,t],o="",i=0,s=0,u=0;for(let E of n)switch(E.type){case 0:m(),r.useTabs?a(1):c(r.tabWidth);break;case 3:{let{string:P}=E;m(),o+=P,i+=P.length;break}case 2:{let{width:P}=E;s+=1,u+=P;break}default:throw new Error(`Unexpected indent comment '${E.type}'.`)}return A(),{...e,value:o,length:i,queue:n};function a(E){o+=" ".repeat(E),i+=r.tabWidth*E}function c(E){o+=" ".repeat(E),i+=E}function m(){r.useTabs?y():A()}function y(){s>0&&a(s),x()}function A(){u>0&&c(u),x()}function x(){s=0,u=0}}function Zs(e,t,r){if(!t)return e;if(t.type==="root")return{...e,root:e};if(t===Number.NEGATIVE_INFINITY)return e.root;let n;return typeof t=="number"?t<0?n=zl:n={type:2,width:t}:n={type:3,string:t},zs(e,n,r)}function eu(e,t){return zs(e,Ql,t)}function Zl(e){let t=0;for(let r=e.length-1;r>=0;r--){let n=e[r];if(n===" "||n===" ")t++;else break}return t}function yn(e){let t=Zl(e);return{text:t===0?e:e.slice(0,e.length-t),count:t}}var Jo=class{#e=[];#t="";#n=0;#o=[];#r=[];#i(){let t=this.#t;t!==""&&(this.#e.push(t),this.#n+=t.length,this.#t="");for(let r of this.#r)this.#o.push(Math.min(r,this.#n));this.#r.length=0}markPosition(){if(this.#o.length+this.#r.length>=2)throw new Error("There are too many 'cursor' in doc.");this.#r.push(this.#n+this.#t.length)}write(t){this.#t+=t}trim(){let{text:t,count:r}=yn(this.#t);return this.#t=t,this.#i(),r}finish(){return this.#i(),{text:this.#e.join(""),positions:this.#o}}},tu=Jo;var nt=Symbol("MODE_BREAK"),Ct=Symbol("MODE_FLAT"),Go=Symbol("DOC_FILL_PRINTED_LENGTH");function En(e,t,r,n,o,i){if(r===Number.POSITIVE_INFINITY)return!0;let s=t.length,u=!1,a=[e],c="";for(;r>=0;){if(a.length===0){if(s===0)return!0;a.push(t[--s]);continue}let{mode:m,doc:y}=a.pop(),A=He(y);switch(A){case ze:y&&(u&&(c+=" ",r-=1,u=!1),c+=y,r-=dt(y));break;case Oe:case Je:{let x=A===Oe?y:y.parts,E=y[Go]??0;for(let P=x.length-1;P>=E;P--)a.push({mode:m,doc:x[P]});break}case Ze:case et:case tt:case _e:a.push({mode:m,doc:y.contents});break;case lt:{let{text:x,count:E}=yn(c);c=x,r+=E;break}case Te:{if(i&&y.break)return!1;let x=y.break?nt:m,E=y.expandedStates&&x===nt?L(0,y.expandedStates,-1):y.contents;a.push({mode:x,doc:E});break}case Me:{let E=(y.groupId?o[y.groupId]||Ct:m)===nt?y.breakContents:y.flatContents;E&&a.push({mode:m,doc:E});break}case Fe:if(m===nt||y.hard)return!0;y.soft||(u=!0);break;case rt:n=!0;break;case Ye:if(n)return!1;break}}return!1}function Uo(e,t){let r=Object.create(null),n=t.printWidth,o=Us(t.endOfLine),i=0,s=[{indent:Wo,mode:nt,doc:e}],u=!1,a=[],c=new tu;for(_s(e);s.length>0;){let{indent:E,mode:P,doc:F}=s.pop();switch(He(F)){case ze:{let I=o!==`-`?V(0,F,`-`,o):F;I&&(c.write(I),s.length>0&&(i+=dt(I)));break}case Oe:for(let I=F.length-1;I>=0;I--)s.push({indent:E,mode:P,doc:F[I]});break;case ct:c.markPosition();break;case Ze:s.push({indent:eu(E,t),mode:P,doc:F.contents});break;case et:s.push({indent:Zs(E,F.n,t),mode:P,doc:F.contents});break;case lt:i-=c.trim();break;case Te:{let I=(function(){if(P===Ct&&!u)return{indent:E,mode:F.break?nt:Ct,doc:F.contents};u=!1;let h=n-i,v=a.length>0,U={indent:E,mode:Ct,doc:F.contents};if(!F.break&&En(U,s,h,v,r))return U;if(!F.expandedStates)return{indent:E,mode:nt,doc:F.contents};if(!F.break)for(let ae=1;ae<F.expandedStates.length-1;ae++){let fe={indent:E,mode:Ct,doc:F.expandedStates[ae]};if(En(fe,s,h,v,r))return fe}return{indent:E,mode:nt,doc:L(0,F.expandedStates,-1)}})();s.push(I),F.id&&(r[F.id]=I.mode);break}case Je:{let I=n-i,k=F[Go]??0,{parts:h}=F,v=h.length-k;if(v===0)break;let U=h[k+0],ae=h[k+1],fe={indent:E,mode:Ct,doc:U},z={indent:E,mode:nt,doc:U},xe=En(fe,[],I,a.length>0,r,!0);if(v===1){xe?s.push(fe):s.push(z);break}let De={indent:E,mode:Ct,doc:ae},xt={indent:E,mode:nt,doc:ae};if(v===2){xe?s.push(De,fe):s.push(xt,z);break}let bt=h[k+2],_={indent:E,mode:P,doc:{...F,[Go]:k+2}},we=En({indent:E,mode:Ct,doc:[U,ae,bt]},[],I,a.length>0,r,!0);s.push(_),we?s.push(De,fe):xe?s.push(xt,fe):s.push(xt,z);break}case Me:case tt:{let I=F.groupId?r[F.groupId]:P;if(I===nt){let k=F.type===Me?F.breakContents:F.negate?F.contents:f(F.contents);k&&s.push({indent:E,mode:P,doc:k})}if(I===Ct){let k=F.type===Me?F.flatContents:F.negate?f(F.contents):F.contents;k&&s.push({indent:E,mode:P,doc:k})}break}case rt:a.push({indent:E,mode:P,doc:F.contents});break;case Ye:a.length>0&&s.push({indent:E,mode:P,doc:Mo});break;case Fe:switch(P){case Ct:if(!F.hard){F.soft||(c.write(" "),i+=1);break}u=!0;case nt:if(a.length>0){s.push({indent:E,mode:P,doc:F},...a.reverse()),a.length=0;break}F.literal?(c.write(o),i=0,E.root&&(E.root.value&&c.write(E.root.value),i=E.root.length)):(c.trim(),c.write(o+E.value),i=E.length);break}break;case _e:s.push({indent:E,mode:P,doc:F.contents});break;case Ge:break;default:throw new Ot(F)}s.length===0&&a.length>0&&(s.push(...a.reverse()),a.length=0)}let{text:m,positions:y}=c.finish();if(y.length!==2)return{formatted:m};let[A,x]=y;return{formatted:m,cursorNodeStart:A,cursorNodeText:m.slice(A,x)}}var St=class extends Error{name="ArgExpansionBailout"};function pr(e){return(e.type==="ObjectTypeProperty"||e.type==="ObjectTypeInternalSlot")&&!e.static&&!e.method&&e.kind!=="get"&&e.kind!=="set"&&e.value.type==="FunctionTypeAnnotation"}function em(e,t){let r=null,n=t;for(;n!==r;)r=n,n=Ki(e,n),n=tr(e,n),n=at(e,n);return n=rr(e,n),n=pt(e,n),n!==!1&&J(e,n)}var Gt=em;var me=(e,{originalText:t})=>{let r=S(e);if(Gt(t,r))return!0;let n=It(e);return n===r?!1:Gt(t,n)};var tm=B(["AnyTypeAnnotation","ThisTypeAnnotation","NumberTypeAnnotation","VoidTypeAnnotation","BooleanTypeAnnotation","BigIntTypeAnnotation","SymbolTypeAnnotation","StringTypeAnnotation","NeverTypeAnnotation","UndefinedTypeAnnotation","UnknownTypeAnnotation","EmptyTypeAnnotation","MixedTypeAnnotation"]),dn=tm;var ru=B(["TSThisType","NullLiteralTypeAnnotation","BooleanLiteralTypeAnnotation","StringLiteralTypeAnnotation","BigIntLiteralTypeAnnotation","NumberLiteralTypeAnnotation","TSLiteralType","TSTemplateLiteralType"]);function rm({type:e}){return e.startsWith("TS")&&e.endsWith("Keyword")}var Cn=rm;function cr(e){return Cn(e)||dn(e)||ru(e)||e.type==="GenericTypeAnnotation"&&!e.typeParameters||e.type==="TSTypeReference"&&!e.typeArguments}function nu(e){return(e.type==="TypeAnnotation"||e.type==="TSTypeAnnotation")&&e.typeAnnotation.type==="FunctionTypeAnnotation"&&!e.static&&!kt(e,e.typeAnnotation)}function nm(e,t){let r=t.split(".");for(let n=r.length-1;n>=0;n--){let o=r[n];if(n===0)return e.type==="Identifier"&&e.name===o;if(n===1&&e.type==="MetaProperty"&&e.property.type==="Identifier"&&e.property.name===o){e=e.meta;continue}if(e.type==="MemberExpression"&&!e.optional&&!e.computed&&e.property.type==="Identifier"&&e.property.name===o){e=e.object;continue}return!1}}function lr(e,t){return t.some(r=>nm(e,r))}var om=["it","it.only","it.skip","describe","describe.only","describe.skip","test","test.only","test.skip","test.fixme","test.step","test.describe","test.describe.only","test.describe.skip","test.describe.fixme","test.describe.parallel","test.describe.parallel.only","test.describe.serial","test.describe.serial.only","skip","xit","xdescribe","xtest","fit","fdescribe","ftest"];function im(e){return lr(e,om)}function sm(e){return e.type==="Identifier"&&(e.name==="beforeEach"||e.name==="beforeAll"||e.name==="afterEach"||e.name==="afterAll")}function qo(e){return M(e)&&e.callee.type==="Identifier"&&["async","inject","fakeAsync","waitForAsync"].includes(e.callee.name)}function um(e){return e.type==="FunctionExpression"||e.type==="ArrowFunctionExpression"&&e.body.type==="BlockStatement"}function Ut(e,t){if(e?.type!=="CallExpression"||e.optional)return!1;let r=se(e);if(r.length===1){if(qo(e)&&Ut(t))return wt(r[0]);if(sm(e.callee))return qo(r[0])}else if((r.length===2||r.length===3)&&(r[0].type==="TemplateLiteral"||q(r[0]))&&im(e.callee))return r[2]&&!Ee(r[2])?!1:(r.length===2?wt(r[1]):um(r[1])&&ee(r[1]).length<=1)||qo(r[1]);return!1}function am(e,t){let r=t-1;r=at(e,r,{backwards:!0}),r=pt(e,r,{backwards:!0}),r=at(e,r,{backwards:!0});let n=pt(e,r,{backwards:!0});return r!==n}var Fn=am;var Yo=()=>!0;function Ho(e,t){let r=e.node;return r.printed=!0,t.printer.printComment(e,t)}function pm(e,t){let r=e.node,n=[Ho(e,t)],{printer:o,originalText:i,locStart:s,locEnd:u}=t;if(o.isBlockComment?.(r)){let m=" ";J(i,u(r))&&(J(i,s(r),{backwards:!0})?m=d:m=g),n.push(m)}else n.push(d);let c=pt(i,at(i,u(r)));return c!==!1&&J(i,c)&&n.push(d),n}function cm(e,t,r){let n=e.node,o=Ho(e,t),{printer:i,originalText:s,locStart:u}=t,a=i.isBlockComment?.(n);if(r?.hasLineSuffix&&!r?.isBlock||J(s,u(n),{backwards:!0})){let c=Fn(s,u(n));return{doc:_o([d,c?d:"",o]),isBlock:a,hasLineSuffix:!0}}return!a||r?.hasLineSuffix?{doc:[_o([" ",o]),Ne],isBlock:a,hasLineSuffix:!0}:{doc:[" ",o],isBlock:a,hasLineSuffix:!1}}function W(e,t,r={}){let{indent:n=!1,marker:o,filter:i=Yo}=r,s=new Set(e.node?.comments?.filter(c=>!(c.leading||c.trailing||c.marker!==o||!i(c))));if(s.size===0)return"";let u=e.map(({node:c})=>s.has(c)?Ho(e,t):"","comments").filter(Boolean),a=w(d,u);return n?f([d,a]):a}function xn(e,t,r){let n=t[Symbol.for("printedComments")],o=r?.filter??Yo,i=new Set(e.node?.comments?.filter(s=>!n?.has(s)&&s.leading&&o(s)));return i.size===0?"":e.map(({node:s})=>i.has(s)?pm(e,t):"","comments").filter(Boolean)}function ou(e,t,r){let n=e.node?.comments,o=new Set(n?.filter(m=>m.trailing)),i=t[Symbol.for("printedComments")],s=r?.filter??Yo,u=new Set(n?.filter(m=>o.has(m)&&!i?.has(m)&&s(m)));if(u.size===0)return"";let a=[],c;return e.each(({node:m})=>{o.has(m)&&(c=cm(e,t,c),u.has(m)&&a.push(c.doc))},"comments"),a}function An(e,t,r){return{leading:xn(e,t,r),trailing:ou(e,t,r)}}function Q(e,t,r,n){let o=xn(e,r,n),i=ou(e,r,n);return o||i?ln(t,s=>[o,s,i]):t}function Tn(e,t="es5"){return e.trailingComma==="es5"&&t==="es5"||e.trailingComma==="all"&&(t==="all"||t==="es5")}function $(e){let{node:t}=e;return!t.optional||t.type==="Identifier"&&t===e.parent.key?"":M(t)||N(t)&&t.computed||t.type==="OptionalIndexedAccessType"?"?.":"?"}function gn(e){return e.node.definite||e.match(void 0,(t,r)=>r==="id"&&t.type==="VariableDeclarator"&&t.definite)?"!":""}var lm=B(["DeclareClass","DeclareComponent","DeclareFunction","DeclareHook","DeclareVariable","DeclareExportDeclaration","DeclareExportAllDeclaration","DeclareOpaqueType","DeclareTypeAlias","DeclareEnum","DeclareInterface"]),mm=e=>{let{node:t}=e;return lm(t)?e.parent.type!=="DeclareExportDeclaration"&&!t.implicitDeclare:t.declare};function re(e){return mm(e)?"declare ":""}var fm=B(["TSAbstractMethodDefinition","TSAbstractPropertyDefinition","TSAbstractAccessorProperty"]);function mr({node:e}){return e.abstract||fm(e)?"abstract ":""}function qt(e){return e.accessibility?e.accessibility+" ":""}var iu=e=>e.type==="UnaryExpression"&&e.operator==="!";function Dm(e){return C(e)||!iu(e)?!1:(e=e.argument,e=iu(e)?e.argument:e,e.type==="LogicalExpression")}function fr(e,t,r){let{node:n}=e,o=n.type==="WithStatement"?"object":"test",i=r(o);return Dm(n[o])?i:p([f([D,i]),D])}function Mt(e,t,r){let{node:n}=e;return C(n,T.Dangling,r)?[f([D,W(e,t,{filter:r})]),C(n,T.Dangling|T.Line,r)?d:D]:""}function Ie(e,t="es5"){return Tn(e,t)?O(","):""}function R(e){return e.semi?";":""}var ym=e=>e.mark!=="commentBeforeArrow";function Ve(e,t,r,n,o){let i=e.node,s=ee(i),u=o&&i.typeParameters?r("typeParameters"):"";if(s.length===0)return[u,"(",Mt(e,t,ym),")"];let{parent:a}=e,c=Ut(a),m=su(i),y=[];if(_i(e,(E,P)=>{let F=P===s.length-1;F&&i.rest&&y.push("..."),y.push(r()),!F&&(y.push(","),c||m?y.push(" "):me(s[P],t)?y.push(d,d):y.push(g))}),n&&!dm(e)){if(ue(u)||ue(y))throw new St;return p([Jt(u),"(",Jt(y),")"])}let A=s.every(E=>!j(E.decorators));return m&&A?[u,"(",...y,")"]:c?[u,"(",...y,")"]:(pr(a)||nu(a)||a.type==="TypeAlias"||a.type==="UnionTypeAnnotation"||a.type==="IntersectionTypeAnnotation"||a.type==="FunctionTypeAnnotation"&&a.returnType===i)&&s.length===1&&s[0].name===null&&i.this!==s[0]&&s[0].typeAnnotation&&i.typeParameters===null&&cr(s[0].typeAnnotation)&&!i.rest?t.arrowParens==="always"||i.type==="HookTypeAnnotation"?["(",...y,")"]:y:[u,"(",f([D,...y]),!Ni(i)&&e.root.type!=="NGRoot"?Ie(t,"all"):"",D,")"]}function su(e){if(!e)return!1;let t=ee(e);if(t.length!==1)return!1;let[r]=t;return!C(r)&&(r.type==="ObjectPattern"||r.type==="ArrayPattern"||r.type==="Identifier"&&r.typeAnnotation&&(r.typeAnnotation.type==="TypeAnnotation"||r.typeAnnotation.type==="TSTypeAnnotation")&&Ue(r.typeAnnotation.typeAnnotation)||r.type==="FunctionTypeParam"&&Ue(r.typeAnnotation)&&r!==e.rest||r.type==="AssignmentPattern"&&(r.left.type==="ObjectPattern"||r.left.type==="ArrayPattern")&&(r.right.type==="Identifier"||ie(r.right)&&r.right.properties.length===0||Y(r.right)&&r.right.elements.length===0))}function Em(e){let t;return e.returnType?(t=e.returnType,t.typeAnnotation&&(t=t.typeAnnotation)):e.typeAnnotation&&(t=e.typeAnnotation),t}function Bt(e,t){let r=Em(e);if(!r)return!1;let n=e.typeParameters?.params;if(n){if(n.length>1)return!1;if(n.length===1){let o=n[0];if(o.constraint||o.default)return!1}}return ee(e).length===1&&(Ue(r)||ue(t))}function dm(e){return e.match(t=>t.type==="ArrowFunctionExpression"&&t.body.type==="BlockStatement",(t,r)=>{if(t.type==="CallExpression"&&r==="arguments"&&t.arguments.length===1&&t.callee.type==="CallExpression"){let n=t.callee.callee;return n.type==="Identifier"||n.type==="MemberExpression"&&!n.computed&&n.object.type==="Identifier"&&n.property.type==="Identifier"}return!1},(t,r)=>t.type==="VariableDeclarator"&&r==="init"||t.type==="ExportDefaultDeclaration"&&r==="declaration"||t.type==="TSExportAssignment"&&r==="expression"||t.type==="AssignmentExpression"&&r==="right"&&t.left.type==="MemberExpression"&&t.left.object.type==="Identifier"&&t.left.object.name==="module"&&t.left.property.type==="Identifier"&&t.left.property.name==="exports",t=>t.type!=="VariableDeclaration"||t.kind==="const"&&t.declarations.length===1)}function uu(e){let t=ee(e);return t.length>1&&t.some(r=>r.type==="TSParameterProperty")}function Yt(e,t){return(t==="params"||t==="this"||t==="rest")&&su(e)}var Cm=/^[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC][\$0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]*$/,Fm=e=>Cm.test(e),au=Fm;function xm(e){return e.length===1?e:e.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/,"$1").replace(/^([+-])?\./,"$10.").replace(/(\.\d+?)0+(?=e|$)/,"$1").replace(/\.(?=e|$)/,"")}var _t=xm;var pu=Object.freeze({character:"'",codePoint:39}),cu=Object.freeze({character:'"',codePoint:34}),Am=Object.freeze({preferred:pu,alternate:cu}),Tm=Object.freeze({preferred:cu,alternate:pu});function hn(e,t){let{preferred:r,alternate:n}=t===!0||t==="'"?Am:Tm,{length:o}=e,i=0,s=0;for(let u=0;u<o;u++){let a=e.charCodeAt(u);a===r.codePoint?i++:a===n.codePoint&&s++}return(i>s?n:r).character}var gm=/\\(["'\\])|(["'])/g;function hm(e,t){let r=t==='"'?"'":'"',n=V(0,e,gm,(o,i,s)=>i?i===r?r:o:s===t?"\\"+s:s);return t+n+t}var mu=hm;function Sm(e,t){ve(/^(?<quote>["']).*\k<quote>$/s.test(e));let r=e.slice(1,-1),n;return t.parser==="json"||t.parser==="jsonc"||t.parser==="json-stringify"||t.parser==="json5"&&t.quoteProps==="preserve"&&!t.singleQuote?n='"':t.__isInHtmlAttribute?n="'":n=hn(r,t.singleQuote),e.charAt(0)===n?e:mu(r,n)}var ot=Sm;var fu=e=>e.type==="TSEnumMember",Du=e=>fu(e)?"id":"key",vr=e=>e[Du(e)],yu=e=>!fu(e)&&e.computed;function Eu(e){return/^(?:\d+|\d+\.\d+)$/.test(e)}var Bm=({parser:e})=>e==="typescript"||e==="babel-ts"||e==="oxc-ts";function bm(e,t){let r=vr(e);if(r.type==="Identifier")return!0;if(!Ee(r)||Bm(t))return!1;let n=_t(ye(r));return String(r.value)===n&&Eu(n)}function du(e,t){let{parser:r}=t;if(r==="json"||r==="jsonc")return!1;let n=vr(e);if(!q(n))return!1;let{value:o}=n;return ot(ye(n),t).slice(1,-1)!==o?!1:!!(!(r==="babel-ts"&&e.type==="ClassProperty"||(r==="typescript"||r==="oxc-ts")&&e.type==="PropertyDefinition")&&au(o)||(r==="babel"||r==="acorn"||r==="oxc"||r==="espree"||r==="meriyah"||r==="__babel_estree")&&e.type!=="ImportAttribute"&&Eu(o)&&String(Number(o))===o)}var Pm=new WeakMap;function Cu(e,t){return Z(Pm,e.parent,()=>e.siblings.some(r=>{if(yu(r))return!1;let n=vr(r);return q(n)&&!du(r,t)}))}function Im(e,t){return(t.parser==="json"||t.parser==="jsonc"||t.quoteProps==="consistent"&&Cu(e,t))&&bm(e.node,t)}function km(e,t){return(t.quoteProps==="as-needed"||t.quoteProps==="consistent"&&!Cu(e,t))&&du(e.node,t)}function je(e,t,r){let{node:n}=e,o=Du(n);if(yu(n))return["[",r(o),"]"];if(Im(e,t)){let i=vr(n),s=ot(JSON.stringify(i.type==="Identifier"?i.name:String(i.value)),t);return e.call(()=>Q(e,s,t),o)}if(km(e,t)){let{value:i}=vr(n),s=/^\d/.test(i)?_t(i):i;return e.call(()=>Q(e,s,t),o)}return r(o)}var wm=B(["VoidTypeAnnotation","TSVoidKeyword","NullLiteralTypeAnnotation","TSNullKeyword"]),Lm=B(["ObjectTypeAnnotation","TSTypeLiteral","GenericTypeAnnotation","TSTypeReference"]);function Vo(e){return e.key==="elementTypes"&&Zt(e.parent)&&e.parent.elementTypes.length>1}function Ht(e){let{types:t}=e;if(t.some(n=>C(n)))return!1;let r=t.find(n=>Lm(n));return r?t.every(n=>n===r||wm(n)):!1}function Sn(e){let{key:t,node:r,parent:n}=e;return!(Ht(r)||t==="types"&&pe(n)||t==="types"&&At(n)||Vo(e))}function Bn(e,t,r,n){let{node:o}=e;if(Ht(o))return w(" | ",e.map(r,"types"));let i=p(e.map(({isFirst:s})=>{let u=s?O("| "):[g,"| "],a=r();return C(e.node,T.Leading)?[u,he(2,Q(e,a,t))]:[u,Q(e,he(2,a),t)]},"types"));return Sn(e)&&(i=Q(e,i,t)),ne(e,t)?p([f([D,i]),D]):Vo(e)?p([f([O(["(",D]),i]),D,O(")")]):n?.assignmentLayout==="break-after-operator"||!Om(e)?i:p(f([D,i]))}function Om(e){let{key:t,parent:r}=e;return!(t==="typeAnnotation"&&r.type==="TSTypeAssertion"||t==="elementTypes"&&Zt(r)||(t==="trueType"||t==="falseType")&&$e(r)||t==="params"&&Hi(r)||t==="typeAnnotation"&&r.type==="FunctionTypeParam"&&!r.name&&e.grandparent.this!==r||e.match(void 0,(n,o)=>o==="typeAnnotation"&&n.type==="FunctionTypeParam",(n,o)=>o==="params"&&n.type==="FunctionTypeAnnotation",(n,o)=>o==="value"&&n.type==="ObjectTypeProperty"&&pr(n)))}function Fu(e){return cr(e)||Ue(e)?!0:pe(e)?Ht(e):!1}var Mm=new WeakSet;function G(e,t,r="typeAnnotation"){let{node:{[r]:n}}=e;if(!n)return"";let o=!1;if(n.type==="TSTypeAnnotation"||n.type==="TypeAnnotation"){let i=e.call(xu,r);(i==="=>"||i===":"&&C(n,T.Leading))&&(o=!0),Mm.add(n)}return o?[" ",t(r)]:t(r)}var xu=e=>e.match(t=>t.type==="TSTypeAnnotation",(t,r)=>(r==="returnType"||r==="typeAnnotation")&&(t.type==="TSFunctionType"||t.type==="TSConstructorType"))?"=>":e.match(t=>t.type==="TSTypeAnnotation",(t,r)=>r==="typeAnnotation"&&(t.type==="TSJSDocNullableType"||t.type==="TSJSDocNonNullableType"||t.type==="TSTypePredicate"))||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="typeAnnotation"&&t.type==="Identifier",(t,r)=>r==="id"&&t.type==="DeclareFunction")||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="typeAnnotation"&&t.type==="Identifier",(t,r)=>r==="id"&&t.type==="DeclareHook")||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="bound"&&t.type==="TypeParameter"&&t.usesExtendsBound)?"":":";function bn(e,t,r){let n=xu(e);return n?[n," ",r("typeAnnotation")]:r("typeAnnotation")}var _m=({node:e,key:t,parent:r})=>t==="value"&&e.type==="FunctionExpression"&&(r.type==="ObjectMethod"||r.type==="ClassMethod"||r.type==="ClassPrivateMethod"||r.type==="MethodDefinition"||r.type==="TSAbstractMethodDefinition"||r.type==="TSDeclareMethod"||r.type==="Property"&&Ke(r));function Dr(e,t,r,n){if(_m(e))return Pn(e,t,r);let{node:o}=e,i=!1;if(o.type==="FunctionExpression"&&n?.expandLastArg){let{parent:y}=e;M(y)&&(se(y).length>1||ee(o).every(A=>A.type==="Identifier"&&!A.typeAnnotation))&&(i=!0)}let s=Ve(e,t,r,i),u=kn(e,r),a=Bt(o,u),m=o.type==="HookDeclaration"?"hook":"function";return[re(e),o.async?"async ":"",m,o.generator?"*":""," ",o.id?r("id"):"",r("typeParameters"),p([a?p(s):s,u]),o.body?" ":"",r("body"),o.declare||!o.body?R(t):""]}function Rr(e,t,r){let{node:n}=e,{kind:o}=n,i=n.value||n,s=[];return!o||o==="init"||o==="method"||o==="constructor"?i.async&&s.push("async "):(ve(o==="get"||o==="set"),s.push(o," ")),i.generator&&s.push("*"),s.push(je(e,t,r),n.optional?"?":"",n===i?Pn(e,t,r):r("value")),s}function Pn(e,t,r){let{node:n}=e,o=Ve(e,t,r),i=kn(e,r),s=uu(n),u=Bt(n,i),a=[r("typeParameters"),p([s?p(o,{shouldBreak:!0}):u?p(o):o,i])];return n.body?a.push(" ",r("body")):a.push(R(t)),a}function Nm(e){let t=ee(e);return t.length===1&&!e.typeParameters&&!C(e,T.Dangling)&&t[0].type==="Identifier"&&!t[0].typeAnnotation&&!C(t[0])&&!t[0].optional&&!e.predicate&&!e.returnType}function In(e,t){if(t.arrowParens==="always")return!1;if(t.arrowParens==="avoid"){let{node:r}=e;return Nm(r)}return!1}function kn(e,t){let{node:r}=e,o=[G(e,t,"returnType")];return r.predicate&&o.push(t("predicate")),o}function yr(e,t){if(t.semi)return!1;let{node:r}=e;if(r.type!=="ExpressionStatement"||$o(e,t)||zo(e,t)||Qo(e,t))return!1;let{key:n,parent:o}=e;return!!((n==="body"&&(o.type==="Program"||o.type==="BlockStatement"||o.type==="StaticBlock"||o.type==="TSModuleBlock")||n==="consequent"&&o.type==="SwitchCase")&&e.call(()=>Au(e,t),"expression"))}function Au(e,t){let{node:r}=e;switch(r.type){case"ParenthesizedExpression":case"TypeCastExpression":case"TSTypeAssertion":case"ArrayExpression":case"ArrayPattern":case"TemplateLiteral":case"TemplateElement":case"RegExpLiteral":return!0;case"ArrowFunctionExpression":if(!In(e,t))return!0;break;case"UnaryExpression":{let{prefix:n,operator:o}=r;if(n&&(o==="+"||o==="-"))return!0;break}case"BindExpression":if(!r.object)return!0;break;case"Literal":if(r.regex)return!0;break;default:if(H(r))return!0}return ne(e,t)?!0:sr(r)?e.call(()=>Au(e,t),...un(r)):!1}var Ko=({node:e,parent:t})=>e.type==="ExpressionStatement"&&t.type==="Program"&&t.body.length===1&&(Array.isArray(t.directives)&&t.directives.length===0||!t.directives);function $o(e,t){return(t.parentParser==="markdown"||t.parentParser==="mdx")&&Ko(e)&&H(e.node.expression)}function Qo(e,t){return t.__isHtmlInlineEventHandler&&Ko(e)}function zo(e,t){return(t.parser==="__vue_event_binding"||t.parser==="__vue_ts_event_binding")&&Ko(e)}function wn(e,t){if(!yr(e,t))return!1;let r=L(0,oe(e.node,T.Leading),-1);return!!(r&&nr(r))}var jm=B(["ClassDeclaration","ClassExpression","DeclareClass","DeclareInterface","InterfaceDeclaration","TSInterfaceDeclaration"]);function vm(e,t){let{key:r,parent:n}=e;if(r==="types"&&pe(n)||r==="argument"&&n.type==="JSXSpreadAttribute"||r==="expression"&&n.type==="JSXSpreadChild"||r==="superClass"&&(n.type==="ClassDeclaration"||n.type==="ClassExpression")||(r==="id"||r==="typeParameters")&&jm(n)||r==="patterns"&&n.type==="MatchOrPattern"||en(e))return!0;let{node:o}=e;return Lt(o)?!1:o.type==="ExpressionStatement"?wn(e,t):pe(o)?Sn(e):!!H(o)}var Tu=vm;function Rm(e,t,r=0){let n=0;for(let o=r;o<e.length;++o)e[o]===" "?n=n+t-n%t:n++;return n}var gu=Rm;function Wm(e,t){let r=e.lastIndexOf(`-`);return r===-1?0:gu(e.slice(r+1).match(/^[\t ]*/)[0],t)}var hu=Wm;function Ln(e,t,r){if(Ym(e)){let i=Jm(e,t,r);if(i)return i}let n=Nt(e,t,r),o=e.map(({isLast:i,index:s})=>[r(),i?"":n[s]],"quasis");return[Se,"`",...o,"`"]}function Bu(e,t,r){let n=r("quasi"),{node:o}=e,i="",s=oe(o.quasi,T.Leading)[0];return s&&(te(t.originalText,S(o.typeArguments??o.tag),b(s))?i=D:i=" "),Et(n.label&&{tagged:!0,...n.label},[r("tag"),r("typeArguments"),i,Se,n])}function Jm(e,t,r){let{node:n}=e,o=n.quasis[0].value.raw.trim().split(/\s*\|\s*/);if(o.length>1||o.some(i=>i.length>0)){t.__inJestEach=!0;let i=Nt(e,t,r);t.__inJestEach=!1;let s=i.map(y=>Uo(y,{...t,printWidth:Number.POSITIVE_INFINITY,endOfLine:"lf"}).formatted),u=[{hasLineBreak:!1,cells:[]}];for(let y=1;y<n.quasis.length;y++){let A=L(0,u,-1),x=s[y-1];A.cells.push(x),x.includes(`-`)&&(A.hasLineBreak=!0),n.quasis[y].value.raw.includes(`-`)&&u.push({hasLineBreak:!1,cells:[]})}let a=Math.max(o.length,...u.map(y=>y.cells.length)),c=Array.from({length:a},()=>0),m=[{cells:o},...u.filter(y=>y.cells.length>0)];for(let y of m)if(!y.hasLineBreak)for(let[A,x]of y.cells.entries())c[A]=Math.max(c[A],dt(x));return[Se,"`",f([d,w(d,m.map(y=>w(" | ",y.cells.map((A,x)=>y.hasLineBreak?A:A+" ".repeat(c[x]-dt(A))))))]),d,"`"]}}var Gm=new WeakMap;function Um(e,t){let{parent:r,index:n}=e;return Z(Gm,r,i=>{let{tabWidth:s}=t,u=0;return i.quasis.map(c=>{let m=c.value.raw,y=m.includes(`-`)?hu(m,s):u;return u=y,{indentSize:y,previousQuasiText:m}})})[n]}function qm(e,t,r){let{node:n,index:o}=e,i=r(),s=e.parent,{quasis:u}=s,a=S(u[o]),c=b(u[o+1]),m=te(t.originalText,a,c);if(!m){let x=Uo(i,{...t,printWidth:Number.POSITIVE_INFINITY}).formatted;x.includes(`-`)?m=!0:i=x}m&&(C(n)||n.type==="Identifier"||N(Pe(n))||n.type==="ConditionalExpression"||n.type==="SequenceExpression"||de(n)||Be(n))&&(i=[f([D,i]),D]);let{indentSize:y,previousQuasiText:A}=Um(e,t);return t.__inJestEach&&(y=Math.max(y,t.tabWidth)),i=y===0&&A.endsWith(`-`)?he(Number.NEGATIVE_INFINITY,i):Gs(i,y,t.tabWidth),p(["${",i,Se,"}"])}function Nt(e,t,r){return e.map(()=>qm(e,t,r),e.node.type==="TSTemplateLiteralType"?"types":"expressions")}function On(e,t){return gt(e,r=>typeof r=="string"?t?V(0,r,/(\\*)`/g,"$1$1\\`"):Zo(r):r)}function Zo(e){return V(0,e,/([\\`]|\$\{)/g,"\\$1")}var Su=/^[fx]?(?:describe|it|test)$/;function Ym({node:e,parent:t}){return e.type==="TemplateLiteral"&&t.type==="TaggedTemplateExpression"&&t.quasi===e&&t.tag.type==="MemberExpression"&&t.tag.property.type==="Identifier"&&t.tag.property.name==="each"&&(t.tag.object.type==="Identifier"&&Su.test(t.tag.object.name)||t.tag.object.type==="MemberExpression"&&t.tag.object.property.type==="Identifier"&&(t.tag.object.property.name==="only"||t.tag.object.property.name==="skip")&&t.tag.object.object.type==="Identifier"&&Su.test(t.tag.object.object.name))}var ti=[(e,t)=>t==="properties"&&e.type==="ObjectExpression",(e,t)=>t==="arguments"&&e.type==="CallExpression"&&e.callee.type==="Identifier"&&e.callee.name==="Component",(e,t)=>t==="expression"&&e.type==="Decorator"];function bu(e){let t=n=>n.type==="TemplateLiteral",r=(n,o)=>We(n)&&!n.computed&&n.key.type==="Identifier"&&n.key.name==="styles"&&o==="value";return e.match(t,(n,o)=>Y(n)&&o==="elements",r,...ti)||e.match(t,r,...ti)}function ri(e){return e.match(t=>t.type==="TemplateLiteral",(t,r)=>We(t)&&!t.computed&&t.key.type==="Identifier"&&t.key.name==="template"&&r==="value",...ti)}function ei(e,t){return C(e,T.Block|T.Leading,({value:r})=>r===` ${t} `)}function Mn({node:e,parent:t},r){return ei(e,r)||Hm(t)&&ei(t,r)||t.type==="ExpressionStatement"&&ei(t,r)}function Hm(e){return e.type==="AsConstExpression"||e.type==="TSAsExpression"&&e.typeAnnotation.type==="TSTypeReference"&&e.typeAnnotation.typeName.type==="Identifier"&&e.typeAnnotation.typeName.name==="const"}async function Iu(e,t,r,n){let{node:o}=r,i="";for(let[c,m]of o.quasis.entries()){let{raw:y}=m.value;c>0&&(i+="@prettier-placeholder-"+(c-1)+"-id"),i+=y}let s=await e(i,{parser:"scss"}),u=Nt(r,n,t),a=Xm(s,u);if(!a)throw new Error("Couldn't insert all the expressions");return["`",f([d,a]),D,"`"]}function Xm(e,t){if(!j(t))return e;let r=0,n=gt(ur(e),o=>typeof o!="string"||!o.includes("@prettier-placeholder")?o:o.split(/@prettier-placeholder-(\d+)-id/).map((i,s)=>s%2===0?Xe(i):(r++,t[i])));return t.length===r?n:null}function Vm(e){return e.match(void 0,(t,r)=>r==="quasi"&&t.type==="TaggedTemplateExpression"&&lr(t.tag,["css","css.global","css.resolve"]))||e.match(void 0,(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer",(t,r)=>r==="children"&&t.type==="JSXElement"&&t.openingElement.name.type==="JSXIdentifier"&&t.openingElement.name.name==="style"&&t.openingElement.attributes.some(n=>n.type==="JSXAttribute"&&n.name.type==="JSXIdentifier"&&n.name.name==="jsx"))}function _n(e){return e.type==="Identifier"&&e.name==="styled"}function Pu(e){return/^[A-Z]/.test(e.object.name)&&e.property.name==="extend"}function Km({parent:e}){if(!e||e.type!=="TaggedTemplateExpression")return!1;let t=e.tag.type==="ParenthesizedExpression"?e.tag.expression:e.tag;switch(t.type){case"MemberExpression":return _n(t.object)||Pu(t);case"CallExpression":return _n(t.callee)||t.callee.type==="MemberExpression"&&(t.callee.object.type==="MemberExpression"&&(_n(t.callee.object.object)||Pu(t.callee.object))||t.callee.object.type==="CallExpression"&&_n(t.callee.object.callee));case"Identifier":return t.name==="css";default:return!1}}function $m({parent:e,grandparent:t}){return t?.type==="JSXAttribute"&&e.type==="JSXExpressionContainer"&&t.name.type==="JSXIdentifier"&&t.name.name==="css"}var ku=e=>Vm(e)||Km(e)||$m(e)||bu(e);async function wu(e,t,r,n){let{node:o}=r,i=o.quasis.length,s=Nt(r,n,t),u=[];for(let a=0;a<i;a++){let c=o.quasis[a],m=a===0,y=a===i-1,A=c.value.cooked,x=A.split(`-`),E=x.length;if(!y&&/#[^\n\r]*$/.test(x[E-1]))return null;let P=E>2&&x[0].trim()===""&&x[1].trim()==="",F=E>2&&x[E-1].trim()===""&&x[E-2].trim()==="",I=x.every(h=>/^\s*(?:#[^\n\r]*)?$/.test(h)),k;I?k=Qm(x):k=await e(A,{parser:"graphql"}),k?(k=On(k,!1),!m&&P&&u.push(""),u.push(k),!y&&F&&u.push("")):!m&&!y&&P&&u.push(""),y||u.push(s[a])}return["`",f([d,w(d,u)]),d,"`"]}function Qm(e){let t=[],r=!1,n=e.map(o=>o.trim());for(let[o,i]of n.entries())i!==""&&(n[o-1]===""&&r?t.push([d,i]):t.push(i),r=!0);return t.length===0?null:w(d,t)}function Lu({node:e,parent:t}){return Mn({node:e,parent:t},"GraphQL")||t&&(t.type==="TaggedTemplateExpression"&&(t.tag.type==="MemberExpression"&&t.tag.object.name==="graphql"&&t.tag.property.name==="experimental"||t.tag.type==="Identifier"&&(t.tag.name==="gql"||t.tag.name==="graphql"))||t.type==="CallExpression"&&t.callee.type==="Identifier"&&t.callee.name==="graphql")}var ni=0;async function Ou(e,t,r,n,o){let{node:i}=n,s=ni;ni=ni+1>>>0;let u=I=>`PRETTIER_HTML_PLACEHOLDER_${I}_${s}_IN_JS`,a=i.quasis.map((I,k,h)=>k===h.length-1?I.value.cooked:I.value.cooked+u(k)).join(""),c=Nt(n,o,r),m=new RegExp(u("(\\d+)"),"g"),y=0,A=await t(a,{parser:e,__onHtmlRoot(I){y=I.children.length}}),x=gt(A,I=>{if(typeof I!="string")return I;let k=[],h=I.split(m);for(let v=0;v<h.length;v++){let U=h[v];if(v%2===0){U&&(U=Zo(U),o.__embeddedInHtml&&(U=V(0,U,/<\/(?=script\b)/gi,"<\\/")),k.push(U));continue}let ae=Number(U);k.push(c[ae])}return k}),E=/^\s/.test(a)?" ":"",P=/\s$/.test(a)?" ":"",F=o.htmlWhitespaceSensitivity==="ignore"?d:E&&P?g:null;return F?p(["`",f([F,p(x)]),F,"`"]):Et({hug:!1},p(["`",E,y>1?f(p(x)):p(x),P,"`"]))}function Mu(e){return Mn(e,"HTML")||e.match(t=>t.type==="TemplateLiteral",(t,r)=>t.type==="TaggedTemplateExpression"&&t.tag.type==="Identifier"&&t.tag.name==="html"&&r==="quasi")}var _u=Ou.bind(void 0,"html"),Nu=Ou.bind(void 0,"angular");async function ju(e,t,r){let{node:n}=r,o=V(0,n.quasis[0].value.raw,/((?:\\\\)*)\\`/g,(a,c)=>"\\".repeat(c.length/2)+"`"),i=zm(o),s=i!=="";s&&(o=V(0,o,new RegExp(`^${i}`,"gm"),""));let u=On(await e(o,{parser:"markdown",__inJsTemplate:!0}),!0);return["`",s?f([D,u]):[ar,Ws(u)],D,"`"]}function zm(e){let t=e.match(/^([^\S\n]*)\S/m);return t===null?"":t[1]}function vu({node:e,parent:t}){return t?.type==="TaggedTemplateExpression"&&e.quasis.length===1&&t.tag.type==="Identifier"&&(t.tag.name==="md"||t.tag.name==="markdown")}var Zm=[{test:ku,print:Iu},{test:Lu,print:wu},{test:Mu,print:_u},{test:ri,print:Nu},{test:vu,print:ju}].map(({test:e,print:t})=>({test:e,print:tf(t)}));function ef(e){let{node:t}=e;if(t.type!=="TemplateLiteral"||rf(t))return;let r=Zm.find(({test:n})=>n(e));if(r)return t.quasis.length===1&&t.quasis[0].value.raw.trim()===""?"``":r.print}function tf(e){return async(...t)=>{let r=await e(...t);return r&&Et({embed:!0,...r.label},r)}}function rf({quasis:e}){return e.some(({value:{cooked:t}})=>t===null)}var Ru=ef;function Wu(e,t){e.type==="ChainExpression"?nf(t):(e.type==="OptionalMemberExpression"||e.type==="OptionalCallExpression")&&of(t)}function Ju(e){if(N(e))return"object";if(M(e))return"callee";if(Re(e))return"expression"}function Nn(e){let t=Ju(e);if(t)return e[t]}function nf(e){for(e=Nn(e);e.type==="MemberExpression"||e.type==="CallExpression"||e.type==="TSNonNullExpression";e=Nn(e)){let t=Ju(e),r=e[t];r.type==="ChainExpression"&&(e[t]=r.expression)}}function of(e){for(e=Nn(e);e.type==="MemberExpression"||e.type==="CallExpression";e=Nn(e))e.type=`Optional${e.type}`}function Gu(e,t,r){let n=t[r];(q(n)||Ee(n))&&(e[r]=String(n.value)),n.type==="Identifier"&&(e[r]=n.name)}function Uu(e,t){(e.type==="Property"||e.type==="ObjectProperty"||e.type==="MethodDefinition"||e.type==="ClassProperty"||e.type==="ClassMethod"||e.type==="PropertyDefinition"||e.type==="TSDeclareMethod"||e.type==="TSPropertySignature"||e.type==="TSMethodSignature"||e.type==="ObjectTypeProperty"||e.type==="ImportAttribute"||e.type==="RecordDeclarationProperty"||e.type==="RecordDeclarationStaticProperty")&&!e.computed&&Gu(t,e,"key"),e.type==="TSEnumMember"&&Gu(t,e,"id")}function qu(e,t){e.type==="RegExpLiteral"&&(t.flags=[...e.flags].sort().join("")),e.type==="Literal"&&"regex"in e&&(t.regex.flags=[...e.regex.flags].sort().join(""))}var sf=new Set(["range","raw","comments","extra","start","end","loc","errors","tokens","trailingComma","docblock","__contentEnd"]),Er=e=>{for(let t of e.quasis)delete t.value};function oi(e,t,r){if(e.type==="Program"&&delete t.sourceType,Wu(e,t),Uu(e,t),qu(e,t),(Ji(e)||e.type==="BigIntLiteralTypeAnnotation")&&"bigint"in e&&(t.bigint=e.bigint.toLowerCase()),e.type==="EmptyStatement"&&!zt({node:e,parent:r})||e.type==="JSXText"||e.type==="JSXExpressionContainer"&&(e.expression.type==="Literal"||e.expression.type==="StringLiteral")&&e.expression.value===" ")return null;if(e.type==="JSXElement"&&e.openingElement.name.type==="JSXIdentifier"&&e.openingElement.name.name==="style"&&e.openingElement.attributes.some(o=>o.type==="JSXAttribute"&&o.name.name==="jsx"))for(let{type:o,expression:i}of t.children)o==="JSXExpressionContainer"&&i.type==="TemplateLiteral"&&Er(i);e.type==="JSXAttribute"&&e.name.name==="css"&&e.value.type==="JSXExpressionContainer"&&e.value.expression.type==="TemplateLiteral"&&Er(t.value.expression),e.type==="JSXAttribute"&&q(e.value)&&/["']|"|'/.test(e.value.value)&&(t.value.value=V(0,e.value.value,/["']|"|'/g,'"'));let n=e.expression||e.callee;if(e.type==="Decorator"&&n.type==="CallExpression"&&n.callee.name==="Component"&&n.arguments.length===1){let o=e.expression.arguments[0].properties;for(let[i,s]of t.expression.arguments[0].properties.entries())switch(o[i].key.name){case"styles":Y(s.value)&&Er(s.value.elements[0]);break;case"template":s.value.type==="TemplateLiteral"&&Er(s.value);break}}e.type==="TaggedTemplateExpression"&&(e.tag.type==="MemberExpression"||e.tag.type==="Identifier"&&(e.tag.name==="gql"||e.tag.name==="graphql"||e.tag.name==="css"||e.tag.name==="md"||e.tag.name==="markdown"||e.tag.name==="html")||e.tag.type==="CallExpression")&&Er(t.quasi),(e.type==="CallExpression"||e.type==="MemberExpression")&&!e.optional&&delete t.optional,e.type==="TemplateLiteral"&&Er(t)}oi.ignoredProperties=sf;var uf=/\*\/$/,af=/^\/\*\*?/,Vu=/^\s*(\/\*\*?(.|\r?\n)*?\*\/)/,pf=/(^|\s+)\/\/([^\n\r]*)/g,Yu=/^(\r?\n)+/,cf=/(?:^|\r?\n) *(@[^\n\r]*?) *\r?\n *(?![^\n\r@]*\/\/[^]*)([^\s@][^\n\r@]+?) *\r?\n/g,Hu=/(?:^|\r?\n) *@(\S+) *([^\n\r]*)/g,lf=/(\r?\n|^) *\* ?/g,Ku=[];function $u(e){let t=e.match(Vu);return t?t[0].trimStart():""}function Qu(e){let r=e.match(Vu)?.[0];return r==null?e:e.slice(r.length)}function zu(e){e=V(0,e.replace(af,"").replace(uf,""),lf,"$1");let r="";for(;r!==e;)r=e,e=V(0,e,cf,`+(function(f){function e(){var i=f();return i.default||i}if(typeof exports=="object"&&typeof module=="object")module.exports=e();else if(typeof define=="function"&&define.amd)define(e);else{var t=typeof globalThis<"u"?globalThis:typeof global<"u"?global:typeof self<"u"?self:this||{};t.prettierPlugins=t.prettierPlugins||{},t.prettierPlugins.estree=e()}})(function(){"use strict";var Co=Object.defineProperty;var Zp=Object.getOwnPropertyDescriptor;var ec=Object.getOwnPropertyNames;var tc=Object.prototype.hasOwnProperty;var Fo=(e,t)=>{for(var r in t)Co(e,r,{get:t[r],enumerable:!0})},rc=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ec(t))!tc.call(e,o)&&o!==r&&Co(e,o,{get:()=>t[o],enumerable:!(n=Zp(t,o))||n.enumerable});return e};var nc=e=>rc(Co({},"__esModule",{value:!0}),e);var Ey={};Fo(Ey,{languages:()=>yy,options:()=>Vp,printers:()=>Dy});var _i=[{name:"JavaScript",type:"programming",aceMode:"javascript",extensions:[".js","._js",".bones",".cjs",".es",".es6",".gs",".jake",".javascript",".jsb",".jscad",".jsfl",".jslib",".jsm",".jspre",".jss",".mjs",".njs",".pac",".sjs",".ssjs",".xsjs",".xsjslib",".start.frag",".end.frag",".wxs"],filenames:["Jakefile","start.frag","end.frag"],tmScope:"source.js",aliases:["js","node"],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",interpreters:["bun","chakra","d8","deno","gjs","js","node","nodejs","qjs","rhino","v8","v8-shell","zx"],parsers:["babel","acorn","espree","meriyah","babel-flow","babel-ts","flow","typescript"],vscodeLanguageIds:["javascript","mongo"],linguistLanguageId:183},{name:"Flow",type:"programming",aceMode:"javascript",extensions:[".js.flow"],filenames:[],tmScope:"source.js",aliases:[],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",interpreters:["bun","chakra","d8","deno","gjs","js","node","nodejs","qjs","rhino","v8","v8-shell"],parsers:["flow","babel-flow"],vscodeLanguageIds:["javascript"],linguistLanguageId:183},{name:"JSX",type:"programming",aceMode:"javascript",extensions:[".jsx"],filenames:void 0,tmScope:"source.js.jsx",aliases:void 0,codemirrorMode:"jsx",codemirrorMimeType:"text/jsx",interpreters:void 0,parsers:["babel","babel-flow","babel-ts","flow","typescript","espree","meriyah"],vscodeLanguageIds:["javascriptreact"],group:"JavaScript",linguistLanguageId:183},{name:"TypeScript",type:"programming",aceMode:"typescript",extensions:[".ts",".cts",".mts"],tmScope:"source.ts",aliases:["ts"],codemirrorMode:"javascript",codemirrorMimeType:"application/typescript",interpreters:["bun","deno","ts-node","tsx"],parsers:["typescript","babel-ts"],vscodeLanguageIds:["typescript"],linguistLanguageId:378},{name:"TSX",type:"programming",aceMode:"tsx",extensions:[".tsx"],tmScope:"source.tsx",aliases:["typescriptreact"],codemirrorMode:"jsx",codemirrorMimeType:"text/typescript-jsx",group:"TypeScript",parsers:["typescript","babel-ts"],vscodeLanguageIds:["typescriptreact"],linguistLanguageId:94901924}];var bi={};Fo(bi,{estree:()=>Bi});function oc(e){return Array.isArray(e)&&e.length>0}var j=oc;var ic=()=>{},Re=ic;function B(e){let t=new Set(e);return r=>t.has(r?.type)}var Qt=(e,t)=>(r,n,...o)=>r|1&&n==null?void 0:(t.call(n)??n[e]).apply(n,o);function sc(e){return this[e<0?this.length+e:e]}var uc=Qt("at",function(){if(Array.isArray(this)||typeof this=="string")return sc}),w=uc;function Z(e,t,r){if(!e.has(t)){let n=r(t);e.set(t,n)}return e.get(t)}function ac(e){let t=[];return e.this&&t.push(e.this),t.push(...e.params),e.rest&&t.push(e.rest),t}var pc=new WeakMap;function ee(e){return Z(pc,e,ac)}function Ni(e,t){let{node:r}=e,n=0,o=()=>t(e,n++);r.this&&e.call(o,"this"),e.each(o,"params"),r.rest&&e.call(o,"rest")}function ji(e){if(e.rest)return!0;let t=ee(e);return w(0,t,-1)?.type==="RestElement"}var vi=e=>e?.type==="TSAsExpression"&&e.typeAnnotation.type==="TSTypeReference"&&e.typeAnnotation.typeName.type==="Identifier"&&e.typeAnnotation.typeName.name==="const";function zt({node:e,parent:t}){return e?.type!=="EmptyStatement"?!1:t.type==="IfStatement"?t.consequent===e||t.alternate===e:t.type==="DoWhileStatement"||t.type==="ForInStatement"||t.type==="ForOfStatement"||t.type==="ForStatement"||t.type==="LabeledStatement"||t.type==="WithStatement"||t.type==="WhileStatement"?t.body===e:!1}function $e(e){return e.method&&e.kind==="init"||e.kind==="get"||e.kind==="set"}var Ao=e=>Number.isSafeInteger(e)&&e>=0;function It(e){return e.range?.[1]??e.end}function b(e){let t=e.range?.[0]??e.start,r=(e.declaration?.decorators??e.decorators)?.[0];return r?Math.min(b(r),t):t}var cc=5,lc=8,mc=8,Ri=e=>t=>t.label?S(t.label):b(t)+e,fc=e=>e.__contentEnd??It(e),Wi=["ExpressionStatement","Directive","ImportDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExportAllDeclaration","ReturnStatement","ThrowStatement","DoWhileStatement"],Dc=new Map([["BreakStatement",Ri(cc)],["ContinueStatement",Ri(lc)],["DebuggerStatement",e=>b(e)+mc],["VariableDeclaration",e=>S(w(0,e.declarations,-1))],...Wi.map(e=>[e,fc])]),Ji=B(Wi),Pr=e=>{if(Ji(e)&&e.__contentEnd)return!0;let{type:t}=e;return t==="BreakStatement"||t==="ContinueStatement"||t==="DebuggerStatement"||t==="VariableDeclaration"?!0:t==="IfStatement"?Pr(e.alternate??e.consequent):t==="ForInStatement"||t==="ForOfStatement"||t==="ForStatement"||t==="LabeledStatement"||t==="WithStatement"||t==="WhileStatement"?Pr(e.body):!1};function S(e){let{type:t}=e;return t==="IfStatement"?S(e.alternate??e.consequent):t==="ForInStatement"||t==="ForOfStatement"||t==="ForStatement"||t==="LabeledStatement"||t==="WithStatement"||t==="WhileStatement"?S(e.body):Dc.get(t)?.(e)??It(e)}function kt(e,t){let r=b(e);return Ao(r)&&r===b(t)}function yc(e,t){let r=S(e);return Ao(r)&&r===S(t)}function To(e,t){return kt(e,t)&&yc(e,t)}function ye(e){return e.extra?.raw??e.raw}function Gi(e){return e.type==="BigIntLiteral"||e.type==="Literal"&&!!e.bigint}function Ui(e){return e.type==="BooleanLiteral"||e.type==="Literal"&&typeof e.value=="boolean"}function Ee(e){return e.type==="NumericLiteral"||e.type==="Literal"&&typeof e.value=="number"}function Xr(e){return e.type==="RegExpLiteral"||e.type==="Literal"&&!!e.regex}function q(e){return e?.type==="StringLiteral"||e?.type==="Literal"&&typeof e.value=="string"}var de=B(["TSAsExpression","TSSatisfiesExpression","AsExpression","AsConstExpression","SatisfiesExpression"]),qi=B(["SatisfiesExpression","TSSatisfiesExpression"]),pe=B(["TSUnionType","UnionTypeAnnotation"]),At=B(["TSIntersectionType","IntersectionTypeAnnotation"]),Zt=B(["TupleTypeAnnotation","TSTupleType"]),Qe=B(["TSConditionalType","ConditionalTypeAnnotation"]),Vr=B(["TSTypeAliasDeclaration","TypeAlias"]),ut=B(["ReturnStatement","ThrowStatement"]),Yi=B(["ExportDefaultDeclaration","DeclareExportDeclaration","ExportNamedDeclaration","ExportAllDeclaration","DeclareExportAllDeclaration"]),Y=B(["ArrayExpression"]),ie=B(["ObjectExpression"]),er=B(["Literal","BooleanLiteral","BigIntLiteral","DirectiveLiteral","NullLiteral","NumericLiteral","RegExpLiteral","StringLiteral"]),Ye=B(["ObjectTypeAnnotation","TSTypeLiteral","TSMappedType"]),wt=B(["FunctionExpression","ArrowFunctionExpression"]),H=B(["JSXElement","JSXFragment"]),be=B(["BinaryExpression","LogicalExpression","NGPipeExpression"]),M=B(["CallExpression","OptionalCallExpression"]),N=B(["MemberExpression","OptionalMemberExpression"]),Tt=B(["CallExpression","OptionalCallExpression","NewExpression"]),Dt=B(["CallExpression","OptionalCallExpression","NewExpression","ImportExpression"]),We=B(["ChainExpression","TSNonNullExpression"]),Hi=B(["TSArrayType","ArrayTypeAnnotation"]),Xi=B(["TSTypeParameterInstantiation","TypeParameterInstantiation"]);function Ir(e){if(e.type!=="ImportSpecifier"&&e.type!=="ExportSpecifier")return!1;let{local:t,[e.type==="ImportSpecifier"?"imported":"exported"]:r}=e;return t.type!==r.type||!To(t,r)?!1:q(t)?t.value===r.value&&ye(t)===ye(r):t.type==="Identifier"?t.name===r.name:!1}var Ec=B(["File","TemplateElement","TSEmptyBodyFunctionExpression","ChainExpression"]),dc=(e,[t])=>t?.type==="ComponentParameter"&&t.shorthand&&t.name===e&&t.local!==t.name||t?.type==="MatchObjectPatternProperty"&&t.shorthand&&t.key===e||t?.type==="ObjectProperty"&&t.shorthand&&t.key===e&&t.value!==t.key||t?.type==="Property"&&t.shorthand&&t.key===e&&!$e(t)&&t.value!==t.key||t?.type==="ImportSpecifier"&&Ir(t)&&t.local===e&&t.local!==t.imported||t?.type==="ExportSpecifier"&&Ir(t)&&t.exported===e&&t.local!==t.exported,Cc=(e,[t])=>!!(e.type==="FunctionExpression"&&t.type==="MethodDefinition"&&t.value===e&&ee(e).length===0&&!e.returnType&&!j(e.typeParameters)&&e.body),Vi=(e,[t])=>t?.typeAnnotation===e&&vi(t),Fc=(e,[t,...r])=>Vi(e,[t])||t?.typeName===e&&Vi(t,r);function xc(e,t){return Ec(e)||dc(e,t)||Cc(e,t)?!1:e.type==="EmptyStatement"?zt({node:e,parent:t[0]}):!(Fc(e,t)||e.type==="TSTypeAnnotation"&&t[0].type==="TSPropertySignature")}var Ki=xc;function Ac(e){let t=e.type||e.kind||"(unknown type)",r=String(e.name||e.id&&(typeof e.id=="object"?e.id.name:e.id)||e.key&&(typeof e.key=="object"?e.key.name:e.key)||e.value&&(typeof e.value=="object"?"":String(e.value))||e.operator||"");return r.length>20&&(r=r.slice(0,19)+"\u2026"),t+(r?" "+r:"")}function go(e,t){(e.comments??(e.comments=[])).push(t),t.printed=!1,t.nodeDescription=Ac(e)}function K(e,t){t.leading=!0,t.trailing=!1,go(e,t)}function Te(e,t,r){t.leading=!1,t.trailing=!1,r&&(t.marker=r),go(e,t)}function X(e,t){t.leading=!1,t.trailing=!0,go(e,t)}function Kr(e){return(t,r,n)=>{if(r===!1)return!1;let o=!!n?.backwards,{length:i}=t,s=r;for(;s>=0&&s<i;){let u=t.charAt(s);if(e instanceof RegExp){if(!e.test(u))return s}else if(!e.includes(u))return s;o?s--:s++}return s===-1||s===i?s:!1}}var yE=Kr(/\s/),at=Kr(" "),$i=Kr(",; "),Qi=Kr(/[^\n\r]/);function Tc(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let r=t+2;r<e.length;++r)if(e.charAt(r)==="*"&&e.charAt(r+1)==="/")return r+2}return t}var tr=Tc;var zi=e=>e===`+`||e==="\r"||e==="\u2028"||e==="\u2029";function gc(e,t,r){if(t===!1)return!1;let n=!!r?.backwards,o=e.charAt(t);if(n){if(e.charAt(t-1)==="\r"&&o===`+`)return t-2;if(zi(o))return t-1}else{if(o==="\r"&&e.charAt(t+1)===`+`)return t+2;if(zi(o))return t+1}return t}var pt=gc;function hc(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?Qi(e,t):t}var rr=hc;function Sc(e,t){let r=null,n=t;for(;n!==r;)r=n,n=at(e,n),n=tr(e,n),n=rr(e,n),n=pt(e,n);return n}var Wt=Sc;function Bc(e,t){let r=Wt(e,t);return r===!1?"":e.charAt(r)}var Je=Bc;function bc(e,t,r={}){let n=at(e,r.backwards?t-1:t,r),o=pt(e,n,r);return n!==o}var J=bc;function Pc(e,t,r){for(let n=t;n<r;++n)if(e.charAt(n)===`+`)return!0;return!1}var te=Pc;var Ic=new WeakMap;function kc(e){let t;return e.type==="ImportExpression"||e.type==="TSImportType"?(t=[e.source],e.options&&t.push(e.options)):e.type==="TSExternalModuleReference"?t=[e.expression]:t=e.arguments,t}function se(e){return Z(Ic,e,kc)}function kr(e,t){let{node:r}=e;r.type==="ImportExpression"||r.type==="TSImportType"?(e.call(()=>t(e,0),"source"),r.options&&e.call(()=>t(e,1),"options")):r.type==="TSExternalModuleReference"?e.call(()=>t(e,0),"expression"):e.each(t,"arguments")}function ho(e,t){if(e.type==="ImportExpression"||e.type==="TSImportType"){if(t===0||t===(e.options?-2:-1))return["source"];if(e.options&&(t===1||t===-1))return["options"];throw new RangeError("Invalid argument index")}if(e.type==="TSExternalModuleReference"){if(t===0||t===-1)return["expression"]}else if(t<0&&(t=e.arguments.length+t),t>=0&&t<e.arguments.length)return["arguments",t];throw new RangeError("Invalid argument index")}var Zi=Symbol.for("comments");var wc=String.prototype.replaceAll??function(e,t){return e.global?this.replace(e,t):this.split(e).join(t)},Lc=Qt("replaceAll",function(){if(typeof this=="string")return wc}),V=Lc;function Oc(e){return V(0,e,/[^\n]/g," ")}var es=Oc;function Mc(e,t){for(let r of t){let n=b(r),o=S(r);e=e.slice(0,n)+es(e.slice(n,o))+e.slice(o)}return e}var _c=new WeakMap;function ce(e){let t=e[Zi];return Z(_c,t,r=>Mc(e.originalText,r))}function ts(e,t){let r=S(e)-1;if(t.originalText[r]===")")return r}function Nc(e,t){if(ts(e,t)===void 0)return;let n=ce(t),o=S(e.typeArguments??e.callee),i=n.indexOf("(",o);if(i!==-1)return i}function rs(e,t,r){let n=ts(e,r);if(n===void 0||S(t)>n)return!1;let o=Nc(e,r);return o===void 0?!1:b(t)>o}var le=B(["Block","CommentBlock","MultiLine"]),Le=B(["Line","CommentLine","SingleLine","HashbangComment","HTMLOpen","HTMLClose","Hashbang","InterpreterDirective"]);function Ge(e){return e?.type==="ObjectProperty"||e?.type==="Property"&&!$e(e)}function yt(e){return e.value.trim()==="prettier-ignore"&&!e.unignore}var jc=new WeakMap;function nr(e){return Z(jc,e,t=>le(t)&&t.value[0]==="*"&&/@(?:type|satisfies)\b/.test(t.value))}function $r({comment:e,enclosingNode:t,followingNode:r,options:n}){if((t?.type==="ForInStatement"||t?.type==="ForOfStatement"||t?.type==="ForStatement")&&r&&r===t.body){let o=ce(n).lastIndexOf(")",b(r));if(b(e)>o)return K(r,e),!0}return!1}var So=(e,t)=>le(e)&&!te(t,b(e),S(e)),wr=(e,t)=>Le(e)||So(e,t);function Qr(e,t){e.type==="BlockStatement"?or(e,t):K(e,t)}function or(e,t){let r=(e.body||e.properties).find(({type:n})=>n!=="EmptyStatement");r?K(r,t):Te(e,t)}function zr({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){return r?.type!=="IfStatement"||!n?!1:Je(o,S(e))===")"?(X(t,e),!0):n===r.consequent?(K(n,e),!0):t===r.consequent&&n===r.alternate?vc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}):!1}function vc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){let s=ce(i).indexOf("else",S(r.consequent));return b(e)>=s?(K(n,e),!0):!(t.type==="BlockStatement")&&wr(e,o)&&!te(o,S(t),b(e))?(X(t,e),!0):(Te(r,e),!0)}function Zr({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return r?.type==="SwitchStatement"&&r.cases.length===0&&!n&&t===r.discriminant&&Je(o,S(e))==="}"?(Te(r,e),!0):!1}function en({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return(r?.type==="WhileStatement"||r?.type==="WithStatement")&&n?Je(o,S(e))===")"?(X(t,e),!0):r.body===n?(K(n,e),!0):!1:!1}function Bo(e,{comment:t,text:r,options:n}){if(pe(e)&&So(t,r)&&!yt(t)){let i=ce(n).slice(S(t),b(e));return/^[ \t]*$/.test(i)}return!1}function bo(e,t){return K(Bo(e,t)?e.types[0]:e,t.comment),!0}function Rc(e){return[Po,Ds,ss,cs,Uc,zr,en,Zr,is,us,$r,$c,Qc,Io,ms,Zc,as,ls,qc,sl,ko,wo,Es].some(t=>t(e))}function Wc(e){return[Po,Gc,cs,ss,ms,zr,en,Zr,is,us,$r,ls,Kc,zc,Io,fs,ol,il,ul,ko,cl,ys,al,wo].some(t=>t(e))}function Jc(e){return[Po,Ds,zr,en,Zr,$r,as,Io,fs,ko,Xc,Hc,rl,ys,wo,Es].some(t=>t(e))}function Gc({comment:e,followingNode:t}){return t&&nr(e)?(K(t,e),!0):!1}function is({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return r?.type!=="TryStatement"&&r?.type!=="CatchClause"||!n?!1:r.type==="CatchClause"&&t?(X(t,e),!0):n.type==="BlockStatement"?(or(n,e),!0):n.type==="TryStatement"?(Qr(n.finalizer,e),!0):n.type==="CatchClause"?(Qr(n.body,e),!0):!1}function Uc({comment:e,enclosingNode:t,followingNode:r}){return N(t)&&r?.type==="Identifier"?(K(t,e),!0):!1}function qc({comment:e,enclosingNode:t,followingNode:r,options:n}){return!n.experimentalTernaries||!(t?.type==="ConditionalExpression"||Qe(t))?!1:r?.type==="ConditionalExpression"||Qe(r)?(Te(t,e),!0):!1}function ss({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o,options:i}){let s=t&&!te(o,S(t),b(e));return(!t||!s)&&(r?.type==="ConditionalExpression"||Qe(r))&&n?i.experimentalTernaries&&r.alternate===n&&!(le(e)&&!te(i.originalText,b(e),S(e)))?(Te(r,e),!0):(K(n,e),!0):!1}var Yc=B(["ClassDeclaration","ClassExpression","DeclareClass","DeclareInterface","InterfaceDeclaration","TSInterfaceDeclaration"]);function us({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){if(Yc(r)){let{decorators:o}=r;if(j(o)&&n?.type!=="Decorator")return X(w(0,o,-1),e),!0;if(r.body&&n===r.body)return or(r.body,e),!0;if(n){let{superClass:i}=r;if(i&&n===i&&t&&(t===r.id||t===r.typeParameters))return X(t,e),!0;for(let s of["implements","extends","mixins"])if(r[s]&&n===r[s][0])return t&&(t===r.id||t===r.typeParameters||t===i)?X(t,e):Te(r,e,s),!0}}return!1}var ns=B(["ClassMethod","ClassProperty","PropertyDefinition","TSAbstractPropertyDefinition","TSAbstractMethodDefinition","TSDeclareMethod","MethodDefinition","ClassAccessorProperty","AccessorProperty","TSAbstractAccessorProperty","TSParameterProperty"]);function as({placement:e,comment:t,precedingNode:r,enclosingNode:n,followingNode:o,text:i}){return n&&r&&Je(i,S(t))==="("&&(n.type==="Property"||n.type==="TSDeclareMethod"||n.type==="TSAbstractMethodDefinition")&&r.type==="Identifier"&&n.key===r&&Je(i,S(r))!==":"?(X(r,t),!0):ns(n)&&!o&&e==="remaining"?(X(Je(i,S(t))==="("?r:n,t),!0):r?.type==="Decorator"&&ns(n)&&(Le(t)||e==="ownLine")?(X(r,t),!0):!1}var ps=B(["FunctionDeclaration","FunctionExpression","ClassMethod","MethodDefinition","ObjectMethod"]);function Hc({comment:e,precedingNode:t,enclosingNode:r,text:n}){return Je(n,S(e))!=="("?!1:t&&ps(r)?(X(t,e),!0):!1}function Xc({comment:e,enclosingNode:t,text:r}){if(t?.type!=="ArrowFunctionExpression")return!1;let n=Wt(r,S(e));return n!==!1&&r.slice(n,n+2)==="=>"?(Te(t,e,"commentBeforeArrow"),!0):!1}function os(e,t,r){let n=b(t),o=S(e);if(n>=o)return!1;let i=S(t),s=b(e);if(i<=s)return!1;let u=ce(r);return u.slice(0,b(t)).trimEnd().endsWith("(")&&u.slice(S(t)).trimStart().startsWith(")")}var Vc=B(["ComponentDeclaration","DeclareComponent","ComponentTypeAnnotation"]);function Po({comment:e,enclosingNode:t,options:r}){if(!t)return!1;if(Dt(t)&&se(t).length===0&&os(t,e,r))return Te(t,e),!0;let n=ds(t)||Vc(t)||t.type==="HookTypeAnnotation"?t:t.type==="MethodDefinition"||t.type==="TSAbstractMethodDefinition"||t.type==="Property"&&$e(t)?t.value:void 0;return n&&ee(n).length===0&&os(n,e,r)?(Te(n,e),!0):!1}function cs({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return t?.type==="FunctionTypeParam"&&r?.type==="FunctionTypeAnnotation"&&n?.type!=="FunctionTypeParam"?(X(t,e),!0):t?.type==="ComponentTypeParameter"&&(r?.type==="DeclareComponent"||r?.type==="ComponentTypeAnnotation")&&n?.type!=="ComponentTypeParameter"?(X(t,e),!0):(t?.type==="Identifier"||t?.type==="AssignmentPattern"||t?.type==="ObjectPattern"||t?.type==="ArrayPattern"||t?.type==="RestElement"||t?.type==="TSParameterProperty")&&(ds(r)||(r?.type==="TSAbstractMethodDefinition"||r?.type==="MethodDefinition")&&r.value.type==="TSEmptyBodyFunctionExpression")&&Je(o,S(e))===")"?(X(t,e),!0):(t?.type==="ComponentParameter"||t?.type==="RestElement")&&(r?.type==="ComponentDeclaration"||r?.type==="DeclareComponent")&&Je(o,S(e))===")"?(X(t,e),!0):!le(e)&&n?.type==="BlockStatement"&&ps(r)&&(r.type==="MethodDefinition"?r.value.body:r.body)===n&&Wt(o,S(e))===b(n)?(or(n,e),!0):!1}function ls({comment:e,enclosingNode:t}){return t?.type==="LabeledStatement"?(K(t,e),!0):!1}function Kc({comment:e,precedingNode:t,enclosingNode:r,options:n}){return Tt(r)&&r.callee===t&&r.arguments.length>0&&rs(r,e,n)?(K(r.arguments[0],e),!0):!1}function $c({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return pe(r)?(yt(e)&&(n.prettierIgnore=!0,e.unignore=!0),t?(X(t,e),!0):!1):(pe(n)&&yt(e)&&(n.types[0].prettierIgnore=!0,e.unignore=!0),!1)}function Qc({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return r&&r.type==="MatchOrPattern"?(yt(e)&&(n.prettierIgnore=!0,e.unignore=!0),t?(X(t,e),!0):!1):(n&&n.type==="MatchOrPattern"&&yt(e)&&(n.types[0].prettierIgnore=!0,e.unignore=!0),!1)}function zc({comment:e,enclosingNode:t}){return Ge(t)?(K(t,e),!0):!1}function Io({comment:e,enclosingNode:t,ast:r,isLastComment:n}){return r?.body?.length===0?(n?Te(r,e):K(r,e),!0):t?.type==="Program"&&t.body.length===0&&!j(t.directives)?(n?Te(t,e):K(t,e),!0):!1}function ms({comment:e,precedingNode:t,enclosingNode:r,text:n}){if(r?.type==="ImportSpecifier"||r?.type==="ExportSpecifier")return K(r,e),!0;let o=t?.type==="ImportSpecifier"&&r?.type==="ImportDeclaration",i=t?.type==="ExportSpecifier"&&r?.type==="ExportNamedDeclaration";return(o||i)&&J(n,S(e))?(X(t,e),!0):!1}function Zc({comment:e,enclosingNode:t}){return t?.type==="AssignmentPattern"?(K(t,e),!0):!1}var el=B(["VariableDeclarator","AssignmentExpression","TypeAlias","TSTypeAliasDeclaration"]),tl=B(["ObjectExpression","ArrayExpression","TemplateLiteral","TaggedTemplateExpression","ObjectTypeAnnotation","TSTypeLiteral"]);function fs(e){let{comment:t,enclosingNode:r,followingNode:n,options:o,placement:i}=e;if(el(r)&&n&&i==="endOfLine"&&(tl(n)||le(t)))return bo(n,e);if(Vr(r)&&n){let s=r.id,u=ce(o).indexOf("=",S(s));if(b(t)>=u)return bo(n,e)}return!1}function rl({comment:e,enclosingNode:t,precedingNode:r,followingNode:n,text:o}){return!n&&(t?.type==="TSMethodSignature"||t?.type==="TSDeclareFunction"||t?.type==="TSAbstractMethodDefinition")&&(!r||r!==t.returnType)&&Je(o,S(e))===";"?(X(t,e),!0):!1}function Ds({comment:e,enclosingNode:t,followingNode:r}){if(yt(e)&&t?.type==="TSMappedType"&&r===t.key)return t.prettierIgnore=!0,e.unignore=!0,!0}function nl(e,t,r){let n=ce(r).indexOf("[",b(e));return S(t)<n}function ko({comment:e,enclosingNode:t,options:r}){if(t?.type==="TSMappedType"&&nl(t,e,r))return Te(t,e),!0}function ol({comment:e,enclosingNode:t,followingNode:r}){return!t||t.type!=="SwitchCase"||t.test||!r||r!==t.consequent[0]?!1:(r.type==="BlockStatement"&&Le(e)?or(r,e):Te(t,e),!0)}function il({comment:e,precedingNode:t,enclosingNode:r,followingNode:n}){return pe(t)&&(Hi(r)&&!n||At(r)||pe(r))?(X(w(0,t.types,-1),e),!0):!1}function sl({comment:e,enclosingNode:t,precedingNode:r,followingNode:n}){if((t?.type==="ObjectPattern"||t?.type==="ArrayPattern")&&n?.type==="TSTypeAnnotation")return r?X(r,e):Te(t,e),!0}function ul({comment:e,precedingNode:t,enclosingNode:r,followingNode:n,text:o}){return!n&&r?.type==="UnaryExpression"&&(t?.type==="LogicalExpression"||t?.type==="BinaryExpression")&&te(o,b(r.argument),b(t.right))&&wr(e,o)&&!te(o,b(t.right),b(e))?(X(t.right,e),!0):!1}function al({enclosingNode:e,followingNode:t,comment:r}){if(e&&(e.type==="TSPropertySignature"||e.type==="ObjectTypeProperty")&&(pe(t)||At(t)))return K(t,r),!0}function wo({enclosingNode:e,precedingNode:t,followingNode:r,comment:n,text:o}){if(de(e)&&t===e.expression&&!wr(n,o))return r?K(r,n):X(e,n),!0}function pl(e,t,r){let n=ce(r).lastIndexOf("=>",b(t.body));return S(e)<n}function cl({comment:e,enclosingNode:t,followingNode:r,precedingNode:n,options:o}){return t?.type!=="ArrowFunctionExpression"||!r||!n||pl(e,t,o)?!1:(Qr(r,e),!0)}function ys({comment:e,enclosingNode:t,precedingNode:r,followingNode:n}){if(!n&&t&&r){if(t.type==="ExpressionStatement"&&t.expression===r)return X(t,e),!0;let o=r.type==="SequenceExpression",i=r.type==="AssignmentExpression";if((o||i)&&(t.type==="ArrowFunctionExpression"&&t.body===r||t.type==="VariableDeclarator"&&t.init===r||t.type==="ReturnStatement"&&t.argument===r||t.type==="AssignmentExpression"&&t.right===r))return X(o?w(0,r.expressions,-1):r.right,e),!0}return!1}function Es(e){let{followingNode:t,comment:r}=e;return Bo(t,e)?(K(t.types[0],r),!0):!1}var ds=B(["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration","ObjectMethod","ClassMethod","TSDeclareFunction","TSCallSignatureDeclaration","TSConstructSignatureDeclaration","TSMethodSignature","TSConstructorType","TSFunctionType","TSDeclareMethod","HookDeclaration"]),ll={endOfLine:Wc,ownLine:Rc,remaining:Jc},Cs=ll;function ml(e,{parser:t}){if(t==="flow"||t==="hermes"||t==="babel-flow")return e=V(0,e,/[\s(]/g,""),e===""||e==="/*"||e==="/*::"}var Fs=ml;var g={Leading:2,Trailing:4,Dangling:8,Block:16,Line:32,PrettierIgnore:64,First:128,Last:256},xs=(e,t)=>{if(typeof e=="function"&&(t=e,e=0),e||t)return(r,n,o)=>!(e&g.Leading&&!r.leading||e&g.Trailing&&!r.trailing||e&g.Dangling&&(r.leading||r.trailing)||e&g.Block&&!le(r)||e&g.Line&&!Le(r)||e&g.First&&n!==0||e&g.Last&&n!==o.length-1||e&g.PrettierIgnore&&!yt(r)||t&&!t(r))};function x(e,t,r){if(!j(e?.comments))return!1;let n=xs(t,r);return n?e.comments.some(n):!0}function re(e,t,r){if(!Array.isArray(e?.comments))return[];let n=xs(t,r);return n?e.comments.filter(n):e.comments}function Lt(e){return e?.prettierIgnore||x(e,g.PrettierIgnore)}function tn(e){let{node:t}=e;return(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression")&&(e.key==="callee"&&M(e.parent)||e.key==="tag"&&e.parent.type==="TaggedTemplateExpression")}var fl=new Map([["|>"],["??"],["||"],["&&"],["|"],["^"],["&"],["==","===","!=","!=="],["<",">","<=",">=","in","instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"],["**"]].flatMap((e,t)=>e.map(r=>[r,t])));function ir(e){return fl.get(e)}var As={"==":!0,"!=":!0,"===":!0,"!==":!0},rn={"*":!0,"/":!0,"%":!0},nn={">>":!0,">>>":!0,"<<":!0};function Lr(e,t){return!(ir(t)!==ir(e)||e==="**"||As[e]&&As[t]||t==="%"&&rn[e]||e==="%"&&rn[t]||t!==e&&rn[t]&&rn[e]||nn[e]&&nn[t])}function Ts(e){return!!nn[e]||e==="|"||e==="^"||e==="&"}function gs(e){return e.type==="LogicalExpression"&&e.operator==="??"}function Ce(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":case"AssignmentExpression":case"NGPipeExpression":return Ce(e.left,t);case"MemberExpression":case"OptionalMemberExpression":return Ce(e.object,t);case"TaggedTemplateExpression":return e.tag.type==="FunctionExpression"?!1:Ce(e.tag,t);case"CallExpression":case"OptionalCallExpression":return e.callee.type==="FunctionExpression"?!1:Ce(e.callee,t);case"ConditionalExpression":return Ce(e.test,t);case"UpdateExpression":return!e.prefix&&Ce(e.argument,t);case"BindExpression":return e.object&&Ce(e.object,t);case"SequenceExpression":return Ce(e.expressions[0],t);case"ChainExpression":case"TSNonNullExpression":case"TSSatisfiesExpression":case"TSAsExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return Ce(e.expression,t);default:return t(e)}}function Dl(e){let{key:t,parent:r}=e;return t==="expression"&&r.type==="TSNonNullExpression"||t==="object"&&r.type==="MemberExpression"&&!r.optional||t==="callee"&&r.type==="CallExpression"&&!r.optional||t==="callee"&&r.type==="NewExpression"||t==="tag"&&r.type==="TaggedTemplateExpression"}var hs=e=>e.extra?.parenthesized,yl=B(["OptionalCallExpression","OptionalMemberExpression"]);function El(e){let{node:t}=e,r=t;for(;r.type==="TSNonNullExpression";)if(r=r.expression,hs(r))return!1;return yl(r)?hs(t)?!0:!(e.key==="expression"&&e.parent.type==="TSNonNullExpression"):!1}function Ss(e){return(e.node.type==="ChainExpression"||El(e))&&Dl(e)}function Bs(e){let{node:t}=e;if(t.type!=="Identifier")return!1;if(t.extra?.parenthesized&&/^PRETTIER_HTML_PLACEHOLDER_\d+_\d+_IN_JS$/.test(t.name))return!0;let{key:r,parent:n}=e;if(r==="left"&&(t.name==="async"&&!n.await||t.name==="let")&&n.type==="ForOfStatement")return!0;if(t.name==="let"){let o=e.findAncestor(i=>i.type==="ForOfStatement"||i.type==="ForInStatement")?.left;if(o&&Ce(o,i=>i===t))return!0}if(r==="object"&&t.name==="let"&&n.type==="MemberExpression"&&n.computed&&!n.optional){let o=e.findAncestor(s=>s.type==="ExpressionStatement"||s.type==="ForStatement"||s.type==="ForInStatement"),i=o?o.type==="ExpressionStatement"?o.expression:o.type==="ForStatement"?o.init:o.left:void 0;if(i&&Ce(i,s=>s===t))return!0}if(r==="expression")switch(t.name){case"await":case"interface":case"module":case"using":case"yield":case"let":case"component":case"hook":case"type":{let o=e.findAncestor(i=>!de(i));if(o!==n&&o.type==="ExpressionStatement")return!0}}return!1}function dl(e){return e!==null&&typeof e=="object"}var on=dl;function*Cl(e,t){let{getVisitorKeys:r,filter:n=()=>!0}=t,o=i=>on(i)&&n(i);for(let i of r(e)){let s=e[i];if(Array.isArray(s))for(let u of s)o(u)&&(yield u);else o(s)&&(yield s)}}function*Fl(e,t){let r=[e];for(let n=0;n<r.length;n++){let o=r[n];for(let i of Cl(o,t))yield i,r.push(i)}}function bs(e,{getVisitorKeys:t,predicate:r}){for(let n of Fl(e,{getVisitorKeys:t}))if(r(n))return!0;return!1}var Or=null;function Mr(e){if(Or!==null&&typeof Or.property){let t=Or;return Or=Mr.prototype=null,t}return Or=Mr.prototype=e??Object.create(null),new Mr}var xl=10;for(let e=0;e<=xl;e++)Mr();function Lo(e){return Mr(e)}function Al(e,t="type"){Lo(e);function r(n){let o=n[t],i=e[o];if(!Array.isArray(i))throw Object.assign(new Error(`Missing visitor keys for '${o}'.`),{node:n});return i}return r}var sn=Al;var l=[["elements"],["left","right"],["value"],["directives","body"],["label"],["callee","typeArguments","arguments"],["test","consequent","alternate"],["body","test"],["expression"],["left","right","body"],["id","typeParameters","params","predicate","returnType","body"],["object","property"],["properties"],["decorators","key","typeParameters","params","returnType","body"],["decorators","key","value"],["argument"],["expressions"],["id","init"],["body"],["decorators","id","typeParameters","superClass","superTypeArguments","mixins","implements","body"],["declaration","specifiers","source","attributes"],["local"],["exported"],["decorators","variance","key","typeAnnotation","value"],["id"],["key","value"],["elementType"],["id","typeParameters"],["id","typeParameters","extends","body"],["id","body"],["typeAnnotation"],["id","typeParameters","right"],["name","typeAnnotation"],["types"],["qualification","id"],["elementTypes"],["expression","typeAnnotation"],["params"],["members"],["objectType","indexType"],["decorators","key","typeAnnotation","value"],["id","typeParameters","params","returnType","body"],["key","typeParameters","params","returnType"],["typeParameters","params","returnType"],["parameterName","typeAnnotation"],["checkType","extendsType","trueType","falseType"],["typeParameter"],["literal"],["expression","typeArguments"],["decorators","key","typeAnnotation"],["argument","cases"],["pattern","body","guard"],["properties","rest"],["node"]],Ps={ArrayExpression:l[0],AssignmentExpression:l[1],BinaryExpression:l[1],InterpreterDirective:[],Directive:l[2],DirectiveLiteral:[],BlockStatement:l[3],BreakStatement:l[4],CallExpression:l[5],CatchClause:["param","body"],ConditionalExpression:l[6],ContinueStatement:l[4],DebuggerStatement:[],DoWhileStatement:l[7],EmptyStatement:[],ExpressionStatement:l[8],File:["program"],ForInStatement:l[9],ForStatement:["init","test","update","body"],FunctionDeclaration:l[10],FunctionExpression:l[10],Identifier:["typeAnnotation","decorators"],IfStatement:l[6],LabeledStatement:["label","body"],StringLiteral:[],NumericLiteral:[],NullLiteral:[],BooleanLiteral:[],RegExpLiteral:[],LogicalExpression:l[1],MemberExpression:l[11],NewExpression:l[5],Program:l[3],ObjectExpression:l[12],ObjectMethod:l[13],ObjectProperty:l[14],RestElement:["argument","typeAnnotation","decorators"],ReturnStatement:l[15],SequenceExpression:l[16],ParenthesizedExpression:l[8],SwitchCase:["test","consequent"],SwitchStatement:["discriminant","cases"],ThisExpression:[],ThrowStatement:l[15],TryStatement:["block","handler","finalizer"],UnaryExpression:l[15],UpdateExpression:l[15],VariableDeclaration:["declarations"],VariableDeclarator:l[17],WhileStatement:l[7],WithStatement:["object","body"],AssignmentPattern:["left","right","decorators","typeAnnotation"],ArrayPattern:["elements","typeAnnotation","decorators"],ArrowFunctionExpression:["typeParameters","params","predicate","returnType","body"],ClassBody:l[18],ClassExpression:l[19],ClassDeclaration:l[19],ExportAllDeclaration:["source","attributes","exported"],ExportDefaultDeclaration:["declaration"],ExportNamedDeclaration:l[20],ExportSpecifier:["local","exported"],ForOfStatement:l[9],ImportDeclaration:["specifiers","source","attributes"],ImportDefaultSpecifier:l[21],ImportNamespaceSpecifier:l[21],ImportSpecifier:["imported","local"],MetaProperty:["meta","property"],ClassMethod:l[13],ObjectPattern:["decorators","properties","typeAnnotation"],SpreadElement:l[15],Super:[],TaggedTemplateExpression:["tag","typeArguments","quasi"],TemplateElement:[],TemplateLiteral:["quasis","expressions"],YieldExpression:l[15],AwaitExpression:l[15],ImportExpression:["source","options"],BigIntLiteral:[],ExportNamespaceSpecifier:l[22],OptionalMemberExpression:l[11],OptionalCallExpression:l[5],ClassProperty:l[23],ClassPrivateProperty:l[23],ClassPrivateMethod:l[13],PrivateName:l[24],StaticBlock:l[18],ImportAttribute:l[25],AnyTypeAnnotation:[],ArrayTypeAnnotation:l[26],BooleanTypeAnnotation:[],BooleanLiteralTypeAnnotation:[],NullLiteralTypeAnnotation:[],ClassImplements:l[27],DeclareClass:["id","typeParameters","extends","mixins","implements","body"],DeclareFunction:["id","predicate"],DeclareInterface:l[28],DeclareModule:l[29],DeclareModuleExports:l[30],DeclareTypeAlias:l[31],DeclareOpaqueType:["id","typeParameters","supertype","lowerBound","upperBound"],DeclareVariable:["id","declarations"],DeclareExportDeclaration:l[20],DeclareExportAllDeclaration:["source","attributes"],DeclaredPredicate:l[2],ExistsTypeAnnotation:[],FunctionTypeAnnotation:["typeParameters","this","params","rest","returnType"],FunctionTypeParam:l[32],GenericTypeAnnotation:l[27],InferredPredicate:[],InterfaceExtends:l[27],InterfaceDeclaration:l[28],InterfaceTypeAnnotation:["extends","body"],IntersectionTypeAnnotation:l[33],MixedTypeAnnotation:[],EmptyTypeAnnotation:[],NullableTypeAnnotation:l[30],NumberLiteralTypeAnnotation:[],BigIntLiteralTypeAnnotation:[],NumberTypeAnnotation:[],ObjectTypeAnnotation:["properties","indexers","callProperties","internalSlots"],ObjectTypeInternalSlot:["id","value"],ObjectTypeCallProperty:l[2],ObjectTypeIndexer:["variance","id","key","value"],ObjectTypeProperty:["key","value","variance"],ObjectTypeSpreadProperty:l[15],OpaqueType:["id","typeParameters","supertype","impltype","lowerBound","upperBound"],QualifiedTypeIdentifier:l[34],StringLiteralTypeAnnotation:[],StringTypeAnnotation:[],SymbolTypeAnnotation:[],ThisTypeAnnotation:[],TupleTypeAnnotation:l[35],TypeofTypeAnnotation:["argument","typeArguments"],TypeAlias:l[31],TypeAnnotation:l[30],TypeCastExpression:l[36],TypeParameter:["bound","default","variance"],TypeParameterDeclaration:l[37],TypeParameterInstantiation:l[37],UnionTypeAnnotation:l[33],Variance:[],VoidTypeAnnotation:[],EnumDeclaration:l[29],EnumBooleanBody:l[38],EnumNumberBody:l[38],EnumStringBody:l[38],EnumSymbolBody:l[38],EnumBooleanMember:l[17],EnumNumberMember:l[17],EnumStringMember:l[17],EnumDefaultedMember:l[24],IndexedAccessType:l[39],OptionalIndexedAccessType:l[39],JSXAttribute:["name","value"],JSXClosingElement:["name"],JSXElement:["openingElement","children","closingElement"],JSXEmptyExpression:[],JSXExpressionContainer:l[8],JSXSpreadChild:l[8],JSXIdentifier:[],JSXMemberExpression:l[11],JSXNamespacedName:["namespace","name"],JSXOpeningElement:["name","typeArguments","attributes"],JSXSpreadAttribute:l[15],JSXText:[],JSXFragment:["openingFragment","children","closingFragment"],JSXOpeningFragment:[],JSXClosingFragment:[],Placeholder:[],V8IntrinsicIdentifier:[],ArgumentPlaceholder:[],BindExpression:["object","callee"],ClassAccessorProperty:l[40],Decorator:l[8],DoExpression:l[18],ExportDefaultSpecifier:l[22],ModuleExpression:l[18],TopicReference:[],VoidPattern:[],TSParameterProperty:["parameter","decorators"],TSDeclareFunction:l[41],TSDeclareMethod:l[42],TSQualifiedName:l[1],TSCallSignatureDeclaration:l[43],TSConstructSignatureDeclaration:l[43],TSPropertySignature:["key","typeAnnotation"],TSMethodSignature:l[42],TSIndexSignature:["parameters","typeAnnotation"],TSAnyKeyword:[],TSBooleanKeyword:[],TSBigIntKeyword:[],TSIntrinsicKeyword:[],TSNeverKeyword:[],TSNullKeyword:[],TSNumberKeyword:[],TSObjectKeyword:[],TSStringKeyword:[],TSSymbolKeyword:[],TSUndefinedKeyword:[],TSUnknownKeyword:[],TSVoidKeyword:[],TSThisType:[],TSFunctionType:l[43],TSConstructorType:l[43],TSTypeReference:["typeName","typeArguments"],TSTypePredicate:l[44],TSTypeQuery:["exprName","typeArguments"],TSTypeLiteral:l[38],TSArrayType:l[26],TSTupleType:l[35],TSOptionalType:l[30],TSRestType:l[30],TSNamedTupleMember:["label","elementType"],TSUnionType:l[33],TSIntersectionType:l[33],TSConditionalType:l[45],TSInferType:l[46],TSParenthesizedType:l[30],TSTypeOperator:l[30],TSIndexedAccessType:l[39],TSMappedType:["key","constraint","nameType","typeAnnotation"],TSTemplateLiteralType:["quasis","types"],TSLiteralType:l[47],TSClassImplements:l[48],TSInterfaceHeritage:l[48],TSInterfaceDeclaration:l[28],TSInterfaceBody:l[18],TSTypeAliasDeclaration:["id","typeParameters","typeAnnotation"],TSInstantiationExpression:l[48],TSAsExpression:l[36],TSSatisfiesExpression:l[36],TSTypeAssertion:l[36],TSEnumBody:l[38],TSEnumDeclaration:l[29],TSEnumMember:["id","initializer"],TSModuleDeclaration:l[29],TSModuleBlock:l[18],TSImportType:["source","options","qualifier","typeArguments"],TSImportEqualsDeclaration:["id","moduleReference"],TSExternalModuleReference:l[8],TSNonNullExpression:l[8],TSExportAssignment:l[8],TSNamespaceExportDeclaration:l[24],TSTypeAnnotation:l[30],TSTypeParameterInstantiation:l[37],TSTypeParameterDeclaration:l[37],TSTypeParameter:["name","constraint","default"],ChainExpression:l[8],Literal:[],MethodDefinition:l[14],PrivateIdentifier:[],Property:l[25],PropertyDefinition:l[23],AccessorProperty:l[40],TSAbstractAccessorProperty:l[49],TSAbstractKeyword:[],TSAbstractMethodDefinition:l[25],TSAbstractPropertyDefinition:l[49],TSAsyncKeyword:[],TSDeclareKeyword:[],TSEmptyBodyFunctionExpression:["id","typeParameters","params","returnType"],TSExportKeyword:[],TSPrivateKeyword:[],TSProtectedKeyword:[],TSPublicKeyword:[],TSReadonlyKeyword:[],TSStaticKeyword:[],AsConstExpression:l[8],AsExpression:l[36],BigIntTypeAnnotation:[],ComponentDeclaration:["id","params","body","typeParameters","rendersType"],ComponentParameter:["name","local"],ComponentTypeAnnotation:["params","rest","typeParameters","rendersType"],ComponentTypeParameter:l[32],ConditionalTypeAnnotation:l[45],DeclareComponent:["id","params","rest","typeParameters","rendersType"],DeclareEnum:l[29],DeclareHook:l[24],DeclareNamespace:l[29],EnumBigIntBody:l[38],EnumBigIntMember:l[17],EnumBody:l[38],HookDeclaration:l[41],HookTypeAnnotation:["params","returnType","rest","typeParameters"],InferTypeAnnotation:l[46],KeyofTypeAnnotation:l[15],MatchArrayPattern:["elements","rest"],MatchAsPattern:["pattern","target"],MatchBindingPattern:l[24],MatchExpression:l[50],MatchExpressionCase:l[51],MatchIdentifierPattern:l[24],MatchInstanceObjectPattern:l[52],MatchInstancePattern:["targetConstructor","properties"],MatchLiteralPattern:l[47],MatchMemberPattern:["base","property"],MatchObjectPattern:l[52],MatchObjectPatternProperty:["key","pattern"],MatchOrPattern:["patterns"],MatchRestPattern:l[15],MatchStatement:l[50],MatchStatementCase:l[51],MatchUnaryPattern:l[15],MatchWildcardPattern:[],NeverTypeAnnotation:[],ObjectTypeMappedTypeProperty:["keyTparam","propType","sourceType","variance"],QualifiedTypeofIdentifier:l[34],RecordDeclaration:["id","typeParameters","implements","body"],RecordDeclarationBody:l[0],RecordDeclarationImplements:["id","typeArguments"],RecordDeclarationProperty:["key","typeAnnotation","defaultValue"],RecordDeclarationStaticProperty:["key","typeAnnotation","value"],RecordExpression:["recordConstructor","typeArguments","properties"],RecordExpressionProperties:l[12],SatisfiesExpression:l[36],TupleTypeLabeledElement:["label","elementType","variance"],TupleTypeSpreadElement:["label","typeAnnotation"],TypeOperator:l[30],TypePredicate:l[44],UndefinedTypeAnnotation:[],UnknownTypeAnnotation:[],NGChainedExpression:l[16],NGEmptyExpression:[],NGPipeExpression:["left","right","arguments"],NGMicrosyntax:l[18],NGMicrosyntaxAs:["key","alias"],NGMicrosyntaxExpression:["expression","alias"],NGMicrosyntaxKey:[],NGMicrosyntaxKeyedExpression:["key","expression"],NGMicrosyntaxLet:l[25],NGRoot:l[53],JsExpressionRoot:l[53],JsonRoot:l[53],TSJSDocAllType:[],TSJSDocUnknownType:[],TSJSDocNullableType:l[30],TSJSDocNonNullableType:l[30]};var Tl=sn(Ps),un=Tl;function _r(e,t){return t(e)||bs(e,{getVisitorKeys:un,predicate:t})}function sr(e){return e.type==="AssignmentExpression"||e.type==="BinaryExpression"||e.type==="LogicalExpression"||e.type==="NGPipeExpression"||e.type==="ConditionalExpression"||M(e)||N(e)||e.type==="SequenceExpression"||e.type==="TaggedTemplateExpression"||e.type==="BindExpression"||e.type==="UpdateExpression"&&!e.prefix||de(e)||We(e)}function Is(e){return e.expressions?e.expressions[0]:e.left??e.test??e.callee??e.object??e.tag??e.argument??e.expression}function an(e){if(e.expressions)return["expressions",0];if(e.left)return["left"];if(e.test)return["test"];if(e.object)return["object"];if(e.callee)return["callee"];if(e.tag)return["tag"];if(e.argument)return["argument"];if(e.expression)return["expression"];throw new Error("Unexpected node has no left side.")}function Oe(e,t){return H(t)?Lt(t):x(t,g.Leading,r=>J(e,S(r)))}function gl(e,t){if(Oe(t.originalText,e)||x(e,g.Leading,r=>te(t.originalText,b(r),S(r)))&&!H(e))return!0;if(sr(e)){let r=e,n;for(;n=Is(r);)if(r=n,Oe(t.originalText,r))return!0}return!1}var hl=new WeakMap;function pn(e,t){return Z(hl,e,r=>gl(r,t))}function Pe(e){for(;We(e);)e=e.expression;return e}function ks(e,t,r){let{node:n,key:o,parent:i}=e;switch(i.type){case"ReturnStatement":case"ThrowStatement":if(Sl(e,t))return!1;break;case"ParenthesizedExpression":return!1;case"ClassDeclaration":case"ClassExpression":if(o==="superClass"){let s=Pe(n);if(s.type==="ArrowFunctionExpression"||s.type==="AssignmentExpression"||s.type==="AwaitExpression"||s.type==="BinaryExpression"||s.type==="ConditionalExpression"||s.type==="LogicalExpression"||s.type==="NewExpression"||s.type==="ObjectExpression"||s.type==="SequenceExpression"||s.type==="TaggedTemplateExpression"||s.type==="UnaryExpression"||s.type==="UpdateExpression"||s.type==="YieldExpression"||s.type==="ClassExpression"&&j(s.decorators))return!0}break;case"ExportDefaultDeclaration":if(ws(e,t,r))return!0;break;case"Decorator":if(o==="expression"&&!Bl(n))return!0;break;case"TypeAnnotation":if(e.match(void 0,void 0,(s,u)=>u==="returnType"&&s.type==="ArrowFunctionExpression")&&!(n.type==="NullableTypeAnnotation"&&e.call(()=>r(e,t),"typeAnnotation"))&&bl(n))return!0;break;case"VariableDeclarator":if(o==="init"&&e.match(void 0,void 0,(s,u)=>u==="declarations"&&s.type==="VariableDeclaration",(s,u)=>u==="left"&&s.type==="ForInStatement"))return!0;break;case"TSInstantiationExpression":if(o==="expression"&&(n.type==="AwaitExpression"||n.type==="YieldExpression"))return!0;break}}function Sl(e,t){let{key:r,parent:n}=e;if(!(r==="argument"&&ut(n)))return!1;let{node:o}=e;return!!((o.type==="SequenceExpression"||o.type==="AssignmentExpression")&&pn(o,t))}function ws(e,t,r){let{node:n,parent:o}=e;return n.type==="FunctionExpression"||n.type==="ClassExpression"?o.type==="ExportDefaultDeclaration"||!r(e,t):!sr(n)||o.type!=="ExportDefaultDeclaration"&&r(e,t)?!1:e.call(()=>ws(e,t,r),...an(n))}function Bl(e){return e.type==="ChainExpression"&&(e=e.expression),Oo(e)||M(e)&&!e.optional&&Oo(e.callee)}function Oo(e){return e.type==="Identifier"?!0:N(e)?!e.computed&&!e.optional&&e.property.type==="Identifier"&&Oo(e.object):!1}function bl(e){return _r(e,t=>t.type==="ObjectTypeAnnotation"&&_r(t,r=>r.type==="FunctionTypeAnnotation"))}function Ls(e,t){if(e.isRoot)return!1;let{node:r,key:n,parent:o}=e;if(t.__isInHtmlInterpolation&&!t.bracketSpacing&&kl(r)&&Nr(e))return!0;if(Pl(r))return!1;if(r.type==="Identifier")return Bs(e);if(r.type==="ObjectExpression"||r.type==="FunctionExpression"||r.type==="ClassExpression"||r.type==="DoExpression"){let s=e.findAncestor(u=>u.type==="ExpressionStatement")?.expression;if(s&&Ce(s,u=>u===r))return!0}if(r.type==="ObjectExpression"){let s=e.findAncestor(u=>u.type==="ArrowFunctionExpression")?.body;if(s&&s.type!=="SequenceExpression"&&s.type!=="AssignmentExpression"&&Ce(s,u=>u===r))return!0}let i=ks(e,t,Ls);if(typeof i=="boolean")return i;switch(r.type){case"UpdateExpression":if(o.type==="UnaryExpression")return r.prefix&&(r.operator==="++"&&o.operator==="+"||r.operator==="--"&&o.operator==="-");case"UnaryExpression":switch(o.type){case"UnaryExpression":return r.operator===o.operator&&(r.operator==="+"||r.operator==="-");case"BindExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"TaggedTemplateExpression":return!0;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"BinaryExpression":return n==="left"&&r.type==="UnaryExpression"&&(o.operator==="in"||o.operator==="instanceof")?!0:n==="left"&&o.operator==="**";case"TSNonNullExpression":return!0;default:return!1}case"BinaryExpression":if(o.type==="UpdateExpression"||r.operator==="in"&&Il(e))return!0;if(r.operator==="|>"&&r.extra?.parenthesized){let s=e.grandparent;if(s.type==="BinaryExpression"&&s.operator==="|>")return!0}case"TSTypeAssertion":case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"LogicalExpression":switch(o.type){case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return!de(r);case"ConditionalExpression":return de(r)||gs(r);case"CallExpression":case"NewExpression":case"OptionalCallExpression":return n==="callee";case"ClassExpression":case"ClassDeclaration":return n==="superClass";case"TSTypeAssertion":case"TaggedTemplateExpression":case"JSXSpreadAttribute":case"SpreadElement":case"BindExpression":case"AwaitExpression":case"TSNonNullExpression":case"UpdateExpression":return!0;case"UnaryExpression":if(!x(r))return!0;break;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"AssignmentExpression":case"AssignmentPattern":return n==="left"&&(r.type==="TSTypeAssertion"||de(r));case"LogicalExpression":if(r.type==="LogicalExpression")return o.operator!==r.operator;case"BinaryExpression":{let{operator:s,type:u}=r;if(!s&&u!=="TSTypeAssertion")return!0;let a=ir(s),c=o.operator,f=ir(c);return!!(f>a||n==="right"&&f===a||f===a&&!Lr(c,s)||f<a&&s==="%"&&(c==="+"||c==="-")||Ts(c))}default:return!1}break;case"SequenceExpression":return o.type!=="ForStatement";case"YieldExpression":if(o.type==="AwaitExpression"||o.type==="TSTypeAssertion")return!0;case"AwaitExpression":switch(o.type){case"TaggedTemplateExpression":case"UnaryExpression":case"LogicalExpression":case"SpreadElement":case"TSAsExpression":case"TSSatisfiesExpression":case"TSNonNullExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"BindExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"ConditionalExpression":return n==="test";case"BinaryExpression":return!(!r.argument&&o.operator==="|>");default:return!1}case"TSFunctionType":if(e.match(s=>s.type==="TSFunctionType",(s,u)=>u==="typeAnnotation"&&s.type==="TSTypeAnnotation",(s,u)=>u==="returnType"&&s.type==="ArrowFunctionExpression"))return!0;case"TSConditionalType":case"TSConstructorType":case"ConditionalTypeAnnotation":if(n==="extendsType"&&Qe(r)&&o.type===r.type||n==="constraint"&&r.type==="TSConditionalType"&&o.type==="TSTypeParameter"||n==="typeAnnotation"&&r.type==="ConditionalTypeAnnotation"&&o.type==="TypeAnnotation"&&e.grandparent.type==="TypeParameter"&&e.grandparent.bound===o&&e.grandparent.usesExtendsBound||n==="checkType"&&Qe(o))return!0;if(n==="extendsType"&&o.type==="TSConditionalType"){let{typeAnnotation:s}=r.returnType||r.typeAnnotation;if(s.type==="TSTypePredicate"&&s.typeAnnotation&&(s=s.typeAnnotation.typeAnnotation),s.type==="TSInferType"&&s.typeParameter.constraint)return!0}case"TSUnionType":case"TSIntersectionType":if(pe(o)||At(o))return!0;case"TSInferType":if(r.type==="TSInferType"){if(o.type==="TSRestType")return!1;if(n==="types"&&(o.type==="TSUnionType"||o.type==="TSIntersectionType")&&r.typeParameter.type==="TSTypeParameter"&&r.typeParameter.constraint)return!0}case"TSTypeOperator":return o.type==="TSArrayType"||o.type==="TSOptionalType"||o.type==="TSRestType"||n==="objectType"&&o.type==="TSIndexedAccessType"||o.type==="TSTypeOperator"||o.type==="TSTypeAnnotation"&&e.grandparent.type.startsWith("TSJSDoc");case"TSTypeQuery":return n==="objectType"&&o.type==="TSIndexedAccessType"||n==="elementType"&&o.type==="TSArrayType";case"TypeOperator":return o.type==="ArrayTypeAnnotation"||o.type==="NullableTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType")||o.type==="TypeOperator";case"TypeofTypeAnnotation":case"KeyofTypeAnnotation":return n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType")||n==="elementType"&&o.type==="ArrayTypeAnnotation";case"ArrayTypeAnnotation":return o.type==="NullableTypeAnnotation";case"IntersectionTypeAnnotation":case"UnionTypeAnnotation":return o.type==="TypeOperator"||o.type==="KeyofTypeAnnotation"||o.type==="ArrayTypeAnnotation"||o.type==="NullableTypeAnnotation"||o.type==="IntersectionTypeAnnotation"||o.type==="UnionTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType");case"InferTypeAnnotation":case"NullableTypeAnnotation":if(o.type==="ArrayTypeAnnotation"||n==="objectType"&&(o.type==="IndexedAccessType"||o.type==="OptionalIndexedAccessType"))return!0;break;case"ComponentTypeAnnotation":case"FunctionTypeAnnotation":{if(r.type==="ComponentTypeAnnotation"&&(r.rendersType===null||r.rendersType===void 0))return!1;if(e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression")||e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="NullableTypeAnnotation",(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression")||e.match(void 0,(u,a)=>a==="typeAnnotation"&&u.type==="TypePredicate",(u,a)=>a==="typeAnnotation"&&u.type==="TypeAnnotation",(u,a)=>a==="returnType"&&u.type==="ArrowFunctionExpression"))return!0;let s=o.type==="NullableTypeAnnotation"?e.grandparent:o;return s.type==="UnionTypeAnnotation"||s.type==="IntersectionTypeAnnotation"||s.type==="ArrayTypeAnnotation"||n==="objectType"&&(s.type==="IndexedAccessType"||s.type==="OptionalIndexedAccessType")||n==="checkType"&&o.type==="ConditionalTypeAnnotation"||n==="extendsType"&&o.type==="ConditionalTypeAnnotation"&&r.returnType?.type==="InferTypeAnnotation"&&r.returnType.typeParameter.bound||s.type==="NullableTypeAnnotation"||o.type==="FunctionTypeParam"&&o.name===null&&ee(r).some(u=>u.typeAnnotation?.type==="NullableTypeAnnotation")}case"OptionalIndexedAccessType":return n==="objectType"&&o.type==="IndexedAccessType";case"StringLiteral":case"NumericLiteral":case"Literal":if(typeof r.value=="string"&&o.type==="ExpressionStatement"&&typeof o.directive!="string"){let s=e.grandparent;return s.type==="Program"||s.type==="BlockStatement"}return n==="object"&&N(o)&&Ee(r);case"AssignmentExpression":return!((n==="init"||n==="update")&&o.type==="ForStatement"||n==="expression"&&r.left.type!=="ObjectPattern"&&o.type==="ExpressionStatement"||n==="key"&&o.type==="TSPropertySignature"||o.type==="AssignmentExpression"||n==="expressions"&&o.type==="SequenceExpression"&&e.match(void 0,void 0,(s,u)=>(u==="init"||u==="update")&&s.type==="ForStatement")||n==="value"&&o.type==="Property"&&e.match(void 0,void 0,(s,u)=>u==="properties"&&s.type==="ObjectPattern")||o.type==="NGChainedExpression"||n==="node"&&o.type==="JsExpressionRoot");case"ConditionalExpression":switch(o.type){case"TaggedTemplateExpression":case"UnaryExpression":case"SpreadElement":case"BinaryExpression":case"LogicalExpression":case"NGPipeExpression":case"AwaitExpression":case"JSXSpreadAttribute":case"TSTypeAssertion":case"TypeCastExpression":case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"TSNonNullExpression":return!0;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"ConditionalExpression":return t.experimentalTernaries?!1:n==="test";case"MemberExpression":case"OptionalMemberExpression":return n==="object";default:return!1}case"FunctionExpression":switch(o.type){case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"TaggedTemplateExpression":return!0;case"ExportDefaultDeclaration":return n==="declaration";default:return!1}case"ArrowFunctionExpression":switch(o.type){case"BinaryExpression":return o.operator!=="|>"||r.extra?.parenthesized;case"NewExpression":case"CallExpression":case"OptionalCallExpression":return n==="callee";case"MemberExpression":case"OptionalMemberExpression":return n==="object";case"TSAsExpression":case"TSSatisfiesExpression":case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":case"TSNonNullExpression":case"BindExpression":case"TaggedTemplateExpression":case"UnaryExpression":case"LogicalExpression":case"AwaitExpression":case"TSTypeAssertion":case"MatchExpressionCase":return!0;case"TSInstantiationExpression":return n==="expression";case"ConditionalExpression":return n==="test";default:return!1}case"ClassExpression":switch(o.type){case"NewExpression":return n==="callee";case"ExportDefaultDeclaration":return n==="declaration";default:return!1}case"OptionalMemberExpression":case"OptionalCallExpression":case"ChainExpression":case"TSNonNullExpression":if(Ss(e))return!0;case"CallExpression":case"MemberExpression":case"TaggedTemplateExpression":case"ImportExpression":if(n==="callee"&&(o.type==="BindExpression"||o.type==="NewExpression")){let s=r;for(;s;)switch(s.type){case"CallExpression":case"ImportExpression":return!0;case"MemberExpression":case"OptionalMemberExpression":case"BindExpression":s=s.object;break;case"TaggedTemplateExpression":s=s.tag;break;case"TSNonNullExpression":s=s.expression;break;default:return!1}}return!1;case"BindExpression":return n==="callee"&&(o.type==="BindExpression"||o.type==="NewExpression")||n==="object"&&N(o);case"NGPipeExpression":return!(o.type==="NGRoot"||o.type==="NGMicrosyntaxExpression"||o.type==="ObjectProperty"&&!r.extra?.parenthesized||Y(o)||n==="arguments"&&M(o)||n==="right"&&o.type==="NGPipeExpression"||n==="property"&&o.type==="MemberExpression"||o.type==="AssignmentExpression");case"JSXFragment":case"JSXElement":return n==="callee"||n==="left"&&o.type==="BinaryExpression"&&o.operator==="<"||!Y(o)&&o.type!=="ArrowFunctionExpression"&&o.type!=="AssignmentExpression"&&o.type!=="AssignmentPattern"&&o.type!=="BinaryExpression"&&o.type!=="ConditionalExpression"&&o.type!=="ExpressionStatement"&&o.type!=="JsExpressionRoot"&&o.type!=="JSXAttribute"&&o.type!=="JSXElement"&&o.type!=="JSXExpressionContainer"&&o.type!=="JSXFragment"&&o.type!=="LogicalExpression"&&!Tt(o)&&!Ge(o)&&!ut(o)&&o.type!=="TypeCastExpression"&&o.type!=="VariableDeclarator"&&o.type!=="YieldExpression"&&o.type!=="MatchExpressionCase"&&!(n==="declaration"&&o.type==="ExportDefaultDeclaration");case"TSInstantiationExpression":return n==="object"&&N(o);case"MatchOrPattern":return o.type==="MatchAsPattern"}return!1}var Pl=B(["BlockStatement","BreakStatement","ComponentDeclaration","ClassBody","ClassDeclaration","ClassMethod","ClassProperty","PropertyDefinition","ClassPrivateProperty","ContinueStatement","DebuggerStatement","DeclareComponent","DeclareClass","DeclareExportAllDeclaration","DeclareExportDeclaration","DeclareFunction","DeclareHook","DeclareInterface","DeclareModule","DeclareModuleExports","DeclareNamespace","DeclareVariable","DeclareEnum","DoWhileStatement","EnumDeclaration","ExportAllDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExpressionStatement","ForInStatement","ForOfStatement","ForStatement","FunctionDeclaration","HookDeclaration","IfStatement","ImportDeclaration","InterfaceDeclaration","LabeledStatement","MethodDefinition","ReturnStatement","SwitchStatement","ThrowStatement","TryStatement","TSDeclareFunction","TSEnumDeclaration","TSImportEqualsDeclaration","TSInterfaceDeclaration","TSModuleDeclaration","TSNamespaceExportDeclaration","TypeAlias","VariableDeclaration","WhileStatement","WithStatement"]);function Il(e){let t=0,{node:r}=e;for(;r;){let n=e.getParentNode(t++);if(n?.type==="ForStatement"&&n.init===r)return!0;r=n}return!1}function kl(e){return ie(e)}function Nr(e){let{parent:t,key:r}=e;switch(t.type){case"NGPipeExpression":if(r==="arguments"&&e.isLast)return e.callParent(Nr);break;case"ObjectProperty":if(r==="value")return e.callParent(()=>e.key==="properties"&&e.isLast);break;case"BinaryExpression":case"LogicalExpression":if(r==="right")return e.callParent(Nr);break;case"ConditionalExpression":if(r==="alternate")return e.callParent(Nr);break;case"UnaryExpression":if(t.prefix&&e.callParent(Nr))return!0;break}return!1}var oe=Ls;var ze="string",Me="array",ct="cursor",Ze="indent",et="align",lt="trim",ge="group",Ue="fill",_e="if-break",tt="indent-if-break",rt="line-suffix",He="line-suffix-boundary",Fe="line",Ne="label",qe="break-parent",cn=new Set([ct,Ze,et,lt,ge,Ue,_e,tt,rt,He,Fe,Ne,qe]);function wl(e){if(typeof e=="string")return ze;if(Array.isArray(e))return Me;if(!e)return;let{type:t}=e;if(cn.has(t))return t}var Xe=wl;var Ll=e=>new Intl.ListFormat("en-US",{type:"disjunction"}).format(e);function Ol(e){let t=e===null?"null":typeof e;if(t!=="string"&&t!=="object")return`Unexpected doc '${t}', +Expected it to be 'string' or 'object'.`;if(Xe(e))throw new Error("doc is valid.");let r=Object.prototype.toString.call(e);if(r!=="[object Object]")return`Unexpected doc '${r}'.`;let n=Ll([...cn].map(o=>`'${o}'`));return`Unexpected doc.type '${e.type}'.+Expected it to be ${n}.`}var Mo=class extends Error{name="InvalidDocError";constructor(t){super(Ol(t)),this.doc=t}},Ot=Mo;var Os={};function Ml(e,t,r,n){let o=[e];for(;o.length>0;){let i=o.pop();if(i===Os){r(o.pop());continue}r&&o.push(i,Os);let s=Xe(i);if(!s)throw new Ot(i);if(t?.(i)!==!1)switch(s){case Me:case Ue:{let u=s===Me?i:i.parts;for(let a=u.length,c=a-1;c>=0;--c)o.push(u[c]);break}case _e:o.push(i.flatContents,i.breakContents);break;case ge:if(n&&i.expandedStates)for(let u=i.expandedStates.length,a=u-1;a>=0;--a)o.push(i.expandedStates[a]);else o.push(i.contents);break;case et:case Ze:case tt:case Ne:case rt:o.push(i.contents);break;case ze:case ct:case lt:case He:case Fe:case qe:break;default:throw new Ot(i)}}}var ln=Ml;function gt(e,t){if(typeof e=="string")return t(e);let r=new Map;return n(e);function n(i){return Z(r,i,o)}function o(i){switch(Xe(i)){case Me:return t(i.map(n));case Ue:return t({...i,parts:i.parts.map(n)});case _e:return t({...i,breakContents:n(i.breakContents),flatContents:n(i.flatContents)});case ge:{let{expandedStates:s,contents:u}=i;return s?(s=s.map(n),u=s[0]):u=n(u),t({...i,contents:u,expandedStates:s})}case et:case Ze:case tt:case Ne:case rt:return t({...i,contents:n(i.contents)});case ze:case ct:case lt:case He:case Fe:case qe:return t(i);default:throw new Ot(i)}}}function _s(e,t,r){let n=r,o=!1;function i(s){if(o)return!1;let u=t(s);u!==void 0&&(o=!0,n=u)}return ln(e,i),n}function _l(e){if(e.type===ge&&e.break||e.type===Fe&&e.hard||e.type===qe)return!0}function ue(e){return _s(e,_l,!1)}function Ms(e){if(e.length>0){let t=w(0,e,-1);!t.expandedStates&&!t.break&&(t.break="propagated")}return null}function Ns(e){let t=new Set,r=[];function n(i){if(i.type===qe&&Ms(r),i.type===ge){if(r.push(i),t.has(i))return!1;t.add(i)}}function o(i){i.type===ge&&r.pop().break&&Ms(r)}ln(e,n,o,!0)}function Nl(e){return e.type===Fe&&!e.hard?e.soft?"":" ":e.type===_e?e.flatContents:e}function Jt(e){return gt(e,Nl)}function jl(e){switch(Xe(e)){case Ue:{let{parts:t}=e;if(t.every(r=>r===""))return"";if(t.length===1)return t[0];break}case ge:if(!e.contents&&!e.id&&!e.break&&!e.expandedStates)return"";if(e.contents.type===ge&&e.contents.id===e.id&&e.contents.break===e.break&&e.contents.expandedStates===e.expandedStates)return e.contents;break;case et:case Ze:case tt:case rt:if(!e.contents)return"";break;case _e:if(!e.flatContents&&!e.breakContents)return"";break;case Me:{let t=[];for(let r of e){if(!r)continue;let[n,...o]=Array.isArray(r)?r:[r];typeof n=="string"&&typeof w(0,t,-1)=="string"?t[t.length-1]+=n:t.push(n),t.push(...o)}return t.length===0?"":t.length===1?t[0]:t}case ze:case ct:case lt:case He:case Fe:case Ne:case qe:break;default:throw new Ot(e)}return e}function ur(e){return gt(e,t=>jl(t))}function Ve(e,t=ar){return gt(e,r=>typeof r=="string"?L(t,r.split(`+`)):r)}function vl(e){if(e.type===Fe)return!0}function js(e){return _s(e,vl,!1)}function mn(e,t){return e.type===Ne?{...e,contents:t(e.contents)}:t(e)}function vs(e){let t=!0;return ln(e,r=>{switch(Xe(r)){case ze:if(r==="")break;case lt:case He:case Fe:case qe:return t=!1,!1}}),t}var he=Re,fn=Re,Rs=Re,Ws=Re;function m(e){return he(e),{type:Ze,contents:e}}function Se(e,t){return Ws(e),he(t),{type:et,contents:t,n:e}}function Js(e){return Se(Number.NEGATIVE_INFINITY,e)}function Gs(e){return Se({type:"root"},e)}function Dn(e){return Se(-1,e)}function Us(e,t,r){he(e);let n=e;if(t>0){for(let o=0;o<Math.floor(t/r);++o)n=m(n);n=Se(t%r,n),n=Se(Number.NEGATIVE_INFINITY,n)}return n}var je={type:qe};var jr={type:ct};function yn(e){return Rs(e),{type:Ue,parts:e}}function p(e,t={}){return he(e),fn(t.expandedStates,!0),{type:ge,id:t.id,contents:e,break:!!t.shouldBreak,expandedStates:t.expandedStates}}function mt(e,t){return p(e[0],{...t,expandedStates:e})}function O(e,t="",r={}){return he(e),t!==""&&he(t),{type:_e,breakContents:e,flatContents:t,groupId:r.groupId}}function ht(e,t){return he(e),{type:tt,contents:e,groupId:t.groupId,negate:t.negate}}function L(e,t){he(e),fn(t);let r=[];for(let n=0;n<t.length;n++)n!==0&&r.push(e),r.push(t[n]);return r}function Et(e,t){return he(t),e?{type:Ne,label:e,contents:t}:t}var T={type:Fe},D={type:Fe,soft:!0},_o={type:Fe,hard:!0},d=[_o,je],Rl={type:Fe,hard:!0,literal:!0},ar=[Rl,je];function No(e){return he(e),{type:rt,contents:e}}var Be={type:He};var Wl="cr",Jl="crlf";var Gl="\r",Ul=`\r+`,ql=`+`,Yl=ql;function qs(e){return e===Wl?Gl:e===Jl?Ul:Yl}var Ys=()=>/[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;var Hs=12288,Xs=65510,Vs=[12288,12288,65281,65376,65504,65510];var Ks=4352,$s=262141,jo=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var vo=(e,t)=>{let r=0,n=Math.floor(e.length/2)-1;for(;r<=n;){let o=Math.floor((r+n)/2),i=o*2;if(t<e[i])n=o-1;else if(t>e[i+1])r=o+1;else return!0}return!1};var Qs=19968,[Hl,Xl]=Vl(jo);function Vl(e){let t=e[0],r=e[1];for(let n=0;n<e.length;n+=2){let o=e[n],i=e[n+1];if(Qs>=o&&Qs<=i)return[o,i];i-o>r-t&&(t=o,r=i)}return[t,r]}var Ro=e=>e<Hs||e>Xs?!1:vo(Vs,e);var Wo=e=>e>=Hl&&e<=Xl?!0:e<Ks||e>$s?!1:vo(jo,e);var Kl=/^(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27A1\u2934\u2935\u2B05-\u2B07]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF3\uDFF5\uDFF7]|\uD83D[\uDC3F\uDC41\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])$/,zs=e=>Kl.test(e);var $l=/[^\x20-\x7F]/;function Ql(e){if(!e)return 0;if(!$l.test(e))return e.length;let t=0;e=e.replace(Ys(),r=>(t+=zs(r)?1:2,""));for(let r of e){let n=r.codePointAt(0);n<=31||n>=127&&n<=159||n>=768&&n<=879||n>=65024&&n<=65039||(t+=Ro(n)||Wo(n)?2:1)}return t}var dt=Ql;var zl={type:0},Zl={type:1},Jo={value:"",length:0,queue:[],get root(){return Jo}};function Zs(e,t,r){let n=t.type===1?e.queue.slice(0,-1):[...e.queue,t],o="",i=0,s=0,u=0;for(let E of n)switch(E.type){case 0:f(),r.useTabs?a(1):c(r.tabWidth);break;case 3:{let{string:P}=E;f(),o+=P,i+=P.length;break}case 2:{let{width:P}=E;s+=1,u+=P;break}default:throw new Error(`Unexpected indent comment '${E.type}'.`)}return F(),{...e,value:o,length:i,queue:n};function a(E){o+=" ".repeat(E),i+=r.tabWidth*E}function c(E){o+=" ".repeat(E),i+=E}function f(){r.useTabs?y():F()}function y(){s>0&&a(s),A()}function F(){u>0&&c(u),A()}function A(){s=0,u=0}}function eu(e,t,r){if(!t)return e;if(t.type==="root")return{...e,root:e};if(t===Number.NEGATIVE_INFINITY)return e.root;let n;return typeof t=="number"?t<0?n=Zl:n={type:2,width:t}:n={type:3,string:t},Zs(e,n,r)}function tu(e,t){return Zs(e,zl,t)}function em(e){let t=0;for(let r=e.length-1;r>=0;r--){let n=e[r];if(n===" "||n===" ")t++;else break}return t}function En(e){let t=em(e);return{text:t===0?e:e.slice(0,e.length-t),count:t}}var Go=class{#e=[];#t="";#n=0;#o=[];#r=[];#i(){let t=this.#t;t!==""&&(this.#e.push(t),this.#n+=t.length,this.#t="");for(let r of this.#r)this.#o.push(Math.min(r,this.#n));this.#r.length=0}markPosition(){if(this.#o.length+this.#r.length>=2)throw new Error("There are too many 'cursor' in doc.");this.#r.push(this.#n+this.#t.length)}write(t){this.#t+=t}trim(){let{text:t,count:r}=En(this.#t);return this.#t=t,this.#i(),r}finish(){return this.#i(),{text:this.#e.join(""),positions:this.#o}}},ru=Go;var nt=Symbol("MODE_BREAK"),Ct=Symbol("MODE_FLAT"),Uo=Symbol("DOC_FILL_PRINTED_LENGTH");function dn(e,t,r,n,o,i){if(r===Number.POSITIVE_INFINITY)return!0;let s=t.length,u=!1,a=[e],c="";for(;r>=0;){if(a.length===0){if(s===0)return!0;a.push(t[--s]);continue}let{mode:f,doc:y}=a.pop(),F=Xe(y);switch(F){case ze:y&&(u&&(c+=" ",r-=1,u=!1),c+=y,r-=dt(y));break;case Me:case Ue:{let A=F===Me?y:y.parts,E=y[Uo]??0;for(let P=A.length-1;P>=E;P--)a.push({mode:f,doc:A[P]});break}case Ze:case et:case tt:case Ne:a.push({mode:f,doc:y.contents});break;case lt:{let{text:A,count:E}=En(c);c=A,r+=E;break}case ge:{if(i&&y.break)return!1;let A=y.break?nt:f,E=y.expandedStates&&A===nt?w(0,y.expandedStates,-1):y.contents;a.push({mode:A,doc:E});break}case _e:{let E=(y.groupId?o[y.groupId]||Ct:f)===nt?y.breakContents:y.flatContents;E&&a.push({mode:f,doc:E});break}case Fe:if(f===nt||y.hard)return!0;y.soft||(u=!0);break;case rt:n=!0;break;case He:if(n)return!1;break}}return!1}function qo(e,t){let r=Object.create(null),n=t.printWidth,o=qs(t.endOfLine),i=0,s=[{indent:Jo,mode:nt,doc:e}],u=!1,a=[],c=new ru;for(Ns(e);s.length>0;){let{indent:E,mode:P,doc:C}=s.pop();switch(Xe(C)){case ze:{let I=o!==`+`?V(0,C,`+`,o):C;I&&(c.write(I),s.length>0&&(i+=dt(I)));break}case Me:for(let I=C.length-1;I>=0;I--)s.push({indent:E,mode:P,doc:C[I]});break;case ct:c.markPosition();break;case Ze:s.push({indent:tu(E,t),mode:P,doc:C.contents});break;case et:s.push({indent:eu(E,C.n,t),mode:P,doc:C.contents});break;case lt:i-=c.trim();break;case ge:{let I=(function(){if(P===Ct&&!u)return{indent:E,mode:C.break?nt:Ct,doc:C.contents};u=!1;let h=n-i,v=a.length>0,U={indent:E,mode:Ct,doc:C.contents};if(!C.break&&dn(U,s,h,v,r))return U;if(!C.expandedStates)return{indent:E,mode:nt,doc:C.contents};if(!C.break)for(let ae=1;ae<C.expandedStates.length-1;ae++){let fe={indent:E,mode:Ct,doc:C.expandedStates[ae]};if(dn(fe,s,h,v,r))return fe}return{indent:E,mode:nt,doc:w(0,C.expandedStates,-1)}})();s.push(I),C.id&&(r[C.id]=I.mode);break}case Ue:{let I=n-i,k=C[Uo]??0,{parts:h}=C,v=h.length-k;if(v===0)break;let U=h[k+0],ae=h[k+1],fe={indent:E,mode:Ct,doc:U},z={indent:E,mode:nt,doc:U},xe=dn(fe,[],I,a.length>0,r,!0);if(v===1){xe?s.push(fe):s.push(z);break}let De={indent:E,mode:Ct,doc:ae},xt={indent:E,mode:nt,doc:ae};if(v===2){xe?s.push(De,fe):s.push(xt,z);break}let bt=h[k+2],_={indent:E,mode:P,doc:{...C,[Uo]:k+2}},we=dn({indent:E,mode:Ct,doc:[U,ae,bt]},[],I,a.length>0,r,!0);s.push(_),we?s.push(De,fe):xe?s.push(xt,fe):s.push(xt,z);break}case _e:case tt:{let I=C.groupId?r[C.groupId]:P;if(I===nt){let k=C.type===_e?C.breakContents:C.negate?C.contents:m(C.contents);k&&s.push({indent:E,mode:P,doc:k})}if(I===Ct){let k=C.type===_e?C.flatContents:C.negate?m(C.contents):C.contents;k&&s.push({indent:E,mode:P,doc:k})}break}case rt:a.push({indent:E,mode:P,doc:C.contents});break;case He:a.length>0&&s.push({indent:E,mode:P,doc:_o});break;case Fe:switch(P){case Ct:if(!C.hard){C.soft||(c.write(" "),i+=1);break}u=!0;case nt:if(a.length>0){s.push({indent:E,mode:P,doc:C},...a.reverse()),a.length=0;break}C.literal?(c.write(o),i=0,E.root&&(E.root.value&&c.write(E.root.value),i=E.root.length)):(c.trim(),c.write(o+E.value),i=E.length);break}break;case Ne:s.push({indent:E,mode:P,doc:C.contents});break;case qe:break;default:throw new Ot(C)}s.length===0&&a.length>0&&(s.push(...a.reverse()),a.length=0)}let{text:f,positions:y}=c.finish();if(y.length!==2)return{formatted:f};let[F,A]=y;return{formatted:f,cursorNodeStart:F,cursorNodeText:f.slice(F,A)}}var St=class extends Error{name="ArgExpansionBailout"};function pr(e){return(e.type==="ObjectTypeProperty"||e.type==="ObjectTypeInternalSlot")&&!e.static&&!e.method&&e.kind!=="get"&&e.kind!=="set"&&e.value.type==="FunctionTypeAnnotation"}function tm(e,t){let r=null,n=t;for(;n!==r;)r=n,n=$i(e,n),n=tr(e,n),n=at(e,n);return n=rr(e,n),n=pt(e,n),n!==!1&&J(e,n)}var Gt=tm;var me=(e,{originalText:t})=>{let r=S(e);if(Gt(t,r))return!0;let n=It(e);return n===r?!1:Gt(t,n)};var rm=B(["AnyTypeAnnotation","ThisTypeAnnotation","NumberTypeAnnotation","VoidTypeAnnotation","BooleanTypeAnnotation","BigIntTypeAnnotation","SymbolTypeAnnotation","StringTypeAnnotation","NeverTypeAnnotation","UndefinedTypeAnnotation","UnknownTypeAnnotation","EmptyTypeAnnotation","MixedTypeAnnotation"]),Cn=rm;var nu=B(["TSThisType","NullLiteralTypeAnnotation","BooleanLiteralTypeAnnotation","StringLiteralTypeAnnotation","BigIntLiteralTypeAnnotation","NumberLiteralTypeAnnotation","TSLiteralType","TSTemplateLiteralType"]);function nm({type:e}){return e.startsWith("TS")&&e.endsWith("Keyword")}var Fn=nm;function cr(e){return Fn(e)||Cn(e)||nu(e)||e.type==="GenericTypeAnnotation"&&!e.typeParameters||e.type==="TSTypeReference"&&!e.typeArguments}function ou(e){return(e.type==="TypeAnnotation"||e.type==="TSTypeAnnotation")&&e.typeAnnotation.type==="FunctionTypeAnnotation"&&!e.static&&!kt(e,e.typeAnnotation)}function om(e,t){let r=t.split(".");for(let n=r.length-1;n>=0;n--){let o=r[n];if(n===0)return e.type==="Identifier"&&e.name===o;if(n===1&&e.type==="MetaProperty"&&e.property.type==="Identifier"&&e.property.name===o){e=e.meta;continue}if(e.type==="MemberExpression"&&!e.optional&&!e.computed&&e.property.type==="Identifier"&&e.property.name===o){e=e.object;continue}return!1}}function lr(e,t){return t.some(r=>om(e,r))}var im=["it","it.only","it.skip","describe","describe.only","describe.skip","test","test.only","test.skip","test.fixme","test.step","test.describe","test.describe.only","test.describe.skip","test.describe.fixme","test.describe.parallel","test.describe.parallel.only","test.describe.serial","test.describe.serial.only","skip","xit","xdescribe","xtest","fit","fdescribe","ftest"];function sm(e){return lr(e,im)}function um(e){return e.type==="Identifier"&&(e.name==="beforeEach"||e.name==="beforeAll"||e.name==="afterEach"||e.name==="afterAll")}function Yo(e){return M(e)&&e.callee.type==="Identifier"&&["async","inject","fakeAsync","waitForAsync"].includes(e.callee.name)}function am(e){return e.type==="FunctionExpression"||e.type==="ArrowFunctionExpression"&&e.body.type==="BlockStatement"}function Ut(e,t){if(e?.type!=="CallExpression"||e.optional)return!1;let r=se(e);if(r.length===1){if(Yo(e)&&Ut(t))return wt(r[0]);if(um(e.callee))return Yo(r[0])}else if((r.length===2||r.length===3)&&(r[0].type==="TemplateLiteral"||q(r[0]))&&sm(e.callee))return r[2]&&!Ee(r[2])?!1:(r.length===2?wt(r[1]):am(r[1])&&ee(r[1]).length<=1)||Yo(r[1]);return!1}function pm(e,t){let r=t-1;r=at(e,r,{backwards:!0}),r=pt(e,r,{backwards:!0}),r=at(e,r,{backwards:!0});let n=pt(e,r,{backwards:!0});return r!==n}var xn=pm;var Ho=()=>!0;function Xo(e,t){let r=e.node;return r.printed=!0,t.printer.printComment(e,t)}function cm(e,t){let r=e.node,n=[Xo(e,t)],{printer:o,originalText:i,locStart:s,locEnd:u}=t;if(o.isBlockComment?.(r)){let f=" ";J(i,u(r))&&(J(i,s(r),{backwards:!0})?f=d:f=T),n.push(f)}else n.push(d);let c=pt(i,at(i,u(r)));return c!==!1&&J(i,c)&&n.push(d),n}function lm(e,t,r){let n=e.node,o=Xo(e,t),{printer:i,originalText:s,locStart:u}=t,a=i.isBlockComment?.(n);if(r?.hasLineSuffix&&!r?.isBlock||J(s,u(n),{backwards:!0})){let c=xn(s,u(n));return{doc:No([d,c?d:"",o]),isBlock:a,hasLineSuffix:!0}}return!a||r?.hasLineSuffix?{doc:[No([" ",o]),je],isBlock:a,hasLineSuffix:!0}:{doc:[" ",o],isBlock:a,hasLineSuffix:!1}}function W(e,t,r={}){let{indent:n=!1,marker:o,filter:i=Ho}=r,s=new Set(e.node?.comments?.filter(c=>!(c.leading||c.trailing||c.marker!==o||!i(c))));if(s.size===0)return"";let u=e.map(({node:c})=>s.has(c)?Xo(e,t):"","comments").filter(Boolean),a=L(d,u);return n?m([d,a]):a}function An(e,t,r){let n=t[Symbol.for("printedComments")],o=r?.filter??Ho,i=new Set(e.node?.comments?.filter(s=>!n?.has(s)&&s.leading&&o(s)));return i.size===0?"":e.map(({node:s})=>i.has(s)?cm(e,t):"","comments").filter(Boolean)}function iu(e,t,r){let n=e.node?.comments,o=new Set(n?.filter(f=>f.trailing)),i=t[Symbol.for("printedComments")],s=r?.filter??Ho,u=new Set(n?.filter(f=>o.has(f)&&!i?.has(f)&&s(f)));if(u.size===0)return"";let a=[],c;return e.each(({node:f})=>{o.has(f)&&(c=lm(e,t,c),u.has(f)&&a.push(c.doc))},"comments"),a}function Tn(e,t,r){return{leading:An(e,t,r),trailing:iu(e,t,r)}}function Q(e,t,r,n){let o=An(e,r,n),i=iu(e,r,n);return o||i?mn(t,s=>[o,s,i]):t}function gn(e,t="es5"){return e.trailingComma==="es5"&&t==="es5"||e.trailingComma==="all"&&(t==="all"||t==="es5")}function $(e){let{node:t}=e;return!t.optional||t.type==="Identifier"&&t===e.parent.key?"":M(t)||N(t)&&t.computed||t.type==="OptionalIndexedAccessType"?"?.":"?"}function hn(e){return e.node.definite||e.match(void 0,(t,r)=>r==="id"&&t.type==="VariableDeclarator"&&t.definite)?"!":""}var mm=B(["DeclareClass","DeclareComponent","DeclareFunction","DeclareHook","DeclareVariable","DeclareExportDeclaration","DeclareExportAllDeclaration","DeclareOpaqueType","DeclareTypeAlias","DeclareEnum","DeclareInterface"]),fm=e=>{let{node:t}=e;return mm(t)?e.parent.type!=="DeclareExportDeclaration"&&!t.implicitDeclare:t.declare};function ne(e){return fm(e)?"declare ":""}var Dm=B(["TSAbstractMethodDefinition","TSAbstractPropertyDefinition","TSAbstractAccessorProperty"]);function mr({node:e}){return e.abstract||Dm(e)?"abstract ":""}function qt(e){return e.accessibility?e.accessibility+" ":""}var su=e=>e.type==="UnaryExpression"&&e.operator==="!";function ym(e){return x(e)||!su(e)?!1:(e=e.argument,e=su(e)?e.argument:e,e.type==="LogicalExpression")}function fr(e,t,r){let{node:n}=e,o=n.type==="WithStatement"?"object":"test",i=r(o);return ym(n[o])?i:p([m([D,i]),D])}function Mt(e,t,r){let{node:n}=e;return x(n,g.Dangling,r)?[m([D,W(e,t,{filter:r})]),x(n,g.Dangling|g.Line,r)?d:D]:""}function Ie(e,t="es5"){return gn(e,t)?O(","):""}function R(e){return e.semi?";":""}var Em=e=>e.mark!=="commentBeforeArrow";function Ke(e,t,r,n,o){let i=e.node,s=ee(i),u=o&&i.typeParameters?r("typeParameters"):"";if(s.length===0)return[u,"(",Mt(e,t,Em),")"];let{parent:a}=e,c=Ut(a),f=uu(i),y=[];if(Ni(e,(E,P)=>{let C=P===s.length-1;C&&i.rest&&y.push("..."),y.push(r()),!C&&(y.push(","),c||f?y.push(" "):me(s[P],t)?y.push(d,d):y.push(T))}),n&&!Cm(e)){if(ue(u)||ue(y))throw new St;return p([Jt(u),"(",Jt(y),")"])}let F=s.every(E=>!j(E.decorators));return f&&F?[u,"(",...y,")"]:c?[u,"(",...y,")"]:(pr(a)||ou(a)||a.type==="TypeAlias"||a.type==="UnionTypeAnnotation"||a.type==="IntersectionTypeAnnotation"||a.type==="FunctionTypeAnnotation"&&a.returnType===i)&&s.length===1&&s[0].name===null&&i.this!==s[0]&&s[0].typeAnnotation&&i.typeParameters===null&&cr(s[0].typeAnnotation)&&!i.rest?t.arrowParens==="always"||i.type==="HookTypeAnnotation"?["(",...y,")"]:y:[u,"(",m([D,...y]),!ji(i)&&e.root.type!=="NGRoot"?Ie(t,"all"):"",D,")"]}function uu(e){if(!e)return!1;let t=ee(e);if(t.length!==1)return!1;let[r]=t;return!x(r)&&(r.type==="ObjectPattern"||r.type==="ArrayPattern"||r.type==="Identifier"&&r.typeAnnotation&&(r.typeAnnotation.type==="TypeAnnotation"||r.typeAnnotation.type==="TSTypeAnnotation")&&Ye(r.typeAnnotation.typeAnnotation)||r.type==="FunctionTypeParam"&&Ye(r.typeAnnotation)&&r!==e.rest||r.type==="AssignmentPattern"&&(r.left.type==="ObjectPattern"||r.left.type==="ArrayPattern")&&(r.right.type==="Identifier"||ie(r.right)&&r.right.properties.length===0||Y(r.right)&&r.right.elements.length===0))}function dm(e){let t;return e.returnType?(t=e.returnType,t.typeAnnotation&&(t=t.typeAnnotation)):e.typeAnnotation&&(t=e.typeAnnotation),t}function Bt(e,t){let r=dm(e);if(!r)return!1;let n=e.typeParameters?.params;if(n){if(n.length>1)return!1;if(n.length===1){let o=n[0];if(o.constraint||o.default)return!1}}return ee(e).length===1&&(Ye(r)||ue(t))}function Cm(e){return e.match(t=>t.type==="ArrowFunctionExpression"&&t.body.type==="BlockStatement",(t,r)=>{if(t.type==="CallExpression"&&r==="arguments"&&t.arguments.length===1&&t.callee.type==="CallExpression"){let n=t.callee.callee;return n.type==="Identifier"||n.type==="MemberExpression"&&!n.computed&&n.object.type==="Identifier"&&n.property.type==="Identifier"}return!1},(t,r)=>t.type==="VariableDeclarator"&&r==="init"||t.type==="ExportDefaultDeclaration"&&r==="declaration"||t.type==="TSExportAssignment"&&r==="expression"||t.type==="AssignmentExpression"&&r==="right"&&t.left.type==="MemberExpression"&&t.left.object.type==="Identifier"&&t.left.object.name==="module"&&t.left.property.type==="Identifier"&&t.left.property.name==="exports",t=>t.type!=="VariableDeclaration"||t.kind==="const"&&t.declarations.length===1)}function au(e){let t=ee(e);return t.length>1&&t.some(r=>r.type==="TSParameterProperty")}function Yt(e,t){return(t==="params"||t==="this"||t==="rest")&&uu(e)}var Fm=/^[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC][\$0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]*$/,xm=e=>Fm.test(e),pu=xm;function Am(e){return e.length===1?e:e.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/,"$1").replace(/^([+-])?\./,"$10.").replace(/(\.\d+?)0+(?=e|$)/,"$1").replace(/\.(?=e|$)/,"")}var _t=Am;var cu=Object.freeze({character:"'",codePoint:39}),lu=Object.freeze({character:'"',codePoint:34}),Tm=Object.freeze({preferred:cu,alternate:lu}),gm=Object.freeze({preferred:lu,alternate:cu});function Sn(e,t){let{preferred:r,alternate:n}=t===!0||t==="'"?Tm:gm,{length:o}=e,i=0,s=0;for(let u=0;u<o;u++){let a=e.charCodeAt(u);a===r.codePoint?i++:a===n.codePoint&&s++}return(i>s?n:r).character}var hm=/\\(["'\\])|(["'])/g;function Sm(e,t){let r=t==='"'?"'":'"',n=V(0,e,hm,(o,i,s)=>i?i===r?r:o:s===t?"\\"+s:s);return t+n+t}var fu=Sm;function Bm(e,t){Re(/^(?<quote>["']).*\k<quote>$/s.test(e));let r=e.slice(1,-1),n;return t.parser==="json"||t.parser==="jsonc"||t.parser==="json-stringify"||t.parser==="json5"&&t.quoteProps==="preserve"&&!t.singleQuote?n='"':t.__isInHtmlAttribute?n="'":n=Sn(r,t.singleQuote),e.charAt(0)===n?e:fu(r,n)}var ot=Bm;var Du=e=>e.type==="TSEnumMember",yu=e=>Du(e)?"id":"key",vr=e=>e[yu(e)],Eu=e=>!Du(e)&&e.computed;function du(e){return/^(?:\d+|\d+\.\d+)$/.test(e)}var bm=({parser:e})=>e==="typescript"||e==="babel-ts"||e==="oxc-ts";function Pm(e,t){let r=vr(e);if(r.type==="Identifier")return!0;if(!Ee(r)||bm(t))return!1;let n=_t(ye(r));return String(r.value)===n&&du(n)}function Cu(e,t){let{parser:r}=t;if(r==="json"||r==="jsonc")return!1;let n=vr(e);if(!q(n))return!1;let{value:o}=n;return ot(ye(n),t).slice(1,-1)!==o?!1:!!(!(r==="babel-ts"&&e.type==="ClassProperty"||(r==="typescript"||r==="oxc-ts")&&e.type==="PropertyDefinition")&&pu(o)||(r==="babel"||r==="acorn"||r==="oxc"||r==="espree"||r==="meriyah"||r==="__babel_estree")&&e.type!=="ImportAttribute"&&du(o)&&String(Number(o))===o)}var Im=new WeakMap;function Fu(e,t){return Z(Im,e.parent,()=>e.siblings.some(r=>{if(Eu(r))return!1;let n=vr(r);return q(n)&&!Cu(r,t)}))}function km(e,t){return(t.parser==="json"||t.parser==="jsonc"||t.quoteProps==="consistent"&&Fu(e,t))&&Pm(e.node,t)}function wm(e,t){return(t.quoteProps==="as-needed"||t.quoteProps==="consistent"&&!Fu(e,t))&&Cu(e.node,t)}function ve(e,t,r){let{node:n}=e,o=yu(n);if(Eu(n))return["[",r(o),"]"];if(km(e,t)){let i=vr(n),s=ot(JSON.stringify(i.type==="Identifier"?i.name:String(i.value)),t);return e.call(()=>Q(e,s,t),o)}if(wm(e,t)){let{value:i}=vr(n),s=/^\d/.test(i)?_t(i):i;return e.call(()=>Q(e,s,t),o)}return r(o)}var Lm=B(["VoidTypeAnnotation","TSVoidKeyword","NullLiteralTypeAnnotation","TSNullKeyword"]),Om=B(["ObjectTypeAnnotation","TSTypeLiteral","GenericTypeAnnotation","TSTypeReference"]);function Ko(e){return e.key==="elementTypes"&&Zt(e.parent)&&e.parent.elementTypes.length>1}function Ht(e){let{types:t}=e;if(t.some(n=>x(n)))return!1;let r=t.find(n=>Om(n));return r?t.every(n=>n===r||Lm(n)):!1}function Bn(e){let{key:t,node:r,parent:n}=e;return!(Ht(r)||t==="types"&&pe(n)||t==="types"&&At(n)||Ko(e))}function bn(e,t,r,n){let{node:o}=e;if(Ht(o))return L(" | ",e.map(r,"types"));let i=p(e.map(({isFirst:s})=>{let u=s?O("| "):[T,"| "],a=r();return x(e.node,g.Leading)?[u,Se(2,Q(e,a,t))]:[u,Q(e,Se(2,a),t)]},"types"));return Bn(e)&&(i=Q(e,i,t)),oe(e,t)?p([m([D,i]),D]):Ko(e)?p([m([O(["(",D]),i]),D,O(")")]):n?.assignmentLayout==="break-after-operator"||!Mm(e)?i:p(m([D,i]))}function Mm(e){let{key:t,parent:r}=e;return!(t==="typeAnnotation"&&r.type==="TSTypeAssertion"||t==="elementTypes"&&Zt(r)||(t==="trueType"||t==="falseType")&&Qe(r)||t==="params"&&Xi(r)||t==="typeAnnotation"&&r.type==="FunctionTypeParam"&&!r.name&&e.grandparent.this!==r||e.match(void 0,(n,o)=>o==="typeAnnotation"&&n.type==="FunctionTypeParam",(n,o)=>o==="params"&&n.type==="FunctionTypeAnnotation",(n,o)=>o==="value"&&n.type==="ObjectTypeProperty"&&pr(n)))}function xu(e){return cr(e)||Ye(e)?!0:pe(e)?Ht(e):!1}var _m=new WeakSet;function G(e,t,r="typeAnnotation"){let{node:{[r]:n}}=e;if(!n)return"";let o=!1;if(n.type==="TSTypeAnnotation"||n.type==="TypeAnnotation"){let i=e.call(Au,r);(i==="=>"||i===":"&&x(n,g.Leading))&&(o=!0),_m.add(n)}return o?[" ",t(r)]:t(r)}var Au=e=>e.match(t=>t.type==="TSTypeAnnotation",(t,r)=>(r==="returnType"||r==="typeAnnotation")&&(t.type==="TSFunctionType"||t.type==="TSConstructorType"))?"=>":e.match(t=>t.type==="TSTypeAnnotation",(t,r)=>r==="typeAnnotation"&&(t.type==="TSJSDocNullableType"||t.type==="TSJSDocNonNullableType"||t.type==="TSTypePredicate"))||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="typeAnnotation"&&t.type==="Identifier",(t,r)=>r==="id"&&t.type==="DeclareFunction")||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="typeAnnotation"&&t.type==="Identifier",(t,r)=>r==="id"&&t.type==="DeclareHook")||e.match(t=>t.type==="TypeAnnotation",(t,r)=>r==="bound"&&t.type==="TypeParameter"&&t.usesExtendsBound)?"":":";function Pn(e,t,r){let n=Au(e);return n?[n," ",r("typeAnnotation")]:r("typeAnnotation")}var Nm=({node:e,key:t,parent:r})=>t==="value"&&e.type==="FunctionExpression"&&(r.type==="ObjectMethod"||r.type==="ClassMethod"||r.type==="ClassPrivateMethod"||r.type==="MethodDefinition"||r.type==="TSAbstractMethodDefinition"||r.type==="TSDeclareMethod"||r.type==="Property"&&$e(r));function Dr(e,t,r,n){if(Nm(e))return In(e,t,r);let{node:o}=e,i=!1;if(o.type==="FunctionExpression"&&n?.expandLastArg){let{parent:y}=e;M(y)&&(se(y).length>1||ee(o).every(F=>F.type==="Identifier"&&!F.typeAnnotation))&&(i=!0)}let s=Ke(e,t,r,i),u=wn(e,r),a=Bt(o,u),f=o.type==="HookDeclaration"?"hook":"function";return[ne(e),o.async?"async ":"",f,o.generator?"*":""," ",o.id?r("id"):"",r("typeParameters"),p([a?p(s):s,u]),o.body?" ":"",r("body"),o.declare||!o.body?R(t):""]}function Rr(e,t,r){let{node:n}=e,{kind:o}=n,i=n.value||n,s=[];return!o||o==="init"||o==="method"||o==="constructor"?i.async&&s.push("async "):(Re(o==="get"||o==="set"),s.push(o," ")),i.generator&&s.push("*"),s.push(ve(e,t,r),n.optional?"?":"",n===i?In(e,t,r):r("value")),s}function In(e,t,r){let{node:n}=e,o=Ke(e,t,r),i=wn(e,r),s=au(n),u=Bt(n,i),a=[r("typeParameters"),p([s?p(o,{shouldBreak:!0}):u?p(o):o,i])];return n.body?a.push(" ",r("body")):a.push(R(t)),a}function jm(e){let t=ee(e);return t.length===1&&!e.typeParameters&&!x(e,g.Dangling)&&t[0].type==="Identifier"&&!t[0].typeAnnotation&&!x(t[0])&&!t[0].optional&&!e.predicate&&!e.returnType}function kn(e,t){if(t.arrowParens==="always")return!1;if(t.arrowParens==="avoid"){let{node:r}=e;return jm(r)}return!1}function wn(e,t){let{node:r}=e,o=[G(e,t,"returnType")];return r.predicate&&o.push(t("predicate")),o}function yr(e,t){if(t.semi)return!1;let{node:r}=e;if(r.type!=="ExpressionStatement"||Qo(e,t)||Zo(e,t)||zo(e,t))return!1;let{key:n,parent:o}=e;return!!((n==="body"&&(o.type==="Program"||o.type==="BlockStatement"||o.type==="StaticBlock"||o.type==="TSModuleBlock")||n==="consequent"&&o.type==="SwitchCase")&&e.call(()=>Tu(e,t),"expression"))}function Tu(e,t){let{node:r}=e;switch(r.type){case"ParenthesizedExpression":case"TypeCastExpression":case"TSTypeAssertion":case"ArrayExpression":case"ArrayPattern":case"TemplateLiteral":case"TemplateElement":case"RegExpLiteral":return!0;case"ArrowFunctionExpression":if(!kn(e,t))return!0;break;case"UnaryExpression":{let{prefix:n,operator:o}=r;if(n&&(o==="+"||o==="-"))return!0;break}case"BindExpression":if(!r.object)return!0;break;case"Literal":if(r.regex)return!0;break;default:if(H(r))return!0}return oe(e,t)?!0:sr(r)?e.call(()=>Tu(e,t),...an(r)):!1}var $o=({node:e,parent:t})=>e.type==="ExpressionStatement"&&t.type==="Program"&&t.body.length===1&&(Array.isArray(t.directives)&&t.directives.length===0||!t.directives);function Qo(e,t){return(t.parentParser==="markdown"||t.parentParser==="mdx")&&$o(e)&&H(e.node.expression)}function zo(e,t){return t.__isHtmlInlineEventHandler&&$o(e)}function Zo(e,t){return(t.parser==="__vue_event_binding"||t.parser==="__vue_ts_event_binding")&&$o(e)}function Ln(e,t){if(!yr(e,t))return!1;let r=w(0,re(e.node,g.Leading),-1);return!!(r&&nr(r))}var vm=B(["ClassDeclaration","ClassExpression","DeclareClass","DeclareInterface","InterfaceDeclaration","TSInterfaceDeclaration"]);function Rm(e,t){let{key:r,parent:n}=e;if(r==="types"&&pe(n)||r==="argument"&&n.type==="JSXSpreadAttribute"||r==="expression"&&n.type==="JSXSpreadChild"||r==="superClass"&&(n.type==="ClassDeclaration"||n.type==="ClassExpression")||(r==="id"||r==="typeParameters")&&vm(n)||r==="patterns"&&n.type==="MatchOrPattern"||tn(e))return!0;let{node:o}=e;return Lt(o)?!1:o.type==="ExpressionStatement"?Ln(e,t):pe(o)?Bn(e):!!H(o)}var gu=Rm;function Wm(e,t,r=0){let n=0;for(let o=r;o<e.length;++o)e[o]===" "?n=n+t-n%t:n++;return n}var hu=Wm;function Jm(e,t){let r=e.lastIndexOf(`+`);return r===-1?0:hu(e.slice(r+1).match(/^[\t ]*/)[0],t)}var Su=Jm;function On(e,t,r){if(Hm(e)){let i=Gm(e,t,r);if(i)return i}let n=Nt(e,t,r),o=e.map(({isLast:i,index:s})=>[r(),i?"":n[s]],"quasis");return[Be,"`",...o,"`"]}function bu(e,t,r){let n=r("quasi"),{node:o}=e,i="",s=re(o.quasi,g.Leading)[0];return s&&(te(t.originalText,S(o.typeArguments??o.tag),b(s))?i=D:i=" "),Et(n.label&&{tagged:!0,...n.label},[r("tag"),r("typeArguments"),i,Be,n])}function Gm(e,t,r){let{node:n}=e,o=n.quasis[0].value.raw.trim().split(/\s*\|\s*/);if(o.length>1||o.some(i=>i.length>0)){t.__inJestEach=!0;let i=Nt(e,t,r);t.__inJestEach=!1;let s=i.map(y=>qo(y,{...t,printWidth:Number.POSITIVE_INFINITY,endOfLine:"lf"}).formatted),u=[{hasLineBreak:!1,cells:[]}];for(let y=1;y<n.quasis.length;y++){let F=w(0,u,-1),A=s[y-1];F.cells.push(A),A.includes(`+`)&&(F.hasLineBreak=!0),n.quasis[y].value.raw.includes(`+`)&&u.push({hasLineBreak:!1,cells:[]})}let a=Math.max(o.length,...u.map(y=>y.cells.length)),c=Array.from({length:a},()=>0),f=[{cells:o},...u.filter(y=>y.cells.length>0)];for(let y of f)if(!y.hasLineBreak)for(let[F,A]of y.cells.entries())c[F]=Math.max(c[F],dt(A));return[Be,"`",m([d,L(d,f.map(y=>L(" | ",y.cells.map((F,A)=>y.hasLineBreak?F:F+" ".repeat(c[A]-dt(F))))))]),d,"`"]}}var Um=new WeakMap;function qm(e,t){let{parent:r,index:n}=e;return Z(Um,r,i=>{let{tabWidth:s}=t,u=0;return i.quasis.map(c=>{let f=c.value.raw,y=f.includes(`+`)?Su(f,s):u;return u=y,{indentSize:y,previousQuasiText:f}})})[n]}function Ym(e,t,r){let{node:n,index:o}=e,i=r(),s=e.parent,{quasis:u}=s,a=S(u[o]),c=b(u[o+1]),f=te(t.originalText,a,c);if(!f){let A=qo(i,{...t,printWidth:Number.POSITIVE_INFINITY}).formatted;A.includes(`+`)?f=!0:i=A}f&&(x(n)||n.type==="Identifier"||N(Pe(n))||n.type==="ConditionalExpression"||n.type==="SequenceExpression"||de(n)||be(n))&&(i=[m([D,i]),D]);let{indentSize:y,previousQuasiText:F}=qm(e,t);return t.__inJestEach&&(y=Math.max(y,t.tabWidth)),i=y===0&&F.endsWith(`+`)?Se(Number.NEGATIVE_INFINITY,i):Us(i,y,t.tabWidth),p(["${",i,Be,"}"])}function Nt(e,t,r){return e.map(()=>Ym(e,t,r),e.node.type==="TSTemplateLiteralType"?"types":"expressions")}function Mn(e,t){return gt(e,r=>typeof r=="string"?t?V(0,r,/(\\*)`/g,"$1$1\\`"):ei(r):r)}function ei(e){return V(0,e,/([\\`]|\$\{)/g,"\\$1")}var Bu=/^[fx]?(?:describe|it|test)$/;function Hm({node:e,parent:t}){return e.type==="TemplateLiteral"&&t.type==="TaggedTemplateExpression"&&t.quasi===e&&t.tag.type==="MemberExpression"&&t.tag.property.type==="Identifier"&&t.tag.property.name==="each"&&(t.tag.object.type==="Identifier"&&Bu.test(t.tag.object.name)||t.tag.object.type==="MemberExpression"&&t.tag.object.property.type==="Identifier"&&(t.tag.object.property.name==="only"||t.tag.object.property.name==="skip")&&t.tag.object.object.type==="Identifier"&&Bu.test(t.tag.object.object.name))}var ri=[(e,t)=>t==="properties"&&e.type==="ObjectExpression",(e,t)=>t==="arguments"&&e.type==="CallExpression"&&e.callee.type==="Identifier"&&e.callee.name==="Component",(e,t)=>t==="expression"&&e.type==="Decorator"];function Pu(e){let t=n=>n.type==="TemplateLiteral",r=(n,o)=>Ge(n)&&!n.computed&&n.key.type==="Identifier"&&n.key.name==="styles"&&o==="value";return e.match(t,(n,o)=>Y(n)&&o==="elements",r,...ri)||e.match(t,r,...ri)}function ni(e){return e.match(t=>t.type==="TemplateLiteral",(t,r)=>Ge(t)&&!t.computed&&t.key.type==="Identifier"&&t.key.name==="template"&&r==="value",...ri)}function ti(e,t){return x(e,g.Block|g.Leading,({value:r})=>r===` ${t} `)}function _n({node:e,parent:t},r){return ti(e,r)||Xm(t)&&ti(t,r)||t.type==="ExpressionStatement"&&ti(t,r)}function Xm(e){return e.type==="AsConstExpression"||e.type==="TSAsExpression"&&e.typeAnnotation.type==="TSTypeReference"&&e.typeAnnotation.typeName.type==="Identifier"&&e.typeAnnotation.typeName.name==="const"}async function ku(e,t,r,n){let{node:o}=r,i="";for(let[c,f]of o.quasis.entries()){let{raw:y}=f.value;c>0&&(i+="@prettier-placeholder-"+(c-1)+"-id"),i+=y}let s=await e(i,{parser:"scss"}),u=Nt(r,n,t),a=Vm(s,u);if(!a)throw new Error("Couldn't insert all the expressions");return["`",m([d,a]),D,"`"]}function Vm(e,t){if(!j(t))return e;let r=0,n=gt(ur(e),o=>typeof o!="string"||!o.includes("@prettier-placeholder")?o:o.split(/@prettier-placeholder-(\d+)-id/).map((i,s)=>s%2===0?Ve(i):(r++,t[i])));return t.length===r?n:null}function Km(e){return e.match(void 0,(t,r)=>r==="quasi"&&t.type==="TaggedTemplateExpression"&&lr(t.tag,["css","css.global","css.resolve"]))||e.match(void 0,(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer",(t,r)=>r==="children"&&t.type==="JSXElement"&&t.openingElement.name.type==="JSXIdentifier"&&t.openingElement.name.name==="style"&&t.openingElement.attributes.some(n=>n.type==="JSXAttribute"&&n.name.type==="JSXIdentifier"&&n.name.name==="jsx"))}function Nn(e){return e.type==="Identifier"&&e.name==="styled"}function Iu(e){return/^[A-Z]/.test(e.object.name)&&e.property.name==="extend"}function $m({parent:e}){if(!e||e.type!=="TaggedTemplateExpression")return!1;let t=e.tag.type==="ParenthesizedExpression"?e.tag.expression:e.tag;switch(t.type){case"MemberExpression":return Nn(t.object)||Iu(t);case"CallExpression":return Nn(t.callee)||t.callee.type==="MemberExpression"&&(t.callee.object.type==="MemberExpression"&&(Nn(t.callee.object.object)||Iu(t.callee.object))||t.callee.object.type==="CallExpression"&&Nn(t.callee.object.callee));case"Identifier":return t.name==="css";default:return!1}}function Qm({parent:e,grandparent:t}){return t?.type==="JSXAttribute"&&e.type==="JSXExpressionContainer"&&t.name.type==="JSXIdentifier"&&t.name.name==="css"}var wu=e=>Km(e)||$m(e)||Qm(e)||Pu(e);async function Lu(e,t,r,n){let{node:o}=r,i=o.quasis.length,s=Nt(r,n,t),u=[];for(let a=0;a<i;a++){let c=o.quasis[a],f=a===0,y=a===i-1,F=c.value.cooked,A=F.split(`+`),E=A.length;if(!y&&/#[^\n\r]*$/.test(A[E-1]))return null;let P=E>2&&A[0].trim()===""&&A[1].trim()==="",C=E>2&&A[E-1].trim()===""&&A[E-2].trim()==="",I=A.every(h=>/^\s*(?:#[^\n\r]*)?$/.test(h)),k;I?k=zm(A):k=await e(F,{parser:"graphql"}),k?(k=Mn(k,!1),!f&&P&&u.push(""),u.push(k),!y&&C&&u.push("")):!f&&!y&&P&&u.push(""),y||u.push(s[a])}return["`",m([d,L(d,u)]),d,"`"]}function zm(e){let t=[],r=!1,n=e.map(o=>o.trim());for(let[o,i]of n.entries())i!==""&&(n[o-1]===""&&r?t.push([d,i]):t.push(i),r=!0);return t.length===0?null:L(d,t)}function Ou({node:e,parent:t}){return _n({node:e,parent:t},"GraphQL")||t&&(t.type==="TaggedTemplateExpression"&&(t.tag.type==="MemberExpression"&&t.tag.object.name==="graphql"&&t.tag.property.name==="experimental"||t.tag.type==="Identifier"&&(t.tag.name==="gql"||t.tag.name==="graphql"))||t.type==="CallExpression"&&t.callee.type==="Identifier"&&t.callee.name==="graphql")}var oi=0;async function Mu(e,t,r,n,o){let{node:i}=n,s=oi;oi=oi+1>>>0;let u=I=>`PRETTIER_HTML_PLACEHOLDER_${I}_${s}_IN_JS`,a=i.quasis.map((I,k,h)=>k===h.length-1?I.value.cooked:I.value.cooked+u(k)).join(""),c=Nt(n,o,r),f=new RegExp(u("(\\d+)"),"g"),y=0,F=await t(a,{parser:e,__onHtmlRoot(I){y=I.children.length}}),A=gt(F,I=>{if(typeof I!="string")return I;let k=[],h=I.split(f);for(let v=0;v<h.length;v++){let U=h[v];if(v%2===0){U&&(U=ei(U),o.__embeddedInHtml&&(U=V(0,U,/<\/(?=script\b)/gi,"<\\/")),k.push(U));continue}let ae=Number(U);k.push(c[ae])}return k}),E=/^\s/.test(a)?" ":"",P=/\s$/.test(a)?" ":"",C=o.htmlWhitespaceSensitivity==="ignore"?d:E&&P?T:null;return C?p(["`",m([C,p(A)]),C,"`"]):Et({hug:!1},p(["`",E,y>1?m(p(A)):p(A),P,"`"]))}function _u(e){return _n(e,"HTML")||e.match(t=>t.type==="TemplateLiteral",(t,r)=>t.type==="TaggedTemplateExpression"&&t.tag.type==="Identifier"&&t.tag.name==="html"&&r==="quasi")}var Nu=Mu.bind(void 0,"html"),ju=Mu.bind(void 0,"angular");async function vu(e,t,r){let{node:n}=r,o=V(0,n.quasis[0].value.raw,/((?:\\\\)*)\\`/g,(a,c)=>"\\".repeat(c.length/2)+"`"),i=Zm(o),s=i!=="";s&&(o=V(0,o,new RegExp(`^${i}`,"gm"),""));let u=Mn(await e(o,{parser:"markdown",__inJsTemplate:!0}),!0);return["`",s?m([D,u]):[ar,Js(u)],D,"`"]}function Zm(e){let t=e.match(/^([^\S\n]*)\S/m);return t===null?"":t[1]}function Ru({node:e,parent:t}){return t?.type==="TaggedTemplateExpression"&&e.quasis.length===1&&t.tag.type==="Identifier"&&(t.tag.name==="md"||t.tag.name==="markdown")}var ef=[{test:wu,print:ku},{test:Ou,print:Lu},{test:_u,print:Nu},{test:ni,print:ju},{test:Ru,print:vu}].map(({test:e,print:t})=>({test:e,print:rf(t)}));function tf(e){let{node:t}=e;if(t.type!=="TemplateLiteral"||nf(t))return;let r=ef.find(({test:n})=>n(e));if(r)return t.quasis.length===1&&t.quasis[0].value.raw.trim()===""?"``":r.print}function rf(e){return async(...t)=>{let r=await e(...t);return r&&Et({embed:!0,...r.label},r)}}function nf({quasis:e}){return e.some(({value:{cooked:t}})=>t===null)}var Wu=tf;function Ju(e,t){e.type==="ChainExpression"?of(t):(e.type==="OptionalMemberExpression"||e.type==="OptionalCallExpression")&&sf(t)}function Gu(e){if(N(e))return"object";if(M(e))return"callee";if(We(e))return"expression"}function jn(e){let t=Gu(e);if(t)return e[t]}function of(e){for(e=jn(e);e.type==="MemberExpression"||e.type==="CallExpression"||e.type==="TSNonNullExpression";e=jn(e)){let t=Gu(e),r=e[t];r.type==="ChainExpression"&&(e[t]=r.expression)}}function sf(e){for(e=jn(e);e.type==="MemberExpression"||e.type==="CallExpression";e=jn(e))e.type=`Optional${e.type}`}function Uu(e,t,r){let n=t[r];(q(n)||Ee(n))&&(e[r]=String(n.value)),n.type==="Identifier"&&(e[r]=n.name)}function qu(e,t){(e.type==="Property"||e.type==="ObjectProperty"||e.type==="MethodDefinition"||e.type==="ClassProperty"||e.type==="ClassMethod"||e.type==="PropertyDefinition"||e.type==="TSDeclareMethod"||e.type==="TSPropertySignature"||e.type==="TSMethodSignature"||e.type==="ObjectTypeProperty"||e.type==="ImportAttribute"||e.type==="RecordDeclarationProperty"||e.type==="RecordDeclarationStaticProperty")&&!e.computed&&Uu(t,e,"key"),e.type==="TSEnumMember"&&Uu(t,e,"id")}function Yu(e,t){e.type==="RegExpLiteral"&&(t.flags=[...e.flags].sort().join("")),e.type==="Literal"&&"regex"in e&&(t.regex.flags=[...e.regex.flags].sort().join(""))}var uf=new Set(["range","raw","comments","extra","start","end","loc","errors","tokens","trailingComma","docblock","__contentEnd"]),Er=e=>{for(let t of e.quasis)delete t.value};function ii(e,t,r){if(e.type==="Program"&&delete t.sourceType,Ju(e,t),qu(e,t),Yu(e,t),(Gi(e)||e.type==="BigIntLiteralTypeAnnotation")&&"bigint"in e&&(t.bigint=e.bigint.toLowerCase()),e.type==="EmptyStatement"&&!zt({node:e,parent:r})||e.type==="JSXText"||e.type==="JSXExpressionContainer"&&(e.expression.type==="Literal"||e.expression.type==="StringLiteral")&&e.expression.value===" ")return null;if(e.type==="JSXElement"&&e.openingElement.name.type==="JSXIdentifier"&&e.openingElement.name.name==="style"&&e.openingElement.attributes.some(o=>o.type==="JSXAttribute"&&o.name.name==="jsx"))for(let{type:o,expression:i}of t.children)o==="JSXExpressionContainer"&&i.type==="TemplateLiteral"&&Er(i);e.type==="JSXAttribute"&&e.name.name==="css"&&e.value.type==="JSXExpressionContainer"&&e.value.expression.type==="TemplateLiteral"&&Er(t.value.expression),e.type==="JSXAttribute"&&q(e.value)&&/["']|"|'/.test(e.value.value)&&(t.value.value=V(0,e.value.value,/["']|"|'/g,'"'));let n=e.expression||e.callee;if(e.type==="Decorator"&&n.type==="CallExpression"&&n.callee.name==="Component"&&n.arguments.length===1){let o=e.expression.arguments[0].properties;for(let[i,s]of t.expression.arguments[0].properties.entries())switch(o[i].key.name){case"styles":Y(s.value)&&Er(s.value.elements[0]);break;case"template":s.value.type==="TemplateLiteral"&&Er(s.value);break}}e.type==="TaggedTemplateExpression"&&(e.tag.type==="MemberExpression"||e.tag.type==="Identifier"&&(e.tag.name==="gql"||e.tag.name==="graphql"||e.tag.name==="css"||e.tag.name==="md"||e.tag.name==="markdown"||e.tag.name==="html")||e.tag.type==="CallExpression")&&Er(t.quasi),(e.type==="CallExpression"||e.type==="MemberExpression")&&!e.optional&&delete t.optional,e.type==="TemplateLiteral"&&Er(t)}ii.ignoredProperties=uf;var af=/\*\/$/,pf=/^\/\*\*?/,Ku=/^\s*(\/\*\*?(.|\r?\n)*?\*\/)/,cf=/(^|\s+)\/\/([^\n\r]*)/g,Hu=/^(\r?\n)+/,lf=/(?:^|\r?\n) *(@[^\n\r]*?) *\r?\n *(?![^\n\r@]*\/\/[^]*)([^\s@][^\n\r@]+?) *\r?\n/g,Xu=/(?:^|\r?\n) *@(\S+) *([^\n\r]*)/g,mf=/(\r?\n|^) *\* ?/g,$u=[];function Qu(e){let t=e.match(Ku);return t?t[0].trimStart():""}function zu(e){let r=e.match(Ku)?.[0];return r==null?e:e.slice(r.length)}function Zu(e){e=V(0,e.replace(pf,"").replace(af,""),mf,"$1");let r="";for(;r!==e;)r=e,e=V(0,e,lf,` $1 $2-`);e=e.replace(Yu,"").trimEnd();let n=Object.create(null),o=V(0,e,Hu,"").replace(Yu,"").trimEnd(),i;for(;i=Hu.exec(e);){let s=V(0,i[2],pf,"");if(typeof n[i[1]]=="string"||Array.isArray(n[i[1]])){let u=n[i[1]];n[i[1]]=[...Ku,...Array.isArray(u)?u:[u],s]}else n[i[1]]=s}return{comments:o,pragmas:n}}function Zu({comments:e="",pragmas:t={}}){let s=Object.keys(t),u=s.flatMap(c=>Xu(c,t[c])).map(c=>` * ${c}-`).join("");if(!e){if(s.length===0)return"";if(s.length===1&&!Array.isArray(t[s[0]])){let c=t[s[0]];return`/** ${Xu(s[0],c)[0]} */`}}let a=e.split(`+`);e=e.replace(Hu,"").trimEnd();let n=Object.create(null),o=V(0,e,Xu,"").replace(Hu,"").trimEnd(),i;for(;i=Xu.exec(e);){let s=V(0,i[2],cf,"");if(typeof n[i[1]]=="string"||Array.isArray(n[i[1]])){let u=n[i[1]];n[i[1]]=[...$u,...Array.isArray(u)?u:[u],s]}else n[i[1]]=s}return{comments:o,pragmas:n}}function ea({comments:e="",pragmas:t={}}){let s=Object.keys(t),u=s.flatMap(c=>Vu(c,t[c])).map(c=>` * ${c}+`).join("");if(!e){if(s.length===0)return"";if(s.length===1&&!Array.isArray(t[s[0]])){let c=t[s[0]];return`/** ${Vu(s[0],c)[0]} */`}}let a=e.split(` `).map(c=>` * ${c}`).join(`@@ -26,4 +26,4 @@ `+(e?a:"")+(e&&s.length>0?` *-`:"")+u+" */"}function Xu(e,t){return[...Ku,...Array.isArray(t)?t:[t]].map(r=>`@${e} ${r}`.trim())}var ea="format";function mf(e){if(!e.startsWith("#!"))return"";let t=e.indexOf(`-`);return t===-1?e:e.slice(0,t)}var ta=mf;function ff(e){let t=ta(e);t&&(e=e.slice(t.length+1));let r=$u(e),{pragmas:n,comments:o}=zu(r);return{shebang:t,text:e,pragmas:n,comments:o}}function ra(e){let{shebang:t,text:r,pragmas:n,comments:o}=ff(e),i=Qu(r),s=Zu({pragmas:{[ea]:"",...n},comments:o.trimStart()});return(t?`${t}+`:"")+u+" */"}function Vu(e,t){return[...$u,...Array.isArray(t)?t:[t]].map(r=>`@${e} ${r}`.trim())}var ta="format";function ff(e){if(!e.startsWith("#!"))return"";let t=e.indexOf(`+`);return t===-1?e:e.slice(0,t)}var ra=ff;function Df(e){let t=ra(e);t&&(e=e.slice(t.length+1));let r=Qu(e),{pragmas:n,comments:o}=Zu(r);return{shebang:t,text:e,pragmas:n,comments:o}}function na(e){let{shebang:t,text:r,pragmas:n,comments:o}=Df(e),i=zu(r),s=ea({pragmas:{[ta]:"",...n},comments:o.trimStart()});return(t?`${t} `:"")+s+(i.startsWith(`@@ -32,13 +32,13 @@ -`)+i}function Df(e){if(!le(e))return[];if(!e.value.includes(`+`)+i}function yf(e){if(!le(e))return[];if(!e.value.includes(` `))return[];let t=[];for(let r of`*${e.value}*`.split(`-`)){if(r=r.trimStart(),!r.startsWith("*"))return[];t.push(r)}return t}var yf=new WeakMap;function ii(e){return Z(yf,e,Df)}function jn(e){return ii(e).length>0}function na(e,t){let r=e.node;if(qe(r))return t.originalText.slice(b(r),S(r)).trimEnd();if(jn(r))return Ef(r);if(le(r))return["/*",Xe(r.value),"*/"];throw new Error("Not a comment: "+JSON.stringify(r))}function Ef(e){let t=ii(e),r=e.value[0]==="*"&&e.value[1]!=="*";return["/",t.map((n,o)=>{if(o===0)return[n.trimEnd(),d];if(o===t.length-1)return[" ",n];let i=n.trimEnd(),s=[" ",i];return r&&i!=="*"&&n.endsWith(" ")?[s," ",Js(ar)]:[s,d]}),"/"]}function si(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}var ui=class{#e;constructor(t){this.#e=new Set(t)}getLeadingWhitespaceCount(t){let r=this.#e,n=0;for(let o=0;o<t.length&&r.has(t.charAt(o));o++)n++;return n}getTrailingWhitespaceCount(t){let r=this.#e,n=0;for(let o=t.length-1;o>=0&&r.has(t.charAt(o));o--)n++;return n}getLeadingWhitespace(t){let r=this.getLeadingWhitespaceCount(t);return t.slice(0,r)}getTrailingWhitespace(t){let r=this.getTrailingWhitespaceCount(t);return t.slice(t.length-r)}hasLeadingWhitespace(t){return this.#e.has(t.charAt(0))}hasTrailingWhitespace(t){return this.#e.has(L(0,t,-1))}trimStart(t){let r=this.getLeadingWhitespaceCount(t);return t.slice(r)}trimEnd(t){let r=this.getTrailingWhitespaceCount(t);return t.slice(0,t.length-r)}trim(t){return this.trimEnd(this.trimStart(t))}split(t,r=!1){let n=`[${si([...this.#e].join(""))}]+`,o=new RegExp(r?`(${n})`:n);return t.split(o)}hasWhitespaceCharacter(t){let r=this.#e;return Array.prototype.some.call(t,n=>r.has(n))}hasNonWhitespaceCharacter(t){let r=this.#e;return Array.prototype.some.call(t,n=>!r.has(n))}isWhitespaceOnly(t){let r=this.#e;return Array.prototype.every.call(t,n=>r.has(n))}#t(t){let r=Number.POSITIVE_INFINITY;for(let n of t.split(`+`)){if(r=r.trimStart(),!r.startsWith("*"))return[];t.push(r)}return t}var Ef=new WeakMap;function si(e){return Z(Ef,e,yf)}function vn(e){return si(e).length>0}function oa(e,t){let r=e.node;if(Le(r))return t.originalText.slice(b(r),S(r)).trimEnd();if(vn(r))return df(r);if(le(r))return["/*",Ve(r.value),"*/"];throw new Error("Not a comment: "+JSON.stringify(r))}function df(e){let t=si(e),r=e.value[0]==="*"&&e.value[1]!=="*";return["/",t.map((n,o)=>{if(o===0)return[n.trimEnd(),d];if(o===t.length-1)return[" ",n];let i=n.trimEnd(),s=[" ",i];return r&&i!=="*"&&n.endsWith(" ")?[s," ",Gs(ar)]:[s,d]}),"/"]}function ui(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}var ai=class{#e;constructor(t){this.#e=new Set(t)}getLeadingWhitespaceCount(t){let r=this.#e,n=0;for(let o=0;o<t.length&&r.has(t.charAt(o));o++)n++;return n}getTrailingWhitespaceCount(t){let r=this.#e,n=0;for(let o=t.length-1;o>=0&&r.has(t.charAt(o));o--)n++;return n}getLeadingWhitespace(t){let r=this.getLeadingWhitespaceCount(t);return t.slice(0,r)}getTrailingWhitespace(t){let r=this.getTrailingWhitespaceCount(t);return t.slice(t.length-r)}hasLeadingWhitespace(t){return this.#e.has(t.charAt(0))}hasTrailingWhitespace(t){return this.#e.has(w(0,t,-1))}trimStart(t){let r=this.getLeadingWhitespaceCount(t);return t.slice(r)}trimEnd(t){let r=this.getTrailingWhitespaceCount(t);return t.slice(0,t.length-r)}trim(t){return this.trimEnd(this.trimStart(t))}split(t,r=!1){let n=`[${ui([...this.#e].join(""))}]+`,o=new RegExp(r?`(${n})`:n);return t.split(o)}hasWhitespaceCharacter(t){let r=this.#e;return Array.prototype.some.call(t,n=>r.has(n))}hasNonWhitespaceCharacter(t){let r=this.#e;return Array.prototype.some.call(t,n=>!r.has(n))}isWhitespaceOnly(t){let r=this.#e;return Array.prototype.every.call(t,n=>r.has(n))}#t(t){let r=Number.POSITIVE_INFINITY;for(let n of t.split(` `)){if(n.length===0)continue;let o=this.getLeadingWhitespaceCount(n);if(o===0)return 0;n.length!==o&&o<r&&(r=o)}return r===Number.POSITIVE_INFINITY?0:r}dedentString(t){let r=this.#t(t);return r===0?t:t.split(` `).map(n=>n.slice(r)).join(`-`)}},oa=ui;var dr=new oa(` -\r `);function Xt(e){return e.type==="JSXText"&&(dr.hasNonWhitespaceCharacter(ye(e))||!/\n/.test(ye(e)))}function ia(e){let{node:t,parent:r}=e;if(!H(t)||!H(r))return!1;let{index:n,siblings:o}=e,i;for(let s=n;s>0;s--){let u=o[s-1];if(!(u.type==="JSXText"&&!Xt(u))){i=u;break}}return i?.type==="JSXExpressionContainer"&&i.expression.type==="JSXEmptyExpression"&&Lt(i.expression)}function df(e){return Lt(e.node)||ia(e)}var Cr=df;var ai=class extends Error{name="UnexpectedNodeError";constructor(t,r,n="type"){super(`Unexpected ${r} node ${n}: ${JSON.stringify(t[n])}.`),this.node=t}},it=ai;function sa(e){return e.type==="CallExpression"&&!e.optional&&e.arguments.length===1&&e.callee.type==="Identifier"&&e.callee.name==="Boolean"}var Cf=0;function vn(e,t,r){let{node:n,parent:o,grandparent:i,key:s}=e,u=s!=="body"&&(o.type==="IfStatement"||o.type==="WhileStatement"||o.type==="SwitchStatement"||o.type==="DoWhileStatement"),a=n.operator==="|>"&&e.root.extra?.__isUsingHackPipeline,c=pi(e,t,r,!1,u);if(u)return c;if(a)return p(c);if(s==="callee"&&Tt(o)||o.type==="UnaryExpression"&&!C(n)||N(o)&&!o.computed)return p([f([D,...c]),D]);let m=ut(o)||o.type==="JSXExpressionContainer"&&i.type==="JSXAttribute"||n.operator!=="|"&&o.type==="JsExpressionRoot"||n.type!=="NGPipeExpression"&&(o.type==="NGRoot"&&t.parser==="__ng_binding"||o.type==="NGMicrosyntaxExpression"&&i.type==="NGMicrosyntax"&&i.body.length===1)||n===o.body&&o.type==="ArrowFunctionExpression"||n!==o.body&&o.type==="ForStatement"||o.type==="ConditionalExpression"&&!ut(i)&&!Tt(i)||o.type==="TemplateLiteral"||s==="argument"&&o.type==="UnaryExpression"||s==="arguments"&&sa(o),y=o.type==="AssignmentExpression"||o.type==="VariableDeclarator"||o.type==="ClassProperty"||o.type==="PropertyDefinition"||o.type==="TSAbstractPropertyDefinition"||o.type==="ClassPrivateProperty"||We(o),A=Be(n.left)&&Lr(n.operator,n.left.operator);if(m||Fr(n)&&!A||!Fr(n)&&y)return p(c);if(c.length===0)return"";let x=H(n.right),E=c.findIndex(v=>typeof v!="string"&&!Array.isArray(v)&&v.type===Te),P=c.slice(0,E===-1?1:E+1),F=c.slice(P.length,x?-1:void 0),I=Symbol("logicalChain-"+ ++Cf),k=p([...P,f(F)],{id:I});if(!x)return k;let h=L(0,c,-1);return p([k,ht(h,{groupId:I})])}function pi(e,t,r,n,o){let{node:i}=e;if(!Be(i))return[p(r())];let s=[];Lr(i.operator,i.left.operator)?s=e.call(()=>pi(e,t,r,!0,o),"left"):s.push(p(r("left")));let u=Fr(i),a=i.right.type==="ChainExpression"?i.right.expression:i.right,c=(i.type==="NGPipeExpression"||i.operator==="|>"||Ff(e,t))&&!Le(t.originalText,a),y=!C(a,T.Leading,nr)&&Le(t.originalText,a),A=i.type==="NGPipeExpression"?"|":i.operator,x=i.type==="NGPipeExpression"&&i.arguments.length>0?p(f([D,": ",w([g,": "],e.map(()=>he(2,p(r())),"arguments"))])):"",E;if(u)E=[A,Le(t.originalText,a)?f([g,r("right"),x]):[" ",r("right"),x]];else{let h=A==="|>"&&e.root.extra?.__isUsingHackPipeline?e.call(()=>pi(e,t,r,!0,o),"right"):r("right");if(t.experimentalOperatorPosition==="start"){let v="";if(y)switch(He(h)){case Oe:v=h[0],h.shift();break;case _e:v=h.contents[0],h.contents.shift();break}E=[g,v,A," ",h,x]}else E=[c?g:"",A,c?" ":g,h,x]}let{parent:P}=e,F=C(i.left,T.Trailing|T.Line);if((F||!(o&&i.type==="LogicalExpression")&&P.type!==i.type&&i.left.type!==i.type&&i.right.type!==i.type)&&(E=p(E,{shouldBreak:F})),t.experimentalOperatorPosition==="start"?s.push(u||y?" ":"",E):s.push(c?"":" ",E),n&&C(i)){let k=ur(Q(e,s,t));return k.type===Je?k.parts:Array.isArray(k)?k:[k]}return s}function Fr(e){return e.type!=="LogicalExpression"?!1:!!(ie(e.right)&&e.right.properties.length>0||Y(e.right)&&e.right.elements.length>0||H(e.right))}var ua=e=>e.type==="BinaryExpression"&&e.operator==="|";function Ff(e,t){return(t.parser==="__vue_expression"||t.parser==="__vue_ts_expression")&&ua(e.node)&&!e.hasAncestor(r=>!ua(r)&&r.type!=="JsExpressionRoot")}function pa(e,t,r){let{node:n}=e;if(n.type.startsWith("NG"))switch(n.type){case"NGRoot":return r("node");case"NGPipeExpression":return vn(e,t,r);case"NGChainedExpression":return p(w([";",g],e.map(()=>Tf(e)?r():["(",r(),")"],"expressions")));case"NGEmptyExpression":return"";case"NGMicrosyntax":return e.map(()=>[e.isFirst?"":aa(e)?" ":[";",g],r()],"body");case"NGMicrosyntaxKey":return/^[$_a-z][\w$]*(?:-[$_a-z][\w$])*$/i.test(n.name)?n.name:JSON.stringify(n.name);case"NGMicrosyntaxExpression":return[r("expression"),n.alias===null?"":[" as ",r("alias")]];case"NGMicrosyntaxKeyedExpression":{let{index:o,parent:i}=e,s=aa(e)||xf(e)||(o===1&&(n.key.name==="then"||n.key.name==="else"||n.key.name==="as")||o===2&&(n.key.name==="else"&&i.body[o-1].type==="NGMicrosyntaxKeyedExpression"&&i.body[o-1].key.name==="then"||n.key.name==="track"))&&i.body[0].type==="NGMicrosyntaxExpression";return[r("key"),s?" ":": ",r("expression")]}case"NGMicrosyntaxLet":return["let ",r("key"),n.value===null?"":[" = ",r("value")]];case"NGMicrosyntaxAs":return[r("key")," as ",r("alias")];default:throw new it(n,"Angular")}}function aa({node:e,index:t}){return e.type==="NGMicrosyntaxKeyedExpression"&&e.key.name==="of"&&t===1}function xf(e){let{node:t}=e;return e.parent.body[1].key.name==="of"&&t.type==="NGMicrosyntaxKeyedExpression"&&t.key.name==="track"&&t.key.type==="NGMicrosyntaxKey"}var Af=B(["CallExpression","OptionalCallExpression","AssignmentExpression"]);function Tf({node:e}){return _r(e,Af)}function ci(e,t,r){let{node:n}=e;return p([w(g,e.map(r,"decorators")),la(n,t)?d:g])}function ca(e,t,r){return ma(e.node)?[w(d,e.map(r,"declaration","decorators")),d]:""}function Rn(e,t,r){let{node:n,parent:o}=e,{decorators:i}=n;if(!j(i)||ma(o)||Cr(e))return"";let s=n.type==="ClassExpression"||n.type==="ClassDeclaration"||la(n,t);return[e.key==="declaration"&&qi(o)?d:s?Ne:"",w(g,e.map(r,"decorators")),g]}function la(e,t){return e.decorators.some(r=>J(t.originalText,S(r)))}function ma(e){if(e.type!=="ExportDefaultDeclaration"&&e.type!=="ExportNamedDeclaration"&&e.type!=="DeclareExportDeclaration")return!1;let t=e.declaration?.decorators;return j(t)&&kt(e,t[0])}function Wn(e){return e.type==="UnaryExpression"&&(e.operator==="+"||e.operator==="-")&&Ee(e.argument)}function xr(e,t,r){let{node:n}=e,o=[],i=Zt(n)?"elementTypes":"elements",s=n[i];if(s.length===0&&!n.inexact)o.push(p(["[",Mt(e,t),"]"]));else{let u=L(0,s,-1),a=u?.type!=="RestElement"&&!n.inexact,c=u===null,m=Symbol("array"),y=!t.__inJestEach&&s.length>1&&s.every((E,P,F)=>{if(!Y(E)&&!ie(E))return!1;let I=E?.type,k=F[P+1];if(k&&I!==k.type)return!1;let h=Y(E)?"elements":"properties";return E[h]&&E[h].length>1})||C(n,T.Dangling|T.Line),A=li(n,t),x=a?c?",":Tn(t)?A?O(",","",{groupId:m}):O(","):"":"";o.push(p(["[",f([D,A?hf(e,t,r,x):[gf(e,t,r,i,n.inexact),x],W(e,t)]),D,"]"],{shouldBreak:y,id:m}))}return o.push($(e),G(e,r)),o}function li(e,t){return Y(e)&&e.elements.length>0&&e.elements.every(r=>r&&(Ee(r)||Wn(r)&&!C(r.argument))&&!C(r,T.Trailing|T.Line,n=>!J(t.originalText,b(n),{backwards:!0})))}function fa({node:e},{originalText:t}){let r=S(e);if(r===b(e))return!1;let{length:n}=t;for(;r<n&&t[r]!==",";)r=tr(t,rr(t,r+1));return Gt(t,r)}function gf(e,t,r,n,o){let i=[];return e.each(({node:s,isLast:u})=>{i.push(s?p(r()):""),(!u||o)&&i.push([",",g,s&&fa(e,t)?D:""])},n),o&&i.push("..."),i}function hf(e,t,r,n){let o=[];return e.each(({isLast:i,next:s})=>{o.push([r(),i?n:","]),i||o.push(fa(e,t)?[d,d]:C(s,T.Leading|T.Line)?d:g)},"elements"),Dn(o)}function mi(e){return e.quasis.some(t=>t.value.raw.includes(`-`))}function Jn(e,t){return(e.type==="TemplateLiteral"&&mi(e)||e.type==="TaggedTemplateExpression"&&mi(e.quasi))&&!J(t,b(e),{backwards:!0})}var Sf=new WeakMap;function Da(e){return Z(Sf,e,t=>t.type==="ConditionalExpression"&&!Ce(t,r=>r.type==="ObjectExpression"))}var Bf=e=>e.type==="SequenceExpression";function ya(e,t,r,n={}){let o=[],i,s=[],u=!1,a=!n.expandLastArg&&e.node.body.type==="ArrowFunctionExpression",c;(function I(){let{node:k}=e,h=bf(e,t,r,n);if(o.length===0)o.push(h);else{let{leading:v,trailing:U}=An(e,t);o.push([v,h]),s.unshift(U)}a&&(u||(u=k.returnType&&ee(k).length>0||k.typeParameters||ee(k).some(v=>v.type!=="Identifier"))),!a||k.body.type!=="ArrowFunctionExpression"?(i=r("body",n),c=k.body):e.call(I,"body")})();let m=!Le(t.originalText,c)&&(Bf(c)||Pf(c,i,t)||!u&&Da(c)),y=e.key==="callee"&&Dt(e.parent),A=Symbol("arrow-chain"),x=If(e,n,{signatureDocs:o,shouldBreak:u}),E=!1,P=!1,F=!1;return a&&(y||n.assignmentLayout)&&(P=!0,F=!C(e.node,T.Leading&T.Line),E=n.assignmentLayout==="chain-tail-arrow-chain"||y&&!m),i=kf(e,t,n,{bodyDoc:i,bodyComments:s,functionBody:c,shouldPutBodyOnSameLine:m}),p([p(P?f([F?D:"",x]):x,{shouldBreak:E,id:A})," =>",a?ht(i,{groupId:A}):p(i),a&&y?O(D,"",{groupId:A}):""])}function bf(e,t,r,n){let{node:o}=e,i=[];if(o.async&&i.push("async "),In(e,t))i.push(r(["params",0]));else{let u=n.expandLastArg||n.expandFirstArg,a=kn(e,r);if(u){if(ue(a))throw new St;a=p(Jt(a))}i.push(p([Ve(e,t,r,u,!0),a]))}let s=W(e,t,{marker:"commentBeforeArrow"});return s&&i.push(" ",s),i}function Pf(e,t,r){return Y(e)||ie(e)||e.type==="ArrowFunctionExpression"||e.type==="DoExpression"||e.type==="BlockStatement"||H(e)||t.label?.hug!==!1&&(t.label?.embed||Jn(e,r.originalText))}function If(e,t,{signatureDocs:r,shouldBreak:n}){if(r.length===1)return r[0];let{parent:o,key:i}=e;return i!=="callee"&&Dt(o)||Be(o)?p([r[0]," =>",f([g,w([" =>",g],r.slice(1))])],{shouldBreak:n}):i==="callee"&&Dt(o)||t.assignmentLayout?p(w([" =>",g],r),{shouldBreak:n}):p(f(w([" =>",g],r)),{shouldBreak:n})}function kf(e,t,r,{bodyDoc:n,bodyComments:o,functionBody:i,shouldPutBodyOnSameLine:s}){let{node:u,parent:a}=e,c=r.expandLastArg?Ie(t,"all"):"",m=(r.expandLastArg||a.type==="JSXExpressionContainer")&&!C(u)?D:"";return s&&Da(i)?[" ",p([O("","("),f([D,n]),O("",")"),c,m]),o]:s?[" ",n,o]:[f([g,n,o]),c,m]}var wf=.25;function Wr(e,t){let{printWidth:r}=t;if(C(e))return!1;let n=r*wf;if(e.type==="ThisExpression"||e.type==="Identifier"&&e.name.length<=n||Wn(e)&&!C(e.argument))return!0;let o=e.type==="Literal"&&"regex"in e&&e.regex.pattern||e.type==="RegExpLiteral"&&e.pattern;return o?o.length<=n:q(e)?ot(ye(e),t).length<=n:e.type==="TemplateLiteral"?e.expressions.length===0&&e.quasis[0].value.raw.length<=n&&!e.quasis[0].value.raw.includes(`-`):e.type==="UnaryExpression"?Wr(e.argument,{printWidth:r}):e.type==="CallExpression"&&e.arguments.length===0&&e.callee.type==="Identifier"?e.callee.name.length<=n-2:er(e)}function jt(e){return N(e)||e.type==="BindExpression"&&!!e.object}function Ea(e){if(e.length<=1)return!1;let t=0;for(let r of e)if(wt(r)){if(t+=1,t>1)return!0}else if(r=Pe(r),M(r)){for(let n of se(r))if(wt(n))return!0}return!1}function Gn(e){let{node:t,parent:r,key:n}=e;return n==="callee"&&M(t)&&M(r)&&r.arguments.length>0&&t.arguments.length>r.arguments.length}var Lf=new Set(["!","-","+","~"]),Of=B(["Identifier","ThisExpression","Super","PrivateName","PrivateIdentifier"]);function st(e,t=2){if(t<=0)return!1;let r=n=>st(n,t-1);if(e=Pe(e),Xr(e))return dt(e.pattern??e.regex.pattern)<=5;if(er(e)||Of(e)||e.type==="ArgumentPlaceholder")return!0;if(e.type==="TemplateLiteral")return e.quasis.every(n=>!n.value.raw.includes(`-`))&&e.expressions.every(r);if(ie(e))return e.properties.every(n=>!n.computed&&(n.shorthand||n.value&&r(n.value)));if(Y(e))return e.elements.every(n=>n===null||r(n));if(Dt(e)){if(e.type==="ImportExpression"||st(e.callee,t)){let n=se(e);return n.length<=t&&n.every(r)}return!1}return N(e)?st(e.object,t)&&st(e.property,t):e.type==="UnaryExpression"&&Lf.has(e.operator)||e.type==="UpdateExpression"?st(e.argument,t):!1}function Mf(e,t,r){let{node:n}=e,o=se(n);if(o.length===0)return p(["(",Mt(e,t),")"]);let i=o.length-1;if(jf(o)){let y=["("];return kr(e,(A,x)=>{y.push(r()),x!==i&&y.push(", ")}),y.push(")"),y}let s=!1,u=[];kr(e,({node:y},A)=>{let x=r();A===i||(me(y,t)?(s=!0,x=[x,",",d,d]):x=[x,",",g]),u.push(x)});let a=e.root.type!=="NGRoot"&&n.type!=="ImportExpression"&&n.type!=="TSImportType"&&n.type!=="TSExternalModuleReference"?Ie(t,"all"):"";function c(){return p(["(",f([g,...u]),a,g,")"],{shouldBreak:!0})}if(s||e.parent.type!=="Decorator"&&Ea(o))return c();if(Nf(o)){let y=u.slice(1);if(y.some(ue))return c();let A;try{A=r(go(n,0),{expandFirstArg:!0})}catch(x){if(x instanceof St)return c();throw x}return ue(A)?[Ne,mt([["(",p(A,{shouldBreak:!0}),", ",...y,")"],c()])]:mt([["(",A,", ",...y,")"],["(",p(A,{shouldBreak:!0}),", ",...y,")"],c()])}if(_f(o,u,t)){let y=u.slice(0,-1);if(y.some(ue))return c();let A;try{A=r(go(n,-1),{expandLastArg:!0})}catch(x){if(x instanceof St)return c();throw x}return ue(A)?[Ne,mt([["(",...y,p(A,{shouldBreak:!0}),")"],c()])]:mt([["(",...y,A,")"],["(",...y,p(A,{shouldBreak:!0}),")"],c()])}let m=["(",f([D,...u]),a,D,")"];return Gn(e)?m:p(m,{shouldBreak:u.some(ue)||s})}function Un(e,t=!1){if(ie(e)&&(e.properties.length>0||C(e))||Y(e)&&(e.elements.length>0||C(e))||(de(e)||e.type==="TSTypeAssertion")&&Un(e.expression)||e.type==="FunctionExpression"||e.type==="DoExpression"||e.type==="ModuleExpression")return!0;if(e.type==="ArrowFunctionExpression"){let{body:r}=e;if(r.type==="BlockStatement"||H(r)||ie(r)||Y(r)||r.type==="ArrowFunctionExpression"&&Un(r,!0)||!t&&(r.type==="ConditionalExpression"||M(Pe(r))))return!0}return!1}function _f(e,t,r){if(e.length===1){let i=L(0,t,-1);if(i.label?.embed&&i.label?.hug!==!1)return!0}let n=L(0,e,-1),o=L(0,e,-2);return!C(n,T.Leading)&&!C(n,T.Trailing)&&Un(n)&&(!o||o.type!==n.type)&&(e.length!==2||o.type!=="ArrowFunctionExpression"||!Y(n))&&!(e.length>1&&li(n,r))}function Nf(e){if(e.length!==2)return!1;let[t,r]=e;return t.type==="ModuleExpression"&&vf(r)?!0:!C(t)&&(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression"&&t.body.type==="BlockStatement")&&r.type!=="FunctionExpression"&&r.type!=="ArrowFunctionExpression"&&r.type!=="ConditionalExpression"&&Ca(r)&&!Un(r)}function Ca(e){if(e.type==="ParenthesizedExpression")return Ca(e.expression);if(de(e)||e.type==="TypeCastExpression"){let{typeAnnotation:t}=e;if(t.type==="TypeAnnotation"&&(t=t.typeAnnotation),t.type==="TSArrayType"&&(t=t.elementType,t.type==="TSArrayType"&&(t=t.elementType)),t.type==="GenericTypeAnnotation"||t.type==="TSTypeReference"){let r=t.type==="GenericTypeAnnotation"?t.typeParameters:t.typeArguments;r?.params.length===1&&(t=r.params[0])}return cr(t)&&st(e.expression,1)}return Dt(e)&&se(e).length>1?!1:Be(e)?st(e.left,1)&&st(e.right,1):Xr(e)||st(e)}function jf(e){return e.length===2?da(e,0):e.length===3?e[0].type==="Identifier"&&da(e,1):!1}function da(e,t){let r=e[t],n=e[t+1];return r.type==="ArrowFunctionExpression"&&ee(r).length===0&&r.body.type==="BlockStatement"&&n.type==="ArrayExpression"&&e.every(o=>!C(o))}function vf(e){if(!(e.type==="ObjectExpression"&&e.properties.length===1))return!1;let[t]=e.properties;return We(t)?!t.computed&&(t.key.type==="Identifier"&&t.key.name==="type"||q(t.key)&&t.key.value==="type")&&q(t.value)&&t.value.value==="module":!1}var Jr=Mf;function Fa(e,t,r){return[r("object"),p(f([D,fi(e,t,r)]))]}function fi(e,t,r){return["::",r("callee")]}var Rf=e=>M(e)&&se(e).length>0;function Wf(e){let{node:t,ancestors:r}=e;for(let n of r){if(!(N(n)&&n.object===t||n.type==="TSNonNullExpression"&&n.expression===t))return n.type==="NewExpression"&&n.callee===t;t=n}return!1}function xa(e,t,r){let n=r("object"),o=Di(e,t,r),{node:i}=e,s=e.findAncestor(c=>!(N(c)||c.type==="TSNonNullExpression")),u=e.findAncestor(c=>!Re(c)),a=s.type==="BindExpression"||s.type==="AssignmentExpression"&&s.left.type!=="Identifier"||Wf(e)||i.computed||i.object.type==="Identifier"&&i.property.type==="Identifier"&&!N(u)||(u.type==="AssignmentExpression"||u.type==="VariableDeclarator")&&(Rf(Pe(i.object))||n.label?.memberChain);return Et(n.label,[n,Se,a?o:p(f([D,o]))])}function Di(e,t,r){let n=r("property"),{node:o}=e,i=$(e);return o.computed?!o.property||Ee(o.property)?[i,"[",n,"]"]:p([i,"[",f([D,n]),D,"]"]):[i,".",n]}function Jf(e,t,r){let n=(e.parent.type==="ChainExpression"?e.grandparent:e.parent).type==="ExpressionStatement",o=[];function i(_){let{originalText:Ae}=t,we=Wt(Ae,S(_));return Ae.charAt(we)===")"?we!==!1&&Gt(Ae,we+1):me(_,t)}function s(){let{node:_}=e;if(M(_)&&(jt(_.callee)||M(_.callee))&&!ne(e,t)){let Ae=i(_);o.unshift({node:_,hasTrailingEmptyLine:Ae,printed:[Q(e,[$(e),r("typeArguments"),Jr(e,t,r)],t),Ae?d:""]}),e.call(s,"callee")}else jt(_)&&!ne(e,t)?(o.unshift({node:_,printed:Q(e,N(_)?Di(e,t,r):fi(e,t,r),t)}),e.call(s,"object")):_.type==="ChainExpression"&&!ne(e,t)?e.call(s,"expression"):_.type==="TSNonNullExpression"&&!ne(e,t)?(o.unshift({node:_,printed:Q(e,"!",t)}),e.call(s,"expression")):o.unshift({node:_,printed:r()})}let{node:u}=e;o.unshift({node:u,printed:[$(e),r("typeArguments"),Jr(e,t,r)]}),u.callee&&e.call(s,"callee");let a=[],c=[o[0]],m=1;for(;m<o.length&&(o[m].node.type==="TSNonNullExpression"||o[m].node.type==="ChainExpression"||M(o[m].node)||N(o[m].node)&&o[m].node.computed&&Ee(o[m].node.property));++m)c.push(o[m]);if(!M(o[0].node))for(;m+1<o.length&&(jt(o[m].node)&&jt(o[m+1].node));++m)c.push(o[m]);a.push(c),c=[];let y=!1;for(;m<o.length;++m){if(y&&jt(o[m].node)){if(o[m].node.computed&&Ee(o[m].node.property)){c.push(o[m]);continue}a.push(c),c=[],y=!1}(M(o[m].node)||o[m].node.type==="ImportExpression")&&(y=!0),c.push(o[m]),C(o[m].node,T.Trailing)&&(a.push(c),c=[],y=!1)}c.length>0&&a.push(c);function A(_){return/^[A-Z]|^[$_]+$/.test(_)}function x(_){return _.length<=t.tabWidth}function E(_){let Ae=_[1][0]?.node.computed;if(_[0].length===1){let Pt=_[0][0].node;return Pt.type==="ThisExpression"||Pt.type==="Identifier"&&(A(Pt.name)||n&&x(Pt.name)||Ae)}let we=L(0,_[0],-1).node;return N(we)&&we.property.type==="Identifier"&&(A(we.property.name)||Ae)}let P=a.length>=2&&!C(a[1][0].node)&&E(a);function F(_){return _.map(Ae=>Ae.printed)}function I(_){return _.length===0?"":f([d,w(d,_.map(F))])}let k=a.map(F),h=k,v=P?3:2,U=a.flat(),ae=U.slice(1,-1).some(_=>C(_.node,T.Leading))||U.slice(0,-1).some(_=>C(_.node,T.Trailing))||a[v]&&C(a[v][0].node,T.Leading);if(a.length<=v&&!ae&&a.every(_=>!L(0,_,-1).hasTrailingEmptyLine))return Gn(e)?h:p(h);let fe=L(0,a[P?1:0],-1).node,z=!M(fe)&&i(fe),xe=[F(a[0]),P?a.slice(1,2).map(F):"",z?d:"",I(a.slice(P?2:1))],De=o.map(({node:_})=>_).filter(M);function xt(){let _=L(0,L(0,a,-1),-1).node,Ae=L(0,k,-1);return M(_)&&ue(Ae)&&De.slice(0,-1).some(we=>we.arguments.some(wt))}let bt;return ae||De.length>2&&De.some(_=>_.arguments.some(Ae=>!st(Ae)))||k.slice(0,-1).some(ue)||xt()?bt=p(xe):bt=[ue(h)||z?Ne:"",mt([h,xe])],Et({memberChain:!0},bt)}var Aa=Jf;function Vt(e,t,r){let{node:n}=e,o=n.type==="NewExpression",i=$(e),s=se(n),u=n.type!=="TSImportType"&&n.typeArguments?[r("typeArguments"),Se]:"",a=s.length===1&&Jn(s[0],t.originalText);if(a||Uf(e)||qf(e)||Ut(n,e.parent)){let y=[];if(kr(e,()=>{y.push(r())}),!(a&&y[0].label?.embed))return[Ta(e,r),i,u,"(",w(", ",y),")"]}let c=n.type==="ImportExpression"||n.type==="TSImportType"||n.type==="TSExternalModuleReference";if(!c&&!o&&jt(n.callee)&&!e.call(()=>ne(e,t),"callee",...n.callee.type==="ChainExpression"?["expression"]:[]))return Aa(e,t,r);let m=[Ta(e,r),i,u,Jr(e,t,r)];return c||M(n.callee)?p(m):m}function Ta(e,t){let{node:r}=e;return r.type==="ImportExpression"?`import${r.phase?`.${r.phase}`:""}`:r.type==="TSImportType"?"import":r.type==="TSExternalModuleReference"?"require":[r.type==="NewExpression"?"new ":"",t("callee"),Se]}var Gf=["require","require.resolve","require.resolve.paths","import.meta.resolve"];function Uf(e){let{node:t}=e;if(!(t.type==="ImportExpression"||t.type==="TSImportType"||t.type==="TSExternalModuleReference"||t.type==="CallExpression"&&!t.optional&&lr(t.callee,Gf)))return!1;let r=se(t);return r.length===1&&q(r[0])&&!C(r[0])}function qf(e){let{node:t}=e;if(t.type!=="CallExpression"||t.optional||t.callee.type!=="Identifier")return!1;let r=se(t);return t.callee.name==="require"?(r.length===1&&q(r[0])||r.length>1)&&!C(r[0]):t.callee.name==="define"&&e.parent.type==="ExpressionStatement"?r.length===1||r.length===2&&r[0].type==="ArrayExpression"||r.length===3&&q(r[0])&&r[1].type==="ArrayExpression":!1}function vt(e,t,r,n,o,i){let s=Yf(e,t,r,n,i),u=i?r(i,{assignmentLayout:s}):"";switch(s){case"break-after-operator":return p([p(n),o,p(f([g,u]))]);case"never-break-after-operator":return p([p(n),o," ",u]);case"fluid":{let a=Symbol("assignment");return p([p(n),o,p(f(g),{id:a}),Se,ht(u,{groupId:a})])}case"break-lhs":return p([n,o," ",p(u)]);case"chain":return[p(n),o,g,u];case"chain-tail":return[p(n),o,f([g,u])];case"chain-tail-arrow-chain":return[p(n),o,u];case"only-left":return n}}function Sa(e,t,r){let{node:n}=e;return vt(e,t,r,r("left"),[" ",n.operator],"right")}function Ba(e,t,r){return vt(e,t,r,r("id")," =","init")}function Yf(e,t,r,n,o){let{node:i}=e,s=i[o];if(!s)return"only-left";let u=!qn(s);if(e.match(qn,ba,A=>!u||A.type!=="ExpressionStatement"&&A.type!=="VariableDeclaration"))return u?s.type==="ArrowFunctionExpression"&&s.body.type==="ArrowFunctionExpression"?"chain-tail-arrow-chain":"chain-tail":"chain";if(!u&&qn(s.right)||pe(s)&&!Ht(s)||Le(t.originalText,s)||C(s,T.Leading,jn))return"break-after-operator";if(i.type==="ImportAttribute"||s.type==="CallExpression"&&s.callee.name==="require"||e.root.type==="JsonRoot")return"never-break-after-operator";let m=Ns(n);if(Xf(i)||$f(i)||yi(i)&&m)return"break-lhs";let y=Qf(i,n,t);return e.call(()=>Hf(e,t,r,y),o)?"break-after-operator":Vf(i)?"break-lhs":!m&&(y||s.type==="TemplateLiteral"||s.type==="TaggedTemplateExpression"||Gi(s)||Ee(s)||s.type==="ClassExpression")?"never-break-after-operator":"fluid"}function Hf(e,t,r,n){let o=e.node;if(Be(o)&&!Fr(o))return!0;switch(o.type){case"StringLiteralTypeAnnotation":case"SequenceExpression":return!0;case"TSConditionalType":case"ConditionalTypeAnnotation":if(!t.experimentalTernaries&&!Zf(o))break;return!0;case"ConditionalExpression":{if(!t.experimentalTernaries){let{test:c}=o;return Be(c)&&!Fr(c)}let{consequent:u,alternate:a}=o;return u.type==="ConditionalExpression"||a.type==="ConditionalExpression"}case"ClassExpression":return j(o.decorators)}if(n)return!1;let i=o,s=[];for(;;)if(i.type==="UnaryExpression"||i.type==="AwaitExpression"||i.type==="YieldExpression"&&i.argument!==null)i=i.argument,s.push("argument");else if(i.type==="TSNonNullExpression")i=i.expression,s.push("expression");else break;return!!(q(i)||e.call(()=>Pa(e,t,r),...s))}function Xf(e){if(ba(e)){let t=e.left||e.id;return t.type==="ObjectPattern"&&t.properties.length>2&&t.properties.some(r=>We(r)&&(!r.shorthand||r.value?.type==="AssignmentPattern"))}return!1}function qn(e){return e.type==="AssignmentExpression"}function ba(e){return qn(e)||e.type==="VariableDeclarator"}function Vf(e){let t=Kf(e);if(j(t)){let r=e.type==="TSTypeAliasDeclaration"?"constraint":"bound";if(t.length>1&&t.some(n=>n[r]||n.default))return!0}return!1}function Kf(e){if(Vr(e))return e.typeParameters?.params}function $f(e){if(e.type!=="VariableDeclarator")return!1;let{typeAnnotation:t}=e.id;if(!t||!t.typeAnnotation)return!1;let r=ga(t.typeAnnotation);return j(r)&&r.length>1&&r.some(n=>j(ga(n))||n.type==="TSConditionalType")}function yi(e){return e.type==="VariableDeclarator"&&e.init?.type==="ArrowFunctionExpression"}function ga(e){let t;switch(e.type){case"GenericTypeAnnotation":t=e.typeParameters;break;case"TSTypeReference":t=e.typeArguments;break}return t?.params}function Pa(e,t,r,n=!1){let{node:o}=e,i=()=>Pa(e,t,r,!0);if(Re(o))return e.call(i,"expression");if(M(o)){if(Vt(e,t,r).label?.memberChain)return!1;let u=se(o);return!(u.length===0||u.length===1&&Wr(u[0],t))||zf(o,r)?!1:e.call(i,"callee")}return N(o)?e.call(i,"object"):n&&(o.type==="Identifier"||o.type==="ThisExpression")}function Qf(e,t,r){return We(e)?(t=ur(t),typeof t=="string"&&dt(t)<r.tabWidth+3):!1}function zf(e,t){let r=e.typeArguments?.params;if(j(r)){if(r.length>1)return!0;if(r.length===1){let n=r[0];if(pe(n)||At(n)||n.type==="TSTypeLiteral"||n.type==="ObjectTypeAnnotation")return!0}if(ue(t("typeArguments")))return!0}return!1}function ha(e){switch(e.type){case"FunctionTypeAnnotation":case"GenericTypeAnnotation":case"TSFunctionType":return!!e.typeParameters;case"TSTypeReference":return!!e.typeArguments;default:return!1}}function Zf(e){return ha(e.checkType)||ha(e.extendsType)}function Ia(e,t,r){let{node:n}=e,o=["await"];if(n.argument){o.push(" ",r("argument"));let{parent:i}=e;if(M(i)&&i.callee===n||N(i)&&i.object===n){o=[f([D,...o]),D];let s=e.findAncestor(u=>u.type==="AwaitExpression"||u.type==="BlockStatement");if(s?.type!=="AwaitExpression"||!Ce(s.argument,u=>u===n))return p(o)}}return o}var eD=Array.prototype.findLast??function(e){for(let t=this.length-1;t>=0;t--){let r=this[t];if(e(r,t,this))return r}},tD=Qt("findLast",function(){if(Array.isArray(this))return eD}),ka=tD;function Gr(e,t,r,n){let{node:o}=e,i=[],s=ka(0,o[n],u=>u.type!=="EmptyStatement");return e.each(({node:u})=>{u.type!=="EmptyStatement"&&(i.push(r()),u!==s&&(i.push(d),me(u,t)&&i.push(d)))},n),i}function Yn(e,t,r){let n=rD(e,t,r),{node:o,parent:i}=e;if(o.type==="Program"&&i?.type!=="ModuleExpression")return n?[n,d]:"";let s=[];if(o.type==="StaticBlock"&&s.push("static "),s.push("{"),n)s.push(f([d,n]),d);else{let u=e.grandparent;i.type==="ArrowFunctionExpression"||i.type==="FunctionExpression"||i.type==="FunctionDeclaration"||i.type==="ComponentDeclaration"||i.type==="HookDeclaration"||i.type==="ObjectMethod"||i.type==="ClassMethod"||i.type==="ClassPrivateMethod"||i.type==="ForStatement"||i.type==="WhileStatement"||i.type==="DoWhileStatement"||i.type==="DoExpression"||i.type==="ModuleExpression"||i.type==="CatchClause"&&!u.finalizer||i.type==="TSModuleDeclaration"||i.type==="MatchStatementCase"||o.type==="StaticBlock"||s.push(d)}return s.push("}"),s}function rD(e,t,r){let{node:n}=e,o=j(n.directives),i=n.body.some(a=>a.type!=="EmptyStatement"),s=C(n,T.Dangling);if(!o&&!i&&!s)return"";let u=[];return o&&(u.push(Gr(e,t,r,"directives")),(i||s)&&(u.push(d),me(L(0,n.directives,-1),t)&&u.push(d))),i&&u.push(Gr(e,t,r,"body")),s&&u.push(W(e,t)),u}function nD(e){let t=new WeakMap;return r=>Z(t,r,()=>Symbol(e))}var wa=nD;var La=["properties","indexers","callProperties","internalSlots"];function Oa(e,t){let{node:r}=e;if(r.type==="ClassBody"||r.type==="TSInterfaceBody"){e.each(t,"body");return}if(r.type==="TSTypeLiteral"){e.each(t,"members");return}if(r.type==="RecordDeclarationBody"){e.each(t,"elements");return}if(r.type==="ObjectTypeAnnotation"){let n=La.flatMap(o=>e.map(({node:i,index:s})=>({node:i,loc:b(i),selector:[o,s]}),o)).sort((o,i)=>o.loc-i.loc);for(let[o,{node:i,selector:s}]of n.entries())e.call(()=>t({node:i,next:n[o+1]?.node,isLast:o===n.length-1}),...s)}}function Ma(e){if(e.type==="ObjectTypeAnnotation")return La.some(r=>j(e[r]));let t=e.type==="RecordDeclarationBody"?e.elements:e.body;return j(t)}function Kt(e,t,r){let{node:n}=e,o=[],i=n.type==="ObjectTypeAnnotation",s=n.type==="RecordDeclarationBody",u=!Na(e),a=u?g:d,c=C(n,T.Dangling),[m,y]=i&&n.exact?["{|","|}"]:"{}",A;if(Oa(e,({node:x,next:E,isLast:P})=>{if(A??(A=x),o.push(r()),!s&&u&&i){let{parent:F}=e;F.inexact||!P?o.push(","):o.push(Ie(t))}s&&x.type!=="MethodDefinition"&&o.push(","),!s&&!u&&(oD({node:x,next:E},t)||va({node:x,next:E},t))&&o.push(";"),P||(o.push(a),me(x,t)&&o.push(d))}),c&&o.push(W(e,t)),n.type==="ObjectTypeAnnotation"&&n.inexact){let x;C(n,T.Dangling)?x=[C(n,T.Line)||J(t.originalText,S(L(0,oe(n),-1)))?d:g,"..."]:x=[A?g:"","..."],o.push(x)}if(u){let x=C(n,T.Dangling|T.Line)||t.objectWrap==="preserve"&&A&&te(t.originalText,b(n),b(A)),E;if(o.length===0)E=m+y;else{let P=t.bracketSpacing?g:D;E=[m,f([P,...o]),P,y]}return e.match(void 0,(P,F)=>F==="typeAnnotation",(P,F)=>F==="typeAnnotation",Yt)||e.match(void 0,(P,F)=>P.type==="FunctionTypeParam"&&F==="typeAnnotation",Yt)?E:p(E,{shouldBreak:x})}return[m,o.length>0?[f([d,o]),d]:"",y]}function Na(e){let{node:t}=e;if(t.type==="ObjectTypeAnnotation"){let{key:r,parent:n}=e;return r==="body"&&(n.type==="InterfaceDeclaration"||n.type==="DeclareInterface"||n.type==="DeclareClass")}return t.type==="ClassBody"||t.type==="TSInterfaceBody"||t.type==="RecordDeclarationBody"}function ke(e,t){let{parent:r}=e;return e.callParent(Na)?r.type==="ObjectTypeAnnotation"?";":R(t):r.type==="TSTypeLiteral"?e.isLast?t.semi?O(";"):"":t.semi||va({node:e.node,next:e.next},t)?";":O("",";"):""}var _a=B(["ClassProperty","PropertyDefinition","ClassPrivateProperty","ClassAccessorProperty","AccessorProperty","TSAbstractPropertyDefinition","TSAbstractAccessorProperty"]),ja=e=>{if(e.computed||e.typeAnnotation)return!1;let{type:t,name:r}=e.key;return t==="Identifier"&&(r==="static"||r==="get"||r==="set")};function oD({node:e,next:t},r){if(r.semi||!_a(e))return!1;if(!e.value&&ja(e))return!0;if(!t||t.static||t.accessibility||t.readonly)return!1;if(!t.computed){let n=t.key?.name;if(n==="in"||n==="instanceof")return!0}if(_a(t)&&!t.static&&t.variance&&!t.declare)return!0;switch(t.type){case"ClassProperty":case"PropertyDefinition":case"TSAbstractPropertyDefinition":return t.computed;case"MethodDefinition":case"TSAbstractMethodDefinition":case"ClassMethod":case"ClassPrivateMethod":{if((t.value?t.value.async:t.async)||t.kind==="get"||t.kind==="set")return!1;let o=t.value?t.value.generator:t.generator;return!!(t.computed||o)}case"TSIndexSignature":return!0}return!1}var iD=B(["TSPropertySignature"]);function va({node:e,next:t},r){return r.semi||!iD(e)?!1:ja(e)?!0:t&&t.type==="TSCallSignatureDeclaration"?!(e.type==="TSPropertySignature"&&e.typeAnnotation):!1}var sD=wa("heritageGroup"),uD=B(["TSInterfaceDeclaration","DeclareInterface","InterfaceDeclaration","InterfaceTypeAnnotation"]);function Ar(e,t,r){let n=aD(e,t,r),{node:o}=e;if(o.type==="ClassExpression"&&j(o.decorators)){let i=Rn(e,t,r);return ne(e,t)?[f([D,i,n]),D]:[i,n]}return n}function aD(e,t,r){let{node:n}=e,o=uD(n),i=n.type==="RecordDeclaration",s=o?"interface":i?"record":"class",u=[re(e),mr(e),s],a=Wa(e),c=[],m=[];if(n.type!=="InterfaceTypeAnnotation"){n.id&&c.push(" ");for(let A of["id","typeParameters"])if(n[A]){let{leading:x,trailing:E}=e.call(()=>An(e,t),A);c.push(x,r(A),f(E))}}if(n.superClass){let A=[lD(e,t,r),r("superTypeArguments")],x=e.call(()=>["extends ",Q(e,A,t)],"superClass");a?m.push(g,p(x)):m.push(" ",x)}else m.push(Ei(e,t,r,"extends"));m.push(Ei(e,t,r,"mixins"),Ei(e,t,r,"implements"));let y;return a?(y=sD(n),u.push(p([...c,f(m)],{id:y}))):u.push(...c,...m),!o&&a&&Ma(n.body)?u.push(O(d," ",{groupId:y})):u.push(" "),u.push(r("body")),u}function Ra(e){let t=e.superClass?1:0;for(let r of["extends","mixins","implements"])if(Array.isArray(e[r])&&(t+=e[r].length),t>1)return!0;return t>1}function pD(e){let{node:t}=e;if(C(t.id,T.Trailing)||C(t.typeParameters,T.Trailing)||C(t.superClass)||Ra(t))return!0;if(t.superClass)return e.parent.type==="AssignmentExpression"?!1:!t.superTypeArguments&&N(Pe(t.superClass));let r=t.extends?.[0]??t.mixins?.[0]??t.implements?.[0];return r?r.type==="InterfaceExtends"&&r.id.type==="QualifiedTypeIdentifier"&&!r.typeParameters||(r.type==="TSClassImplements"||r.type==="TSInterfaceHeritage")&&N(r.expression)&&!r.typeArguments:!1}var cD=new WeakMap;function Wa(e){return Z(cD,e.node,()=>pD(e))}function Ei(e,t,r,n){let{node:o}=e;if(!j(o[n]))return"";let i=W(e,t,{marker:n}),s=w([",",g],e.map(r,n));if(!Ra(o)){let u=[`${n} `,i,s];return Wa(e)?[g,p(u)]:[" ",u]}return[g,i,i&&d,n,p(f([g,s]))]}function lD(e,t,r){let n=r("superClass"),{parent:o}=e;return o.type==="AssignmentExpression"?p(O(["(",f([D,n]),D,")"],n)):n}function Hn(e,t,r){let{node:n}=e,o=[];return j(n.decorators)&&o.push(ci(e,t,r)),o.push(qt(n)),n.static&&o.push("static "),o.push(mr(e)),n.override&&o.push("override "),o.push(Rr(e,t,r)),o}function Xn(e,t,r){let{node:n}=e,o=[];j(n.decorators)&&o.push(ci(e,t,r)),o.push(re(e),qt(n)),n.static&&o.push("static "),o.push(mr(e)),n.override&&o.push("override "),n.readonly&&o.push("readonly "),n.variance&&o.push(r("variance")),(n.type==="ClassAccessorProperty"||n.type==="AccessorProperty"||n.type==="TSAbstractAccessorProperty")&&o.push("accessor "),o.push(je(e,t,r),$(e),gn(e),G(e,r));let i=n.type==="TSAbstractPropertyDefinition"||n.type==="TSAbstractAccessorProperty";return[vt(e,t,r,o," =",i?void 0:"value"),R(t)]}function mD(e,t){let r=oe(e,T.Leading);if(r.length===0)return!1;let[n]=r,o=t.originalText,i=b(n);return te(o,i,S(n))||J(o,i,{backwards:!0})}function Ft(e,t,r,n="body"){return e.call(({node:o})=>{let i=r();if(o.type==="EmptyStatement")return C(o,T.Leading)?[" ",i]:i;let s=o.type==="BlockStatement";return mD(o,t)?s?[d,i]:f([d,i]):s||o.type==="IfStatement"&&e.parent.type==="IfStatement"&&e.key==="alternate"?[" ",i]:f([g,i])},n)}var Ja=(e,t,r)=>Ft(e,t,r,"consequent"),Ga=(e,t,r)=>Ft(e,t,r,"alternate");function Ua(e,t,r){return[p(["do",Ft(e,t,r)]),e.node.body.type==="BlockStatement"?" ":d,"while (",fr(e,t,r),")",R(t)]}var fD=B(["TSAsExpression","TSTypeAssertion","TSNonNullExpression","TSInstantiationExpression","TSSatisfiesExpression"]);function di(e){return fD(e)?di(e.expression):e}var qa=B(["FunctionExpression","ArrowFunctionExpression"]);function Ya(e){return e.type==="MemberExpression"||e.type==="OptionalMemberExpression"||e.type==="Identifier"&&e.name!=="undefined"}function DD(e,t){if(zo(e,t)){let r=di(e.node.expression);return qa(r)||Ya(r)}return!(!t.semi||$o(e,t)||Qo(e,t))}function Ha(e,t,r){let n=[r("expression")];if(yr(e,t)){if(wn(e,t)){let{node:o}=e,i=L(0,oe(o,T.Leading),-1),s=xn(e,t,{filter:u=>u===i});return Q(e,[";",s,...n],t,{filter:u=>u!==i})}n.unshift(";")}else DD(e,t)&&n.push(";");return n}function Xa(e,t,r){let{node:n}=e,o=Ft(e,t,r),i=W(e,t),s=i?[i,D]:"";return!n.init&&!n.test&&!n.update?[s,p(["for (;;)",o])]:[s,p(["for (",p([f([D,r("init"),";",g,r("test"),";",n.update?[g,r("update")]:""]),D]),")",o])]}function Va(e,t,r){let{node:n}=e,o=n.type==="ForOfStatement";return p(["for",o&&n.await?" await":""," (",r("left")," ",o?"of":"in"," ",r("right"),")",Ft(e,t,r)])}function Ka(e,t,r){if(t.__isVueBindings||t.__isVueForBindingLeft){let n=e.map(r,"program","body",0,"params");if(n.length===1)return n[0];let o=w([",",g],n);return t.__isVueForBindingLeft?["(",f([D,p(o)]),D,")"]:o}if(t.__isEmbeddedTypescriptGenericParameters){let n=e.map(r,"program","body",0,"typeParameters","params");return w([",",g],n)}}var $a=(e,{originalText:t})=>Fn(t,b(e));function Vn(e){return qe(L(0,oe(e,T.Dangling),-1))}function Qa(e,t,r){let{node:n}=e,o=p(["if (",fr(e,t,r),")",Ja(e,t,r)]);if(!n.alternate)return o;let{consequent:i}=n,s=i.type==="BlockStatement",u=[o],a=s;s||(u.push(d),a=!1);let c=oe(n,T.Dangling);if(c.length>0){let[m]=c;$a(m,t)?u.push(s?[d,d]:d):J(t.originalText,b(m),{backwards:!0})?u.push(s?d:""):u.push(" "),u.push(W(e,t),Vn(n)||J(t.originalText,S(L(0,c,-1)))?d:" "),a=!1}return u.push(a?" ":"","else",p(Ga(e,t,r))),u}function ep(e,t){let{node:r}=e;switch(r.type){case"RegExpLiteral":return za(r);case"BigIntLiteral":return Kn(r.extra.raw);case"NumericLiteral":return _t(r.extra.raw);case"StringLiteral":return Xe(ot(r.extra.raw,t));case"NullLiteral":return"null";case"BooleanLiteral":return String(r.value);case"DirectiveLiteral":return Za(r.extra.raw,t);case"Literal":{if(r.regex)return za(r.regex);if(r.bigint)return Kn(r.raw);let{value:n}=r;return typeof n=="number"?_t(r.raw):typeof n=="string"?yD(e)?Za(r.raw,t):Xe(ot(r.raw,t)):String(n)}}}function yD(e){if(e.key!=="expression")return;let{parent:t}=e;return t.type==="ExpressionStatement"&&typeof t.directive=="string"}function Kn(e){return e.toLowerCase()}function za({pattern:e,flags:t}){return t=[...t].sort().join(""),`/${e}/${t}`}var ED="use strict";function Za(e,t){let r=e.slice(1,-1);if(r===ED||!(r.includes('"')||r.includes("'"))){let n=t.singleQuote?"'":'"';return n+r+n}return e}var tp=B(["ImportDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExportAllDeclaration","DeclareExportDeclaration","DeclareExportAllDeclaration"]),dD=B(["EnumBody","EnumBooleanBody","EnumNumberBody","EnumBigIntBody","EnumStringBody","EnumSymbolBody"]);function ft(e,t,r){let{node:n,parent:o}=e,i=dD(n),s=n.type==="TSEnumBody"||i,u=tp(n),a=i&&n.hasUnknownMembers,c=s?"members":u?"attributes":"properties",m=n[c],y=s||n.type==="ObjectPattern"&&o.type!=="FunctionDeclaration"&&o.type!=="FunctionExpression"&&o.type!=="ArrowFunctionExpression"&&o.type!=="ObjectMethod"&&o.type!=="ClassMethod"&&o.type!=="ClassPrivateMethod"&&o.type!=="AssignmentPattern"&&o.type!=="CatchClause"&&n.properties.some(F=>F.value&&(F.value.type==="ObjectPattern"||F.value.type==="ArrayPattern"))||n.type!=="ObjectPattern"&&t.objectWrap==="preserve"&&m.length>0&&CD(n,m[0],t),A=[],x=e.map(({node:F})=>{let I=[...A,r()];return A=[",",g],me(F,t)&&A.push(d),I},c);if(a){let F;if(C(n,T.Dangling)){let I=C(n,T.Line);F=[W(e,t),I||J(t.originalText,S(L(0,oe(n),-1)))?d:g,"..."]}else F=["..."];x.push([...A,...F])}let E=!(a||L(0,m,-1)?.type==="RestElement"),P;if(x.length===0)P=p(["{",Mt(e,t),"}",$(e),G(e,r)]);else{let F=t.bracketSpacing?g:D;P=["{",f([F,...x]),E?Ie(t):"",F,"}",$(e),G(e,r)]}return e.match(F=>F.type==="ObjectPattern"&&!j(F.decorators),Yt)||Ue(n)&&(e.match(void 0,(F,I)=>I==="typeAnnotation",(F,I)=>I==="typeAnnotation",Yt)||e.match(void 0,(F,I)=>F.type==="FunctionTypeParam"&&I==="typeAnnotation",Yt))||!y&&e.match(F=>F.type==="ObjectPattern",F=>F.type==="AssignmentExpression"||F.type==="VariableDeclarator")?P:p(P,{shouldBreak:y})}function CD(e,t,r){let n=r.originalText,o=b(t),i=b(e);return tp(e)&&(i=ce(r).lastIndexOf("{",o)),te(n,i,o)}function rp(e,t,r){let{node:n}=e;return["import",n.phase?` ${n.phase}`:"",Fi(n),ip(e,t,r),op(e,t,r),up(e,t,r),R(t)]}var np=e=>e.type==="ExportDefaultDeclaration"||e.type==="DeclareExportDeclaration"&&e.default;function $n(e,t,r){let{node:n}=e,o=[ca(e,t,r),re(e),"export",np(n)?" default":""],{declaration:i,exported:s}=n;return C(n,T.Dangling)&&(o.push(" ",W(e,t)),Vn(n)&&o.push(d)),i?o.push(" ",r("declaration")):(o.push(AD(n)),n.type==="ExportAllDeclaration"||n.type==="DeclareExportAllDeclaration"?(o.push(" *"),s&&o.push(" as ",r("exported"))):o.push(ip(e,t,r)),o.push(op(e,t,r),up(e,t,r))),o.push(xD(n,t)),o}var FD=B(["ClassDeclaration","ComponentDeclaration","FunctionDeclaration","TSInterfaceDeclaration","DeclareClass","DeclareComponent","DeclareFunction","DeclareHook","HookDeclaration","TSDeclareFunction","EnumDeclaration"]);function xD(e,t){return!e.declaration||np(e)&&!FD(e.declaration)?R(t):""}function Ci(e,t=!0){return e&&e!=="value"?`${t?" ":""}${e}${t?"":" "}`:""}function Fi(e,t){return Ci(e.importKind,t)}function AD(e){return Ci(e.exportKind)}function op(e,t,r){let{node:n}=e;return n.source?[sp(n,t)?" from":""," ",r("source")]:""}function ip(e,t,r){let{node:n}=e;if(!sp(n,t))return"";let o=[" "];if(j(n.specifiers)){let i=[],s=[];e.each(()=>{let u=e.node.type;if(u==="ExportNamespaceSpecifier"||u==="ExportDefaultSpecifier"||u==="ImportNamespaceSpecifier"||u==="ImportDefaultSpecifier")i.push(r());else if(u==="ExportSpecifier"||u==="ImportSpecifier")s.push(r());else throw new it(n,"specifier")},"specifiers"),o.push(w(", ",i)),s.length>0&&(i.length>0&&o.push(", "),s.length>1||i.length>0||n.specifiers.some(a=>C(a))?o.push(p(["{",f([t.bracketSpacing?g:D,w([",",g],s)]),Ie(t),t.bracketSpacing?g:D,"}"])):o.push(["{",t.bracketSpacing?" ":"",...s,t.bracketSpacing?" ":"","}"]))}else o.push("{}");return o}function sp(e,t){return e.type!=="ImportDeclaration"||j(e.specifiers)||e.importKind==="type"?!0:ce(t).slice(b(e),b(e.source)).trimEnd().endsWith("from")}function TD(e,t){let r=ce(t).slice(S(e.source),e.attributes?.[0]?b(e.attributes[0]):S(e)).trimStart();return r.startsWith("assert")?"assert":r.startsWith("with")||j(e.attributes)?"with":void 0}var gD=e=>{let{attributes:t}=e;if(t.length!==1)return!1;let[r]=t,{type:n,key:o,value:i}=r;return n==="ImportAttribute"&&(o.type==="Identifier"&&o.name==="type"||q(o)&&o.value==="type")&&q(i)&&!C(r)&&!C(o)&&!C(i)};function up(e,t,r){let{node:n}=e;if(!n.source)return"";let o=TD(n,t);if(!o)return"";let i=ft(e,t,r);return gD(n)&&(i=Jt(i)),[` ${o} `,i]}function ap(e,t,r){let{node:n}=e,{type:o}=n,i=o.startsWith("Import"),s=i?"imported":"local",u=i?"local":"exported",a=n[s],c=n[u],m="",y="";return o==="ExportNamespaceSpecifier"||o==="ImportNamespaceSpecifier"?m="*":a&&(m=r(s)),c&&!Ir(n)&&(y=r(u)),[Ci(o==="ImportSpecifier"?n.importKind:n.exportKind,!1),m,m&&y?" as ":"",y]}function Qn(e,t,r){let{node:n}=e;return n.shorthand?r("value"):vt(e,t,r,je(e,t,r),":","value")}function Tr(e,t){return["...",t("argument"),G(e,t)]}function hD(e,t,r){let{node:n}=e,o=r();return an(n,t)?["(",f([d,o]),d,")"]:Be(n)||t.experimentalTernaries&&n.type==="ConditionalExpression"&&(n.consequent.type==="ConditionalExpression"||n.alternate.type==="ConditionalExpression")?p([O("("),f([D,o]),D,O(")")]):o}function zn(e,t,r){let{node:n}=e;return[n.type==="ThrowStatement"?"throw":"return",n.argument?[" ",e.call(()=>hD(e,t,r),"argument")]:"",R(t)]}function SD(e,t){let{key:r,parent:n}=e;return!!(r==="argument"&&ut(n)&&ne(e,t)||r==="body"&&n.type==="ArrowFunctionExpression")}function pp(e,t,r){let{parent:n}=e;if(n.type==="ExpressionStatement"||n.type==="ForStatement"){let i=[];return e.each(({isFirst:s})=>{s?i.push(r()):i.push(",",f([g,r()]))},"expressions"),p(i)}let o=w([",",g],e.map(r,"expressions"));return SD(e,t)?p(O([f([D,o]),D],o)):p(o)}function cp(e,t,r){return[p(["switch (",f([D,r("discriminant")]),D,")"])," {",e.node.cases.length>0?f([d,w(d,e.map(({node:n,isLast:o})=>[r(),!o&&me(n,t)?d:""],"cases"))]):"",d,"}"]}function lp(e,t,r){let{node:n}=e,o=[];n.test?o.push("case ",r("test"),":"):o.push("default:"),C(n,T.Dangling)&&o.push(" ",W(e,t));let i=n.consequent.filter(s=>s.type!=="EmptyStatement");if(i.length>0){let s=Gr(e,t,r,"consequent");o.push(i.length===1&&i[0].type==="BlockStatement"?[" ",s]:f([d,s]))}return o}function mp(e,t){let r=0;for(let n in e){let o=e[n];if(nn(o)&&typeof o.type=="string"&&(r++,r+=mp(o,t-r)),r>t)return r}return r}function xi(e,t=5){return mp(e,t)<=t}function BD(e){let t=[e];for(let r=0;r<t.length;r++){let n=t[r];for(let o of["test","consequent","alternate"]){let i=n[o];if(H(i))return!0;i.type==="ConditionalExpression"&&t.push(i)}}return!1}function bD(e,t,r){let{node:n}=e,o=n.type==="ConditionalExpression",i=o?"alternate":"falseType",{parent:s}=e,u=o?r("test"):[r("checkType")," ","extends"," ",r("extendsType")];return s.type===n.type&&s[i]===n?he(2,u):u}var PD=new Map([["AssignmentExpression","right"],["VariableDeclarator","init"],["ReturnStatement","argument"],["ThrowStatement","argument"],["UnaryExpression","argument"],["YieldExpression","argument"],["AwaitExpression","argument"]]);function ID(e){let{node:t}=e;if(t.type!=="ConditionalExpression")return!1;let r,n=t;for(let o=0;!r;o++){let i=e.getParentNode(o);if(Re(i)&&i.expression===n||M(i)&&i.callee===n||N(i)&&i.object===n){n=i;continue}i.type==="NewExpression"&&i.callee===n||de(i)&&i.expression===n?(r=e.getParentNode(o+1),n=i):r=i}return n===t?!1:r[PD.get(r.type)]===n}function fp(e,t,r){let{node:n}=e,o=n.type==="ConditionalExpression",i=o?"consequent":"trueType",s=o?"alternate":"falseType",u=o?["test"]:["checkType","extendsType"],a=n[i],c=n[s],m=[],y=!1,{parent:A}=e,x=A.type===n.type&&u.some(z=>A[z]===n),E=A.type===n.type&&!x,P,F,I=0;do F=P||n,P=e.getParentNode(I),I++;while(P&&P.type===n.type&&u.every(z=>P[z]!==F));let k=P||A,h=F;if(o&&(H(n[u[0]])||H(a)||H(c)||BD(h))){y=!0,E=!0;let z=De=>[O("("),f([D,De]),D,O(")")],xe=De=>De.type==="NullLiteral"||De.type==="Literal"&&De.value===null||De.type==="Identifier"&&De.name==="undefined";m.push(" ? ",xe(a)?r(i):z(r(i))," : ",c.type===n.type||xe(c)?r(s):z(r(s)))}else{let z=De=>t.useTabs?f(r(De)):he(2,r(De)),xe=[g,"? ",a.type===n.type?O("","("):"",z(i),a.type===n.type?O("",")"):"",g,": ",z(s)];m.push(A.type!==n.type||A[s]===n||x?xe:t.useTabs?fn(f(xe)):he(Math.max(0,t.tabWidth-2),xe))}let v=z=>A===k?p(z):z,U=!y&&(N(A)||A.type==="NGPipeExpression"&&A.left===n)&&!A.computed,ae=ID(e),fe=v([bD(e,t,r),E?m:f(m),o&&U&&!ae?D:""]);return x||ae?p([f([D,fe]),D]):fe}function kD(e,t){return(N(t)||t.type==="NGPipeExpression"&&t.left===e)&&!t.computed}function wD(e,t,r,n){return[...e.map(i=>oe(i)),oe(t),oe(r)].flat().some(i=>le(i)&&te(n.originalText,b(i),S(i)))}var LD=new Map([["AssignmentExpression","right"],["VariableDeclarator","init"],["ReturnStatement","argument"],["ThrowStatement","argument"],["UnaryExpression","argument"],["YieldExpression","argument"],["AwaitExpression","argument"]]);function OD(e){let{node:t}=e;if(t.type!=="ConditionalExpression")return!1;let r,n=t;for(let o=0;!r;o++){let i=e.getParentNode(o);if(Re(i)&&i.expression===n||M(i)&&i.callee===n||N(i)&&i.object===n){n=i;continue}i.type==="NewExpression"&&i.callee===n||de(i)&&i.expression===n?(r=e.getParentNode(o+1),n=i):r=i}return n===t?!1:r[LD.get(r.type)]===n}var Ai=e=>[O("("),f([D,e]),D,O(")")];function gr(e,t,r,n){if(!t.experimentalTernaries)return fp(e,t,r);let{node:o}=e,i=o.type==="ConditionalExpression",s=$e(o),u=i?"consequent":"trueType",a=i?"alternate":"falseType",c=i?["test"]:["checkType","extendsType"],m=o[u],y=o[a],A=c.map(br=>o[br]),{parent:x}=e,E=x.type===o.type,P=E&&c.some(br=>x[br]===o),F=E&&x[a]===o,I=m.type===o.type,k=y.type===o.type,h=k||F,v=t.tabWidth>2||t.useTabs,U,ae,fe=0;do ae=U||o,U=e.getParentNode(fe),fe++;while(U&&U.type===o.type&&c.every(br=>U[br]!==ae));let z=U||x,xe=n&&n.assignmentLayout&&n.assignmentLayout!=="break-after-operator"&&(x.type==="AssignmentExpression"||x.type==="VariableDeclarator"||x.type==="ClassProperty"||x.type==="PropertyDefinition"||x.type==="ClassPrivateProperty"||x.type==="ObjectProperty"||x.type==="Property"),De=ut(x)&&!(I||k),xt=i&&z.type==="JSXExpressionContainer"&&e.grandparent.type!=="JSXAttribute",bt=OD(e),_=kD(o,x),Ae=s&&ne(e,t),we=v?t.useTabs?" ":" ".repeat(t.tabWidth-1):"",Pt=wD(A,m,y,t)||I||k,Sr=!h&&!E&&!s&&(xt?m.type==="NullLiteral"||m.type==="Literal"&&m.value===null:Wr(m,t)&&xi(o.test,3)),ki=h||F||s&&!E||E&&i&&xi(o.test,1)||Sr,qr=[];C(o.test,T.Dangling)&&e.call(()=>{qr.push(W(e,t))},"test"),C(o,T.Dangling)&&qr.push(W(e,t));let wi=Symbol("test"),Vp=Symbol("consequent"),Yr=Symbol("test-and-consequent"),Kp=i?[Ai(r("test")),o.test.type==="ConditionalExpression"?Ne:""]:[r("checkType")," ","extends"," ",$e(o.extendsType)||o.extendsType.type==="TSMappedType"?r("extendsType"):p(Ai(r("extendsType")))],Li=p([Kp," ?"],{id:wi}),$p=r(u),Hr=f([I||xt&&(H(m)||E||h)?d:g,$p]),Qp=ki?p([Li,h?Hr:O(Hr,p(Hr,{id:Vp}),{groupId:wi})],{id:Yr}):[Li,Hr],yo=r(a),Oi=Sr?O(yo,fn(Ai(yo)),{groupId:Yr}):yo,Br=[Qp,qr.length>0?[f([d,qr]),d]:k?d:Sr?O(g," ",{groupId:Yr}):g,":",k||!v?" ":ki?O(we,O(h||Sr?" ":we," "),{groupId:Yr}):O(we," "),k?Oi:p([f(Oi),xt&&!Sr?D:""]),_&&!bt?D:"",Pt?Ne:""];return xe&&!Pt?p(f([D,p(Br)])):xe||De?p(f(Br)):bt||s&&P?p([f([D,Br]),Ae?D:""]):x===z?p(Br):Br}function Dp(e,t,r){let{node:n}=e;return["try ",r("block"),n.handler?[" ",r("handler")]:"",n.finalizer?[" finally ",r("finalizer")]:""]}function yp(e,t,r){let{node:n}=e;if(n.param){let o=C(n.param,s=>!le(s)||s.leading&&J(t.originalText,S(s))||s.trailing&&J(t.originalText,b(s),{backwards:!0})),i=r("param");return["catch ",o?["(",f([D,i]),D,") "]:["(",i,") "],r("body")]}return["catch ",r("body")]}function Zn(e,t,r){let{node:n}=e,o=e.map(r,"declarations"),i=e.key==="init"&&e.parent.type==="ForStatement"||e.key==="left"&&(e.parent.type==="ForInStatement"||e.parent.type==="ForOfStatement"),s=n.declarations.some(a=>a.init),u;return o.length===1&&!C(n.declarations[0])?u=o[0]:u=f(o[0]),p([re(e),n.kind,u?[" ",u]:"",f(o.slice(1).map(a=>[",",s&&!i?d:g,a])),i?"":R(t)])}function Ep(e,t,r){let{node:n}=e,o=n.type==="WithStatement"?"with":"while";return p([o," (",fr(e,t,r),")",Ft(e,t,r)])}function dp(e,t,r,n){let{node:o}=e;if(er(o))return ep(e,t);switch(o.type){case"JsExpressionRoot":return r("node");case"JsonRoot":return[W(e,t),r("node"),d];case"File":return Ka(e,t,r)??r("program");case"ExpressionStatement":return Ha(e,t,r);case"ChainExpression":return r("expression");case"ParenthesizedExpression":return!C(o.expression)&&(ie(o.expression)||Y(o.expression))?["(",r("expression"),")"]:p(["(",f([D,r("expression")]),D,")"]);case"AssignmentExpression":return Sa(e,t,r);case"VariableDeclarator":return Ba(e,t,r);case"BinaryExpression":case"LogicalExpression":return vn(e,t,r);case"AssignmentPattern":return[r("left")," = ",r("right")];case"OptionalMemberExpression":case"MemberExpression":return xa(e,t,r);case"MetaProperty":return[r("meta"),".",r("property")];case"BindExpression":return Fa(e,t,r);case"Identifier":return[o.name,$(e),gn(e),G(e,r)];case"V8IntrinsicIdentifier":return["%",o.name];case"SpreadElement":return Tr(e,r);case"RestElement":return Tr(e,r);case"FunctionDeclaration":case"FunctionExpression":return Dr(e,t,r,n);case"ArrowFunctionExpression":return ya(e,t,r,n);case"YieldExpression":return[`yield${o.delegate?"*":""}`,o.argument?[" ",r("argument")]:""];case"AwaitExpression":return Ia(e,t,r);case"ExportDefaultDeclaration":case"ExportNamedDeclaration":case"ExportAllDeclaration":return $n(e,t,r);case"ImportDeclaration":return rp(e,t,r);case"ImportSpecifier":case"ExportSpecifier":case"ImportNamespaceSpecifier":case"ExportNamespaceSpecifier":case"ImportDefaultSpecifier":case"ExportDefaultSpecifier":return ap(e,t,r);case"ImportAttribute":return Qn(e,t,r);case"Program":case"BlockStatement":case"StaticBlock":return Yn(e,t,r);case"ClassBody":return Kt(e,t,r);case"ThrowStatement":return zn(e,t,r);case"ReturnStatement":return zn(e,t,r);case"NewExpression":case"ImportExpression":case"OptionalCallExpression":case"CallExpression":return Vt(e,t,r);case"ObjectExpression":case"ObjectPattern":return ft(e,t,r);case"Property":return Ke(o)?Rr(e,t,r):Qn(e,t,r);case"ObjectProperty":return Qn(e,t,r);case"ObjectMethod":return Rr(e,t,r);case"Decorator":return["@",r("expression")];case"ArrayExpression":case"ArrayPattern":return xr(e,t,r);case"SequenceExpression":return pp(e,t,r);case"ThisExpression":return"this";case"Super":return"super";case"Directive":return[r("value"),R(t)];case"UnaryExpression":{let i=[o.operator];/[a-z]$/.test(o.operator)&&i.push(" ");let s=r("argument");return C(o.argument)?i.push(p(["(",f([D,s]),D,")"])):i.push(s),i}case"UpdateExpression":return[o.prefix?o.operator:"",r("argument"),o.prefix?"":o.operator];case"ConditionalExpression":return gr(e,t,r,n);case"VariableDeclaration":return Zn(e,t,r);case"IfStatement":return Qa(e,t,r);case"ForStatement":return Xa(e,t,r);case"WithStatement":case"WhileStatement":return Ep(e,t,r);case"DoWhileStatement":return Ua(e,t,r);case"ForInStatement":case"ForOfStatement":return Va(e,t,r);case"DoExpression":return[o.async?"async ":"","do ",r("body")];case"BreakStatement":case"ContinueStatement":return[o.type==="BreakStatement"?"break":"continue",o.label?[" ",r("label")]:"",R(t)];case"LabeledStatement":return[r("label"),`:${o.body.type==="EmptyStatement"&&!C(o.body,T.Leading)?"":" "}`,r("body")];case"TryStatement":return Dp(e,t,r);case"CatchClause":return yp(e,t,r);case"SwitchStatement":return cp(e,t,r);case"SwitchCase":return lp(e,t,r);case"DebuggerStatement":return["debugger",R(t)];case"ClassDeclaration":case"ClassExpression":return Ar(e,t,r);case"ClassMethod":case"ClassPrivateMethod":case"MethodDefinition":return Hn(e,t,r);case"ClassProperty":case"PropertyDefinition":case"ClassPrivateProperty":case"ClassAccessorProperty":case"AccessorProperty":return Xn(e,t,r);case"TemplateElement":return Xe(o.value.raw);case"TemplateLiteral":return Ln(e,t,r);case"TaggedTemplateExpression":return Bu(e,t,r);case"PrivateIdentifier":return["#",o.name];case"PrivateName":return["#",r("id")];case"TopicReference":return"%";case"ArgumentPlaceholder":return"?";case"ModuleExpression":return["module ",r("body")];case"VoidPattern":return"void";case"EmptyStatement":if(zt(e))return";";default:throw new it(o,"ESTree")}}function eo(e){return[e("elementType"),"[]"]}function to(e,t,r){let{parent:n,node:o,key:i}=e,u=o.type==="AsConstExpression"?"const":r("typeAnnotation"),a=[r("expression")," ",Ui(o)?"satisfies":"as"," ",u];return i==="callee"&&Tt(n)||i==="object"&&N(n)?p([f([D,...a]),D]):a}function Cp(e,t,r){let{node:n}=e,o=[re(e),n.async?"async ":"","component"];n.id&&o.push(" ",r("id")),o.push(r("typeParameters"));let i=Ve(e,t,r);return n.rendersType?o.push(p([i," ",r("rendersType")])):o.push(p([i])),n.body&&o.push(" ",r("body")),n.type==="DeclareComponent"&&o.push(R(t)),o}function Fp(e,t,r){let{node:n}=e;return n.shorthand?r("local"):[r("name")," as ",r("local")]}function xp(e,t,r){let{node:n}=e,o=[];return n.name&&o.push(r("name"),n.optional?"?: ":": "),o.push(r("typeAnnotation")),o}function Ap(e,t,r){let{node:n}=e;return[n.explicitType?`of ${n.explicitType} `:"",ft(e,t,r)]}function Tp(e,t,r){let{node:n}=e;return[n.type==="EnumSymbolBody"||n.explicitType?`of ${n.type.slice(4,-4).toLowerCase()} `:"",ft(e,t,r)]}function ro(e,t,r){let{node:n}=e,o=n.type==="TSEnumMember",i=o?je(e,t,r):r("id"),s=o?"initializer":"init";return n[s]?[i," = ",r(s)]:i}function no(e,t){let{node:r}=e;return[re(e),r.const?"const ":"","enum ",t("id")," ",t("body")]}function oo(e,t,r){let{node:n}=e,o=[mr(e)];(n.type==="TSConstructorType"||n.type==="TSConstructSignatureDeclaration")&&o.push("new ");let i=Ve(e,t,r,!1,!0),s=[];return n.type==="FunctionTypeAnnotation"?s.push(MD(e)?" => ":": ",r("returnType")):s.push(G(e,r,"returnType")),Bt(n,s)&&(i=p(i)),o.push(i,s),[p(o),n.type==="TSConstructSignatureDeclaration"||n.type==="TSCallSignatureDeclaration"?ke(e,t):""]}function MD(e){let{node:t,parent:r}=e;return t.type==="FunctionTypeAnnotation"&&(pr(r)||!((r.type==="ObjectTypeProperty"||r.type==="ObjectTypeInternalSlot")&&!r.variance&&!r.optional&&kt(r,t)||r.type==="ObjectTypeCallProperty"||e.getParentNode(2)?.type==="DeclareFunction"))}function hp(e,t,r){return[re(e),"hook",e.node.id?[" ",r("id")]:"",R(t)]}function gp(e){let{node:t}=e;return t.type==="HookTypeAnnotation"&&e.getParentNode(2)?.type==="DeclareHook"}function Sp(e,t,r){let{node:n}=e,o=Ve(e,t,r,!1,!0),i=[gp(e)?": ":" => ",r("returnType")];return p([gp(e)?"":"hook ",Bt(n,i)?p(o):o,i])}function io(e,t,r){return[r("objectType"),$(e),"[",r("indexType"),"]"]}function so(e,t,r){return["infer ",r("typeParameter")]}function uo(e,t,r){let n=!1;return p(e.map(({isFirst:o,previous:i,node:s,index:u})=>{let a=r();if(o)return a;let c=Ue(s),m=Ue(i);return m&&c?[" & ",n?f(a):a]:!m&&!c||Le(t.originalText,s)?t.experimentalOperatorPosition==="start"?f([g,"& ",a]):f([" &",g,a]):(u>1&&(n=!0),[" & ",u>1?f(a):a])},"types"))}function _D(e){switch(e){case null:return"";case"PlusOptional":return"+?";case"MinusOptional":return"-?";case"Optional":return"?"}}function bp(e,t,r){let{node:n}=e;return[p([n.variance?r("variance"):"",p(["[",f([D,r("keyTparam")," in ",r("sourceType")]),D,"]"]),_D(n.optional),": ",r("propType")]),ke(e,t)]}function Bp(e,t){return e==="+"||e==="-"?e+t:t}function Pp(e,t,r){let{node:n}=e,o=!1;if(t.objectWrap==="preserve"){let u=ce(t),a=b(n)+1,c=u.slice(a),m=a+c.search(/\S/);te(t.originalText,a,m)&&(o=!0)}let i=[],s=oe(n,T.Dangling);if(s.length>0){let u=L(0,s,-1),a=W(e,t);i.push(...a.slice(0,-1),p([L(0,a,-1),qe(u)||J(t.originalText,S(u))?d:g]))}return p(["{",f([t.bracketSpacing?g:D,...i,n.readonly?[Bp(n.readonly,"readonly")," "]:"",p(["[",f([D,r("key")," in ",r("constraint"),n.nameType?[" as ",r("nameType")]:""]),D,"]"]),n.optional?Bp(n.optional,"?"):"",n.typeAnnotation?": ":"",r("typeAnnotation"),t.semi?O(";"):""]),t.bracketSpacing?g:D,"}"],{shouldBreak:o})}function Ip(e,t,r){let{node:n}=e;return[p(["match (",f([D,r("argument")]),D,")"])," {",n.cases.length>0?f([d,w(d,e.map(({node:o,isLast:i})=>[r(),!i&&me(o,t)?d:""],"cases"))]):"",d,"}"]}function kp(e,t,r){let{node:n}=e,o=C(n,T.Dangling)?[" ",W(e,t)]:[],i=n.type==="MatchStatementCase"?[" ",r("body")]:f([g,r("body"),","]);return[r("pattern"),n.guard?p([f([g,"if (",r("guard"),")"])]):"",p([" =>",o,i])]}function wp(e,t,r){let{node:n}=e;switch(n.type){case"MatchOrPattern":return RD(e,t,r);case"MatchAsPattern":return[r("pattern")," as ",r("target")];case"MatchWildcardPattern":return["_"];case"MatchLiteralPattern":return r("literal");case"MatchUnaryPattern":return[n.operator,r("argument")];case"MatchIdentifierPattern":return r("id");case"MatchMemberPattern":{let o=n.property.type==="Identifier"?[".",r("property")]:["[",f([D,r("property")]),D,"]"];return p([r("base"),o])}case"MatchBindingPattern":return[n.kind," ",r("id")];case"MatchObjectPattern":case"MatchInstanceObjectPattern":return ND(e,t,r);case"MatchInstancePattern":return p([r("targetConstructor")," ",r("properties")]);case"MatchArrayPattern":{let o=e.map(r,"elements");return n.rest&&o.push(r("rest")),p(["[",f([D,w([",",g],o)]),n.rest?"":O(","),D,"]"])}case"MatchObjectPatternProperty":return n.shorthand?r("pattern"):p([r("key"),":",f([g,r("pattern")])]);case"MatchRestPattern":{let o=["..."];return n.argument&&o.push(r("argument")),o}}}function ND(e,t,r){let{node:n}=e,o=e.map(r,"properties");return n.rest&&o.push(r("rest")),p(["{",f([D,w([",",g],o)]),n.rest?"":O(","),D,"}"])}var Lp=B(["MatchWildcardPattern","MatchLiteralPattern","MatchUnaryPattern","MatchIdentifierPattern"]);function jD(e){let{patterns:t}=e;if(t.some(n=>C(n)))return!1;let r=t.find(n=>n.type==="MatchObjectPattern");return r?t.every(n=>n===r||Lp(n)):!1}function vD(e){return Lp(e)||e.type==="MatchObjectPattern"?!0:e.type==="MatchOrPattern"?jD(e):!1}function RD(e,t,r){let{node:n}=e,{parent:o}=e,i=o.type!=="MatchStatementCase"&&o.type!=="MatchExpressionCase"&&o.type!=="MatchArrayPattern"&&o.type!=="MatchObjectPatternProperty"&&!Le(t.originalText,n),s=vD(n),u=e.map(()=>{let c=r();return s||(c=he(2,c)),Q(e,c,t)},"patterns");if(s)return w(" | ",u);let a=[O(["| "]),w([g,"| "],u)];return ne(e,t)?p([f([O([D]),a]),D]):o.type==="MatchArrayPattern"&&o.elements.length>1?p([f([O(["(",D]),a]),D,O(")")]):p(i?f(a):a)}function Op(e,t,r){let{node:n}=e,o=[re(e),"opaque type ",r("id"),r("typeParameters")];if(n.supertype&&o.push(": ",r("supertype")),n.lowerBound||n.upperBound){let i=[];n.lowerBound&&i.push(f([g,"super ",r("lowerBound")])),n.upperBound&&i.push(f([g,"extends ",r("upperBound")])),o.push(p(i))}return n.impltype&&o.push(" = ",r("impltype")),o.push(R(t)),o}function ao(e,t,r){let{node:n}=e;return["...",...n.type==="TupleTypeSpreadElement"&&n.label?[r("label"),": "]:[],r("typeAnnotation")]}function po(e,t,r){let{node:n}=e;return[n.variance?r("variance"):"",r("label"),n.optional?"?":"",": ",r("elementType")]}function co(e,t,r){let{node:n}=e,o=[re(e),"type ",r("id"),r("typeParameters")],i=n.type==="TSTypeAliasDeclaration"?"typeAnnotation":"right";return[vt(e,t,r,o," =",i),R(t)]}function WD(e,t,r){let{node:n}=e;return ee(n).length===1&&n.type.startsWith("TS")&&!n[r][0].constraint&&e.parent.type==="ArrowFunctionExpression"&&!(t.filepath&&/\.ts$/.test(t.filepath))}function $t(e,t,r,n){let{node:o}=e,i=o[n];if(!i)return"";if(!Array.isArray(i))return r(n);let s=Ut(e.grandparent),u=e.match(m=>!(m[n].length===1&&Ue(m[n][0])),void 0,(m,y)=>y==="typeAnnotation",m=>m.type==="Identifier",yi);if(i.length===0||!u&&(s||i.length===1&&(i[0].type==="NullableTypeAnnotation"||Fu(i[0])))&&!i.some(m=>C(m,T.Line)||C(m,T.Last,y=>J(t.originalText,S(y)))))return["<",w(", ",e.map(r,n)),JD(e,t),">"];let c=o.type==="TSTypeParameterInstantiation"?"":WD(e,t,n)?",":Ie(t);return p(["<",f([D,w([",",g],e.map(r,n))]),c,D,">"])}function JD(e,t){let{node:r}=e;if(!C(r,T.Dangling))return"";let n=!C(r,T.Line),o=W(e,t,{indent:!n});return n?o:[o,d]}function lo(e,t,r){let{node:n}=e,o=[n.const?"const ":""],i=n.type==="TSTypeParameter"?r("name"):n.name;if(n.variance&&o.push(r("variance")),n.in&&o.push("in "),n.out&&o.push("out "),o.push(i),n.bound&&(n.usesExtendsBound&&o.push(" extends "),o.push(G(e,r,"bound"))),n.constraint){let s=Symbol("constraint");o.push(" extends",p(f(g),{id:s}),Se,ht(r("constraint"),{groupId:s}))}if(n.default){let s=Symbol("default");o.push(" =",p(f(g),{id:s}),Se,ht(r("default"),{groupId:s}))}return p(o)}function mo(e,t){let{node:r}=e;return[r.type==="TSTypePredicate"&&r.asserts?"asserts ":r.type==="TypePredicate"&&r.kind?`${r.kind} `:"",t("parameterName"),r.typeAnnotation?[" is ",G(e,t)]:""]}function fo({node:e},t){let r=e.type==="TSTypeQuery"?"exprName":"argument";return["typeof ",t(r),t("typeArguments")]}function Mp(e,t,r,n){let{node:o}=e;if(dn(o))return o.type.slice(0,-14).toLowerCase();switch(o.type){case"ComponentDeclaration":case"DeclareComponent":case"ComponentTypeAnnotation":return Cp(e,t,r);case"ComponentParameter":return Fp(e,t,r);case"ComponentTypeParameter":return xp(e,t,r);case"HookDeclaration":return Dr(e,t,r);case"DeclareHook":return hp(e,t,r);case"HookTypeAnnotation":return Sp(e,t,r);case"DeclareFunction":return[re(e),"function ",r("id"),r("predicate"),R(t)];case"DeclareModule":return["declare module ",r("id")," ",r("body")];case"DeclareModuleExports":return["declare module.exports",G(e,r),R(t)];case"DeclareNamespace":return["declare namespace ",r("id")," ",r("body")];case"DeclareVariable":return Array.isArray(o.declarations)?Zn(e,t,r):[re(e),o.kind??"var"," ",r("id"),R(t)];case"DeclareExportDeclaration":case"DeclareExportAllDeclaration":return $n(e,t,r);case"DeclareOpaqueType":case"OpaqueType":return Op(e,t,r);case"DeclareTypeAlias":case"TypeAlias":return co(e,t,r);case"IntersectionTypeAnnotation":return uo(e,t,r);case"UnionTypeAnnotation":return Bn(e,t,r,n);case"ConditionalTypeAnnotation":return gr(e,t,r);case"InferTypeAnnotation":return so(e,t,r);case"FunctionTypeAnnotation":return oo(e,t,r);case"TupleTypeAnnotation":return xr(e,t,r);case"TupleTypeLabeledElement":return po(e,t,r);case"TupleTypeSpreadElement":return ao(e,t,r);case"GenericTypeAnnotation":return[r("id"),$t(e,t,r,"typeParameters")];case"IndexedAccessType":case"OptionalIndexedAccessType":return io(e,t,r);case"TypeAnnotation":return bn(e,t,r);case"TypeParameter":return lo(e,t,r);case"TypeofTypeAnnotation":return fo(e,r);case"ExistsTypeAnnotation":return"*";case"ArrayTypeAnnotation":return eo(r);case"DeclareEnum":case"EnumDeclaration":return no(e,r);case"EnumBody":return Ap(e,t,r);case"EnumBooleanBody":case"EnumNumberBody":case"EnumBigIntBody":case"EnumStringBody":case"EnumSymbolBody":return Tp(e,t,r);case"EnumBooleanMember":case"EnumNumberMember":case"EnumBigIntMember":case"EnumStringMember":case"EnumDefaultedMember":return ro(e,t,r);case"FunctionTypeParam":{let i=o.name?r("name"):e.parent.this===o?"this":"";return[i,$(e),i?": ":"",r("typeAnnotation")]}case"DeclareClass":case"DeclareInterface":case"InterfaceDeclaration":case"InterfaceTypeAnnotation":case"RecordDeclaration":return Ar(e,t,r);case"ObjectTypeAnnotation":case"RecordDeclarationBody":return Kt(e,t,r);case"ClassImplements":case"InterfaceExtends":return[r("id"),r("typeParameters")];case"RecordDeclarationImplements":return[r("id"),r("typeArguments")];case"NullableTypeAnnotation":return["?",r("typeAnnotation")];case"Variance":{let{kind:i}=o;return ve(i==="plus"||i==="minus"||i==="readonly"||i==="writeonly"||i==="in"||i==="out"),i==="plus"?"+":i==="minus"?"-":`${i} `}case"KeyofTypeAnnotation":return["keyof ",r("argument")];case"ObjectTypeCallProperty":return[o.static?"static ":"",r("value"),ke(e,t)];case"ObjectTypeMappedTypeProperty":return bp(e,t,r);case"ObjectTypeIndexer":return[o.static?"static ":"",o.variance?r("variance"):"","[",r("id"),o.id?": ":"",r("key"),"]: ",r("value"),ke(e,t)];case"ObjectTypeProperty":{let i="";return o.proto?i="proto ":o.static&&(i="static "),[i,o.kind!=="init"?o.kind+" ":"",o.variance?r("variance"):"",je(e,t,r),$(e),Ke(o)?"":": ",r("value"),ke(e,t)]}case"ObjectTypeInternalSlot":return[o.static?"static ":"","[[",r("id"),"]]",$(e),o.method?"":": ",r("value"),ke(e,t)];case"ObjectTypeSpreadProperty":return Tr(e,r);case"QualifiedTypeofIdentifier":case"QualifiedTypeIdentifier":return[r("qualification"),".",r("id")];case"NullLiteralTypeAnnotation":return"null";case"BooleanLiteralTypeAnnotation":return String(o.value);case"StringLiteralTypeAnnotation":return Xe(ot(ye(o),t));case"NumberLiteralTypeAnnotation":return _t(ye(o));case"BigIntLiteralTypeAnnotation":return Kn(ye(o));case"TypeCastExpression":return["(",r("expression"),G(e,r),")"];case"TypePredicate":return mo(e,r);case"TypeOperator":return[o.operator," ",r("typeAnnotation")];case"TypeParameterDeclaration":case"TypeParameterInstantiation":return $t(e,t,r,"params");case"InferredPredicate":case"DeclaredPredicate":return[e.key==="predicate"&&e.parent.type!=="DeclareFunction"&&!e.parent.returnType?": ":" ","%checks",...o.type==="DeclaredPredicate"?["(",r("value"),")"]:[]];case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return to(e,t,r);case"MatchExpression":case"MatchStatement":return Ip(e,t,r);case"MatchExpressionCase":case"MatchStatementCase":return kp(e,t,r);case"MatchOrPattern":case"MatchAsPattern":case"MatchWildcardPattern":case"MatchLiteralPattern":case"MatchUnaryPattern":case"MatchIdentifierPattern":case"MatchInstancePattern":case"MatchInstanceObjectPattern":case"MatchMemberPattern":case"MatchBindingPattern":case"MatchObjectPattern":case"MatchObjectPatternProperty":case"MatchRestPattern":case"MatchArrayPattern":return wp(e,t,r);case"RecordExpression":return[r("recordConstructor"),r("typeArguments")," ",r("properties")];case"RecordExpressionProperties":return ft(e,t,r);case"RecordDeclarationProperty":case"RecordDeclarationStaticProperty":{let i=o.type==="RecordDeclarationStaticProperty",s=i?"value":"defaultValue";return[i?"static ":"",je(e,t,r),G(e,r),o[s]?[" = ",r(s)]:""]}}}function _p(e,t){let{node:r}=e,n=t.originalText.slice(b(r),S(r));return t.semi&&Pr(r)?n+=";":yr(e,t)&&(n=`;${n}`),r.type==="ClassExpression"&&j(r.decorators)?[f([D,n]),D]:n}var Ti=e=>e===""||e===g||e===d||e===D;function GD(e,t,r){let{node:n}=e;if(n.type==="JSXElement"&&ny(n))return[r("openingElement"),r("closingElement")];let o=n.type==="JSXElement"?r("openingElement"):r("openingFragment"),i=n.type==="JSXElement"?r("closingElement"):r("closingFragment");if(n.children.length===1&&n.children[0].type==="JSXExpressionContainer"&&(n.children[0].expression.type==="TemplateLiteral"||n.children[0].expression.type==="TaggedTemplateExpression"))return[o,...e.map(r,"children"),i];n.children=n.children.map(h=>oy(h)?{type:"JSXText",value:" ",raw:" "}:h);let s=n.children.some(H),u=n.children.filter(h=>h.type==="JSXExpressionContainer").length>1,a=n.type==="JSXElement"&&n.openingElement.attributes.length>1,c=ue(o)||s||a||u,m=e.parent.rootMarker==="mdx",y=t.singleQuote?"{' '}":'{" "}',A=m?g:O([y,D]," "),x=n.openingElement?.name?.name==="fbt",E=UD(e,t,r,A,x),P=n.children.some(h=>Xt(h));for(let h=E.length-2;h>=0;h--){let v=E[h]===""&&E[h+1]==="",U=E[h]===d&&E[h+1]===""&&E[h+2]===d,ae=(E[h]===D||E[h]===d)&&E[h+1]===""&&E[h+2]===A,fe=E[h]===A&&E[h+1]===""&&(E[h+2]===D||E[h+2]===d),z=E[h]===A&&E[h+1]===""&&E[h+2]===A,xe=E[h]===D&&E[h+1]===""&&E[h+2]===d||E[h]===d&&E[h+1]===""&&E[h+2]===D;U&&P||v||ae||z||xe?E.splice(h,2):fe&&E.splice(h+1,2)}for(;E.length>0&&Ti(L(0,E,-1));)E.pop();for(;E.length>1&&Ti(E[0])&&Ti(E[1]);)E.shift(),E.shift();let F=[""];for(let[h,v]of E.entries()){if(v===A){if(h===1&&js(E[h-1])){if(E.length===2){F.push([F.pop(),y]);continue}F.push([y,d],"");continue}if(h===E.length-1){F.push([F.pop(),y]);continue}if(E[h-1]===""&&E[h-2]===d){F.push([F.pop(),y]);continue}}h%2===0?F.push([F.pop(),v]):F.push(v,""),ue(v)&&(c=!0)}let I=P?Dn(F):p(F,{shouldBreak:!0});if(t.cursorNode?.type==="JSXText"&&n.children.includes(t.cursorNode)?I=[jr,I,jr]:t.nodeBeforeCursor?.type==="JSXText"&&n.children.includes(t.nodeBeforeCursor)?I=[jr,I]:t.nodeAfterCursor?.type==="JSXText"&&n.children.includes(t.nodeAfterCursor)&&(I=[I,jr]),m)return I;let k=p([o,f([d,I]),d,i]);return c?k:mt([p([o,...E,i]),k])}function UD(e,t,r,n,o){let i="",s=[i];function u(c){i=c,s.push([s.pop(),c])}function a(c){c!==""&&(i=c,s.push(c,""))}return e.each(({node:c,next:m})=>{if(c.type==="JSXText"){let y=ye(c);if(Xt(c)){let A=dr.split(y,!0);A[0]===""&&(A.shift(),/\n/.test(A[0])?a(jp(o,A[1],c,m)):a(n),A.shift());let x;if(L(0,A,-1)===""&&(A.pop(),x=A.pop()),A.length===0)return;for(let[E,P]of A.entries())E%2===1?a(g):u(P);x!==void 0?/\n/.test(x)?a(jp(o,i,c,m)):a(n):a(Np(o,i,c,m))}else/\n/.test(y)?y.match(/\n/g).length>1&&a(d):a(n)}else{let y=r();if(u(y),m&&Xt(m)){let x=dr.trim(ye(m)),[E]=dr.split(x);a(Np(o,E,c,m))}else a(d)}},"children"),s}function Np(e,t,r,n){return e?"":r.type==="JSXElement"&&!r.closingElement||n?.type==="JSXElement"&&!n.closingElement?t.length===1?D:d:D}function jp(e,t,r,n){return e?d:t.length===1?r.type==="JSXElement"&&!r.closingElement||n?.type==="JSXElement"&&!n.closingElement?d:D:d}var qD=B(["ArrayExpression","JSXAttribute","JSXElement","JSXExpressionContainer","JSXFragment","ExpressionStatement","NewExpression","CallExpression","OptionalCallExpression","ConditionalExpression","JsExpressionRoot","MatchExpressionCase"]);function YD(e,t,r){let{parent:n}=e;if(qD(n))return t;let o=HD(e),i=ne(e,r);return p([i?"":O("("),f([D,t]),D,i?"":O(")")],{shouldBreak:o})}function HD(e){return e.match(void 0,(t,r)=>r==="body"&&t.type==="ArrowFunctionExpression",(t,r)=>r==="arguments"&&M(t))&&(e.match(void 0,void 0,void 0,(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer")||e.match(void 0,void 0,void 0,(t,r)=>r==="expression"&&t.type==="ChainExpression",(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer"))}function XD(e,t,r){let{node:n}=e,o=[r("name")];if(n.value){let i;if(q(n.value)){let s=ye(n.value),u=V(0,V(0,s.slice(1,-1),"'","'"),""",'"'),a=hn(u,t.jsxSingleQuote);u=a==='"'?V(0,u,'"',"""):V(0,u,"'","'"),i=e.call(()=>Q(e,Xe(a+u+a),t),"value")}else i=r("value");o.push("=",i)}return o}function VD(e,t,r){let{node:n}=e,o=(i,s)=>i.type==="JSXEmptyExpression"||!C(i)&&(Y(i)||ie(i)||i.type==="ArrowFunctionExpression"||i.type==="AwaitExpression"&&(o(i.argument,i)||i.argument.type==="JSXElement")||M(Pe(i))||i.type==="FunctionExpression"||i.type==="TemplateLiteral"||i.type==="TaggedTemplateExpression"||i.type==="DoExpression"||H(s)&&(i.type==="ConditionalExpression"||Be(i)));return o(n.expression,e.parent)?p(["{",r("expression"),Se,"}"]):p(["{",f([D,r("expression")]),D,Se,"}"])}function KD(e,t,r){let{node:n}=e,o=C(n.name)||C(n.typeArguments);if(n.selfClosing&&n.attributes.length===0&&!o)return["<",r("name"),r("typeArguments")," />"];if(n.attributes?.length===1&&q(n.attributes[0].value)&&!n.attributes[0].value.value.includes(`-`)&&!o&&!C(n.attributes[0]))return p(["<",r("name"),r("typeArguments")," ",...e.map(r,"attributes"),n.selfClosing?" />":">"]);let i=n.attributes?.some(u=>q(u.value)&&u.value.value.includes(`-`)),s=t.singleAttributePerLine&&n.attributes.length>1?d:g;return p(["<",r("name"),r("typeArguments"),f(e.map(({isFirst:u,previous:a})=>[u?s:me(a,t)?[d,d]:s,r()],"attributes")),...$D(n,t,o)],{shouldBreak:i})}function $D(e,t,r){return e.selfClosing?[g,"/>"]:QD(e,t,r)?[">"]:[D,">"]}function QD(e,t,r){let n=e.attributes.length>0&&C(L(0,e.attributes,-1),T.Trailing);return e.attributes.length===0&&!r||(t.bracketSameLine||t.jsxBracketSameLine)&&(!r||e.attributes.length>0)&&!n}function zD(e,t,r){let{node:n}=e,o=["</"],i=r("name");return C(n.name,T.Leading|T.Line)?o.push(f([d,i]),d):C(n.name,T.Leading|T.Block)?o.push(" ",i):o.push(i),o.push(">"),o}function ZD(e,t){let{node:r}=e,n=C(r),o=C(r,T.Line),i=r.type==="JSXOpeningFragment";return[i?"<":"</",f([o?d:n&&!i?" ":"",W(e,t)]),o?d:"",">"]}function ey(e,t,r){let n=Q(e,GD(e,t,r),t);return YD(e,n,t)}function ty(e,t){let{node:r}=e,n=C(r,T.Line);return[W(e,t,{indent:n}),n?d:""]}function ry(e,t,r){let{node:n}=e;return["{",e.call(({node:o})=>{let i=["...",r()];return C(o)?[f([D,Q(e,i,t)]),D]:i},n.type==="JSXSpreadAttribute"?"argument":"expression"),"}"]}function vp(e,t,r){let{node:n}=e;if(n.type.startsWith("JSX"))switch(n.type){case"JSXAttribute":return XD(e,t,r);case"JSXIdentifier":return n.name;case"JSXNamespacedName":return w(":",[r("namespace"),r("name")]);case"JSXMemberExpression":return w(".",[r("object"),r("property")]);case"JSXSpreadAttribute":case"JSXSpreadChild":return ry(e,t,r);case"JSXExpressionContainer":return VD(e,t,r);case"JSXFragment":case"JSXElement":return ey(e,t,r);case"JSXOpeningElement":return KD(e,t,r);case"JSXClosingElement":return zD(e,t,r);case"JSXOpeningFragment":case"JSXClosingFragment":return ZD(e,t);case"JSXEmptyExpression":return ty(e,t);case"JSXText":throw new Error("JSXText should be handled by JSXElement");default:throw new it(n,"JSX")}}function ny(e){if(e.children.length===0)return!0;if(e.children.length>1)return!1;let t=e.children[0];return t.type==="JSXText"&&!Xt(t)}function oy(e){return e.type==="JSXExpressionContainer"&&q(e.expression)&&e.expression.value===" "&&!C(e.expression)}function Rp(e,t,r){let{node:n}=e,o=n.parameters.length>1?Ie(t):"",i=p([f([D,w([", ",D],e.map(r,"parameters"))]),o,D]);return[e.key==="body"&&e.parent.type==="ClassBody"&&n.static?"static ":"",n.readonly?"readonly ":"","[",n.parameters?i:"","]",G(e,r),ke(e,t)]}function gi(e,t,r){let{node:n}=e;return[n.postfix?"":r,G(e,t),n.postfix?r:""]}function Wp(e,t,r){let{node:n}=e,o=[],i=n.kind&&n.kind!=="method"?`${n.kind} `:"";o.push(qt(n),i,je(e,t,r),$(e));let s=Ve(e,t,r,!1,!0),u=G(e,r,"returnType"),a=Bt(n,u);return o.push(a?p(s):s),n.returnType&&o.push(p(u)),[p(o),ke(e,t)]}function Jp(e,t,r){let{node:n}=e;return[re(e),n.kind==="global"?"":`${n.kind} `,r("id"),n.body?[" ",p(r("body"))]:R(t)]}function Gp(e,t,r){let{node:n}=e,o=!(Y(n.expression)||ie(n.expression)),i=p(["<",f([D,r("typeAnnotation")]),D,">"]),s=[O("("),f([D,r("expression")]),D,O(")")];return o?mt([[i,r("expression")],[i,p(s,{shouldBreak:!0})],[i,r("expression")]]):p([i,r("expression")])}function Up(e,t,r,n){let{node:o}=e;if(o.type.startsWith("TS")){if(Cn(o))return o.type.slice(2,-7).toLowerCase();switch(o.type){case"TSThisType":return"this";case"TSTypeAssertion":return Gp(e,t,r);case"TSDeclareFunction":return Dr(e,t,r);case"TSExportAssignment":return["export = ",r("expression"),R(t)];case"TSModuleBlock":return Yn(e,t,r);case"TSInterfaceBody":case"TSTypeLiteral":return Kt(e,t,r);case"TSTypeAliasDeclaration":return co(e,t,r);case"TSQualifiedName":return[r("left"),".",r("right")];case"TSAbstractMethodDefinition":case"TSDeclareMethod":return Hn(e,t,r);case"TSAbstractAccessorProperty":case"TSAbstractPropertyDefinition":return Xn(e,t,r);case"TSInterfaceHeritage":case"TSClassImplements":case"TSInstantiationExpression":return[r("expression"),r("typeArguments")];case"TSTemplateLiteralType":return Ln(e,t,r);case"TSNamedTupleMember":return po(e,t,r);case"TSRestType":return ao(e,t,r);case"TSOptionalType":return[r("typeAnnotation"),"?"];case"TSInterfaceDeclaration":return Ar(e,t,r);case"TSTypeParameterDeclaration":case"TSTypeParameterInstantiation":return $t(e,t,r,"params");case"TSTypeParameter":return lo(e,t,r);case"TSAsExpression":case"TSSatisfiesExpression":return to(e,t,r);case"TSArrayType":return eo(r);case"TSPropertySignature":return[o.readonly?"readonly ":"",je(e,t,r),$(e),G(e,r),ke(e,t)];case"TSParameterProperty":return[qt(o),o.static?"static ":"",o.override?"override ":"",o.readonly?"readonly ":"",r("parameter")];case"TSTypeQuery":return fo(e,r);case"TSIndexSignature":return Rp(e,t,r);case"TSTypePredicate":return mo(e,r);case"TSNonNullExpression":return[r("expression"),"!"];case"TSImportType":return[Vt(e,t,r),o.qualifier?[".",r("qualifier")]:"",$t(e,t,r,"typeArguments")];case"TSLiteralType":return r("literal");case"TSIndexedAccessType":return io(e,t,r);case"TSTypeOperator":return[o.operator," ",r("typeAnnotation")];case"TSMappedType":return Pp(e,t,r);case"TSMethodSignature":return Wp(e,t,r);case"TSNamespaceExportDeclaration":return["export as namespace ",r("id"),R(t)];case"TSEnumDeclaration":return no(e,r);case"TSEnumBody":return ft(e,t,r);case"TSEnumMember":return ro(e,t,r);case"TSImportEqualsDeclaration":return["import ",Fi(o,!1),r("id")," = ",r("moduleReference"),R(t)];case"TSExternalModuleReference":return Vt(e,t,r);case"TSModuleDeclaration":return Jp(e,t,r);case"TSConditionalType":return gr(e,t,r);case"TSInferType":return so(e,t,r);case"TSIntersectionType":return uo(e,t,r);case"TSUnionType":return Bn(e,t,r,n);case"TSFunctionType":case"TSCallSignatureDeclaration":case"TSConstructorType":case"TSConstructSignatureDeclaration":return oo(e,t,r);case"TSTupleType":return xr(e,t,r);case"TSTypeReference":return[r("typeName"),$t(e,t,r,"typeArguments")];case"TSTypeAnnotation":return bn(e,t,r);case"TSEmptyBodyFunctionExpression":return Pn(e,t,r);case"TSJSDocAllType":return"*";case"TSJSDocUnknownType":return"?";case"TSJSDocNullableType":return gi(e,r,"?");case"TSJSDocNonNullableType":return gi(e,r,"!");default:throw new it(o,"TypeScript")}}}function iy(e,t,r,n){for(let o of[pa,vp,Mp,Up,dp]){let i=o(e,t,r,n);if(i!==void 0)return i}}var sy=B(["ClassMethod","ClassPrivateMethod","ClassProperty","ClassAccessorProperty","AccessorProperty","TSAbstractAccessorProperty","PropertyDefinition","TSAbstractPropertyDefinition","ClassPrivateProperty","MethodDefinition","TSAbstractMethodDefinition","TSDeclareMethod"]);function hi(e,t,r,n){e.isRoot&&t.__onHtmlBindingRoot?.(e.node,t);let{node:o}=e,i=Cr(e)?_p(e,t):iy(e,t,r,n);if(!i)return"";if(sy(o))return i;i=uy(e,t,i);let s=o.type!=="ClassExpression"&&j(o.decorators)?Rn(e,t,r):"",u=ne(e,t);return!s&&!u?i:ln(i,a=>[u?"(":"",s?p([s,a]):a,u?")":""])}function uy(e,t,r){let{node:n}=e;return(C(n,T.Leading)||C(n,T.Trailing))&&en(e)?[f([D,Q(e,r,t)]),D]:r}var ay={experimental_avoidAstMutation:!0,experimental_locForRangeFormat:{locStart:b,locEnd:It}},Si={features:ay,massageAstNode:oi,canAttachComment:Vi,handleComments:ds,isGap:Cs,willPrintOwnComments:Tu,embed:Ru,insertPragma:ra,printComment:na,printPrettierIgnored:hi,print:hi,getVisitorKeys:sn,isBlockComment:le,hasPrettierIgnore:Cr};var bi=[{name:"JSON.stringify",type:"data",aceMode:"json",extensions:[".importmap"],filenames:["package.json","package-lock.json","composer.json"],tmScope:"source.json",aliases:["geojson","jsonl","sarif","topojson"],codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json-stringify"],vscodeLanguageIds:["json"],linguistLanguageId:174},{name:"JSON",type:"data",aceMode:"json",extensions:[".json",".4DForm",".4DProject",".avsc",".geojson",".gltf",".har",".ice",".JSON-tmLanguage",".json.example",".mcmeta",".sarif",".slnlaunch",".tact",".tfstate",".tfstate.backup",".topojson",".webapp",".webmanifest",".yy",".yyp"],filenames:[".all-contributorsrc",".arcconfig",".auto-changelog",".c8rc",".htmlhintrc",".imgbotconfig",".nycrc",".tern-config",".tern-project",".watchmanconfig",".babelrc",".jscsrc",".jshintrc",".jslintrc",".swcrc"],tmScope:"source.json",aliases:["geojson","jsonl","sarif","topojson"],codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json"],vscodeLanguageIds:["json"],linguistLanguageId:174},{name:"JSON with Comments",type:"data",aceMode:"javascript",extensions:[".jsonc",".code-snippets",".code-workspace",".sublime-build",".sublime-color-scheme",".sublime-commands",".sublime-completions",".sublime-keymap",".sublime-macro",".sublime-menu",".sublime-mousemap",".sublime-project",".sublime-settings",".sublime-theme",".sublime-workspace",".sublime_metrics",".sublime_session"],filenames:[],tmScope:"source.json.comments",aliases:["jsonc"],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",group:"JSON",parsers:["jsonc"],vscodeLanguageIds:["jsonc"],linguistLanguageId:423},{name:"JSON5",type:"data",aceMode:"json5",extensions:[".json5"],tmScope:"source.js",codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json5"],vscodeLanguageIds:["json5"],linguistLanguageId:175}];var Do={};Co(Do,{estree:()=>Si,"estree-json":()=>ly});var qp={JsonRoot:["node"],ArrayExpression:["elements"],ObjectExpression:["properties"],ObjectProperty:["key","value"],UnaryExpression:["argument"],NullLiteral:[],BooleanLiteral:[],StringLiteral:[],NumericLiteral:[],Identifier:[],TemplateLiteral:["quasis"],TemplateElement:[]};var py=on(qp),Yp=py;function Ur(e){return e.extra.raw}var cy=new Set(["start","end","loc","comments","leadingComments","trailingComments","innerComments","errors","range","tokens"]);function Pi(e,t){let{type:r}=e;if(r==="ObjectProperty"){let{key:n}=e;if(n.type==="Identifier"){let{name:o}=n;t.key={type:"StringLiteral",value:o,extra:{rawValue:o}}}else if(n.type==="NumericLiteral"){let o=Ur(n);String(Number(o))===o&&(t.key={type:"StringLiteral",value:o,extra:{rawValue:o}})}}if(r==="StringLiteral"&&delete t.extra.raw,r==="UnaryExpression"&&e.operator==="+")return t.argument;if((r==="ArrayExpression"||r==="ObjectExpression")&&(t.extra??(t.extra={}),e.extra?.trailingComma&&delete t.extra.trailingComma),r==="ArrayExpression"){for(let[n,o]of e.elements.entries())o===null&&t.elements.splice(n,0,{type:"NullLiteral"});return}if(r==="TemplateLiteral"){let n=e.quasis[0].value.cooked;return{type:"StringLiteral",value:n,extra:{rawValue:n}}}}Pi.ignoredProperties=cy;function Ii(e,t,r){let{node:n}=e;switch(n.type){case"JsonRoot":return[r("node"),d];case"ArrayExpression":{if(n.elements.length===0)return"[]";let o=e.map(()=>e.node===null?"null":r(),"elements");return["[",f([d,w([",",d],o)]),d,"]"]}case"ObjectExpression":return n.properties.length===0?"{}":["{",f([d,w([",",d],e.map(r,"properties"))]),d,"}"];case"ObjectProperty":return[r("key"),": ",r("value")];case"UnaryExpression":return[n.operator==="+"?"":n.operator,r("argument")];case"NullLiteral":return"null";case"BooleanLiteral":return n.value?"true":"false";case"StringLiteral":return ot(Ur(n),t);case"NumericLiteral":{let o=Ur(n);return Hp(e)&&String(Number(o))===o?`"${o}"`:o}case"Identifier":return Hp(e)?JSON.stringify(n.name):n.name;case"TemplateLiteral":return r(["quasis",0]);case"TemplateElement":return JSON.stringify(n.value.cooked);default:throw new it(n,"JSON")}}function Hp(e){return e.key==="key"&&e.parent.type==="ObjectProperty"}var ly={massageAstNode:Pi,print:Ii,getVisitorKeys:Yp};var hr={bracketSpacing:{category:"Common",type:"boolean",default:!0,description:"Print spaces between brackets.",oppositeDescription:"Do not print spaces between brackets."},objectWrap:{category:"Common",type:"choice",default:"preserve",description:"How to wrap object literals.",choices:[{value:"preserve",description:"Keep as multi-line, if there is a newline between the opening brace and first property."},{value:"collapse",description:"Fit to a single line when possible."}]},singleQuote:{category:"Common",type:"boolean",default:!1,description:"Use single quotes instead of double quotes."},proseWrap:{category:"Common",type:"choice",default:"preserve",description:"How to wrap prose.",choices:[{value:"always",description:"Wrap prose if it exceeds the print width."},{value:"never",description:"Do not wrap prose."},{value:"preserve",description:"Wrap prose as-is."}]},bracketSameLine:{category:"Common",type:"boolean",default:!1,description:"Put > of opening tags on the last line instead of on a new line."},singleAttributePerLine:{category:"Common",type:"boolean",default:!1,description:"Enforce single attribute per line in HTML, Vue and JSX."}};var Rt="JavaScript",my={arrowParens:{category:Rt,type:"choice",default:"always",description:"Include parentheses around a sole arrow function parameter.",choices:[{value:"always",description:"Always include parens. Example: `(x) => x`"},{value:"avoid",description:"Omit parens when possible. Example: `x => x`"}]},bracketSameLine:hr.bracketSameLine,objectWrap:hr.objectWrap,bracketSpacing:hr.bracketSpacing,jsxBracketSameLine:{category:Rt,type:"boolean",description:"Put > on the last line instead of at a new line.",deprecated:"2.4.0"},semi:{category:Rt,type:"boolean",default:!0,description:"Print semicolons.",oppositeDescription:"Do not print semicolons, except at the beginning of lines which may need them."},experimentalOperatorPosition:{category:Rt,type:"choice",default:"end",description:"Where to print operators when binary expressions wrap lines.",choices:[{value:"start",description:"Print operators at the start of new lines."},{value:"end",description:"Print operators at the end of previous lines."}]},experimentalTernaries:{category:Rt,type:"boolean",default:!1,description:"Use curious ternaries, with the question mark after the condition.",oppositeDescription:"Default behavior of ternaries; keep question marks on the same line as the consequent."},singleQuote:hr.singleQuote,jsxSingleQuote:{category:Rt,type:"boolean",default:!1,description:"Use single quotes in JSX."},quoteProps:{category:Rt,type:"choice",default:"as-needed",description:"Change when properties in objects are quoted.",choices:[{value:"as-needed",description:"Only add quotes around object properties where required."},{value:"consistent",description:"If at least one property in an object requires quotes, quote all properties."},{value:"preserve",description:"Respect the input use of quotes in object properties."}]},trailingComma:{category:Rt,type:"choice",default:"all",description:"Print trailing commas wherever possible when multi-line.",choices:[{value:"all",description:"Trailing commas wherever possible (including function arguments)."},{value:"es5",description:"Trailing commas where valid in ES5 (objects, arrays, etc.)"},{value:"none",description:"No trailing commas."}]},singleAttributePerLine:hr.singleAttributePerLine},Xp=my;var fy={...Bi,...Do},Dy=[...Mi,...bi];return rc(yy);});+`)}},ia=ai;var dr=new ia(` +\r `);function Xt(e){return e.type==="JSXText"&&(dr.hasNonWhitespaceCharacter(ye(e))||!/\n/.test(ye(e)))}function sa(e){let{node:t,parent:r}=e;if(!H(t)||!H(r))return!1;let{index:n,siblings:o}=e,i;for(let s=n;s>0;s--){let u=o[s-1];if(!(u.type==="JSXText"&&!Xt(u))){i=u;break}}return i?.type==="JSXExpressionContainer"&&i.expression.type==="JSXEmptyExpression"&&Lt(i.expression)}function Cf(e){return Lt(e.node)||sa(e)}var Cr=Cf;var pi=class extends Error{name="UnexpectedNodeError";constructor(t,r,n="type"){super(`Unexpected ${r} node ${n}: ${JSON.stringify(t[n])}.`),this.node=t}},it=pi;function ua(e){return e.type==="CallExpression"&&!e.optional&&e.arguments.length===1&&e.callee.type==="Identifier"&&e.callee.name==="Boolean"}var Ff=0;function Rn(e,t,r){let{node:n,parent:o,grandparent:i,key:s}=e,u=s!=="body"&&(o.type==="IfStatement"||o.type==="WhileStatement"||o.type==="SwitchStatement"||o.type==="DoWhileStatement"),a=n.operator==="|>"&&e.root.extra?.__isUsingHackPipeline,c=ci(e,t,r,!1,u);if(u)return c;if(a)return p(c);if(s==="callee"&&Tt(o)||o.type==="UnaryExpression"&&!x(n)||N(o)&&!o.computed)return p([m([D,...c]),D]);let f=ut(o)||o.type==="JSXExpressionContainer"&&i.type==="JSXAttribute"||n.operator!=="|"&&o.type==="JsExpressionRoot"||n.type!=="NGPipeExpression"&&(o.type==="NGRoot"&&t.parser==="__ng_binding"||o.type==="NGMicrosyntaxExpression"&&i.type==="NGMicrosyntax"&&i.body.length===1)||n===o.body&&o.type==="ArrowFunctionExpression"||n!==o.body&&o.type==="ForStatement"||o.type==="ConditionalExpression"&&!ut(i)&&!Tt(i)||o.type==="TemplateLiteral"||s==="argument"&&o.type==="UnaryExpression"||s==="arguments"&&ua(o),y=o.type==="AssignmentExpression"||o.type==="VariableDeclarator"||o.type==="ClassProperty"||o.type==="PropertyDefinition"||o.type==="TSAbstractPropertyDefinition"||o.type==="ClassPrivateProperty"||Ge(o),F=be(n.left)&&Lr(n.operator,n.left.operator);if(f||Fr(n)&&!F||!Fr(n)&&y)return p(c);if(c.length===0)return"";let A=H(n.right),E=c.findIndex(v=>typeof v!="string"&&!Array.isArray(v)&&v.type===ge),P=c.slice(0,E===-1?1:E+1),C=c.slice(P.length,A?-1:void 0),I=Symbol("logicalChain-"+ ++Ff),k=p([...P,m(C)],{id:I});if(!A)return k;let h=w(0,c,-1);return p([k,ht(h,{groupId:I})])}function ci(e,t,r,n,o){let{node:i}=e;if(!be(i))return[p(r())];let s=[];Lr(i.operator,i.left.operator)?s=e.call(()=>ci(e,t,r,!0,o),"left"):s.push(p(r("left")));let u=Fr(i),a=i.right.type==="ChainExpression"?i.right.expression:i.right,c=(i.type==="NGPipeExpression"||i.operator==="|>"||xf(e,t))&&!Oe(t.originalText,a),y=!x(a,g.Leading,nr)&&Oe(t.originalText,a),F=i.type==="NGPipeExpression"?"|":i.operator,A=i.type==="NGPipeExpression"&&i.arguments.length>0?p(m([D,": ",L([T,": "],e.map(()=>Se(2,p(r())),"arguments"))])):"",E;if(u)E=[F,Oe(t.originalText,a)?m([T,r("right"),A]):[" ",r("right"),A]];else{let h=F==="|>"&&e.root.extra?.__isUsingHackPipeline?e.call(()=>ci(e,t,r,!0,o),"right"):r("right");if(t.experimentalOperatorPosition==="start"){let v="";if(y)switch(Xe(h)){case Me:v=h[0],h.shift();break;case Ne:v=h.contents[0],h.contents.shift();break}E=[T,v,F," ",h,A]}else E=[c?T:"",F,c?" ":T,h,A]}let{parent:P}=e,C=x(i.left,g.Trailing|g.Line);if((C||!(o&&i.type==="LogicalExpression")&&P.type!==i.type&&i.left.type!==i.type&&i.right.type!==i.type)&&(E=p(E,{shouldBreak:C})),t.experimentalOperatorPosition==="start"?s.push(u||y?" ":"",E):s.push(c?"":" ",E),n&&x(i)){let k=ur(Q(e,s,t));return k.type===Ue?k.parts:Array.isArray(k)?k:[k]}return s}function Fr(e){return e.type!=="LogicalExpression"?!1:!!(ie(e.right)&&e.right.properties.length>0||Y(e.right)&&e.right.elements.length>0||H(e.right))}var aa=e=>e.type==="BinaryExpression"&&e.operator==="|";function xf(e,t){return(t.parser==="__vue_expression"||t.parser==="__vue_ts_expression")&&aa(e.node)&&!e.hasAncestor(r=>!aa(r)&&r.type!=="JsExpressionRoot")}function ca(e,t,r){let{node:n}=e;if(n.type.startsWith("NG"))switch(n.type){case"NGRoot":return r("node");case"NGPipeExpression":return Rn(e,t,r);case"NGChainedExpression":return p(L([";",T],e.map(()=>gf(e)?r():["(",r(),")"],"expressions")));case"NGEmptyExpression":return"";case"NGMicrosyntax":return e.map(()=>[e.isFirst?"":pa(e)?" ":[";",T],r()],"body");case"NGMicrosyntaxKey":return/^[$_a-z][\w$]*(?:-[$_a-z][\w$])*$/i.test(n.name)?n.name:JSON.stringify(n.name);case"NGMicrosyntaxExpression":return[r("expression"),n.alias===null?"":[" as ",r("alias")]];case"NGMicrosyntaxKeyedExpression":{let{index:o,parent:i}=e,s=pa(e)||Af(e)||(o===1&&(n.key.name==="then"||n.key.name==="else"||n.key.name==="as")||o===2&&(n.key.name==="else"&&i.body[o-1].type==="NGMicrosyntaxKeyedExpression"&&i.body[o-1].key.name==="then"||n.key.name==="track"))&&i.body[0].type==="NGMicrosyntaxExpression";return[r("key"),s?" ":": ",r("expression")]}case"NGMicrosyntaxLet":return["let ",r("key"),n.value===null?"":[" = ",r("value")]];case"NGMicrosyntaxAs":return[r("key")," as ",r("alias")];default:throw new it(n,"Angular")}}function pa({node:e,index:t}){return e.type==="NGMicrosyntaxKeyedExpression"&&e.key.name==="of"&&t===1}function Af(e){let{node:t}=e;return e.parent.body[1].key.name==="of"&&t.type==="NGMicrosyntaxKeyedExpression"&&t.key.name==="track"&&t.key.type==="NGMicrosyntaxKey"}var Tf=B(["CallExpression","OptionalCallExpression","AssignmentExpression"]);function gf({node:e}){return _r(e,Tf)}function li(e,t,r){let{node:n}=e;return p([L(T,e.map(r,"decorators")),ma(n,t)?d:T])}function la(e,t,r){return fa(e.node)?[L(d,e.map(r,"declaration","decorators")),d]:""}function Wn(e,t,r){let{node:n,parent:o}=e,{decorators:i}=n;if(!j(i)||fa(o)||Cr(e))return"";let s=n.type==="ClassExpression"||n.type==="ClassDeclaration"||ma(n,t);return[e.key==="declaration"&&Yi(o)?d:s?je:"",L(T,e.map(r,"decorators")),T]}function ma(e,t){return e.decorators.some(r=>J(t.originalText,S(r)))}function fa(e){if(e.type!=="ExportDefaultDeclaration"&&e.type!=="ExportNamedDeclaration"&&e.type!=="DeclareExportDeclaration")return!1;let t=e.declaration?.decorators;return j(t)&&kt(e,t[0])}function Jn(e){return e.type==="UnaryExpression"&&(e.operator==="+"||e.operator==="-")&&Ee(e.argument)}function xr(e,t,r){let{node:n}=e,o=[],i=Zt(n)?"elementTypes":"elements",s=n[i];if(s.length===0&&!n.inexact)o.push(p(["[",Mt(e,t),"]"]));else{let u=w(0,s,-1),a=u?.type!=="RestElement"&&!n.inexact,c=u===null,f=Symbol("array"),y=!t.__inJestEach&&s.length>1&&s.every((E,P,C)=>{if(!Y(E)&&!ie(E))return!1;let I=E?.type,k=C[P+1];if(k&&I!==k.type)return!1;let h=Y(E)?"elements":"properties";return E[h]&&E[h].length>1})||x(n,g.Dangling|g.Line),F=mi(n,t),A=a?c?",":gn(t)?F?O(",","",{groupId:f}):O(","):"":"";o.push(p(["[",m([D,F?Sf(e,t,r,A):[hf(e,t,r,i,n.inexact),A],W(e,t)]),D,"]"],{shouldBreak:y,id:f}))}return o.push($(e),G(e,r)),o}function mi(e,t){return Y(e)&&e.elements.length>0&&e.elements.every(r=>r&&(Ee(r)||Jn(r)&&!x(r.argument))&&!x(r,g.Trailing|g.Line,n=>!J(t.originalText,b(n),{backwards:!0})))}function Da({node:e},{originalText:t}){let r=S(e);if(r===b(e))return!1;let{length:n}=t;for(;r<n&&t[r]!==",";)r=tr(t,rr(t,r+1));return Gt(t,r)}function hf(e,t,r,n,o){let i=[];return e.each(({node:s,isLast:u})=>{i.push(s?p(r()):""),(!u||o)&&i.push([",",T,s&&Da(e,t)?D:""])},n),o&&i.push("..."),i}function Sf(e,t,r,n){let o=[];return e.each(({isLast:i,next:s})=>{o.push([r(),i?n:","]),i||o.push(Da(e,t)?[d,d]:x(s,g.Leading|g.Line)?d:T)},"elements"),yn(o)}function fi(e){return e.quasis.some(t=>t.value.raw.includes(`+`))}function Gn(e,t){return(e.type==="TemplateLiteral"&&fi(e)||e.type==="TaggedTemplateExpression"&&fi(e.quasi))&&!J(t,b(e),{backwards:!0})}var Bf=new WeakMap;function ya(e){return Z(Bf,e,t=>t.type==="ConditionalExpression"&&!Ce(t,r=>r.type==="ObjectExpression"))}var bf=e=>e.type==="SequenceExpression";function Ea(e,t,r,n={}){let o=[],i,s=[],u=!1,a=!n.expandLastArg&&e.node.body.type==="ArrowFunctionExpression",c;(function I(){let{node:k}=e,h=Pf(e,t,r,n);if(o.length===0)o.push(h);else{let{leading:v,trailing:U}=Tn(e,t);o.push([v,h]),s.unshift(U)}a&&(u||(u=k.returnType&&ee(k).length>0||k.typeParameters||ee(k).some(v=>v.type!=="Identifier"))),!a||k.body.type!=="ArrowFunctionExpression"?(i=r("body",n),c=k.body):e.call(I,"body")})();let f=!Oe(t.originalText,c)&&(bf(c)||If(c,i,t)||!u&&ya(c)),y=e.key==="callee"&&Dt(e.parent),F=Symbol("arrow-chain"),A=kf(e,n,{signatureDocs:o,shouldBreak:u}),E=!1,P=!1,C=!1;return a&&(y||n.assignmentLayout)&&(P=!0,C=!x(e.node,g.Leading&g.Line),E=n.assignmentLayout==="chain-tail-arrow-chain"||y&&!f),i=wf(e,t,n,{bodyDoc:i,bodyComments:s,functionBody:c,shouldPutBodyOnSameLine:f}),p([p(P?m([C?D:"",A]):A,{shouldBreak:E,id:F})," =>",a?ht(i,{groupId:F}):p(i),a&&y?O(D,"",{groupId:F}):""])}function Pf(e,t,r,n){let{node:o}=e,i=[];if(o.async&&i.push("async "),kn(e,t))i.push(r(["params",0]));else{let u=n.expandLastArg||n.expandFirstArg,a=wn(e,r);if(u){if(ue(a))throw new St;a=p(Jt(a))}i.push(p([Ke(e,t,r,u,!0),a]))}let s=W(e,t,{marker:"commentBeforeArrow"});return s&&i.push(" ",s),i}function If(e,t,r){return Y(e)||ie(e)||e.type==="ArrowFunctionExpression"||e.type==="DoExpression"||e.type==="BlockStatement"||H(e)||t.label?.hug!==!1&&(t.label?.embed||Gn(e,r.originalText))}function kf(e,t,{signatureDocs:r,shouldBreak:n}){if(r.length===1)return r[0];let{parent:o,key:i}=e;return i!=="callee"&&Dt(o)||be(o)?p([r[0]," =>",m([T,L([" =>",T],r.slice(1))])],{shouldBreak:n}):i==="callee"&&Dt(o)||t.assignmentLayout?p(L([" =>",T],r),{shouldBreak:n}):p(m(L([" =>",T],r)),{shouldBreak:n})}function wf(e,t,r,{bodyDoc:n,bodyComments:o,functionBody:i,shouldPutBodyOnSameLine:s}){let{node:u,parent:a}=e,c=r.expandLastArg?Ie(t,"all"):"",f=(r.expandLastArg||a.type==="JSXExpressionContainer")&&!x(u)?D:"";return s&&ya(i)?[" ",p([O("","("),m([D,n]),O("",")"),c,f]),o]:s?[" ",n,o]:[m([T,n,o]),c,f]}var Lf=.25;function Wr(e,t){let{printWidth:r}=t;if(x(e))return!1;let n=r*Lf;if(e.type==="ThisExpression"||e.type==="Identifier"&&e.name.length<=n||Jn(e)&&!x(e.argument))return!0;let o=e.type==="Literal"&&"regex"in e&&e.regex.pattern||e.type==="RegExpLiteral"&&e.pattern;return o?o.length<=n:q(e)?ot(ye(e),t).length<=n:e.type==="TemplateLiteral"?e.expressions.length===0&&e.quasis[0].value.raw.length<=n&&!e.quasis[0].value.raw.includes(`+`):e.type==="UnaryExpression"?Wr(e.argument,{printWidth:r}):e.type==="CallExpression"&&e.arguments.length===0&&e.callee.type==="Identifier"?e.callee.name.length<=n-2:er(e)}function jt(e){return N(e)||e.type==="BindExpression"&&!!e.object}function da(e){if(e.length<=1)return!1;let t=0;for(let r of e)if(wt(r)){if(t+=1,t>1)return!0}else if(r=Pe(r),M(r)){for(let n of se(r))if(wt(n))return!0}return!1}function Un(e){let{node:t,parent:r,key:n}=e;return n==="callee"&&M(t)&&M(r)&&r.arguments.length>0&&t.arguments.length>r.arguments.length}var Of=new Set(["!","-","+","~"]),Mf=B(["Identifier","ThisExpression","Super","PrivateName","PrivateIdentifier"]);function st(e,t=2){if(t<=0)return!1;let r=n=>st(n,t-1);if(e=Pe(e),Xr(e))return dt(e.pattern??e.regex.pattern)<=5;if(er(e)||Mf(e)||e.type==="ArgumentPlaceholder")return!0;if(e.type==="TemplateLiteral")return e.quasis.every(n=>!n.value.raw.includes(`+`))&&e.expressions.every(r);if(ie(e))return e.properties.every(n=>!n.computed&&(n.shorthand||n.value&&r(n.value)));if(Y(e))return e.elements.every(n=>n===null||r(n));if(Dt(e)){if(e.type==="ImportExpression"||st(e.callee,t)){let n=se(e);return n.length<=t&&n.every(r)}return!1}return N(e)?st(e.object,t)&&st(e.property,t):e.type==="UnaryExpression"&&Of.has(e.operator)||e.type==="UpdateExpression"?st(e.argument,t):!1}function _f(e,t,r){let{node:n}=e,o=se(n);if(o.length===0)return p(["(",Mt(e,t),")"]);let i=o.length-1;if(vf(o)){let y=["("];return kr(e,(F,A)=>{y.push(r()),A!==i&&y.push(", ")}),y.push(")"),y}let s=!1,u=[];kr(e,({node:y},F)=>{let A=r();F===i||(me(y,t)?(s=!0,A=[A,",",d,d]):A=[A,",",T]),u.push(A)});let a=e.root.type!=="NGRoot"&&n.type!=="ImportExpression"&&n.type!=="TSImportType"&&n.type!=="TSExternalModuleReference"?Ie(t,"all"):"";function c(){return p(["(",m([T,...u]),a,T,")"],{shouldBreak:!0})}if(s||e.parent.type!=="Decorator"&&da(o))return c();if(jf(o)){let y=u.slice(1);if(y.some(ue))return c();let F;try{F=r(ho(n,0),{expandFirstArg:!0})}catch(A){if(A instanceof St)return c();throw A}return ue(F)?[je,mt([["(",p(F,{shouldBreak:!0}),", ",...y,")"],c()])]:mt([["(",F,", ",...y,")"],["(",p(F,{shouldBreak:!0}),", ",...y,")"],c()])}if(Nf(o,u,t)){let y=u.slice(0,-1);if(y.some(ue))return c();let F;try{F=r(ho(n,-1),{expandLastArg:!0})}catch(A){if(A instanceof St)return c();throw A}return ue(F)?[je,mt([["(",...y,p(F,{shouldBreak:!0}),")"],c()])]:mt([["(",...y,F,")"],["(",...y,p(F,{shouldBreak:!0}),")"],c()])}let f=["(",m([D,...u]),a,D,")"];return Un(e)?f:p(f,{shouldBreak:u.some(ue)||s})}function qn(e,t=!1){if(ie(e)&&(e.properties.length>0||x(e))||Y(e)&&(e.elements.length>0||x(e))||(de(e)||e.type==="TSTypeAssertion")&&qn(e.expression)||e.type==="FunctionExpression"||e.type==="DoExpression"||e.type==="ModuleExpression")return!0;if(e.type==="ArrowFunctionExpression"){let{body:r}=e;if(r.type==="BlockStatement"||H(r)||ie(r)||Y(r)||r.type==="ArrowFunctionExpression"&&qn(r,!0)||!t&&(r.type==="ConditionalExpression"||M(Pe(r))))return!0}return!1}function Nf(e,t,r){if(e.length===1){let i=w(0,t,-1);if(i.label?.embed&&i.label?.hug!==!1)return!0}let n=w(0,e,-1),o=w(0,e,-2);return!x(n,g.Leading)&&!x(n,g.Trailing)&&qn(n)&&(!o||o.type!==n.type)&&(e.length!==2||o.type!=="ArrowFunctionExpression"||!Y(n))&&!(e.length>1&&mi(n,r))}function jf(e){if(e.length!==2)return!1;let[t,r]=e;return t.type==="ModuleExpression"&&Rf(r)?!0:!x(t)&&(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression"&&t.body.type==="BlockStatement")&&r.type!=="FunctionExpression"&&r.type!=="ArrowFunctionExpression"&&r.type!=="ConditionalExpression"&&Fa(r)&&!qn(r)}function Fa(e){if(e.type==="ParenthesizedExpression")return Fa(e.expression);if(de(e)||e.type==="TypeCastExpression"){let{typeAnnotation:t}=e;if(t.type==="TypeAnnotation"&&(t=t.typeAnnotation),t.type==="TSArrayType"&&(t=t.elementType,t.type==="TSArrayType"&&(t=t.elementType)),t.type==="GenericTypeAnnotation"||t.type==="TSTypeReference"){let r=t.type==="GenericTypeAnnotation"?t.typeParameters:t.typeArguments;r?.params.length===1&&(t=r.params[0])}return cr(t)&&st(e.expression,1)}return Dt(e)&&se(e).length>1?!1:be(e)?st(e.left,1)&&st(e.right,1):Xr(e)||st(e)}function vf(e){return e.length===2?Ca(e,0):e.length===3?e[0].type==="Identifier"&&Ca(e,1):!1}function Ca(e,t){let r=e[t],n=e[t+1];return r.type==="ArrowFunctionExpression"&&ee(r).length===0&&r.body.type==="BlockStatement"&&n.type==="ArrayExpression"&&e.every(o=>!x(o))}function Rf(e){if(!(e.type==="ObjectExpression"&&e.properties.length===1))return!1;let[t]=e.properties;return Ge(t)?!t.computed&&(t.key.type==="Identifier"&&t.key.name==="type"||q(t.key)&&t.key.value==="type")&&q(t.value)&&t.value.value==="module":!1}var Jr=_f;function xa(e,t,r){return[r("object"),p(m([D,Di(e,t,r)]))]}function Di(e,t,r){return["::",r("callee")]}var Wf=e=>M(e)&&se(e).length>0;function Jf(e){let{node:t,ancestors:r}=e;for(let n of r){if(!(N(n)&&n.object===t||n.type==="TSNonNullExpression"&&n.expression===t))return n.type==="NewExpression"&&n.callee===t;t=n}return!1}function Aa(e,t,r){let n=r("object"),o=yi(e,t,r),{node:i}=e,s=e.findAncestor(c=>!(N(c)||c.type==="TSNonNullExpression")),u=e.findAncestor(c=>!We(c)),a=s.type==="BindExpression"||s.type==="AssignmentExpression"&&s.left.type!=="Identifier"||Jf(e)||i.computed||i.object.type==="Identifier"&&i.property.type==="Identifier"&&!N(u)||(u.type==="AssignmentExpression"||u.type==="VariableDeclarator")&&(Wf(Pe(i.object))||n.label?.memberChain);return Et(n.label,[n,Be,a?o:p(m([D,o]))])}function yi(e,t,r){let n=r("property"),{node:o}=e,i=$(e);return o.computed?!o.property||Ee(o.property)?[i,"[",n,"]"]:p([i,"[",m([D,n]),D,"]"]):[i,".",n]}function Gf(e,t,r){let n=(e.parent.type==="ChainExpression"?e.grandparent:e.parent).type==="ExpressionStatement",o=[];function i(_){let{originalText:Ae}=t,we=Wt(Ae,S(_));return Ae.charAt(we)===")"?we!==!1&&Gt(Ae,we+1):me(_,t)}function s(){let{node:_}=e;if(M(_)&&(jt(_.callee)||M(_.callee))&&!oe(e,t)){let Ae=i(_);o.unshift({node:_,hasTrailingEmptyLine:Ae,printed:[Q(e,[$(e),r("typeArguments"),Jr(e,t,r)],t),Ae?d:""]}),e.call(s,"callee")}else jt(_)&&!oe(e,t)?(o.unshift({node:_,printed:Q(e,N(_)?yi(e,t,r):Di(e,t,r),t)}),e.call(s,"object")):_.type==="ChainExpression"&&!oe(e,t)?e.call(s,"expression"):_.type==="TSNonNullExpression"&&!oe(e,t)?(o.unshift({node:_,printed:Q(e,"!",t)}),e.call(s,"expression")):o.unshift({node:_,printed:r()})}let{node:u}=e;o.unshift({node:u,printed:[$(e),r("typeArguments"),Jr(e,t,r)]}),u.callee&&e.call(s,"callee");let a=[],c=[o[0]],f=1;for(;f<o.length&&(o[f].node.type==="TSNonNullExpression"||o[f].node.type==="ChainExpression"||M(o[f].node)||N(o[f].node)&&o[f].node.computed&&Ee(o[f].node.property));++f)c.push(o[f]);if(!M(o[0].node))for(;f+1<o.length&&(jt(o[f].node)&&jt(o[f+1].node));++f)c.push(o[f]);a.push(c),c=[];let y=!1;for(;f<o.length;++f){if(y&&jt(o[f].node)){if(o[f].node.computed&&Ee(o[f].node.property)){c.push(o[f]);continue}a.push(c),c=[],y=!1}(M(o[f].node)||o[f].node.type==="ImportExpression")&&(y=!0),c.push(o[f]),x(o[f].node,g.Trailing)&&(a.push(c),c=[],y=!1)}c.length>0&&a.push(c);function F(_){return/^[A-Z]|^[$_]+$/.test(_)}function A(_){return _.length<=t.tabWidth}function E(_){let Ae=_[1][0]?.node.computed;if(_[0].length===1){let Pt=_[0][0].node;return Pt.type==="ThisExpression"||Pt.type==="Identifier"&&(F(Pt.name)||n&&A(Pt.name)||Ae)}let we=w(0,_[0],-1).node;return N(we)&&we.property.type==="Identifier"&&(F(we.property.name)||Ae)}let P=a.length>=2&&!x(a[1][0].node)&&E(a);function C(_){return _.map(Ae=>Ae.printed)}function I(_){return _.length===0?"":m([d,L(d,_.map(C))])}let k=a.map(C),h=k,v=P?3:2,U=a.flat(),ae=U.slice(1,-1).some(_=>x(_.node,g.Leading))||U.slice(0,-1).some(_=>x(_.node,g.Trailing))||a[v]&&x(a[v][0].node,g.Leading);if(a.length<=v&&!ae&&a.every(_=>!w(0,_,-1).hasTrailingEmptyLine))return Un(e)?h:p(h);let fe=w(0,a[P?1:0],-1).node,z=!M(fe)&&i(fe),xe=[C(a[0]),P?a.slice(1,2).map(C):"",z?d:"",I(a.slice(P?2:1))],De=o.map(({node:_})=>_).filter(M);function xt(){let _=w(0,w(0,a,-1),-1).node,Ae=w(0,k,-1);return M(_)&&ue(Ae)&&De.slice(0,-1).some(we=>we.arguments.some(wt))}let bt;return ae||De.length>2&&De.some(_=>_.arguments.some(Ae=>!st(Ae)))||k.slice(0,-1).some(ue)||xt()?bt=p(xe):bt=[ue(h)||z?je:"",mt([h,xe])],Et({memberChain:!0},bt)}var Ta=Gf;function Vt(e,t,r){let{node:n}=e,o=n.type==="NewExpression",i=$(e),s=se(n),u=n.type!=="TSImportType"&&n.typeArguments?[r("typeArguments"),Be]:"",a=s.length===1&&Gn(s[0],t.originalText);if(a||qf(e)||Yf(e)||Ut(n,e.parent)){let y=[];if(kr(e,()=>{y.push(r())}),!(a&&y[0].label?.embed))return[ga(e,r),i,u,"(",L(", ",y),")"]}let c=n.type==="ImportExpression"||n.type==="TSImportType"||n.type==="TSExternalModuleReference";if(!c&&!o&&jt(n.callee)&&!e.call(()=>oe(e,t),"callee",...n.callee.type==="ChainExpression"?["expression"]:[]))return Ta(e,t,r);let f=[ga(e,r),i,u,Jr(e,t,r)];return c||M(n.callee)?p(f):f}function ga(e,t){let{node:r}=e;return r.type==="ImportExpression"?`import${r.phase?`.${r.phase}`:""}`:r.type==="TSImportType"?"import":r.type==="TSExternalModuleReference"?"require":[r.type==="NewExpression"?"new ":"",t("callee"),Be]}var Uf=["require","require.resolve","require.resolve.paths","import.meta.resolve"];function qf(e){let{node:t}=e;if(!(t.type==="ImportExpression"||t.type==="TSImportType"||t.type==="TSExternalModuleReference"||t.type==="CallExpression"&&!t.optional&&lr(t.callee,Uf)))return!1;let r=se(t);return r.length===1&&q(r[0])&&!x(r[0])}function Yf(e){let{node:t}=e;if(t.type!=="CallExpression"||t.optional||t.callee.type!=="Identifier")return!1;let r=se(t);return t.callee.name==="require"?(r.length===1&&q(r[0])||r.length>1)&&!x(r[0]):t.callee.name==="define"&&e.parent.type==="ExpressionStatement"?r.length===1||r.length===2&&r[0].type==="ArrayExpression"||r.length===3&&q(r[0])&&r[1].type==="ArrayExpression":!1}function vt(e,t,r,n,o,i){let s=Hf(e,t,r,n,i),u=i?r(i,{assignmentLayout:s}):"";switch(s){case"break-after-operator":return p([p(n),o,p(m([T,u]))]);case"never-break-after-operator":return p([p(n),o," ",u]);case"fluid":{let a=Symbol("assignment");return p([p(n),o,p(m(T),{id:a}),Be,ht(u,{groupId:a})])}case"break-lhs":return p([n,o," ",p(u)]);case"chain":return[p(n),o,T,u];case"chain-tail":return[p(n),o,m([T,u])];case"chain-tail-arrow-chain":return[p(n),o,u];case"only-left":return n}}function Ba(e,t,r){let{node:n}=e;return vt(e,t,r,r("left"),[" ",n.operator],"right")}function ba(e,t,r){return vt(e,t,r,r("id")," =","init")}function Hf(e,t,r,n,o){let{node:i}=e,s=i[o];if(!s)return"only-left";let u=!Yn(s);if(e.match(Yn,Pa,F=>!u||F.type!=="ExpressionStatement"&&F.type!=="VariableDeclaration"))return u?s.type==="ArrowFunctionExpression"&&s.body.type==="ArrowFunctionExpression"?"chain-tail-arrow-chain":"chain-tail":"chain";if(!u&&Yn(s.right)||pe(s)&&!Ht(s)||Oe(t.originalText,s)||x(s,g.Leading,vn))return"break-after-operator";if(i.type==="ImportAttribute"||s.type==="CallExpression"&&s.callee.name==="require"||e.root.type==="JsonRoot")return"never-break-after-operator";let f=js(n);if(Vf(i)||Qf(i)||Ei(i)&&f)return"break-lhs";let y=zf(i,n,t);return e.call(()=>Xf(e,t,r,y),o)?"break-after-operator":Kf(i)?"break-lhs":!f&&(y||s.type==="TemplateLiteral"||s.type==="TaggedTemplateExpression"||Ui(s)||Ee(s)||s.type==="ClassExpression")?"never-break-after-operator":"fluid"}function Xf(e,t,r,n){let o=e.node;if(be(o)&&!Fr(o))return!0;switch(o.type){case"StringLiteralTypeAnnotation":case"SequenceExpression":return!0;case"TSConditionalType":case"ConditionalTypeAnnotation":if(!t.experimentalTernaries&&!eD(o))break;return!0;case"ConditionalExpression":{if(!t.experimentalTernaries){let{test:c}=o;return be(c)&&!Fr(c)}let{consequent:u,alternate:a}=o;return u.type==="ConditionalExpression"||a.type==="ConditionalExpression"}case"ClassExpression":return j(o.decorators)}if(n)return!1;let i=o,s=[];for(;;)if(i.type==="UnaryExpression"||i.type==="AwaitExpression"||i.type==="YieldExpression"&&i.argument!==null)i=i.argument,s.push("argument");else if(i.type==="TSNonNullExpression")i=i.expression,s.push("expression");else break;return!!(q(i)||e.call(()=>Ia(e,t,r),...s))}function Vf(e){if(Pa(e)){let t=e.left||e.id;return t.type==="ObjectPattern"&&t.properties.length>2&&t.properties.some(r=>Ge(r)&&(!r.shorthand||r.value?.type==="AssignmentPattern"))}return!1}function Yn(e){return e.type==="AssignmentExpression"}function Pa(e){return Yn(e)||e.type==="VariableDeclarator"}function Kf(e){let t=$f(e);if(j(t)){let r=e.type==="TSTypeAliasDeclaration"?"constraint":"bound";if(t.length>1&&t.some(n=>n[r]||n.default))return!0}return!1}function $f(e){if(Vr(e))return e.typeParameters?.params}function Qf(e){if(e.type!=="VariableDeclarator")return!1;let{typeAnnotation:t}=e.id;if(!t||!t.typeAnnotation)return!1;let r=ha(t.typeAnnotation);return j(r)&&r.length>1&&r.some(n=>j(ha(n))||n.type==="TSConditionalType")}function Ei(e){return e.type==="VariableDeclarator"&&e.init?.type==="ArrowFunctionExpression"}function ha(e){let t;switch(e.type){case"GenericTypeAnnotation":t=e.typeParameters;break;case"TSTypeReference":t=e.typeArguments;break}return t?.params}function Ia(e,t,r,n=!1){let{node:o}=e,i=()=>Ia(e,t,r,!0);if(We(o))return e.call(i,"expression");if(M(o)){if(Vt(e,t,r).label?.memberChain)return!1;let u=se(o);return!(u.length===0||u.length===1&&Wr(u[0],t))||Zf(o,r)?!1:e.call(i,"callee")}return N(o)?e.call(i,"object"):n&&(o.type==="Identifier"||o.type==="ThisExpression")}function zf(e,t,r){return Ge(e)?(t=ur(t),typeof t=="string"&&dt(t)<r.tabWidth+3):!1}function Zf(e,t){let r=e.typeArguments?.params;if(j(r)){if(r.length>1)return!0;if(r.length===1){let n=r[0];if(pe(n)||At(n)||n.type==="TSTypeLiteral"||n.type==="ObjectTypeAnnotation")return!0}if(ue(t("typeArguments")))return!0}return!1}function Sa(e){switch(e.type){case"FunctionTypeAnnotation":case"GenericTypeAnnotation":case"TSFunctionType":return!!e.typeParameters;case"TSTypeReference":return!!e.typeArguments;default:return!1}}function eD(e){return Sa(e.checkType)||Sa(e.extendsType)}function ka(e,t,r){let{node:n}=e,o=["await"];if(n.argument){o.push(" ",r("argument"));let{parent:i}=e;if(M(i)&&i.callee===n||N(i)&&i.object===n){o=[m([D,...o]),D];let s=e.findAncestor(u=>u.type==="AwaitExpression"||u.type==="BlockStatement");if(s?.type!=="AwaitExpression"||!Ce(s.argument,u=>u===n))return p(o)}}return o}var tD=Array.prototype.findLast??function(e){for(let t=this.length-1;t>=0;t--){let r=this[t];if(e(r,t,this))return r}},rD=Qt("findLast",function(){if(Array.isArray(this))return tD}),wa=rD;function Gr(e,t,r,n){let{node:o}=e,i=[],s=wa(0,o[n],u=>u.type!=="EmptyStatement");return e.each(({node:u})=>{u.type!=="EmptyStatement"&&(i.push(r()),u!==s&&(i.push(d),me(u,t)&&i.push(d)))},n),i}function Hn(e,t,r){let n=nD(e,t,r),{node:o,parent:i}=e;if(o.type==="Program"&&i?.type!=="ModuleExpression")return n?[n,d]:"";let s=[];if(o.type==="StaticBlock"&&s.push("static "),s.push("{"),n)s.push(m([d,n]),d);else{let u=e.grandparent;i.type==="ArrowFunctionExpression"||i.type==="FunctionExpression"||i.type==="FunctionDeclaration"||i.type==="ComponentDeclaration"||i.type==="HookDeclaration"||i.type==="ObjectMethod"||i.type==="ClassMethod"||i.type==="ClassPrivateMethod"||i.type==="ForStatement"||i.type==="WhileStatement"||i.type==="DoWhileStatement"||i.type==="DoExpression"||i.type==="ModuleExpression"||i.type==="CatchClause"&&!u.finalizer||i.type==="TSModuleDeclaration"||i.type==="DeclareModule"||i.type==="MatchStatementCase"||o.type==="StaticBlock"||s.push(d)}return s.push("}"),s}function nD(e,t,r){let{node:n}=e,o=j(n.directives),i=n.body.some(a=>a.type!=="EmptyStatement"),s=x(n,g.Dangling);if(!o&&!i&&!s)return"";let u=[];return o&&(u.push(Gr(e,t,r,"directives")),(i||s)&&(u.push(d),me(w(0,n.directives,-1),t)&&u.push(d))),i&&u.push(Gr(e,t,r,"body")),s&&u.push(W(e,t)),u}function oD(e){let t=new WeakMap;return r=>Z(t,r,()=>Symbol(e))}var La=oD;var Oa=["properties","indexers","callProperties","internalSlots"];function Ma(e,t){let{node:r}=e;if(r.type==="ClassBody"||r.type==="TSInterfaceBody"){e.each(t,"body");return}if(r.type==="TSTypeLiteral"){e.each(t,"members");return}if(r.type==="RecordDeclarationBody"){e.each(t,"elements");return}if(r.type==="ObjectTypeAnnotation"){let n=Oa.flatMap(o=>e.map(({node:i,index:s})=>({node:i,loc:b(i),selector:[o,s]}),o)).sort((o,i)=>o.loc-i.loc);for(let[o,{node:i,selector:s}]of n.entries())e.call(()=>t({node:i,next:n[o+1]?.node,isLast:o===n.length-1}),...s)}}function _a(e){if(e.type==="ObjectTypeAnnotation")return Oa.some(r=>j(e[r]));let t=e.type==="RecordDeclarationBody"?e.elements:e.body;return j(t)}function Kt(e,t,r){let{node:n}=e,o=[],i=n.type==="ObjectTypeAnnotation",s=n.type==="RecordDeclarationBody",u=!ja(e),a=u?T:d,c=x(n,g.Dangling),[f,y]=i&&n.exact?["{|","|}"]:"{}",F=!0,A;if(Ma(e,({node:E,next:P,isLast:C})=>{if(A??(A=E),F&&(F=!1),o.push(r()),!s&&u&&i){let{parent:I}=e;I.inexact||!C?o.push(","):o.push(Ie(t))}s&&E.type!=="MethodDefinition"&&o.push(","),!s&&!u&&(iD({node:E,next:P},t)||Ra({node:E,next:P},t))&&o.push(";"),C||(o.push(a),me(E,t)&&o.push(d))}),c&&o.push(W(e,t)),n.type==="ObjectTypeAnnotation"&&n.inexact){F&&(F=!1);let E;x(n,g.Dangling)?E=[x(n,g.Line)||J(t.originalText,S(w(0,re(n),-1)))?d:T,"..."]:E=[A?T:"","..."],o.push(E)}if(u){let E=x(n,g.Dangling|g.Line)||t.objectWrap==="preserve"&&A&&te(t.originalText,b(n),b(A)),P;if(o.length===0)P=f+y;else{let C=!t.bracketSpacing||F&&!E?D:T;P=[f,m([C,...o]),C,y]}return e.match(void 0,(C,I)=>I==="typeAnnotation",(C,I)=>I==="typeAnnotation",Yt)||e.match(void 0,(C,I)=>C.type==="FunctionTypeParam"&&I==="typeAnnotation",Yt)?P:p(P,{shouldBreak:E})}return[f,o.length>0?[m([d,o]),d]:"",y]}function ja(e){let{node:t}=e;if(t.type==="ObjectTypeAnnotation"){let{key:r,parent:n}=e;return r==="body"&&(n.type==="InterfaceDeclaration"||n.type==="DeclareInterface"||n.type==="DeclareClass")}return t.type==="ClassBody"||t.type==="TSInterfaceBody"||t.type==="RecordDeclarationBody"}function ke(e,t){let{parent:r}=e;return e.callParent(ja)?r.type==="ObjectTypeAnnotation"?";":R(t):r.type==="TSTypeLiteral"?e.isLast?t.semi?O(";"):"":t.semi||Ra({node:e.node,next:e.next},t)?";":O("",";"):""}var Na=B(["ClassProperty","PropertyDefinition","ClassPrivateProperty","ClassAccessorProperty","AccessorProperty","TSAbstractPropertyDefinition","TSAbstractAccessorProperty"]),va=e=>{if(e.computed||e.typeAnnotation)return!1;let{type:t,name:r}=e.key;return t==="Identifier"&&(r==="static"||r==="get"||r==="set")};function iD({node:e,next:t},r){if(r.semi||!Na(e))return!1;if(!e.value&&va(e))return!0;if(!t||t.static||t.accessibility||t.readonly)return!1;if(!t.computed){let n=t.key?.name;if(n==="in"||n==="instanceof")return!0}if(Na(t)&&!t.static&&t.variance&&!t.declare)return!0;switch(t.type){case"ClassProperty":case"PropertyDefinition":case"TSAbstractPropertyDefinition":return t.computed;case"MethodDefinition":case"TSAbstractMethodDefinition":case"ClassMethod":case"ClassPrivateMethod":{if((t.value?t.value.async:t.async)||t.kind==="get"||t.kind==="set")return!1;let o=t.value?t.value.generator:t.generator;return!!(t.computed||o)}case"TSIndexSignature":return!0}return!1}var sD=B(["TSPropertySignature"]);function Ra({node:e,next:t},r){return r.semi||!sD(e)?!1:va(e)?!0:t&&t.type==="TSCallSignatureDeclaration"?!(e.type==="TSPropertySignature"&&e.typeAnnotation):!1}var uD=La("heritageGroup"),aD=B(["TSInterfaceDeclaration","DeclareInterface","InterfaceDeclaration","InterfaceTypeAnnotation"]);function Ar(e,t,r){let n=pD(e,t,r),{node:o}=e;if(o.type==="ClassExpression"&&j(o.decorators)){let i=Wn(e,t,r);return oe(e,t)?[m([D,i,n]),D]:[i,n]}return n}function pD(e,t,r){let{node:n}=e,o=aD(n),i=n.type==="RecordDeclaration",s=o?"interface":i?"record":"class",u=[ne(e),mr(e),s],a=Ja(e),c=[],f=[];if(n.type!=="InterfaceTypeAnnotation"){n.id&&c.push(" ");for(let F of["id","typeParameters"])if(n[F]){let{leading:A,trailing:E}=e.call(()=>Tn(e,t),F);c.push(A,r(F),m(E))}}if(n.superClass){let F=[mD(e,t,r),r("superTypeArguments")],A=e.call(()=>["extends ",Q(e,F,t)],"superClass");a?f.push(T,p(A)):f.push(" ",A)}else f.push(di(e,t,r,"extends"));f.push(di(e,t,r,"mixins"),di(e,t,r,"implements"));let y;return a?(y=uD(n),u.push(p([...c,m(f)],{id:y}))):u.push(...c,...f),!o&&a&&_a(n.body)?u.push(O(d," ",{groupId:y})):u.push(" "),u.push(r("body")),u}function Wa(e){let t=e.superClass?1:0;for(let r of["extends","mixins","implements"])if(Array.isArray(e[r])&&(t+=e[r].length),t>1)return!0;return t>1}function cD(e){let{node:t}=e;if(x(t.id,g.Trailing)||x(t.typeParameters,g.Trailing)||x(t.superClass)||Wa(t))return!0;if(t.superClass)return e.parent.type==="AssignmentExpression"?!1:!t.superTypeArguments&&N(Pe(t.superClass));let r=t.extends?.[0]??t.mixins?.[0]??t.implements?.[0];return r?r.type==="InterfaceExtends"&&r.id.type==="QualifiedTypeIdentifier"&&!r.typeParameters||(r.type==="TSClassImplements"||r.type==="TSInterfaceHeritage")&&N(r.expression)&&!r.typeArguments:!1}var lD=new WeakMap;function Ja(e){return Z(lD,e.node,()=>cD(e))}function di(e,t,r,n){let{node:o}=e;if(!j(o[n]))return"";let i=W(e,t,{marker:n}),s=L([",",T],e.map(r,n));if(!Wa(o)){let u=[`${n} `,i,s];return Ja(e)?[T,p(u)]:[" ",u]}return[T,i,i&&d,n,p(m([T,s]))]}function mD(e,t,r){let n=r("superClass"),{parent:o}=e;return o.type==="AssignmentExpression"?p(O(["(",m([D,n]),D,")"],n)):n}function Xn(e,t,r){let{node:n}=e,o=[];return j(n.decorators)&&o.push(li(e,t,r)),o.push(qt(n)),n.static&&o.push("static "),o.push(mr(e)),n.override&&o.push("override "),o.push(Rr(e,t,r)),o}function Vn(e,t,r){let{node:n}=e,o=[];j(n.decorators)&&o.push(li(e,t,r)),o.push(ne(e),qt(n)),n.static&&o.push("static "),o.push(mr(e)),n.override&&o.push("override "),n.readonly&&o.push("readonly "),n.variance&&o.push(r("variance")),(n.type==="ClassAccessorProperty"||n.type==="AccessorProperty"||n.type==="TSAbstractAccessorProperty")&&o.push("accessor "),o.push(ve(e,t,r),$(e),hn(e),G(e,r));let i=n.type==="TSAbstractPropertyDefinition"||n.type==="TSAbstractAccessorProperty";return[vt(e,t,r,o," =",i?void 0:"value"),R(t)]}function fD(e,t){let r=re(e,g.Leading);if(r.length===0)return!1;let[n]=r,o=t.originalText,i=b(n);return te(o,i,S(n))||J(o,i,{backwards:!0})}function Ft(e,t,r,n="body"){return e.call(({node:o})=>{let i=r();if(o.type==="EmptyStatement")return x(o,g.Leading)?[" ",i]:i;let s=o.type==="BlockStatement";return fD(o,t)?s?[d,i]:m([d,i]):s||o.type==="IfStatement"&&e.parent.type==="IfStatement"&&e.key==="alternate"?[" ",i]:m([T,i])},n)}var Ga=(e,t,r)=>Ft(e,t,r,"consequent"),Ua=(e,t,r)=>Ft(e,t,r,"alternate");function qa(e,t,r){return[p(["do",Ft(e,t,r)]),e.node.body.type==="BlockStatement"?" ":d,"while (",fr(e,t,r),")",R(t)]}var DD=B(["TSAsExpression","TSTypeAssertion","TSNonNullExpression","TSInstantiationExpression","TSSatisfiesExpression"]);function Ci(e){return DD(e)?Ci(e.expression):e}var Ya=B(["FunctionExpression","ArrowFunctionExpression"]);function Ha(e){return e.type==="MemberExpression"||e.type==="OptionalMemberExpression"||e.type==="Identifier"&&e.name!=="undefined"}function yD(e,t){if(Zo(e,t)){let r=Ci(e.node.expression);return Ya(r)||Ha(r)}return!(!t.semi||Qo(e,t)||zo(e,t))}function Xa(e,t,r){let n=[r("expression")];if(yr(e,t)){if(Ln(e,t)){let{node:o}=e,i=w(0,re(o,g.Leading),-1),s=An(e,t,{filter:u=>u===i});return Q(e,[";",s,...n],t,{filter:u=>u!==i})}n.unshift(";")}else yD(e,t)&&n.push(";");return n}function Va(e,t,r){let{node:n}=e,o=Ft(e,t,r),i=W(e,t),s=i?[i,D]:"";return!n.init&&!n.test&&!n.update?[s,p(["for (;;)",o])]:[s,p(["for (",p([m([D,r("init"),";",T,r("test"),";",n.update?[T,r("update")]:""]),D]),")",o])]}function Ka(e,t,r){let{node:n}=e,o=n.type==="ForOfStatement";return p(["for",o&&n.await?" await":""," (",r("left")," ",o?"of":"in"," ",r("right"),")",Ft(e,t,r)])}function $a(e,t,r){if(t.__isVueBindings||t.__isVueForBindingLeft){let n=e.map(r,"program","body",0,"params");if(n.length===1)return n[0];let o=L([",",T],n);return t.__isVueForBindingLeft?["(",m([D,p(o)]),D,")"]:o}if(t.__isEmbeddedTypescriptGenericParameters){let n=e.map(r,"program","body",0,"typeParameters","params");return L([",",T],n)}}var Qa=(e,{originalText:t})=>xn(t,b(e));function Kn(e){return Le(w(0,re(e,g.Dangling),-1))}function za(e,t,r){let{node:n}=e,o=p(["if (",fr(e,t,r),")",Ga(e,t,r)]);if(!n.alternate)return o;let{consequent:i}=n,s=i.type==="BlockStatement",u=[o],a=s;s||(u.push(d),a=!1);let c=re(n,g.Dangling);if(c.length>0){let[f]=c;Qa(f,t)?u.push(s?[d,d]:d):J(t.originalText,b(f),{backwards:!0})?u.push(s?d:""):u.push(" "),u.push(W(e,t),Kn(n)||J(t.originalText,S(w(0,c,-1)))?d:" "),a=!1}return u.push(a?" ":"","else",p(Ua(e,t,r))),u}function tp(e,t){let{node:r}=e;switch(r.type){case"RegExpLiteral":return Za(r);case"BigIntLiteral":return $n(r.extra.raw);case"NumericLiteral":return _t(r.extra.raw);case"StringLiteral":return Ve(ot(r.extra.raw,t));case"NullLiteral":return"null";case"BooleanLiteral":return String(r.value);case"DirectiveLiteral":return ep(r.extra.raw,t);case"Literal":{if(r.regex)return Za(r.regex);if(r.bigint)return $n(r.raw);let{value:n}=r;return typeof n=="number"?_t(r.raw):typeof n=="string"?ED(e)?ep(r.raw,t):Ve(ot(r.raw,t)):String(n)}}}function ED(e){if(e.key!=="expression")return;let{parent:t}=e;return t.type==="ExpressionStatement"&&typeof t.directive=="string"}function $n(e){return e.toLowerCase()}function Za({pattern:e,flags:t}){return t=[...t].sort().join(""),`/${e}/${t}`}var dD="use strict";function ep(e,t){let r=e.slice(1,-1);if(r===dD||!(r.includes('"')||r.includes("'"))){let n=t.singleQuote?"'":'"';return n+r+n}return e}var rp=B(["ImportDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ExportAllDeclaration","DeclareExportDeclaration","DeclareExportAllDeclaration"]),CD=B(["EnumBody","EnumBooleanBody","EnumNumberBody","EnumBigIntBody","EnumStringBody","EnumSymbolBody"]);function ft(e,t,r){let{node:n,parent:o}=e,i=CD(n),s=n.type==="TSEnumBody"||i,u=rp(n),a=i&&n.hasUnknownMembers,c=s?"members":u?"attributes":"properties",f=n[c],y=s||n.type==="ObjectPattern"&&o.type!=="FunctionDeclaration"&&o.type!=="FunctionExpression"&&o.type!=="ArrowFunctionExpression"&&o.type!=="ObjectMethod"&&o.type!=="ClassMethod"&&o.type!=="ClassPrivateMethod"&&o.type!=="AssignmentPattern"&&o.type!=="CatchClause"&&n.properties.some(C=>C.value&&(C.value.type==="ObjectPattern"||C.value.type==="ArrayPattern"))||n.type!=="ObjectPattern"&&t.objectWrap==="preserve"&&f.length>0&&FD(n,f[0],t),F=[],A=e.map(({node:C})=>{let I=[...F,r()];return F=[",",T],me(C,t)&&F.push(d),I},c);if(a){let C;if(x(n,g.Dangling)){let I=x(n,g.Line);C=[W(e,t),I||J(t.originalText,S(w(0,re(n),-1)))?d:T,"..."]}else C=["..."];A.push([...F,...C])}let E=!(a||w(0,f,-1)?.type==="RestElement"),P;if(A.length===0)P=p(["{",Mt(e,t),"}",$(e),G(e,r)]);else{let C=t.bracketSpacing?T:D;P=["{",m([C,...A]),E?Ie(t):"",C,"}",$(e),G(e,r)]}return e.match(C=>C.type==="ObjectPattern"&&!j(C.decorators),Yt)||Ye(n)&&(e.match(void 0,(C,I)=>I==="typeAnnotation",(C,I)=>I==="typeAnnotation",Yt)||e.match(void 0,(C,I)=>C.type==="FunctionTypeParam"&&I==="typeAnnotation",Yt))||!y&&e.match(C=>C.type==="ObjectPattern",C=>C.type==="AssignmentExpression"||C.type==="VariableDeclarator")?P:p(P,{shouldBreak:y})}function FD(e,t,r){let n=r.originalText,o=b(t),i=b(e);return rp(e)&&(i=ce(r).lastIndexOf("{",o)),te(n,i,o)}function np(e,t,r){let{node:n}=e;return["import",n.phase?` ${n.phase}`:"",xi(n),sp(e,t,r),ip(e,t,r),ap(e,t,r),R(t)]}var op=e=>e.type==="ExportDefaultDeclaration"||e.type==="DeclareExportDeclaration"&&e.default;function Qn(e,t,r){let{node:n}=e,o=[la(e,t,r),ne(e),"export",op(n)?" default":""],{declaration:i,exported:s}=n;return x(n,g.Dangling)&&(o.push(" ",W(e,t)),Kn(n)&&o.push(d)),i?o.push(" ",r("declaration")):(o.push(TD(n)),n.type==="ExportAllDeclaration"||n.type==="DeclareExportAllDeclaration"?(o.push(" *"),s&&o.push(" as ",r("exported"))):o.push(sp(e,t,r)),o.push(ip(e,t,r),ap(e,t,r))),o.push(AD(n,t)),o}var xD=B(["ClassDeclaration","ComponentDeclaration","FunctionDeclaration","TSInterfaceDeclaration","DeclareClass","DeclareComponent","DeclareFunction","DeclareHook","HookDeclaration","TSDeclareFunction","EnumDeclaration"]);function AD(e,t){return!e.declaration||op(e)&&!xD(e.declaration)?R(t):""}function Fi(e,t=!0){return e&&e!=="value"?`${t?" ":""}${e}${t?"":" "}`:""}function xi(e,t){return Fi(e.importKind,t)}function TD(e){return Fi(e.exportKind)}function ip(e,t,r){let{node:n}=e;return n.source?[up(n,t)?" from":""," ",r("source")]:""}function sp(e,t,r){let{node:n}=e;if(!up(n,t))return"";let o=[" "];if(j(n.specifiers)){let i=[],s=[];e.each(()=>{let u=e.node.type;if(u==="ExportNamespaceSpecifier"||u==="ExportDefaultSpecifier"||u==="ImportNamespaceSpecifier"||u==="ImportDefaultSpecifier")i.push(r());else if(u==="ExportSpecifier"||u==="ImportSpecifier")s.push(r());else throw new it(n,"specifier")},"specifiers"),o.push(L(", ",i)),s.length>0&&(i.length>0&&o.push(", "),s.length>1||i.length>0||n.specifiers.some(a=>x(a))?o.push(p(["{",m([t.bracketSpacing?T:D,L([",",T],s)]),Ie(t),t.bracketSpacing?T:D,"}"])):o.push(["{",t.bracketSpacing?" ":"",...s,t.bracketSpacing?" ":"","}"]))}else o.push("{}");return o}function up(e,t){return e.type!=="ImportDeclaration"||j(e.specifiers)||e.importKind==="type"?!0:ce(t).slice(b(e),b(e.source)).trimEnd().endsWith("from")}function gD(e,t){let r=ce(t).slice(S(e.source),e.attributes?.[0]?b(e.attributes[0]):S(e)).trimStart();return r.startsWith("assert")?"assert":r.startsWith("with")||j(e.attributes)?"with":void 0}var hD=e=>{let{attributes:t}=e;if(t.length!==1)return!1;let[r]=t,{type:n,key:o,value:i}=r;return n==="ImportAttribute"&&(o.type==="Identifier"&&o.name==="type"||q(o)&&o.value==="type")&&q(i)&&!x(r)&&!x(o)&&!x(i)};function ap(e,t,r){let{node:n}=e;if(!n.source)return"";let o=gD(n,t);if(!o)return"";let i=ft(e,t,r);return hD(n)&&(i=Jt(i)),[` ${o} `,i]}function pp(e,t,r){let{node:n}=e,{type:o}=n,i=o.startsWith("Import"),s=i?"imported":"local",u=i?"local":"exported",a=n[s],c=n[u],f="",y="";return o==="ExportNamespaceSpecifier"||o==="ImportNamespaceSpecifier"?f="*":a&&(f=r(s)),c&&!Ir(n)&&(y=r(u)),[Fi(o==="ImportSpecifier"?n.importKind:n.exportKind,!1),f,f&&y?" as ":"",y]}function zn(e,t,r){let{node:n}=e;return n.shorthand?r("value"):vt(e,t,r,ve(e,t,r),":","value")}function Tr(e,t){return["...",t("argument"),G(e,t)]}function SD(e,t,r){let{node:n}=e,o=r();return pn(n,t)?["(",m([d,o]),d,")"]:be(n)||t.experimentalTernaries&&n.type==="ConditionalExpression"&&(n.consequent.type==="ConditionalExpression"||n.alternate.type==="ConditionalExpression")?p([O("("),m([D,o]),D,O(")")]):o}function Zn(e,t,r){let{node:n}=e;return[n.type==="ThrowStatement"?"throw":"return",n.argument?[" ",e.call(()=>SD(e,t,r),"argument")]:"",R(t)]}function BD(e,t){let{key:r,parent:n}=e;return!!(r==="argument"&&ut(n)&&oe(e,t)||r==="body"&&n.type==="ArrowFunctionExpression")}function cp(e,t,r){let{parent:n}=e;if(n.type==="ExpressionStatement"||n.type==="ForStatement"){let i=[];return e.each(({isFirst:s})=>{s?i.push(r()):i.push(",",m([T,r()]))},"expressions"),p(i)}let o=L([",",T],e.map(r,"expressions"));return BD(e,t)?p(O([m([D,o]),D],o)):p(o)}function lp(e,t,r){return[p(["switch (",m([D,r("discriminant")]),D,")"])," {",e.node.cases.length>0?m([d,L(d,e.map(({node:n,isLast:o})=>[r(),!o&&me(n,t)?d:""],"cases"))]):W(e,t,{indent:!0}),d,"}"]}function mp(e,t,r){let{node:n}=e,o=[];n.test?o.push("case ",r("test"),":"):o.push("default:"),x(n,g.Dangling)&&o.push(" ",W(e,t));let i=n.consequent.filter(s=>s.type!=="EmptyStatement");if(i.length>0){let s=Gr(e,t,r,"consequent");o.push(i.length===1&&i[0].type==="BlockStatement"?[" ",s]:m([d,s]))}return o}function fp(e,t){let r=0;for(let n in e){let o=e[n];if(on(o)&&typeof o.type=="string"&&(r++,r+=fp(o,t-r)),r>t)return r}return r}function Ai(e,t=5){return fp(e,t)<=t}function bD(e){let t=[e];for(let r=0;r<t.length;r++){let n=t[r];for(let o of["test","consequent","alternate"]){let i=n[o];if(H(i))return!0;i.type==="ConditionalExpression"&&t.push(i)}}return!1}function PD(e,t,r){let{node:n}=e,o=n.type==="ConditionalExpression",i=o?"alternate":"falseType",{parent:s}=e,u=o?r("test"):[r("checkType")," ","extends"," ",r("extendsType")];return s.type===n.type&&s[i]===n?Se(2,u):u}var ID=new Map([["AssignmentExpression","right"],["VariableDeclarator","init"],["ReturnStatement","argument"],["ThrowStatement","argument"],["UnaryExpression","argument"],["YieldExpression","argument"],["AwaitExpression","argument"]]);function kD(e){let{node:t}=e;if(t.type!=="ConditionalExpression")return!1;let r,n=t;for(let o=0;!r;o++){let i=e.getParentNode(o);if(We(i)&&i.expression===n||M(i)&&i.callee===n||N(i)&&i.object===n){n=i;continue}i.type==="NewExpression"&&i.callee===n||de(i)&&i.expression===n?(r=e.getParentNode(o+1),n=i):r=i}return n===t?!1:r[ID.get(r.type)]===n}function Dp(e,t,r){let{node:n}=e,o=n.type==="ConditionalExpression",i=o?"consequent":"trueType",s=o?"alternate":"falseType",u=o?["test"]:["checkType","extendsType"],a=n[i],c=n[s],f=[],y=!1,{parent:F}=e,A=F.type===n.type&&u.some(z=>F[z]===n),E=F.type===n.type&&!A,P,C,I=0;do C=P||n,P=e.getParentNode(I),I++;while(P&&P.type===n.type&&u.every(z=>P[z]!==C));let k=P||F,h=C;if(o&&(H(n[u[0]])||H(a)||H(c)||bD(h))){y=!0,E=!0;let z=De=>[O("("),m([D,De]),D,O(")")],xe=De=>De.type==="NullLiteral"||De.type==="Literal"&&De.value===null||De.type==="Identifier"&&De.name==="undefined";f.push(" ? ",xe(a)?r(i):z(r(i))," : ",c.type===n.type||xe(c)?r(s):z(r(s)))}else{let z=De=>t.useTabs?m(r(De)):Se(2,r(De)),xe=[T,"? ",a.type===n.type?O("","("):"",z(i),a.type===n.type?O("",")"):"",T,": ",z(s)];f.push(F.type!==n.type||F[s]===n||A?xe:t.useTabs?Dn(m(xe)):Se(Math.max(0,t.tabWidth-2),xe))}let v=z=>F===k?p(z):z,U=!y&&(N(F)||F.type==="NGPipeExpression"&&F.left===n)&&!F.computed,ae=kD(e),fe=v([PD(e,t,r),E?f:m(f),o&&U&&!ae?D:""]);return A||ae?p([m([D,fe]),D]):fe}function wD(e,t){return(N(t)||t.type==="NGPipeExpression"&&t.left===e)&&!t.computed}function LD(e,t,r,n){return[...e.map(i=>re(i)),re(t),re(r)].flat().some(i=>le(i)&&te(n.originalText,b(i),S(i)))}var OD=new Map([["AssignmentExpression","right"],["VariableDeclarator","init"],["ReturnStatement","argument"],["ThrowStatement","argument"],["UnaryExpression","argument"],["YieldExpression","argument"],["AwaitExpression","argument"]]);function MD(e){let{node:t}=e;if(t.type!=="ConditionalExpression")return!1;let r,n=t;for(let o=0;!r;o++){let i=e.getParentNode(o);if(We(i)&&i.expression===n||M(i)&&i.callee===n||N(i)&&i.object===n){n=i;continue}i.type==="NewExpression"&&i.callee===n||de(i)&&i.expression===n?(r=e.getParentNode(o+1),n=i):r=i}return n===t?!1:r[OD.get(r.type)]===n}var Ti=e=>[O("("),m([D,e]),D,O(")")];function gr(e,t,r,n){if(!t.experimentalTernaries)return Dp(e,t,r);let{node:o}=e,i=o.type==="ConditionalExpression",s=Qe(o),u=i?"consequent":"trueType",a=i?"alternate":"falseType",c=i?["test"]:["checkType","extendsType"],f=o[u],y=o[a],F=c.map(br=>o[br]),{parent:A}=e,E=A.type===o.type,P=E&&c.some(br=>A[br]===o),C=E&&A[a]===o,I=f.type===o.type,k=y.type===o.type,h=k||C,v=t.tabWidth>2||t.useTabs,U,ae,fe=0;do ae=U||o,U=e.getParentNode(fe),fe++;while(U&&U.type===o.type&&c.every(br=>U[br]!==ae));let z=U||A,xe=n&&n.assignmentLayout&&n.assignmentLayout!=="break-after-operator"&&(A.type==="AssignmentExpression"||A.type==="VariableDeclarator"||A.type==="ClassProperty"||A.type==="PropertyDefinition"||A.type==="ClassPrivateProperty"||A.type==="ObjectProperty"||A.type==="Property"),De=ut(A)&&!(I||k),xt=i&&z.type==="JSXExpressionContainer"&&e.grandparent.type!=="JSXAttribute",bt=MD(e),_=wD(o,A),Ae=s&&oe(e,t),we=v?t.useTabs?" ":" ".repeat(t.tabWidth-1):"",Pt=LD(F,f,y,t)||I||k,Sr=!h&&!E&&!s&&(xt?f.type==="NullLiteral"||f.type==="Literal"&&f.value===null:Wr(f,t)&&Ai(o.test,3)),wi=h||C||s&&!E||E&&i&&Ai(o.test,1)||Sr,qr=[];x(o.test,g.Dangling)&&e.call(()=>{qr.push(W(e,t))},"test"),x(o,g.Dangling)&&qr.push(W(e,t));let Li=Symbol("test"),Kp=Symbol("consequent"),Yr=Symbol("test-and-consequent"),$p=i?[Ti(r("test")),o.test.type==="ConditionalExpression"?je:""]:[r("checkType")," ","extends"," ",Qe(o.extendsType)||o.extendsType.type==="TSMappedType"?r("extendsType"):p(Ti(r("extendsType")))],Oi=p([$p," ?"],{id:Li}),Qp=r(u),Hr=m([I||xt&&(H(f)||E||h)?d:T,Qp]),zp=wi?p([Oi,h?Hr:O(Hr,p(Hr,{id:Kp}),{groupId:Li})],{id:Yr}):[Oi,Hr],Eo=r(a),Mi=Sr?O(Eo,Dn(Ti(Eo)),{groupId:Yr}):Eo,Br=[zp,qr.length>0?[m([d,qr]),d]:k?d:Sr?O(T," ",{groupId:Yr}):T,":",k||!v?" ":wi?O(we,O(h||Sr?" ":we," "),{groupId:Yr}):O(we," "),k?Mi:p([m(Mi),xt&&!Sr?D:""]),_&&!bt?D:"",Pt?je:""];return xe&&!Pt?p(m([D,p(Br)])):xe||De?p(m(Br)):bt||s&&P?p([m([D,Br]),Ae?D:""]):A===z?p(Br):Br}function yp(e,t,r){let{node:n}=e;return["try ",r("block"),n.handler?[" ",r("handler")]:"",n.finalizer?[" finally ",r("finalizer")]:""]}function Ep(e,t,r){let{node:n}=e;if(n.param){let o=x(n.param,s=>!le(s)||s.leading&&J(t.originalText,S(s))||s.trailing&&J(t.originalText,b(s),{backwards:!0})),i=r("param");return["catch ",o?["(",m([D,i]),D,") "]:["(",i,") "],r("body")]}return["catch ",r("body")]}function eo(e,t,r){let{node:n}=e,o=e.map(r,"declarations"),i=e.key==="init"&&e.parent.type==="ForStatement"||e.key==="left"&&(e.parent.type==="ForInStatement"||e.parent.type==="ForOfStatement"),s=n.declarations.some(a=>a.init),u;return o.length===1&&!x(n.declarations[0])?u=o[0]:u=m(o[0]),p([ne(e),n.kind,u?[" ",u]:"",m(o.slice(1).map(a=>[",",s&&!i?d:T,a])),i?"":R(t)])}function dp(e,t,r){let{node:n}=e,o=n.type==="WithStatement"?"with":"while";return p([o," (",fr(e,t,r),")",Ft(e,t,r)])}function Cp(e,t,r,n){let{node:o}=e;if(er(o))return tp(e,t);switch(o.type){case"JsExpressionRoot":return r("node");case"JsonRoot":return[W(e,t),r("node"),d];case"File":return $a(e,t,r)??r("program");case"ExpressionStatement":return Xa(e,t,r);case"ChainExpression":return r("expression");case"ParenthesizedExpression":return!x(o.expression)&&(ie(o.expression)||Y(o.expression))?["(",r("expression"),")"]:p(["(",m([D,r("expression")]),D,")"]);case"AssignmentExpression":return Ba(e,t,r);case"VariableDeclarator":return ba(e,t,r);case"BinaryExpression":case"LogicalExpression":return Rn(e,t,r);case"AssignmentPattern":return[r("left")," = ",r("right")];case"OptionalMemberExpression":case"MemberExpression":return Aa(e,t,r);case"MetaProperty":return[r("meta"),".",r("property")];case"BindExpression":return xa(e,t,r);case"Identifier":return[o.name,$(e),hn(e),G(e,r)];case"V8IntrinsicIdentifier":return["%",o.name];case"SpreadElement":return Tr(e,r);case"RestElement":return Tr(e,r);case"FunctionDeclaration":case"FunctionExpression":return Dr(e,t,r,n);case"ArrowFunctionExpression":return Ea(e,t,r,n);case"YieldExpression":return[`yield${o.delegate?"*":""}`,o.argument?[" ",r("argument")]:""];case"AwaitExpression":return ka(e,t,r);case"ExportDefaultDeclaration":case"ExportNamedDeclaration":case"ExportAllDeclaration":return Qn(e,t,r);case"ImportDeclaration":return np(e,t,r);case"ImportSpecifier":case"ExportSpecifier":case"ImportNamespaceSpecifier":case"ExportNamespaceSpecifier":case"ImportDefaultSpecifier":case"ExportDefaultSpecifier":return pp(e,t,r);case"ImportAttribute":return zn(e,t,r);case"Program":case"BlockStatement":case"StaticBlock":return Hn(e,t,r);case"ClassBody":return Kt(e,t,r);case"ThrowStatement":return Zn(e,t,r);case"ReturnStatement":return Zn(e,t,r);case"NewExpression":case"ImportExpression":case"OptionalCallExpression":case"CallExpression":return Vt(e,t,r);case"ObjectExpression":case"ObjectPattern":return ft(e,t,r);case"Property":return $e(o)?Rr(e,t,r):zn(e,t,r);case"ObjectProperty":return zn(e,t,r);case"ObjectMethod":return Rr(e,t,r);case"Decorator":return["@",r("expression")];case"ArrayExpression":case"ArrayPattern":return xr(e,t,r);case"SequenceExpression":return cp(e,t,r);case"ThisExpression":return"this";case"Super":return"super";case"Directive":return[r("value"),R(t)];case"UnaryExpression":{let i=[o.operator];/[a-z]$/.test(o.operator)&&i.push(" ");let s=r("argument");return x(o.argument)?i.push(p(["(",m([D,s]),D,")"])):i.push(s),i}case"UpdateExpression":return[o.prefix?o.operator:"",r("argument"),o.prefix?"":o.operator];case"ConditionalExpression":return gr(e,t,r,n);case"VariableDeclaration":return eo(e,t,r);case"IfStatement":return za(e,t,r);case"ForStatement":return Va(e,t,r);case"WithStatement":case"WhileStatement":return dp(e,t,r);case"DoWhileStatement":return qa(e,t,r);case"ForInStatement":case"ForOfStatement":return Ka(e,t,r);case"DoExpression":return[o.async?"async ":"","do ",r("body")];case"BreakStatement":case"ContinueStatement":return[o.type==="BreakStatement"?"break":"continue",o.label?[" ",r("label")]:"",R(t)];case"LabeledStatement":return[r("label"),`:${o.body.type==="EmptyStatement"&&!x(o.body,g.Leading)?"":" "}`,r("body")];case"TryStatement":return yp(e,t,r);case"CatchClause":return Ep(e,t,r);case"SwitchStatement":return lp(e,t,r);case"SwitchCase":return mp(e,t,r);case"DebuggerStatement":return["debugger",R(t)];case"ClassDeclaration":case"ClassExpression":return Ar(e,t,r);case"ClassMethod":case"ClassPrivateMethod":case"MethodDefinition":return Xn(e,t,r);case"ClassProperty":case"PropertyDefinition":case"ClassPrivateProperty":case"ClassAccessorProperty":case"AccessorProperty":return Vn(e,t,r);case"TemplateElement":return Ve(o.value.raw);case"TemplateLiteral":return On(e,t,r);case"TaggedTemplateExpression":return bu(e,t,r);case"PrivateIdentifier":return["#",o.name];case"PrivateName":return["#",r("id")];case"TopicReference":return"%";case"ArgumentPlaceholder":return"?";case"ModuleExpression":return["module ",r("body")];case"VoidPattern":return"void";case"EmptyStatement":if(zt(e))return";";default:throw new it(o,"ESTree")}}function to(e){return[e("elementType"),"[]"]}function ro(e,t,r){let{parent:n,node:o,key:i}=e,u=o.type==="AsConstExpression"?"const":r("typeAnnotation"),a=[r("expression")," ",qi(o)?"satisfies":"as"," ",u];return i==="callee"&&Tt(n)||i==="object"&&N(n)?p([m([D,...a]),D]):a}function Fp(e,t,r){let{node:n}=e,o=[ne(e),n.async?"async ":"","component"];n.id&&o.push(" ",r("id")),o.push(r("typeParameters"));let i=Ke(e,t,r);return n.rendersType?o.push(p([i," ",r("rendersType")])):o.push(p([i])),n.body&&o.push(" ",r("body")),n.type==="DeclareComponent"&&o.push(R(t)),o}function xp(e,t,r){let{node:n}=e;return n.shorthand?r("local"):[r("name")," as ",r("local")]}function Ap(e,t,r){let{node:n}=e,o=[];return n.name&&o.push(r("name"),n.optional?"?: ":": "),o.push(r("typeAnnotation")),o}function Tp(e,t,r){let{node:n}=e;return[n.explicitType?`of ${n.explicitType} `:"",ft(e,t,r)]}function gp(e,t,r){let{node:n}=e;return[n.type==="EnumSymbolBody"||n.explicitType?`of ${n.type.slice(4,-4).toLowerCase()} `:"",ft(e,t,r)]}function no(e,t,r){let{node:n}=e,o=n.type==="TSEnumMember",i=o?ve(e,t,r):r("id"),s=o?"initializer":"init";return n[s]?[i," = ",r(s)]:i}function oo(e,t){let{node:r}=e;return[ne(e),r.const?"const ":"","enum ",t("id")," ",t("body")]}function io(e,t,r){let{node:n}=e,o=[mr(e)];(n.type==="TSConstructorType"||n.type==="TSConstructSignatureDeclaration")&&o.push("new ");let i=Ke(e,t,r,!1,!0),s=[];return n.type==="FunctionTypeAnnotation"?s.push(_D(e)?" => ":": ",r("returnType")):s.push(G(e,r,"returnType")),Bt(n,s)&&(i=p(i)),o.push(i,s),[p(o),n.type==="TSConstructSignatureDeclaration"||n.type==="TSCallSignatureDeclaration"?ke(e,t):""]}function _D(e){let{node:t,parent:r}=e;return t.type==="FunctionTypeAnnotation"&&(pr(r)||!((r.type==="ObjectTypeProperty"||r.type==="ObjectTypeInternalSlot")&&!r.variance&&!r.optional&&kt(r,t)||r.type==="ObjectTypeCallProperty"||e.getParentNode(2)?.type==="DeclareFunction"))}function Sp(e,t,r){return[ne(e),"hook",e.node.id?[" ",r("id")]:"",R(t)]}function hp(e){let{node:t}=e;return t.type==="HookTypeAnnotation"&&e.getParentNode(2)?.type==="DeclareHook"}function Bp(e,t,r){let{node:n}=e,o=Ke(e,t,r,!1,!0),i=[hp(e)?": ":" => ",r("returnType")];return p([hp(e)?"":"hook ",Bt(n,i)?p(o):o,i])}function so(e,t,r){return[r("objectType"),$(e),"[",r("indexType"),"]"]}function uo(e,t,r){return["infer ",r("typeParameter")]}function ao(e,t,r){let n=!1;return p(e.map(({isFirst:o,previous:i,node:s,index:u})=>{let a=r();if(o)return a;let c=Ye(s),f=Ye(i);return f&&c?[" & ",n?m(a):a]:!f&&!c||Oe(t.originalText,s)?t.experimentalOperatorPosition==="start"?m([T,"& ",a]):m([" &",T,a]):(u>1&&(n=!0),[" & ",u>1?m(a):a])},"types"))}function ND(e){switch(e){case null:return"";case"PlusOptional":return"+?";case"MinusOptional":return"-?";case"Optional":return"?"}}function Pp(e,t,r){let{node:n}=e;return[p([n.variance?r("variance"):"",p(["[",m([D,r("keyTparam")," in ",r("sourceType")]),D,"]"]),ND(n.optional),": ",r("propType")]),ke(e,t)]}function bp(e,t){return e==="+"||e==="-"?e+t:t}function Ip(e,t,r){let{node:n}=e,o=!1;if(t.objectWrap==="preserve"){let u=ce(t),a=b(n)+1,c=u.slice(a),f=a+c.search(/\S/);te(t.originalText,a,f)&&(o=!0)}let i=[],s=re(n,g.Dangling);if(s.length>0){let u=w(0,s,-1),a=W(e,t);i.push(...a.slice(0,-1),p([w(0,a,-1),Le(u)||J(t.originalText,S(u))?d:T]))}return p(["{",m([t.bracketSpacing?T:D,...i,n.readonly?[bp(n.readonly,"readonly")," "]:"",p(["[",m([D,r("key")," in ",r("constraint"),n.nameType?[" as ",r("nameType")]:""]),D,"]"]),n.optional?bp(n.optional,"?"):"",n.typeAnnotation?": ":"",r("typeAnnotation"),t.semi?O(";"):""]),t.bracketSpacing?T:D,"}"],{shouldBreak:o})}function kp(e,t,r){let{node:n}=e;return[p(["match (",m([D,r("argument")]),D,")"])," {",n.cases.length>0?m([d,L(d,e.map(({node:o,isLast:i})=>[r(),!i&&me(o,t)?d:""],"cases"))]):"",d,"}"]}function wp(e,t,r){let{node:n}=e,o=x(n,g.Dangling)?[" ",W(e,t)]:[],i=n.type==="MatchStatementCase"?[" ",r("body")]:m([T,r("body"),","]);return[r("pattern"),n.guard?p([m([T,"if (",r("guard"),")"])]):"",p([" =>",o,i])]}function Lp(e,t,r){let{node:n}=e;switch(n.type){case"MatchOrPattern":return WD(e,t,r);case"MatchAsPattern":return[r("pattern")," as ",r("target")];case"MatchWildcardPattern":return["_"];case"MatchLiteralPattern":return r("literal");case"MatchUnaryPattern":return[n.operator,r("argument")];case"MatchIdentifierPattern":return r("id");case"MatchMemberPattern":{let o=n.property.type==="Identifier"?[".",r("property")]:["[",m([D,r("property")]),D,"]"];return p([r("base"),o])}case"MatchBindingPattern":return[n.kind," ",r("id")];case"MatchObjectPattern":case"MatchInstanceObjectPattern":return jD(e,t,r);case"MatchInstancePattern":return p([r("targetConstructor")," ",r("properties")]);case"MatchArrayPattern":{let o=e.map(r,"elements");return n.rest&&o.push(r("rest")),p(["[",m([D,L([",",T],o)]),n.rest?"":O(","),D,"]"])}case"MatchObjectPatternProperty":return n.shorthand?r("pattern"):p([r("key"),":",m([T,r("pattern")])]);case"MatchRestPattern":{let o=["..."];return n.argument&&o.push(r("argument")),o}}}function jD(e,t,r){let{node:n}=e,o=e.map(r,"properties");return n.rest&&o.push(r("rest")),p(["{",m([D,L([",",T],o)]),n.rest?"":O(","),D,"}"])}var Op=B(["MatchWildcardPattern","MatchLiteralPattern","MatchUnaryPattern","MatchIdentifierPattern"]);function vD(e){let{patterns:t}=e;if(t.some(n=>x(n)))return!1;let r=t.find(n=>n.type==="MatchObjectPattern");return r?t.every(n=>n===r||Op(n)):!1}function RD(e){return Op(e)||e.type==="MatchObjectPattern"?!0:e.type==="MatchOrPattern"?vD(e):!1}function WD(e,t,r){let{node:n}=e,{parent:o}=e,i=o.type!=="MatchStatementCase"&&o.type!=="MatchExpressionCase"&&o.type!=="MatchArrayPattern"&&o.type!=="MatchObjectPatternProperty"&&!Oe(t.originalText,n),s=RD(n),u=e.map(()=>{let c=r();return s||(c=Se(2,c)),Q(e,c,t)},"patterns");if(s)return L(" | ",u);let a=[O(["| "]),L([T,"| "],u)];return oe(e,t)?p([m([O([D]),a]),D]):o.type==="MatchArrayPattern"&&o.elements.length>1?p([m([O(["(",D]),a]),D,O(")")]):p(i?m(a):a)}function Mp(e,t,r){let{node:n}=e,o=[ne(e),"opaque type ",r("id"),r("typeParameters")];if(n.supertype&&o.push(": ",r("supertype")),n.lowerBound||n.upperBound){let i=[];n.lowerBound&&i.push(m([T,"super ",r("lowerBound")])),n.upperBound&&i.push(m([T,"extends ",r("upperBound")])),o.push(p(i))}return n.impltype&&o.push(" = ",r("impltype")),o.push(R(t)),o}function po(e,t,r){let{node:n}=e;return["...",...n.type==="TupleTypeSpreadElement"&&n.label?[r("label"),": "]:[],r("typeAnnotation")]}function co(e,t,r){let{node:n}=e;return[n.variance?r("variance"):"",r("label"),n.optional?"?":"",": ",r("elementType")]}function lo(e,t,r){let{node:n}=e,o=[ne(e),"type ",r("id"),r("typeParameters")],i=n.type==="TSTypeAliasDeclaration"?"typeAnnotation":"right";return[vt(e,t,r,o," =",i),R(t)]}function JD(e,t,r){let{node:n}=e;return ee(n).length===1&&n.type.startsWith("TS")&&!n[r][0].constraint&&e.parent.type==="ArrowFunctionExpression"&&!(t.filepath&&/\.ts$/.test(t.filepath))}function $t(e,t,r,n){let{node:o}=e,i=o[n];if(!i)return"";if(!Array.isArray(i))return r(n);let s=Ut(e.grandparent),u=e.match(f=>!(f[n].length===1&&Ye(f[n][0])),void 0,(f,y)=>y==="typeAnnotation",f=>f.type==="Identifier",Ei);if(i.length===0||!u&&(s||i.length===1&&(i[0].type==="NullableTypeAnnotation"||xu(i[0])))&&!i.some(f=>{let y=re(f,F=>F.leading||F.trailing);return y.length>0&&(y.some(F=>Le(F))||J(t.originalText,S(w(0,y,-1))))}))return["<",L(", ",e.map(r,n)),GD(e,t),">"];let c=o.type==="TSTypeParameterInstantiation"?"":JD(e,t,n)?",":Ie(t);return p(["<",m([D,L([",",T],e.map(r,n))]),c,D,">"])}function GD(e,t){let{node:r}=e;if(!x(r,g.Dangling))return"";let n=!x(r,g.Line),o=W(e,t,{indent:!n});return n?o:[o,d]}function mo(e,t,r){let{node:n}=e,o=[n.const?"const ":""],i=n.type==="TSTypeParameter"?r("name"):n.name;if(n.variance&&o.push(r("variance")),n.in&&o.push("in "),n.out&&o.push("out "),o.push(i),n.bound&&(n.usesExtendsBound&&o.push(" extends "),o.push(G(e,r,"bound"))),n.constraint){let s=Symbol("constraint");o.push(" extends",p(m(T),{id:s}),Be,ht(r("constraint"),{groupId:s}))}if(n.default){let s=Symbol("default");o.push(" =",p(m(T),{id:s}),Be,ht(r("default"),{groupId:s}))}return p(o)}function fo(e,t){let{node:r}=e;return[r.type==="TSTypePredicate"&&r.asserts?"asserts ":r.type==="TypePredicate"&&r.kind?`${r.kind} `:"",t("parameterName"),r.typeAnnotation?[" is ",G(e,t)]:""]}function Do({node:e},t){let r=e.type==="TSTypeQuery"?"exprName":"argument";return["typeof ",t(r),t("typeArguments")]}function _p(e,t,r,n){let{node:o}=e;if(Cn(o))return o.type.slice(0,-14).toLowerCase();switch(o.type){case"ComponentDeclaration":case"DeclareComponent":case"ComponentTypeAnnotation":return Fp(e,t,r);case"ComponentParameter":return xp(e,t,r);case"ComponentTypeParameter":return Ap(e,t,r);case"HookDeclaration":return Dr(e,t,r);case"DeclareHook":return Sp(e,t,r);case"HookTypeAnnotation":return Bp(e,t,r);case"DeclareFunction":return[ne(e),"function ",r("id"),r("predicate"),R(t)];case"DeclareModule":return["declare module ",r("id")," ",r("body")];case"DeclareModuleExports":return["declare module.exports",G(e,r),R(t)];case"DeclareNamespace":return["declare namespace ",r("id")," ",r("body")];case"DeclareVariable":return Array.isArray(o.declarations)?eo(e,t,r):[ne(e),o.kind??"var"," ",r("id"),R(t)];case"DeclareExportDeclaration":case"DeclareExportAllDeclaration":return Qn(e,t,r);case"DeclareOpaqueType":case"OpaqueType":return Mp(e,t,r);case"DeclareTypeAlias":case"TypeAlias":return lo(e,t,r);case"IntersectionTypeAnnotation":return ao(e,t,r);case"UnionTypeAnnotation":return bn(e,t,r,n);case"ConditionalTypeAnnotation":return gr(e,t,r);case"InferTypeAnnotation":return uo(e,t,r);case"FunctionTypeAnnotation":return io(e,t,r);case"TupleTypeAnnotation":return xr(e,t,r);case"TupleTypeLabeledElement":return co(e,t,r);case"TupleTypeSpreadElement":return po(e,t,r);case"GenericTypeAnnotation":return[r("id"),$t(e,t,r,"typeParameters")];case"IndexedAccessType":case"OptionalIndexedAccessType":return so(e,t,r);case"TypeAnnotation":return Pn(e,t,r);case"TypeParameter":return mo(e,t,r);case"TypeofTypeAnnotation":return Do(e,r);case"ExistsTypeAnnotation":return"*";case"ArrayTypeAnnotation":return to(r);case"DeclareEnum":case"EnumDeclaration":return oo(e,r);case"EnumBody":return Tp(e,t,r);case"EnumBooleanBody":case"EnumNumberBody":case"EnumBigIntBody":case"EnumStringBody":case"EnumSymbolBody":return gp(e,t,r);case"EnumBooleanMember":case"EnumNumberMember":case"EnumBigIntMember":case"EnumStringMember":case"EnumDefaultedMember":return no(e,t,r);case"FunctionTypeParam":{let i=o.name?r("name"):e.parent.this===o?"this":"";return[i,$(e),i?": ":"",r("typeAnnotation")]}case"DeclareClass":case"DeclareInterface":case"InterfaceDeclaration":case"InterfaceTypeAnnotation":case"RecordDeclaration":return Ar(e,t,r);case"ObjectTypeAnnotation":case"RecordDeclarationBody":return Kt(e,t,r);case"ClassImplements":case"InterfaceExtends":return[r("id"),r("typeParameters")];case"RecordDeclarationImplements":return[r("id"),r("typeArguments")];case"NullableTypeAnnotation":return["?",r("typeAnnotation")];case"Variance":{let{kind:i}=o;return Re(i==="plus"||i==="minus"||i==="readonly"||i==="writeonly"||i==="in"||i==="out"),i==="plus"?"+":i==="minus"?"-":`${i} `}case"KeyofTypeAnnotation":return["keyof ",r("argument")];case"ObjectTypeCallProperty":return[o.static?"static ":"",r("value"),ke(e,t)];case"ObjectTypeMappedTypeProperty":return Pp(e,t,r);case"ObjectTypeIndexer":return[o.static?"static ":"",o.variance?r("variance"):"","[",r("id"),o.id?": ":"",r("key"),"]: ",r("value"),ke(e,t)];case"ObjectTypeProperty":{let i="";return o.proto?i="proto ":o.static&&(i="static "),[i,o.kind!=="init"?o.kind+" ":"",o.variance?r("variance"):"",ve(e,t,r),$(e),$e(o)?"":": ",r("value"),ke(e,t)]}case"ObjectTypeInternalSlot":return[o.static?"static ":"","[[",r("id"),"]]",$(e),o.method?"":": ",r("value"),ke(e,t)];case"ObjectTypeSpreadProperty":return Tr(e,r);case"QualifiedTypeofIdentifier":case"QualifiedTypeIdentifier":return[r("qualification"),".",r("id")];case"NullLiteralTypeAnnotation":return"null";case"BooleanLiteralTypeAnnotation":return String(o.value);case"StringLiteralTypeAnnotation":return Ve(ot(ye(o),t));case"NumberLiteralTypeAnnotation":return _t(ye(o));case"BigIntLiteralTypeAnnotation":return $n(ye(o));case"TypeCastExpression":return["(",r("expression"),G(e,r),")"];case"TypePredicate":return fo(e,r);case"TypeOperator":return[o.operator," ",r("typeAnnotation")];case"TypeParameterDeclaration":case"TypeParameterInstantiation":return $t(e,t,r,"params");case"InferredPredicate":case"DeclaredPredicate":return[e.key==="predicate"&&e.parent.type!=="DeclareFunction"&&!e.parent.returnType?": ":" ","%checks",...o.type==="DeclaredPredicate"?["(",r("value"),")"]:[]];case"AsExpression":case"AsConstExpression":case"SatisfiesExpression":return ro(e,t,r);case"MatchExpression":case"MatchStatement":return kp(e,t,r);case"MatchExpressionCase":case"MatchStatementCase":return wp(e,t,r);case"MatchOrPattern":case"MatchAsPattern":case"MatchWildcardPattern":case"MatchLiteralPattern":case"MatchUnaryPattern":case"MatchIdentifierPattern":case"MatchInstancePattern":case"MatchInstanceObjectPattern":case"MatchMemberPattern":case"MatchBindingPattern":case"MatchObjectPattern":case"MatchObjectPatternProperty":case"MatchRestPattern":case"MatchArrayPattern":return Lp(e,t,r);case"RecordExpression":return[r("recordConstructor"),r("typeArguments")," ",r("properties")];case"RecordExpressionProperties":return ft(e,t,r);case"RecordDeclarationProperty":case"RecordDeclarationStaticProperty":{let i=o.type==="RecordDeclarationStaticProperty",s=i?"value":"defaultValue";return[i?"static ":"",ve(e,t,r),G(e,r),o[s]?[" = ",r(s)]:""]}}}function Np(e,t){let{node:r}=e,n=t.originalText.slice(b(r),S(r));return t.semi&&Pr(r)?n+=";":yr(e,t)&&(n=`;${n}`),r.type==="ClassExpression"&&j(r.decorators)?[m([D,n]),D]:n}var gi=e=>e===""||e===T||e===d||e===D;function UD(e,t,r){let{node:n}=e;if(n.type==="JSXElement"&&oy(n))return[r("openingElement"),r("closingElement")];let o=n.type==="JSXElement"?r("openingElement"):r("openingFragment"),i=n.type==="JSXElement"?r("closingElement"):r("closingFragment");if(n.children.length===1&&n.children[0].type==="JSXExpressionContainer"&&(n.children[0].expression.type==="TemplateLiteral"||n.children[0].expression.type==="TaggedTemplateExpression"))return[o,...e.map(r,"children"),i];n.children=n.children.map(h=>iy(h)?{type:"JSXText",value:" ",raw:" "}:h);let s=n.children.some(H),u=n.children.filter(h=>h.type==="JSXExpressionContainer").length>1,a=n.type==="JSXElement"&&n.openingElement.attributes.length>1,c=ue(o)||s||a||u,f=e.parent.rootMarker==="mdx",y=t.singleQuote?"{' '}":'{" "}',F=f?T:O([y,D]," "),A=n.openingElement?.name?.name==="fbt",E=qD(e,t,r,F,A),P=n.children.some(h=>Xt(h));for(let h=E.length-2;h>=0;h--){let v=E[h]===""&&E[h+1]==="",U=E[h]===d&&E[h+1]===""&&E[h+2]===d,ae=(E[h]===D||E[h]===d)&&E[h+1]===""&&E[h+2]===F,fe=E[h]===F&&E[h+1]===""&&(E[h+2]===D||E[h+2]===d),z=E[h]===F&&E[h+1]===""&&E[h+2]===F,xe=E[h]===D&&E[h+1]===""&&E[h+2]===d||E[h]===d&&E[h+1]===""&&E[h+2]===D;U&&P||v||ae||z||xe?E.splice(h,2):fe&&E.splice(h+1,2)}for(;E.length>0&&gi(w(0,E,-1));)E.pop();for(;E.length>1&&gi(E[0])&&gi(E[1]);)E.shift(),E.shift();let C=[""];for(let[h,v]of E.entries()){if(v===F){if(h===1&&vs(E[h-1])){if(E.length===2){C.push([C.pop(),y]);continue}C.push([y,d],"");continue}if(h===E.length-1){C.push([C.pop(),y]);continue}if(E[h-1]===""&&E[h-2]===d){C.push([C.pop(),y]);continue}}h%2===0?C.push([C.pop(),v]):C.push(v,""),ue(v)&&(c=!0)}let I=P?yn(C):p(C,{shouldBreak:!0});if(t.cursorNode?.type==="JSXText"&&n.children.includes(t.cursorNode)?I=[jr,I,jr]:t.nodeBeforeCursor?.type==="JSXText"&&n.children.includes(t.nodeBeforeCursor)?I=[jr,I]:t.nodeAfterCursor?.type==="JSXText"&&n.children.includes(t.nodeAfterCursor)&&(I=[I,jr]),f)return I;let k=p([o,m([d,I]),d,i]);return c?k:mt([p([o,...E,i]),k])}function qD(e,t,r,n,o){let i="",s=[i];function u(c){i=c,s.push([s.pop(),c])}function a(c){c!==""&&(i=c,s.push(c,""))}return e.each(({node:c,next:f})=>{if(c.type==="JSXText"){let y=ye(c);if(Xt(c)){let F=dr.split(y,!0);F[0]===""&&(F.shift(),/\n/.test(F[0])?a(vp(o,F[1],c,f)):a(n),F.shift());let A;if(w(0,F,-1)===""&&(F.pop(),A=F.pop()),F.length===0)return;for(let[E,P]of F.entries())E%2===1?a(T):u(P);A!==void 0?/\n/.test(A)?a(vp(o,i,c,f)):a(n):a(jp(o,i,c,f))}else/\n/.test(y)?y.match(/\n/g).length>1&&a(d):a(n)}else{let y=r();if(u(y),f&&Xt(f)){let A=dr.trim(ye(f)),[E]=dr.split(A);a(jp(o,E,c,f))}else a(d)}},"children"),s}function jp(e,t,r,n){return e?"":r.type==="JSXElement"&&!r.closingElement||n?.type==="JSXElement"&&!n.closingElement?t.length===1?D:d:D}function vp(e,t,r,n){return e?d:t.length===1?r.type==="JSXElement"&&!r.closingElement||n?.type==="JSXElement"&&!n.closingElement?d:D:d}var YD=B(["ArrayExpression","JSXAttribute","JSXElement","JSXExpressionContainer","JSXFragment","ExpressionStatement","NewExpression","CallExpression","OptionalCallExpression","ConditionalExpression","JsExpressionRoot","MatchExpressionCase"]);function HD(e,t,r){let{parent:n}=e;if(YD(n))return t;let o=XD(e),i=oe(e,r);return p([i?"":O("("),m([D,t]),D,i?"":O(")")],{shouldBreak:o})}function XD(e){return e.match(void 0,(t,r)=>r==="body"&&t.type==="ArrowFunctionExpression",(t,r)=>r==="arguments"&&M(t))&&(e.match(void 0,void 0,void 0,(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer")||e.match(void 0,void 0,void 0,(t,r)=>r==="expression"&&t.type==="ChainExpression",(t,r)=>r==="expression"&&t.type==="JSXExpressionContainer"))}function VD(e,t,r){let{node:n}=e,o=[r("name")];if(n.value){let i;if(q(n.value)){let s=ye(n.value),u=V(0,V(0,s.slice(1,-1),"'","'"),""",'"'),a=Sn(u,t.jsxSingleQuote);u=a==='"'?V(0,u,'"',"""):V(0,u,"'","'"),i=e.call(()=>Q(e,Ve(a+u+a),t),"value")}else i=r("value");o.push("=",i)}return o}function KD(e,t,r){let{node:n}=e,o=(i,s)=>i.type==="JSXEmptyExpression"||!x(i)&&(Y(i)||ie(i)||i.type==="ArrowFunctionExpression"||i.type==="AwaitExpression"&&(o(i.argument,i)||i.argument.type==="JSXElement")||M(Pe(i))||i.type==="FunctionExpression"||i.type==="TemplateLiteral"||i.type==="TaggedTemplateExpression"||i.type==="DoExpression"||H(s)&&(i.type==="ConditionalExpression"||be(i)));return o(n.expression,e.parent)?p(["{",r("expression"),Be,"}"]):p(["{",m([D,r("expression")]),D,Be,"}"])}function $D(e,t,r){let{node:n}=e,o=x(n.name)||x(n.typeArguments);if(n.selfClosing&&n.attributes.length===0&&!o)return["<",r("name"),r("typeArguments")," />"];if(n.attributes?.length===1&&q(n.attributes[0].value)&&!n.attributes[0].value.value.includes(`+`)&&!o&&!x(n.attributes[0]))return p(["<",r("name"),r("typeArguments")," ",...e.map(r,"attributes"),n.selfClosing?" />":">"]);let i=n.attributes?.some(u=>q(u.value)&&u.value.value.includes(`+`)),s=t.singleAttributePerLine&&n.attributes.length>1?d:T;return p(["<",r("name"),r("typeArguments"),m(e.map(({isFirst:u,previous:a})=>[u?s:me(a,t)?[d,d]:s,r()],"attributes")),...QD(n,t,o)],{shouldBreak:i})}function QD(e,t,r){return e.selfClosing?[T,"/>"]:zD(e,t,r)?[">"]:[D,">"]}function zD(e,t,r){let n=e.attributes.length>0&&x(w(0,e.attributes,-1),g.Trailing);return e.attributes.length===0&&!r||(t.bracketSameLine||t.jsxBracketSameLine)&&(!r||e.attributes.length>0)&&!n}function ZD(e,t,r){let{node:n}=e,o=["</"],i=r("name");return x(n.name,g.Leading|g.Line)?o.push(m([d,i]),d):x(n.name,g.Leading|g.Block)?o.push(" ",i):o.push(i),o.push(">"),o}function ey(e,t){let{node:r}=e,n=x(r),o=x(r,g.Line),i=r.type==="JSXOpeningFragment";return[i?"<":"</",m([o?d:n&&!i?" ":"",W(e,t)]),o?d:"",">"]}function ty(e,t,r){let n=Q(e,UD(e,t,r),t);return HD(e,n,t)}function ry(e,t){let{node:r}=e,n=x(r,g.Line);return[W(e,t,{indent:n}),n?d:""]}function ny(e,t,r){let{node:n}=e;return["{",e.call(({node:o})=>{let i=["...",r()];return x(o)?[m([D,Q(e,i,t)]),D]:i},n.type==="JSXSpreadAttribute"?"argument":"expression"),"}"]}function Rp(e,t,r){let{node:n}=e;if(n.type.startsWith("JSX"))switch(n.type){case"JSXAttribute":return VD(e,t,r);case"JSXIdentifier":return n.name;case"JSXNamespacedName":return L(":",[r("namespace"),r("name")]);case"JSXMemberExpression":return L(".",[r("object"),r("property")]);case"JSXSpreadAttribute":case"JSXSpreadChild":return ny(e,t,r);case"JSXExpressionContainer":return KD(e,t,r);case"JSXFragment":case"JSXElement":return ty(e,t,r);case"JSXOpeningElement":return $D(e,t,r);case"JSXClosingElement":return ZD(e,t,r);case"JSXOpeningFragment":case"JSXClosingFragment":return ey(e,t);case"JSXEmptyExpression":return ry(e,t);case"JSXText":throw new Error("JSXText should be handled by JSXElement");default:throw new it(n,"JSX")}}function oy(e){if(e.children.length===0)return!0;if(e.children.length>1)return!1;let t=e.children[0];return t.type==="JSXText"&&!Xt(t)}function iy(e){return e.type==="JSXExpressionContainer"&&q(e.expression)&&e.expression.value===" "&&!x(e.expression)}function Wp(e,t,r){let{node:n}=e,o=n.parameters.length>1?Ie(t):"",i=p([m([D,L([", ",D],e.map(r,"parameters"))]),o,D]);return[e.key==="body"&&e.parent.type==="ClassBody"&&n.static?"static ":"",n.readonly?"readonly ":"","[",n.parameters?i:"","]",G(e,r),ke(e,t)]}function hi(e,t,r){let{node:n}=e;return[n.postfix?"":r,G(e,t),n.postfix?r:""]}function Jp(e,t,r){let{node:n}=e,o=[],i=n.kind&&n.kind!=="method"?`${n.kind} `:"";o.push(qt(n),i,ve(e,t,r),$(e));let s=Ke(e,t,r,!1,!0),u=G(e,r,"returnType"),a=Bt(n,u);return o.push(a?p(s):s),n.returnType&&o.push(p(u)),[p(o),ke(e,t)]}function Gp(e,t,r){let{node:n}=e;return[ne(e),n.kind==="global"?"":`${n.kind} `,r("id"),n.body?[" ",p(r("body"))]:R(t)]}function Up(e,t,r){let{node:n}=e,o=!(Y(n.expression)||ie(n.expression)),i=p(["<",m([D,r("typeAnnotation")]),D,">"]),s=[O("("),m([D,r("expression")]),D,O(")")];return o?mt([[i,r("expression")],[i,p(s,{shouldBreak:!0})],[i,r("expression")]]):p([i,r("expression")])}function qp(e,t,r,n){let{node:o}=e;if(o.type.startsWith("TS")){if(Fn(o))return o.type.slice(2,-7).toLowerCase();switch(o.type){case"TSThisType":return"this";case"TSTypeAssertion":return Up(e,t,r);case"TSDeclareFunction":return Dr(e,t,r);case"TSExportAssignment":return["export = ",r("expression"),R(t)];case"TSModuleBlock":return Hn(e,t,r);case"TSInterfaceBody":case"TSTypeLiteral":return Kt(e,t,r);case"TSTypeAliasDeclaration":return lo(e,t,r);case"TSQualifiedName":return[r("left"),".",r("right")];case"TSAbstractMethodDefinition":case"TSDeclareMethod":return Xn(e,t,r);case"TSAbstractAccessorProperty":case"TSAbstractPropertyDefinition":return Vn(e,t,r);case"TSInterfaceHeritage":case"TSClassImplements":case"TSInstantiationExpression":return[r("expression"),r("typeArguments")];case"TSTemplateLiteralType":return On(e,t,r);case"TSNamedTupleMember":return co(e,t,r);case"TSRestType":return po(e,t,r);case"TSOptionalType":return[r("typeAnnotation"),"?"];case"TSInterfaceDeclaration":return Ar(e,t,r);case"TSTypeParameterDeclaration":case"TSTypeParameterInstantiation":return $t(e,t,r,"params");case"TSTypeParameter":return mo(e,t,r);case"TSAsExpression":case"TSSatisfiesExpression":return ro(e,t,r);case"TSArrayType":return to(r);case"TSPropertySignature":return[o.readonly?"readonly ":"",ve(e,t,r),$(e),G(e,r),ke(e,t)];case"TSParameterProperty":return[qt(o),o.static?"static ":"",o.override?"override ":"",o.readonly?"readonly ":"",r("parameter")];case"TSTypeQuery":return Do(e,r);case"TSIndexSignature":return Wp(e,t,r);case"TSTypePredicate":return fo(e,r);case"TSNonNullExpression":return[r("expression"),"!"];case"TSImportType":return[Vt(e,t,r),o.qualifier?[".",r("qualifier")]:"",$t(e,t,r,"typeArguments")];case"TSLiteralType":return r("literal");case"TSIndexedAccessType":return so(e,t,r);case"TSTypeOperator":return[o.operator," ",r("typeAnnotation")];case"TSMappedType":return Ip(e,t,r);case"TSMethodSignature":return Jp(e,t,r);case"TSNamespaceExportDeclaration":return["export as namespace ",r("id"),R(t)];case"TSEnumDeclaration":return oo(e,r);case"TSEnumBody":return ft(e,t,r);case"TSEnumMember":return no(e,t,r);case"TSImportEqualsDeclaration":return["import ",xi(o,!1),r("id")," = ",r("moduleReference"),R(t)];case"TSExternalModuleReference":return Vt(e,t,r);case"TSModuleDeclaration":return Gp(e,t,r);case"TSConditionalType":return gr(e,t,r);case"TSInferType":return uo(e,t,r);case"TSIntersectionType":return ao(e,t,r);case"TSUnionType":return bn(e,t,r,n);case"TSFunctionType":case"TSCallSignatureDeclaration":case"TSConstructorType":case"TSConstructSignatureDeclaration":return io(e,t,r);case"TSTupleType":return xr(e,t,r);case"TSTypeReference":return[r("typeName"),$t(e,t,r,"typeArguments")];case"TSTypeAnnotation":return Pn(e,t,r);case"TSEmptyBodyFunctionExpression":return In(e,t,r);case"TSJSDocAllType":return"*";case"TSJSDocUnknownType":return"?";case"TSJSDocNullableType":return hi(e,r,"?");case"TSJSDocNonNullableType":return hi(e,r,"!");default:throw new it(o,"TypeScript")}}}function sy(e,t,r,n){for(let o of[ca,Rp,_p,qp,Cp]){let i=o(e,t,r,n);if(i!==void 0)return i}}var uy=B(["ClassMethod","ClassPrivateMethod","ClassProperty","ClassAccessorProperty","AccessorProperty","TSAbstractAccessorProperty","PropertyDefinition","TSAbstractPropertyDefinition","ClassPrivateProperty","MethodDefinition","TSAbstractMethodDefinition","TSDeclareMethod"]);function Si(e,t,r,n){e.isRoot&&t.__onHtmlBindingRoot?.(e.node,t);let{node:o}=e,i=Cr(e)?Np(e,t):sy(e,t,r,n);if(!i)return"";if(uy(o))return i;i=ay(e,t,i);let s=o.type!=="ClassExpression"&&j(o.decorators)?Wn(e,t,r):"",u=oe(e,t);return!s&&!u?i:mn(i,a=>[u?"(":"",s?p([s,a]):a,u?")":""])}function ay(e,t,r){let{node:n}=e;return(x(n,g.Leading)||x(n,g.Trailing))&&tn(e)?[m([D,Q(e,r,t)]),D]:r}var py={experimental_avoidAstMutation:!0,experimental_locForRangeFormat:{locStart:b,locEnd:It}},Bi={features:py,massageAstNode:ii,canAttachComment:Ki,handleComments:Cs,isGap:Fs,willPrintOwnComments:gu,embed:Wu,insertPragma:na,printComment:oa,printPrettierIgnored:Si,print:Si,getVisitorKeys:un,isBlockComment:le,hasPrettierIgnore:Cr};var Pi=[{name:"JSON.stringify",type:"data",aceMode:"json",extensions:[".importmap"],filenames:["package.json","package-lock.json","composer.json"],tmScope:"source.json",aliases:["geojson","jsonl","sarif","topojson"],codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json-stringify"],vscodeLanguageIds:["json"],linguistLanguageId:174},{name:"JSON",type:"data",aceMode:"json",extensions:[".json",".4DForm",".4DProject",".avsc",".geojson",".gltf",".har",".ice",".JSON-tmLanguage",".json.example",".mcmeta",".sarif",".slnlaunch",".tact",".tfstate",".tfstate.backup",".topojson",".webapp",".webmanifest",".yy",".yyp"],filenames:[".all-contributorsrc",".arcconfig",".auto-changelog",".c8rc",".htmlhintrc",".imgbotconfig",".nycrc",".tern-config",".tern-project",".watchmanconfig",".babelrc",".jscsrc",".jshintrc",".jslintrc",".swcrc"],tmScope:"source.json",aliases:["geojson","jsonl","sarif","topojson"],codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json"],vscodeLanguageIds:["json"],linguistLanguageId:174},{name:"JSON with Comments",type:"data",aceMode:"javascript",extensions:[".jsonc",".code-snippets",".code-workspace",".sublime-build",".sublime-color-scheme",".sublime-commands",".sublime-completions",".sublime-keymap",".sublime-macro",".sublime-menu",".sublime-mousemap",".sublime-project",".sublime-settings",".sublime-theme",".sublime-workspace",".sublime_metrics",".sublime_session"],filenames:[],tmScope:"source.json.comments",aliases:["jsonc"],codemirrorMode:"javascript",codemirrorMimeType:"text/javascript",group:"JSON",parsers:["jsonc"],vscodeLanguageIds:["jsonc"],linguistLanguageId:423},{name:"JSON5",type:"data",aceMode:"json5",extensions:[".json5"],tmScope:"source.js",codemirrorMode:"javascript",codemirrorMimeType:"application/json",parsers:["json5"],vscodeLanguageIds:["json5"],linguistLanguageId:175}];var yo={};Fo(yo,{estree:()=>Bi,"estree-json":()=>my});var Yp={JsonRoot:["node"],ArrayExpression:["elements"],ObjectExpression:["properties"],ObjectProperty:["key","value"],UnaryExpression:["argument"],NullLiteral:[],BooleanLiteral:[],StringLiteral:[],NumericLiteral:[],Identifier:[],TemplateLiteral:["quasis"],TemplateElement:[]};var cy=sn(Yp),Hp=cy;function Ur(e){return e.extra.raw}var ly=new Set(["start","end","loc","comments","leadingComments","trailingComments","innerComments","errors","range","tokens"]);function Ii(e,t){let{type:r}=e;if(r==="ObjectProperty"){let{key:n}=e;if(n.type==="Identifier"){let{name:o}=n;t.key={type:"StringLiteral",value:o,extra:{rawValue:o}}}else if(n.type==="NumericLiteral"){let o=Ur(n);String(Number(o))===o&&(t.key={type:"StringLiteral",value:o,extra:{rawValue:o}})}}if(r==="StringLiteral"&&delete t.extra.raw,r==="UnaryExpression"&&e.operator==="+")return t.argument;if((r==="ArrayExpression"||r==="ObjectExpression")&&(t.extra??(t.extra={}),e.extra?.trailingComma&&delete t.extra.trailingComma),r==="ArrayExpression"){for(let[n,o]of e.elements.entries())o===null&&t.elements.splice(n,0,{type:"NullLiteral"});return}if(r==="TemplateLiteral"){let n=e.quasis[0].value.cooked;return{type:"StringLiteral",value:n,extra:{rawValue:n}}}}Ii.ignoredProperties=ly;function ki(e,t,r){let{node:n}=e;switch(n.type){case"JsonRoot":return[r("node"),d];case"ArrayExpression":{if(n.elements.length===0)return"[]";let o=e.map(()=>e.node===null?"null":r(),"elements");return["[",m([d,L([",",d],o)]),d,"]"]}case"ObjectExpression":return n.properties.length===0?"{}":["{",m([d,L([",",d],e.map(r,"properties"))]),d,"}"];case"ObjectProperty":return[r("key"),": ",r("value")];case"UnaryExpression":return[n.operator==="+"?"":n.operator,r("argument")];case"NullLiteral":return"null";case"BooleanLiteral":return n.value?"true":"false";case"StringLiteral":return ot(Ur(n),t);case"NumericLiteral":{let o=Ur(n);return Xp(e)&&String(Number(o))===o?`"${o}"`:o}case"Identifier":return Xp(e)?JSON.stringify(n.name):n.name;case"TemplateLiteral":return r(["quasis",0]);case"TemplateElement":return JSON.stringify(n.value.cooked);default:throw new it(n,"JSON")}}function Xp(e){return e.key==="key"&&e.parent.type==="ObjectProperty"}var my={massageAstNode:Ii,print:ki,getVisitorKeys:Hp};var hr={bracketSpacing:{category:"Common",type:"boolean",default:!0,description:"Print spaces between brackets.",oppositeDescription:"Do not print spaces between brackets."},objectWrap:{category:"Common",type:"choice",default:"preserve",description:"How to wrap object literals.",choices:[{value:"preserve",description:"Keep as multi-line, if there is a newline between the opening brace and first property."},{value:"collapse",description:"Fit to a single line when possible."}]},singleQuote:{category:"Common",type:"boolean",default:!1,description:"Use single quotes instead of double quotes."},proseWrap:{category:"Common",type:"choice",default:"preserve",description:"How to wrap prose.",choices:[{value:"always",description:"Wrap prose if it exceeds the print width."},{value:"never",description:"Do not wrap prose."},{value:"preserve",description:"Wrap prose as-is."}]},bracketSameLine:{category:"Common",type:"boolean",default:!1,description:"Put > of opening tags on the last line instead of on a new line."},singleAttributePerLine:{category:"Common",type:"boolean",default:!1,description:"Enforce single attribute per line in HTML, Vue and JSX."}};var Rt="JavaScript",fy={arrowParens:{category:Rt,type:"choice",default:"always",description:"Include parentheses around a sole arrow function parameter.",choices:[{value:"always",description:"Always include parens. Example: `(x) => x`"},{value:"avoid",description:"Omit parens when possible. Example: `x => x`"}]},bracketSameLine:hr.bracketSameLine,objectWrap:hr.objectWrap,bracketSpacing:hr.bracketSpacing,jsxBracketSameLine:{category:Rt,type:"boolean",description:"Put > on the last line instead of at a new line.",deprecated:"2.4.0"},semi:{category:Rt,type:"boolean",default:!0,description:"Print semicolons.",oppositeDescription:"Do not print semicolons, except at the beginning of lines which may need them."},experimentalOperatorPosition:{category:Rt,type:"choice",default:"end",description:"Where to print operators when binary expressions wrap lines.",choices:[{value:"start",description:"Print operators at the start of new lines."},{value:"end",description:"Print operators at the end of previous lines."}]},experimentalTernaries:{category:Rt,type:"boolean",default:!1,description:"Use curious ternaries, with the question mark after the condition.",oppositeDescription:"Default behavior of ternaries; keep question marks on the same line as the consequent."},singleQuote:hr.singleQuote,jsxSingleQuote:{category:Rt,type:"boolean",default:!1,description:"Use single quotes in JSX."},quoteProps:{category:Rt,type:"choice",default:"as-needed",description:"Change when properties in objects are quoted.",choices:[{value:"as-needed",description:"Only add quotes around object properties where required."},{value:"consistent",description:"If at least one property in an object requires quotes, quote all properties."},{value:"preserve",description:"Respect the input use of quotes in object properties."}]},trailingComma:{category:Rt,type:"choice",default:"all",description:"Print trailing commas wherever possible when multi-line.",choices:[{value:"all",description:"Trailing commas wherever possible (including function arguments)."},{value:"es5",description:"Trailing commas where valid in ES5 (objects, arrays, etc.)"},{value:"none",description:"No trailing commas."}]},singleAttributePerLine:hr.singleAttributePerLine},Vp=fy;var Dy={...bi,...yo},yy=[..._i,...Pi];return nc(Ey);});
react npm critical-tier BURST ×10
19.2.4
19.1.5
19.0.4
19.2.5
19.1.6
19.0.5
19.2.6
19.1.7
19.0.6
19.0.7
19.1.8
19.2.7
BURST
2 releases in 37m: 0.2.0, 0.2.1
info · registry-verified · 2012-01-10 · 14y ago
BURST
2 releases in 40m: 0.14.4, 0.14.5
info · registry-verified · 2015-12-29 · 10y ago
BURST
3 releases in 26m: 0.14.10, 15.7.0, 16.14.0
info · registry-verified · 2020-10-14 · 5y ago
BURST
3 releases in 5m: 19.2.1, 19.1.2, 19.0.1
info · registry-verified · 2025-12-03 · 7mo ago
BURST
3 releases in 3m: 19.2.2, 19.1.3, 19.0.2
info · registry-verified · 2025-12-11 · 7mo ago
BURST
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
info · registry-verified · 2025-12-11 · 7mo ago
BURST
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
info · registry-verified · 2026-01-26 · 5mo ago
BURST
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
info · registry-verified · 2026-04-08 · 3mo ago
BURST
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
info · registry-verified · 2026-05-06 · 2mo ago
BURST
3 releases in 4m: 19.0.7, 19.1.8, 19.2.7 · ACTIVE
info · registry-verified · 2026-06-01 · 1mo ago
release diff 19.1.8 → 19.2.7
artifact too large or unavailable
react-dom npm critical-tier BURST ×10
19.2.4
19.1.5
19.0.4
19.2.5
19.1.6
19.0.5
19.2.6
19.1.7
19.0.6
19.0.7
19.1.8
19.2.7
BURST
2 releases in 40m: 0.14.4, 0.14.5
info · registry-verified · 2015-12-29 · 10y ago
BURST
5 releases in 14m: 16.0.1, 16.1.2, 16.2.1, 16.3.3, 16.4.2
info · registry-verified · 2018-08-01 · 7y ago
BURST
3 releases in 25m: 0.14.10, 15.7.0, 16.14.0
info · registry-verified · 2020-10-14 · 5y ago
BURST
3 releases in 5m: 19.2.1, 19.1.2, 19.0.1
info · registry-verified · 2025-12-03 · 7mo ago
BURST
3 releases in 3m: 19.2.2, 19.1.3, 19.0.2
info · registry-verified · 2025-12-11 · 7mo ago
BURST
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
info · registry-verified · 2025-12-11 · 7mo ago
BURST
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
info · registry-verified · 2026-01-26 · 5mo ago
BURST
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
info · registry-verified · 2026-04-08 · 3mo ago
BURST
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
info · registry-verified · 2026-05-06 · 2mo ago
BURST
3 releases in 4m: 19.0.7, 19.1.8, 19.2.7 · ACTIVE
info · registry-verified · 2026-06-01 · 1mo ago
release diff 19.1.8 → 19.2.7
+0 added · -0 removed · ~26 modified
+1 more files not shown
--- +++ @@ -75,3 +75,2 @@ }- function warnForMissingKey() {} function warnInvalidHookAccess() {@@ -86,3 +85,4 @@ }- function noop$2() {}+ function noop() {}+ function warnForMissingKey() {} function setToSortedString(set) {@@ -145,2 +145,12 @@ if (null !== suspenseState) return suspenseState.dehydrated;+ }+ return null;+ }+ function getActivityInstanceFromFiber(fiber) {+ if (31 === fiber.tag) {+ var activityState = fiber.memoizedState;+ null === activityState &&+ ((fiber = fiber.alternate),+ null !== fiber && (activityState = fiber.memoizedState));+ if (null !== activityState) return activityState.dehydrated; }@@ -278,3 +288,3 @@ case REACT_CONTEXT_TYPE:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case REACT_CONSUMER_TYPE:@@ -321,3 +331,3 @@ case 10:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case 18:@@ -477,677 +487,2 @@ }- function typeName(value) {- return (- ("function" === typeof Symbol &&- Symbol.toStringTag &&- value[Symbol.toStringTag]) ||- value.constructor.name ||- "Object"- );- }- function willCoercionThrow(value) {- try {- return testStringCoercion(value), !1;- } catch (e) {- return !0;- }- }- function testStringCoercion(value) {- return "" + value;- }- function checkAttributeStringCoercion(value, attributeName) {- if (willCoercionThrow(value))- return (- console.error(- "The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",- attributeName,- typeName(value)- ),- testStringCoercion(value)- );- }- function checkCSSPropertyStringCoercion(value, propName) {- if (willCoercionThrow(value))- return (- console.error(- "The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",- propName,- typeName(value)- ),- testStringCoercion(value)- );- }- function checkFormFieldValueStringCoercion(value) {- if (willCoercionThrow(value))- return (- console.error(- "Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",- typeName(value)- ),- testStringCoercion(value)- );- }- function injectInternals(internals) {- if ("undefined" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;- var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;- if (hook.isDisabled) return !0;- if (!hook.supportsFiber)- return (- console.error(- "The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"- ),- !0- );- try {- (rendererID = hook.inject(internals)), (injectedHook = hook);- } catch (err) {- console.error("React instrumentation encountered an error: %s.", err);- }- return hook.checkDCE ? !0 : !1;- }- function setIsStrictModeForDevtools(newIsStrictMode) {- "function" === typeof log$1 &&- unstable_setDisableYieldValue(newIsStrictMode);- if (injectedHook && "function" === typeof injectedHook.setStrictMode)- try {- injectedHook.setStrictMode(rendererID, newIsStrictMode);- } catch (err) {- hasLoggedError ||- ((hasLoggedError = !0),- console.error(- "React instrumentation encountered an error: %s",- err- ));- }- }- function injectProfilingHooks(profilingHooks) {- injectedProfilingHooks = profilingHooks;- }- function markCommitStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markCommitStopped &&- injectedProfilingHooks.markCommitStopped();- }- function markComponentRenderStarted(fiber) {- null !== injectedProfilingHooks &&- "function" ===- typeof injectedProfilingHooks.markComponentRenderStarted &&- injectedProfilingHooks.markComponentRenderStarted(fiber);- }- function markComponentRenderStopped() {- null !== injectedProfilingHooks &&- "function" ===- typeof injectedProfilingHooks.markComponentRenderStopped &&- injectedProfilingHooks.markComponentRenderStopped();- }- function markRenderStarted(lanes) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStarted &&- injectedProfilingHooks.markRenderStarted(lanes);- }- function markRenderStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStopped &&- injectedProfilingHooks.markRenderStopped();- }- function markStateUpdateScheduled(fiber, lane) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markStateUpdateScheduled &&- injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);- }- function clz32Fallback(x) {- x >>>= 0;- return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;- }- function getLabelForLane(lane) {- if (lane & 1) return "SyncHydrationLane";- if (lane & 2) return "Sync";- if (lane & 4) return "InputContinuousHydration";- if (lane & 8) return "InputContinuous";- if (lane & 16) return "DefaultHydration";- if (lane & 32) return "Default";- if (lane & 128) return "TransitionHydration";- if (lane & 4194048) return "Transition";- if (lane & 62914560) return "Retry";- if (lane & 67108864) return "SelectiveHydration";- if (lane & 134217728) return "IdleHydration";- if (lane & 268435456) return "Idle";- if (lane & 536870912) return "Offscreen";- if (lane & 1073741824) return "Deferred";- }- function getHighestPriorityLanes(lanes) {- var pendingSyncLanes = lanes & 42;- if (0 !== pendingSyncLanes) return pendingSyncLanes;- switch (lanes & -lanes) {- case 1:- return 1;- case 2:- return 2;- case 4:- return 4;- case 8:- return 8;- case 16:- return 16;- case 32:- return 32;- case 64:- return 64;- case 128:- return 128;- case 256:- case 512:- case 1024:- case 2048:- case 4096:- case 8192:- case 16384:- case 32768:- case 65536:- case 131072:- case 262144:- case 524288:- case 1048576:- case 2097152:- return lanes & 4194048;- case 4194304:- case 8388608:- case 16777216:- case 33554432:- return lanes & 62914560;- case 67108864:- return 67108864;- case 134217728:- return 134217728;- case 268435456:- return 268435456;- case 536870912:- return 536870912;- case 1073741824:- return 0;- default:- return (- console.error(- "Should have found matching lanes. This is a bug in React."- ),- lanes- );- }- }- function getNextLanes(root, wipLanes, rootHasPendingCommit) {- var pendingLanes = root.pendingLanes;- if (0 === pendingLanes) return 0;- var nextLanes = 0,- suspendedLanes = root.suspendedLanes,- pingedLanes = root.pingedLanes;- root = root.warmLanes;- var nonIdlePendingLanes = pendingLanes & 134217727;- 0 !== nonIdlePendingLanes- ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),- 0 !== pendingLanes- ? (nextLanes = getHighestPriorityLanes(pendingLanes))- : ((pingedLanes &= nonIdlePendingLanes),- 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))
… 12025 more lines (truncated)
--- +++ @@ -59,2 +59,12 @@ if (null !== suspenseState) return suspenseState.dehydrated;+ }+ return null;+}+function getActivityInstanceFromFiber(fiber) {+ if (31 === fiber.tag) {+ var activityState = fiber.memoizedState;+ null === activityState &&+ ((fiber = fiber.alternate),+ null !== fiber && (activityState = fiber.memoizedState));+ if (null !== activityState) return activityState.dehydrated; }@@ -151,3 +161,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -200,3 +209,3 @@ case REACT_CONTEXT_TYPE:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case REACT_CONSUMER_TYPE:@@ -310,483 +319,2 @@ }-var hasOwnProperty = Object.prototype.hasOwnProperty,- scheduleCallback$3 = Scheduler.unstable_scheduleCallback,- cancelCallback$1 = Scheduler.unstable_cancelCallback,- shouldYield = Scheduler.unstable_shouldYield,- requestPaint = Scheduler.unstable_requestPaint,- now = Scheduler.unstable_now,- getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,- ImmediatePriority = Scheduler.unstable_ImmediatePriority,- UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,- NormalPriority$1 = Scheduler.unstable_NormalPriority,- LowPriority = Scheduler.unstable_LowPriority,- IdlePriority = Scheduler.unstable_IdlePriority,- log$1 = Scheduler.log,- unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,- rendererID = null,- injectedHook = null;-function setIsStrictModeForDevtools(newIsStrictMode) {- "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);- if (injectedHook && "function" === typeof injectedHook.setStrictMode)- try {- injectedHook.setStrictMode(rendererID, newIsStrictMode);- } catch (err) {}-}-var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,- log = Math.log,- LN2 = Math.LN2;-function clz32Fallback(x) {- x >>>= 0;- return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;-}-var nextTransitionLane = 256,- nextRetryLane = 4194304;-function getHighestPriorityLanes(lanes) {- var pendingSyncLanes = lanes & 42;- if (0 !== pendingSyncLanes) return pendingSyncLanes;- switch (lanes & -lanes) {- case 1:- return 1;- case 2:- return 2;- case 4:- return 4;- case 8:- return 8;- case 16:- return 16;- case 32:- return 32;- case 64:- return 64;- case 128:- return 128;- case 256:- case 512:- case 1024:- case 2048:- case 4096:- case 8192:- case 16384:- case 32768:- case 65536:- case 131072:- case 262144:- case 524288:- case 1048576:- case 2097152:- return lanes & 4194048;- case 4194304:- case 8388608:- case 16777216:- case 33554432:- return lanes & 62914560;- case 67108864:- return 67108864;- case 134217728:- return 134217728;- case 268435456:- return 268435456;- case 536870912:- return 536870912;- case 1073741824:- return 0;- default:- return lanes;- }-}-function getNextLanes(root, wipLanes, rootHasPendingCommit) {- var pendingLanes = root.pendingLanes;- if (0 === pendingLanes) return 0;- var nextLanes = 0,- suspendedLanes = root.suspendedLanes,- pingedLanes = root.pingedLanes;- root = root.warmLanes;- var nonIdlePendingLanes = pendingLanes & 134217727;- 0 !== nonIdlePendingLanes- ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),- 0 !== pendingLanes- ? (nextLanes = getHighestPriorityLanes(pendingLanes))- : ((pingedLanes &= nonIdlePendingLanes),- 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))- : rootHasPendingCommit ||- ((rootHasPendingCommit = nonIdlePendingLanes & ~root),- 0 !== rootHasPendingCommit &&- (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))- : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),- 0 !== nonIdlePendingLanes- ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))- : 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))- : rootHasPendingCommit ||- ((rootHasPendingCommit = pendingLanes & ~root),- 0 !== rootHasPendingCommit &&- (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));- return 0 === nextLanes- ? 0- : 0 !== wipLanes &&- wipLanes !== nextLanes &&- 0 === (wipLanes & suspendedLanes) &&- ((suspendedLanes = nextLanes & -nextLanes),- (rootHasPendingCommit = wipLanes & -wipLanes),- suspendedLanes >= rootHasPendingCommit ||- (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))- ? wipLanes- : nextLanes;-}-function checkIfRootIsPrerendering(root, renderLanes) {- return (- 0 ===- (root.pendingLanes &- ~(root.suspendedLanes & ~root.pingedLanes) &- renderLanes)- );-}-function computeExpirationTime(lane, currentTime) {- switch (lane) {- case 1:- case 2:- case 4:- case 8:- case 64:- return currentTime + 250;- case 16:- case 32:- case 128:- case 256:- case 512:- case 1024:- case 2048:- case 4096:- case 8192:- case 16384:- case 32768:- case 65536:- case 131072:- case 262144:- case 524288:- case 1048576:- case 2097152:- return currentTime + 5e3;- case 4194304:- case 8388608:- case 16777216:- case 33554432:- return -1;- case 67108864:- case 134217728:- case 268435456:- case 536870912:- case 1073741824:- return -1;- default:- return -1;- }-}-function claimNextTransitionLane() {- var lane = nextTransitionLane;- nextTransitionLane <<= 1;- 0 === (nextTransitionLane & 4194048) && (nextTransitionLane = 256);- return lane;-}-function claimNextRetryLane() {- var lane = nextRetryLane;- nextRetryLane <<= 1;- 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);- return lane;-}-function createLaneMap(initial) {- for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);- return laneMap;-}-function markRootUpdated$1(root, updateLane) {- root.pendingLanes |= updateLane;- 268435456 !== updateLane &&- ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));-}-function markRootFinished(- root,- finishedLanes,- remainingLanes,- spawnedLane,- updatedLanes,- suspendedRetryLanes-) {- var previouslyPendingLanes = root.pendingLanes;- root.pendingLanes = remainingLanes;- root.suspendedLanes = 0;- root.pingedLanes = 0;- root.warmLanes = 0;- root.expiredLanes &= remainingLanes;- root.entangledLanes &= remainingLanes;- root.errorRecoveryDisabledLanes &= remainingLanes;- root.shellSuspendCounter = 0;- var entanglements = root.entanglements,- expirationTimes = root.expirationTimes,- hiddenUpdates = root.hiddenUpdates;- for (- remainingLanes = previouslyPendingLanes & ~remainingLanes;- 0 < remainingLanes;-- ) {- var index$5 = 31 - clz32(remainingLanes),- lane = 1 << index$5;- entanglements[index$5] = 0;
… 6220 more lines (truncated)
--- +++ @@ -75,3 +75,2 @@ }- function warnForMissingKey() {} function warnInvalidHookAccess() {@@ -86,3 +85,4 @@ }- function noop$3() {}+ function noop() {}+ function warnForMissingKey() {} function setToSortedString(set) {@@ -145,2 +145,12 @@ if (null !== suspenseState) return suspenseState.dehydrated;+ }+ return null;+ }+ function getActivityInstanceFromFiber(fiber) {+ if (31 === fiber.tag) {+ var activityState = fiber.memoizedState;+ null === activityState &&+ ((fiber = fiber.alternate),+ null !== fiber && (activityState = fiber.memoizedState));+ if (null !== activityState) return activityState.dehydrated; }@@ -278,3 +288,3 @@ case REACT_CONTEXT_TYPE:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case REACT_CONSUMER_TYPE:@@ -321,3 +331,3 @@ case 10:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case 18:@@ -485,677 +495,2 @@ }- function typeName(value) {- return (- ("function" === typeof Symbol &&- Symbol.toStringTag &&- value[Symbol.toStringTag]) ||- value.constructor.name ||- "Object"- );- }- function willCoercionThrow(value) {- try {- return testStringCoercion(value), !1;- } catch (e) {- return !0;- }- }- function testStringCoercion(value) {- return "" + value;- }- function checkAttributeStringCoercion(value, attributeName) {- if (willCoercionThrow(value))- return (- console.error(- "The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",- attributeName,- typeName(value)- ),- testStringCoercion(value)- );- }- function checkCSSPropertyStringCoercion(value, propName) {- if (willCoercionThrow(value))- return (- console.error(- "The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",- propName,- typeName(value)- ),- testStringCoercion(value)- );- }- function checkFormFieldValueStringCoercion(value) {- if (willCoercionThrow(value))- return (- console.error(- "Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",- typeName(value)- ),- testStringCoercion(value)- );- }- function injectInternals(internals) {- if ("undefined" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;- var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;- if (hook.isDisabled) return !0;- if (!hook.supportsFiber)- return (- console.error(- "The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"- ),- !0- );- try {- (rendererID = hook.inject(internals)), (injectedHook = hook);- } catch (err) {- console.error("React instrumentation encountered an error: %s.", err);- }- return hook.checkDCE ? !0 : !1;- }- function setIsStrictModeForDevtools(newIsStrictMode) {- "function" === typeof log$1 &&- unstable_setDisableYieldValue(newIsStrictMode);- if (injectedHook && "function" === typeof injectedHook.setStrictMode)- try {- injectedHook.setStrictMode(rendererID, newIsStrictMode);- } catch (err) {- hasLoggedError ||- ((hasLoggedError = !0),- console.error(- "React instrumentation encountered an error: %s",- err- ));- }- }- function injectProfilingHooks(profilingHooks) {- injectedProfilingHooks = profilingHooks;- }- function markCommitStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markCommitStopped &&- injectedProfilingHooks.markCommitStopped();- }- function markComponentRenderStarted(fiber) {- null !== injectedProfilingHooks &&- "function" ===- typeof injectedProfilingHooks.markComponentRenderStarted &&- injectedProfilingHooks.markComponentRenderStarted(fiber);- }- function markComponentRenderStopped() {- null !== injectedProfilingHooks &&- "function" ===- typeof injectedProfilingHooks.markComponentRenderStopped &&- injectedProfilingHooks.markComponentRenderStopped();- }- function markRenderStarted(lanes) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStarted &&- injectedProfilingHooks.markRenderStarted(lanes);- }- function markRenderStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStopped &&- injectedProfilingHooks.markRenderStopped();- }- function markStateUpdateScheduled(fiber, lane) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markStateUpdateScheduled &&- injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);- }- function clz32Fallback(x) {- x >>>= 0;- return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;- }- function getLabelForLane(lane) {- if (lane & 1) return "SyncHydrationLane";- if (lane & 2) return "Sync";- if (lane & 4) return "InputContinuousHydration";- if (lane & 8) return "InputContinuous";- if (lane & 16) return "DefaultHydration";- if (lane & 32) return "Default";- if (lane & 128) return "TransitionHydration";- if (lane & 4194048) return "Transition";- if (lane & 62914560) return "Retry";- if (lane & 67108864) return "SelectiveHydration";- if (lane & 134217728) return "IdleHydration";- if (lane & 268435456) return "Idle";- if (lane & 536870912) return "Offscreen";- if (lane & 1073741824) return "Deferred";- }- function getHighestPriorityLanes(lanes) {- var pendingSyncLanes = lanes & 42;- if (0 !== pendingSyncLanes) return pendingSyncLanes;- switch (lanes & -lanes) {- case 1:- return 1;- case 2:- return 2;- case 4:- return 4;- case 8:- return 8;- case 16:- return 16;- case 32:- return 32;- case 64:- return 64;- case 128:- return 128;- case 256:- case 512:- case 1024:- case 2048:- case 4096:- case 8192:- case 16384:- case 32768:- case 65536:- case 131072:- case 262144:- case 524288:- case 1048576:- case 2097152:- return lanes & 4194048;- case 4194304:- case 8388608:- case 16777216:- case 33554432:- return lanes & 62914560;- case 67108864:- return 67108864;- case 134217728:- return 134217728;- case 268435456:- return 268435456;- case 536870912:- return 536870912;- case 1073741824:- return 0;- default:- return (- console.error(- "Should have found matching lanes. This is a bug in React."- ),- lanes- );- }- }- function getNextLanes(root, wipLanes, rootHasPendingCommit) {- var pendingLanes = root.pendingLanes;- if (0 === pendingLanes) return 0;- var nextLanes = 0,- suspendedLanes = root.suspendedLanes,- pingedLanes = root.pingedLanes;- root = root.warmLanes;- var nonIdlePendingLanes = pendingLanes & 134217727;- 0 !== nonIdlePendingLanes- ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),- 0 !== pendingLanes- ? (nextLanes = getHighestPriorityLanes(pendingLanes))- : ((pingedLanes &= nonIdlePendingLanes),- 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))
… 12068 more lines (truncated)
--- +++ @@ -63,2 +63,12 @@ if (null !== suspenseState) return suspenseState.dehydrated;+ }+ return null;+}+function getActivityInstanceFromFiber(fiber) {+ if (31 === fiber.tag) {+ var activityState = fiber.memoizedState;+ null === activityState &&+ ((fiber = fiber.alternate),+ null !== fiber && (activityState = fiber.memoizedState));+ if (null !== activityState) return activityState.dehydrated; }@@ -155,3 +165,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -204,3 +213,3 @@ case REACT_CONTEXT_TYPE:- return (type.displayName || "Context") + ".Provider";+ return type.displayName || "Context"; case REACT_CONSUMER_TYPE:@@ -228,2 +237,60 @@ }+ return null;+}+function getComponentNameFromFiber(fiber) {+ var type = fiber.type;+ switch (fiber.tag) {+ case 31:+ return "Activity";+ case 24:+ return "Cache";+ case 9:+ return (type._context.displayName || "Context") + ".Consumer";+ case 10:+ return type.displayName || "Context";+ case 18:+ return "DehydratedFragment";+ case 11:+ return (+ (fiber = type.render),+ (fiber = fiber.displayName || fiber.name || ""),+ type.displayName ||+ ("" !== fiber ? "ForwardRef(" + fiber + ")" : "ForwardRef")+ );+ case 7:+ return "Fragment";+ case 26:+ case 27:+ case 5:+ return type;+ case 4:+ return "Portal";+ case 3:+ return "Root";+ case 6:+ return "Text";+ case 16:+ return getComponentNameFromType(type);+ case 8:+ return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode";+ case 22:+ return "Offscreen";+ case 12:+ return "Profiler";+ case 21:+ return "Scope";+ case 13:+ return "Suspense";+ case 19:+ return "SuspenseList";+ case 25:+ return "TracingMarker";+ case 1:+ case 0:+ case 14:+ case 15:+ if ("function" === typeof type)+ return type.displayName || type.name || null;+ if ("string" === typeof type) return type;+ } return null;@@ -314,561 +381,2 @@ }-var hasOwnProperty = Object.prototype.hasOwnProperty,- scheduleCallback$3 = Scheduler.unstable_scheduleCallback,- cancelCallback$1 = Scheduler.unstable_cancelCallback,- shouldYield = Scheduler.unstable_shouldYield,- requestPaint = Scheduler.unstable_requestPaint,- now$1 = Scheduler.unstable_now,- getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,- ImmediatePriority = Scheduler.unstable_ImmediatePriority,- UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,- NormalPriority$1 = Scheduler.unstable_NormalPriority,- LowPriority = Scheduler.unstable_LowPriority,- IdlePriority = Scheduler.unstable_IdlePriority,- log$1 = Scheduler.log,- unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,- rendererID = null,- injectedHook = null,- injectedProfilingHooks = null,- isDevToolsPresent = "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__;-function setIsStrictModeForDevtools(newIsStrictMode) {- "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);- if (injectedHook && "function" === typeof injectedHook.setStrictMode)- try {- injectedHook.setStrictMode(rendererID, newIsStrictMode);- } catch (err) {}-}-function markCommitStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markCommitStopped &&- injectedProfilingHooks.markCommitStopped();-}-function markComponentRenderStarted(fiber) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markComponentRenderStarted &&- injectedProfilingHooks.markComponentRenderStarted(fiber);-}-function markComponentRenderStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markComponentRenderStopped &&- injectedProfilingHooks.markComponentRenderStopped();-}-function markRenderStarted(lanes) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStarted &&- injectedProfilingHooks.markRenderStarted(lanes);-}-function markRenderStopped() {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markRenderStopped &&- injectedProfilingHooks.markRenderStopped();-}-function markStateUpdateScheduled(fiber, lane) {- null !== injectedProfilingHooks &&- "function" === typeof injectedProfilingHooks.markStateUpdateScheduled &&- injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);-}-var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,- log = Math.log,- LN2 = Math.LN2;-function clz32Fallback(x) {- x >>>= 0;- return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;-}-function getLabelForLane(lane) {- if (lane & 1) return "SyncHydrationLane";- if (lane & 2) return "Sync";- if (lane & 4) return "InputContinuousHydration";- if (lane & 8) return "InputContinuous";- if (lane & 16) return "DefaultHydration";- if (lane & 32) return "Default";- if (lane & 128) return "TransitionHydration";- if (lane & 4194048) return "Transition";- if (lane & 62914560) return "Retry";- if (lane & 67108864) return "SelectiveHydration";- if (lane & 134217728) return "IdleHydration";- if (lane & 268435456) return "Idle";- if (lane & 536870912) return "Offscreen";- if (lane & 1073741824) return "Deferred";-}-var nextTransitionLane = 256,- nextRetryLane = 4194304;-function getHighestPriorityLanes(lanes) {- var pendingSyncLanes = lanes & 42;- if (0 !== pendingSyncLanes) return pendingSyncLanes;- switch (lanes & -lanes) {- case 1:- return 1;- case 2:- return 2;- case 4:- return 4;- case 8:- return 8;- case 16:- return 16;- case 32:- return 32;- case 64:- return 64;- case 128:- return 128;- case 256:- case 512:- case 1024:- case 2048:- case 4096:- case 8192:- case 16384:- case 32768:- case 65536:- case 131072:- case 262144:- case 524288:- case 1048576:- case 2097152:- return lanes & 4194048;- case 4194304:- case 8388608:- case 16777216:- case 33554432:- return lanes & 62914560;- case 67108864:- return 67108864;- case 134217728:- return 134217728;- case 268435456:- return 268435456;- case 536870912:- return 536870912;- case 1073741824:- return 0;- default:- return lanes;- }-}-function getNextLanes(root, wipLanes, rootHasPendingCommit) {- var pendingLanes = root.pendingLanes;- if (0 === pendingLanes) return 0;- var nextLanes = 0,- suspendedLanes = root.suspendedLanes,- pingedLanes = root.pingedLanes;- root = root.warmLanes;- var nonIdlePendingLanes = pendingLanes & 134217727;- 0 !== nonIdlePendingLanes- ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),- 0 !== pendingLanes- ? (nextLanes = getHighestPriorityLanes(pendingLanes))- : ((pingedLanes &= nonIdlePendingLanes),- 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))- : rootHasPendingCommit ||- ((rootHasPendingCommit = nonIdlePendingLanes & ~root),- 0 !== rootHasPendingCommit &&- (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))- : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),- 0 !== nonIdlePendingLanes- ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))- : 0 !== pingedLanes- ? (nextLanes = getHighestPriorityLanes(pingedLanes))- : rootHasPendingCommit ||- ((rootHasPendingCommit = pendingLanes & ~root),- 0 !== rootHasPendingCommit &&- (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));- return 0 === nextLanes
… 9180 more lines (truncated)
--- +++ @@ -43,8 +43,13 @@ }+ function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable)+ return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+ } function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -760,11 +765,8 @@ }- function createPreambleState() {- return {- htmlChunks: null,- headChunks: null,- bodyChunks: null,- contribution: NoContribution- };- }- function createFormatContext(insertionMode, selectedValue, tagScope) {+ function createFormatContext(+ insertionMode,+ selectedValue,+ tagScope,+ viewTransition+ ) { return {@@ -772,3 +774,4 @@ selectedValue: selectedValue,- tagScope: tagScope+ tagScope: tagScope,+ viewTransition: viewTransition };@@ -776,9 +779,6 @@ function getChildFormatContext(parentContext, type, props) {+ var subtreeScope = parentContext.tagScope & -25; switch (type) { case "noscript":- return createFormatContext(- HTML_MODE,- null,- parentContext.tagScope | 1- );+ return createFormatContext(HTML_MODE, null, subtreeScope | 1, null); case "select":@@ -787,22 +787,15 @@ null != props.value ? props.value : props.defaultValue,- parentContext.tagScope+ subtreeScope,+ null ); case "svg":- return createFormatContext(SVG_MODE, null, parentContext.tagScope);+ return createFormatContext(SVG_MODE, null, subtreeScope, null); case "picture":- return createFormatContext(- HTML_MODE,- null,- parentContext.tagScope | 2- );+ return createFormatContext(HTML_MODE, null, subtreeScope | 2, null); case "math":- return createFormatContext(MATHML_MODE, null, parentContext.tagScope);+ return createFormatContext(MATHML_MODE, null, subtreeScope, null); case "foreignObject":- return createFormatContext(HTML_MODE, null, parentContext.tagScope);+ return createFormatContext(HTML_MODE, null, subtreeScope, null); case "table":- return createFormatContext(- HTML_TABLE_MODE,- null,- parentContext.tagScope- );+ return createFormatContext(HTML_TABLE_MODE, null, subtreeScope, null); case "thead":@@ -813,3 +806,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -819,3 +813,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -825,3 +820,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -832,3 +828,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -840,3 +837,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -845,4 +843,46 @@ parentContext.insertionMode < HTML_MODE- ? createFormatContext(HTML_MODE, null, parentContext.tagScope)- : parentContext;+ ? createFormatContext(HTML_MODE, null, subtreeScope, null)+ : parentContext.tagScope !== subtreeScope+ ? createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ null+ )+ : parentContext;+ }+ function getSuspenseViewTransition(parentViewTransition) {+ return null === parentViewTransition+ ? null+ : {+ update: parentViewTransition.update,+ enter: "none",+ exit: "none",+ share: parentViewTransition.update,+ name: parentViewTransition.autoName,+ autoName: parentViewTransition.autoName,+ nameIdx: 0+ };+ }+ function getSuspenseFallbackFormatContext(resumableState, parentContext) {+ parentContext.tagScope & 32 && (resumableState.instructions |= 128);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ parentContext.tagScope | 12,+ getSuspenseViewTransition(parentContext.viewTransition)+ );+ }+ function getSuspenseContentFormatContext(resumableState, parentContext) {+ resumableState = getSuspenseViewTransition(parentContext.viewTransition);+ var subtreeScope = parentContext.tagScope | 16;+ null !== resumableState &&+ "none" !== resumableState.share &&+ (subtreeScope |= 64);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ resumableState+ ); }@@ -1349,9 +1389,22 @@ function injectFormReplayingRuntime(resumableState, renderState) {- (resumableState.instructions & 16) === NothingSent &&- ((resumableState.instructions |= 16),- renderState.bootstrapChunks.unshift(- renderState.startInlineScript,- formReplayingRuntimeScript,- "\x3c/script>"- ));+ if ((resumableState.instructions & 16) === NothingSent) {+ resumableState.instructions |= 16;+ var preamble = renderState.preamble,+ bootstrapChunks = renderState.bootstrapChunks;+ (preamble.htmlChunks || preamble.headChunks) &&+ 0 === bootstrapChunks.length+ ? (bootstrapChunks.push(renderState.startInlineScript),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag,+ formReplayingRuntimeScript,+ endInlineScript+ ))+ : bootstrapChunks.unshift(+ renderState.startInlineScript,+ endOfStartTag,+ formReplayingRuntimeScript,+ endInlineScript+ );+ } }@@ -1540,4 +1593,3 @@ formatContext,- textEmbedded,- isFallback+ textEmbedded ) {@@ -2162,4 +2214,4 @@ case "title":- var insertionMode = formatContext.insertionMode,- noscriptTagInScope = !!(formatContext.tagScope & 1);+ var noscriptTagInScope = formatContext.tagScope & 1,+ isFallback = formatContext.tagScope & 4; if (hasOwnProperty.call(props, "children")) {@@ -2192,3 +2244,3 @@ if (- insertionMode === SVG_MODE ||+ formatContext.insertionMode === SVG_MODE || noscriptTagInScope ||@@ -2207,3 +2259,5 @@ case "link":- var rel = props.rel,+ var noscriptTagInScope$jscomp$0 = formatContext.tagScope & 1,+ isFallback$jscomp$0 = formatContext.tagScope & 4,+ rel = props.rel, href = props.href,@@ -2212,3 +2266,3 @@ formatContext.insertionMode === SVG_MODE ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$0 || null != props.itemProp ||@@ -2313,3 +2367,3 @@ : (textEmbedded && target$jscomp$0.push("\x3c!-- --\x3e"),- (JSCompiler_inline_result$jscomp$5 = isFallback+ (JSCompiler_inline_result$jscomp$5 = isFallback$jscomp$0 ? null@@ -2318,3 +2372,4 @@ case "script":- var asyncProp = props.async;+ var noscriptTagInScope$jscomp$1 = formatContext.tagScope & 1,+ asyncProp = props.async; if (@@ -2328,3 +2383,3 @@ formatContext.insertionMode === SVG_MODE ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$1 || null != props.itemProp@@ -2366,4 +2421,3 @@ case "style":- var insertionMode$jscomp$0 = formatContext.insertionMode,- noscriptTagInScope$jscomp$0 = !!(formatContext.tagScope & 1);+ var noscriptTagInScope$jscomp$2 = formatContext.tagScope & 1; if (hasOwnProperty.call(props, "children")) {@@ -2388,6 +2442,7 @@ var precedence$jscomp$0 = props.precedence,
… 2616 more lines (truncated)
--- +++ @@ -57,3 +57,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -70,4 +69,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray;+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray; function murmurhash3_32_gc(key, seed) {@@ -300,2 +306,3 @@ var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null, scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -331,11 +338,8 @@ }-function createPreambleState() {- return {- htmlChunks: null,- headChunks: null,- bodyChunks: null,- contribution: 0- };-}-function createFormatContext(insertionMode, selectedValue, tagScope) {+function createFormatContext(+ insertionMode,+ selectedValue,+ tagScope,+ viewTransition+) { return {@@ -343,3 +347,4 @@ selectedValue: selectedValue,- tagScope: tagScope+ tagScope: tagScope,+ viewTransition: viewTransition };@@ -347,5 +352,6 @@ function getChildFormatContext(parentContext, type, props) {+ var subtreeScope = parentContext.tagScope & -25; switch (type) { case "noscript":- return createFormatContext(2, null, parentContext.tagScope | 1);+ return createFormatContext(2, null, subtreeScope | 1, null); case "select":@@ -354,14 +360,15 @@ null != props.value ? props.value : props.defaultValue,- parentContext.tagScope+ subtreeScope,+ null ); case "svg":- return createFormatContext(4, null, parentContext.tagScope);+ return createFormatContext(4, null, subtreeScope, null); case "picture":- return createFormatContext(2, null, parentContext.tagScope | 2);+ return createFormatContext(2, null, subtreeScope | 2, null); case "math":- return createFormatContext(5, null, parentContext.tagScope);+ return createFormatContext(5, null, subtreeScope, null); case "foreignObject":- return createFormatContext(2, null, parentContext.tagScope);+ return createFormatContext(2, null, subtreeScope, null); case "table":- return createFormatContext(6, null, parentContext.tagScope);+ return createFormatContext(6, null, subtreeScope, null); case "thead":@@ -369,10 +376,10 @@ case "tfoot":- return createFormatContext(7, null, parentContext.tagScope);+ return createFormatContext(7, null, subtreeScope, null); case "colgroup":- return createFormatContext(9, null, parentContext.tagScope);+ return createFormatContext(9, null, subtreeScope, null); case "tr":- return createFormatContext(8, null, parentContext.tagScope);+ return createFormatContext(8, null, subtreeScope, null); case "head": if (2 > parentContext.insertionMode)- return createFormatContext(3, null, parentContext.tagScope);+ return createFormatContext(3, null, subtreeScope, null); break;@@ -380,7 +387,49 @@ if (0 === parentContext.insertionMode)- return createFormatContext(1, null, parentContext.tagScope);+ return createFormatContext(1, null, subtreeScope, null); } return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode- ? createFormatContext(2, null, parentContext.tagScope)- : parentContext;+ ? createFormatContext(2, null, subtreeScope, null)+ : parentContext.tagScope !== subtreeScope+ ? createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ null+ )+ : parentContext;+}+function getSuspenseViewTransition(parentViewTransition) {+ return null === parentViewTransition+ ? null+ : {+ update: parentViewTransition.update,+ enter: "none",+ exit: "none",+ share: parentViewTransition.update,+ name: parentViewTransition.autoName,+ autoName: parentViewTransition.autoName,+ nameIdx: 0+ };+}+function getSuspenseFallbackFormatContext(resumableState, parentContext) {+ parentContext.tagScope & 32 && (resumableState.instructions |= 128);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ parentContext.tagScope | 12,+ getSuspenseViewTransition(parentContext.viewTransition)+ );+}+function getSuspenseContentFormatContext(resumableState, parentContext) {+ resumableState = getSuspenseViewTransition(parentContext.viewTransition);+ var subtreeScope = parentContext.tagScope | 16;+ null !== resumableState &&+ "none" !== resumableState.share &&+ (subtreeScope |= 64);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ resumableState+ ); }@@ -684,9 +733,21 @@ function injectFormReplayingRuntime(resumableState, renderState) {- 0 === (resumableState.instructions & 16) &&- ((resumableState.instructions |= 16),- renderState.bootstrapChunks.unshift(- renderState.startInlineScript,- 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',- "\x3c/script>"- ));+ if (0 === (resumableState.instructions & 16)) {+ resumableState.instructions |= 16;+ var preamble = renderState.preamble,+ bootstrapChunks = renderState.bootstrapChunks;+ (preamble.htmlChunks || preamble.headChunks) && 0 === bootstrapChunks.length+ ? (bootstrapChunks.push(renderState.startInlineScript),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ ">",+ 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',+ "\x3c/script>"+ ))+ : bootstrapChunks.unshift(+ renderState.startInlineScript,+ ">",+ 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',+ "\x3c/script>"+ );+ } }@@ -861,4 +922,3 @@ formatContext,- textEmbedded,- isFallback+ textEmbedded ) {@@ -1328,5 +1388,7 @@ case "title":+ var noscriptTagInScope = formatContext.tagScope & 1,+ isFallback = formatContext.tagScope & 4; if ( 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope || null != props.itemProp@@ -1344,3 +1406,5 @@ case "link":- var rel = props.rel,+ var noscriptTagInScope$jscomp$0 = formatContext.tagScope & 1,+ isFallback$jscomp$0 = formatContext.tagScope & 4,+ rel = props.rel, href = props.href,@@ -1349,3 +1413,3 @@ 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$0 || null != props.itemProp ||@@ -1416,3 +1480,3 @@ : (textEmbedded && target$jscomp$0.push("\x3c!-- --\x3e"),- (JSCompiler_inline_result$jscomp$4 = isFallback+ (JSCompiler_inline_result$jscomp$4 = isFallback$jscomp$0 ? null@@ -1421,3 +1485,4 @@ case "script":- var asyncProp = props.async;+ var noscriptTagInScope$jscomp$1 = formatContext.tagScope & 1,+ asyncProp = props.async; if (@@ -1431,3 +1496,3 @@ 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$1 || null != props.itemProp@@ -1468,7 +1533,9 @@ case "style":- var precedence$jscomp$0 = props.precedence,- href$jscomp$0 = props.href;+ var noscriptTagInScope$jscomp$2 = formatContext.tagScope & 1,+ precedence$jscomp$0 = props.precedence,+ href$jscomp$0 = props.href,+ nonce = props.nonce; if ( 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$2 || null != props.itemProp ||@@ -1524,42 +1591,43 @@ resumableState.styleResources[href$jscomp$0] = null;- styleQueue$jscomp$0- ? styleQueue$jscomp$0.hrefs.push(- escapeTextForBrowser(href$jscomp$0)- )- : ((styleQueue$jscomp$0 = {- precedence: escapeTextForBrowser(precedence$jscomp$0),- rules: [],- hrefs: [escapeTextForBrowser(href$jscomp$0)],- sheets: new Map()- }),- renderState.styles.set(precedence$jscomp$0, styleQueue$jscomp$0));- var target = styleQueue$jscomp$0.rules,- children$jscomp$7 = null,- innerHTML$jscomp$6 = null,- propKey$jscomp$9;- for (propKey$jscomp$9 in props)- if (hasOwnProperty.call(props, propKey$jscomp$9)) {
… 2125 more lines (truncated)
--- +++ @@ -43,8 +43,13 @@ }+ function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable)+ return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+ } function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -760,11 +765,8 @@ }- function createPreambleState() {- return {- htmlChunks: null,- headChunks: null,- bodyChunks: null,- contribution: NoContribution- };- }- function createFormatContext(insertionMode, selectedValue, tagScope) {+ function createFormatContext(+ insertionMode,+ selectedValue,+ tagScope,+ viewTransition+ ) { return {@@ -772,3 +774,4 @@ selectedValue: selectedValue,- tagScope: tagScope+ tagScope: tagScope,+ viewTransition: viewTransition };@@ -776,9 +779,6 @@ function getChildFormatContext(parentContext, type, props) {+ var subtreeScope = parentContext.tagScope & -25; switch (type) { case "noscript":- return createFormatContext(- HTML_MODE,- null,- parentContext.tagScope | 1- );+ return createFormatContext(HTML_MODE, null, subtreeScope | 1, null); case "select":@@ -787,22 +787,15 @@ null != props.value ? props.value : props.defaultValue,- parentContext.tagScope+ subtreeScope,+ null ); case "svg":- return createFormatContext(SVG_MODE, null, parentContext.tagScope);+ return createFormatContext(SVG_MODE, null, subtreeScope, null); case "picture":- return createFormatContext(- HTML_MODE,- null,- parentContext.tagScope | 2- );+ return createFormatContext(HTML_MODE, null, subtreeScope | 2, null); case "math":- return createFormatContext(MATHML_MODE, null, parentContext.tagScope);+ return createFormatContext(MATHML_MODE, null, subtreeScope, null); case "foreignObject":- return createFormatContext(HTML_MODE, null, parentContext.tagScope);+ return createFormatContext(HTML_MODE, null, subtreeScope, null); case "table":- return createFormatContext(- HTML_TABLE_MODE,- null,- parentContext.tagScope- );+ return createFormatContext(HTML_TABLE_MODE, null, subtreeScope, null); case "thead":@@ -813,3 +806,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -819,3 +813,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -825,3 +820,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -832,3 +828,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -840,3 +837,4 @@ null,- parentContext.tagScope+ subtreeScope,+ null );@@ -845,4 +843,46 @@ parentContext.insertionMode < HTML_MODE- ? createFormatContext(HTML_MODE, null, parentContext.tagScope)- : parentContext;+ ? createFormatContext(HTML_MODE, null, subtreeScope, null)+ : parentContext.tagScope !== subtreeScope+ ? createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ null+ )+ : parentContext;+ }+ function getSuspenseViewTransition(parentViewTransition) {+ return null === parentViewTransition+ ? null+ : {+ update: parentViewTransition.update,+ enter: "none",+ exit: "none",+ share: parentViewTransition.update,+ name: parentViewTransition.autoName,+ autoName: parentViewTransition.autoName,+ nameIdx: 0+ };+ }+ function getSuspenseFallbackFormatContext(resumableState, parentContext) {+ parentContext.tagScope & 32 && (resumableState.instructions |= 128);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ parentContext.tagScope | 12,+ getSuspenseViewTransition(parentContext.viewTransition)+ );+ }+ function getSuspenseContentFormatContext(resumableState, parentContext) {+ resumableState = getSuspenseViewTransition(parentContext.viewTransition);+ var subtreeScope = parentContext.tagScope | 16;+ null !== resumableState &&+ "none" !== resumableState.share &&+ (subtreeScope |= 64);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ resumableState+ ); }@@ -1349,9 +1389,22 @@ function injectFormReplayingRuntime(resumableState, renderState) {- (resumableState.instructions & 16) === NothingSent &&- ((resumableState.instructions |= 16),- renderState.bootstrapChunks.unshift(- renderState.startInlineScript,- formReplayingRuntimeScript,- "\x3c/script>"- ));+ if ((resumableState.instructions & 16) === NothingSent) {+ resumableState.instructions |= 16;+ var preamble = renderState.preamble,+ bootstrapChunks = renderState.bootstrapChunks;+ (preamble.htmlChunks || preamble.headChunks) &&+ 0 === bootstrapChunks.length+ ? (bootstrapChunks.push(renderState.startInlineScript),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag,+ formReplayingRuntimeScript,+ endInlineScript+ ))+ : bootstrapChunks.unshift(+ renderState.startInlineScript,+ endOfStartTag,+ formReplayingRuntimeScript,+ endInlineScript+ );+ } }@@ -1540,4 +1593,3 @@ formatContext,- textEmbedded,- isFallback+ textEmbedded ) {@@ -2162,4 +2214,4 @@ case "title":- var insertionMode = formatContext.insertionMode,- noscriptTagInScope = !!(formatContext.tagScope & 1);+ var noscriptTagInScope = formatContext.tagScope & 1,+ isFallback = formatContext.tagScope & 4; if (hasOwnProperty.call(props, "children")) {@@ -2192,3 +2244,3 @@ if (- insertionMode === SVG_MODE ||+ formatContext.insertionMode === SVG_MODE || noscriptTagInScope ||@@ -2207,3 +2259,5 @@ case "link":- var rel = props.rel,+ var noscriptTagInScope$jscomp$0 = formatContext.tagScope & 1,+ isFallback$jscomp$0 = formatContext.tagScope & 4,+ rel = props.rel, href = props.href,@@ -2212,3 +2266,3 @@ formatContext.insertionMode === SVG_MODE ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$0 || null != props.itemProp ||@@ -2313,3 +2367,3 @@ : (textEmbedded && target$jscomp$0.push("\x3c!-- --\x3e"),- (JSCompiler_inline_result$jscomp$5 = isFallback+ (JSCompiler_inline_result$jscomp$5 = isFallback$jscomp$0 ? null@@ -2318,3 +2372,4 @@ case "script":- var asyncProp = props.async;+ var noscriptTagInScope$jscomp$1 = formatContext.tagScope & 1,+ asyncProp = props.async; if (@@ -2328,3 +2383,3 @@ formatContext.insertionMode === SVG_MODE ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$1 || null != props.itemProp@@ -2366,4 +2421,3 @@ case "style":- var insertionMode$jscomp$0 = formatContext.insertionMode,- noscriptTagInScope$jscomp$0 = !!(formatContext.tagScope & 1);+ var noscriptTagInScope$jscomp$2 = formatContext.tagScope & 1; if (hasOwnProperty.call(props, "children")) {@@ -2388,6 +2442,7 @@ var precedence$jscomp$0 = props.precedence,
… 2616 more lines (truncated)
--- +++ @@ -42,3 +42,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -55,4 +54,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray;+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray; function murmurhash3_32_gc(key, seed) {@@ -285,2 +291,3 @@ var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null, scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -316,11 +323,8 @@ }-function createPreambleState() {- return {- htmlChunks: null,- headChunks: null,- bodyChunks: null,- contribution: 0- };-}-function createFormatContext(insertionMode, selectedValue, tagScope) {+function createFormatContext(+ insertionMode,+ selectedValue,+ tagScope,+ viewTransition+) { return {@@ -328,3 +332,4 @@ selectedValue: selectedValue,- tagScope: tagScope+ tagScope: tagScope,+ viewTransition: viewTransition };@@ -332,5 +337,6 @@ function getChildFormatContext(parentContext, type, props) {+ var subtreeScope = parentContext.tagScope & -25; switch (type) { case "noscript":- return createFormatContext(2, null, parentContext.tagScope | 1);+ return createFormatContext(2, null, subtreeScope | 1, null); case "select":@@ -339,14 +345,15 @@ null != props.value ? props.value : props.defaultValue,- parentContext.tagScope+ subtreeScope,+ null ); case "svg":- return createFormatContext(4, null, parentContext.tagScope);+ return createFormatContext(4, null, subtreeScope, null); case "picture":- return createFormatContext(2, null, parentContext.tagScope | 2);+ return createFormatContext(2, null, subtreeScope | 2, null); case "math":- return createFormatContext(5, null, parentContext.tagScope);+ return createFormatContext(5, null, subtreeScope, null); case "foreignObject":- return createFormatContext(2, null, parentContext.tagScope);+ return createFormatContext(2, null, subtreeScope, null); case "table":- return createFormatContext(6, null, parentContext.tagScope);+ return createFormatContext(6, null, subtreeScope, null); case "thead":@@ -354,10 +361,10 @@ case "tfoot":- return createFormatContext(7, null, parentContext.tagScope);+ return createFormatContext(7, null, subtreeScope, null); case "colgroup":- return createFormatContext(9, null, parentContext.tagScope);+ return createFormatContext(9, null, subtreeScope, null); case "tr":- return createFormatContext(8, null, parentContext.tagScope);+ return createFormatContext(8, null, subtreeScope, null); case "head": if (2 > parentContext.insertionMode)- return createFormatContext(3, null, parentContext.tagScope);+ return createFormatContext(3, null, subtreeScope, null); break;@@ -365,7 +372,49 @@ if (0 === parentContext.insertionMode)- return createFormatContext(1, null, parentContext.tagScope);+ return createFormatContext(1, null, subtreeScope, null); } return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode- ? createFormatContext(2, null, parentContext.tagScope)- : parentContext;+ ? createFormatContext(2, null, subtreeScope, null)+ : parentContext.tagScope !== subtreeScope+ ? createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ null+ )+ : parentContext;+}+function getSuspenseViewTransition(parentViewTransition) {+ return null === parentViewTransition+ ? null+ : {+ update: parentViewTransition.update,+ enter: "none",+ exit: "none",+ share: parentViewTransition.update,+ name: parentViewTransition.autoName,+ autoName: parentViewTransition.autoName,+ nameIdx: 0+ };+}+function getSuspenseFallbackFormatContext(resumableState, parentContext) {+ parentContext.tagScope & 32 && (resumableState.instructions |= 128);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ parentContext.tagScope | 12,+ getSuspenseViewTransition(parentContext.viewTransition)+ );+}+function getSuspenseContentFormatContext(resumableState, parentContext) {+ resumableState = getSuspenseViewTransition(parentContext.viewTransition);+ var subtreeScope = parentContext.tagScope | 16;+ null !== resumableState &&+ "none" !== resumableState.share &&+ (subtreeScope |= 64);+ return createFormatContext(+ parentContext.insertionMode,+ parentContext.selectedValue,+ subtreeScope,+ resumableState+ ); }@@ -680,9 +729,21 @@ function injectFormReplayingRuntime(resumableState, renderState) {- 0 === (resumableState.instructions & 16) &&- ((resumableState.instructions |= 16),- renderState.bootstrapChunks.unshift(- renderState.startInlineScript,- 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',- "\x3c/script>"- ));+ if (0 === (resumableState.instructions & 16)) {+ resumableState.instructions |= 16;+ var preamble = renderState.preamble,+ bootstrapChunks = renderState.bootstrapChunks;+ (preamble.htmlChunks || preamble.headChunks) && 0 === bootstrapChunks.length+ ? (bootstrapChunks.push(renderState.startInlineScript),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ ">",+ 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',+ "\x3c/script>"+ ))+ : bootstrapChunks.unshift(+ renderState.startInlineScript,+ ">",+ 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});',+ "\x3c/script>"+ );+ } }@@ -861,4 +922,3 @@ formatContext,- textEmbedded,- isFallback+ textEmbedded ) {@@ -1337,5 +1397,7 @@ case "title":+ var noscriptTagInScope = formatContext.tagScope & 1,+ isFallback = formatContext.tagScope & 4; if ( 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope || null != props.itemProp@@ -1353,3 +1415,5 @@ case "link":- var rel = props.rel,+ var noscriptTagInScope$jscomp$0 = formatContext.tagScope & 1,+ isFallback$jscomp$0 = formatContext.tagScope & 4,+ rel = props.rel, href = props.href,@@ -1358,3 +1422,3 @@ 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$0 || null != props.itemProp ||@@ -1425,3 +1489,3 @@ : (textEmbedded && target$jscomp$0.push("\x3c!-- --\x3e"),- (JSCompiler_inline_result$jscomp$4 = isFallback+ (JSCompiler_inline_result$jscomp$4 = isFallback$jscomp$0 ? null@@ -1430,3 +1494,4 @@ case "script":- var asyncProp = props.async;+ var noscriptTagInScope$jscomp$1 = formatContext.tagScope & 1,+ asyncProp = props.async; if (@@ -1440,3 +1505,3 @@ 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$1 || null != props.itemProp@@ -1477,7 +1542,9 @@ case "style":- var precedence$jscomp$0 = props.precedence,- href$jscomp$0 = props.href;+ var noscriptTagInScope$jscomp$2 = formatContext.tagScope & 1,+ precedence$jscomp$0 = props.precedence,+ href$jscomp$0 = props.href,+ nonce = props.nonce; if ( 4 === formatContext.insertionMode ||- formatContext.tagScope & 1 ||+ noscriptTagInScope$jscomp$2 || null != props.itemProp ||@@ -1533,42 +1600,43 @@ resumableState.styleResources[href$jscomp$0] = null;- styleQueue$jscomp$0- ? styleQueue$jscomp$0.hrefs.push(- escapeTextForBrowser(href$jscomp$0)- )- : ((styleQueue$jscomp$0 = {- precedence: escapeTextForBrowser(precedence$jscomp$0),- rules: [],- hrefs: [escapeTextForBrowser(href$jscomp$0)],- sheets: new Map()- }),- renderState.styles.set(precedence$jscomp$0, styleQueue$jscomp$0));- var target = styleQueue$jscomp$0.rules,- children$jscomp$7 = null,- innerHTML$jscomp$6 = null,- propKey$jscomp$9;- for (propKey$jscomp$9 in props)- if (hasOwnProperty.call(props, propKey$jscomp$9)) {
… 2136 more lines (truncated)
--- +++ @@ -43,8 +43,13 @@ }+ function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable)+ return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+ } function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -321,2 +326,5 @@ return content;+ }+ function byteLengthOfChunk(chunk) {+ return chunk.byteLength; }@@ -806,11 +814,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -818,4 +837,6 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, stringToChunk(@@ -824,3 +845,3 @@ endInlineScript- );+ )); bootstrapScriptContent = [];@@ -856,5 +877,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -885,3 +907,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -890,62 +912,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- maxHeadersLength = bootstrapScripts[importMap];- bootstrapScriptContent = idPrefix = void 0;- var props = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof maxHeadersLength- ? (props.href = inlineScriptWithNonce = maxHeadersLength)- : ((props.href = inlineScriptWithNonce = maxHeadersLength.src),- (props.integrity = bootstrapScriptContent =- "string" === typeof maxHeadersLength.integrity- ? maxHeadersLength.integrity- : void 0),- (props.crossOrigin = idPrefix =- "string" === typeof maxHeadersLength ||- null == maxHeadersLength.crossOrigin- ? void 0- : "use-credentials" === maxHeadersLength.crossOrigin- ? "use-credentials"- : ""));- preloadBootstrapScriptOrModule(- resumableState,- onHeaders,- inlineScriptWithNonce,- props- );- externalRuntimeConfig.push(- startScriptSrc,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))- );- nonce &&- externalRuntimeConfig.push(- scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))- );- "string" === typeof bootstrapScriptContent &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(bootstrapScriptContent))- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptCrossOrigin,- stringToChunk(escapeTextForBrowser(idPrefix))- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (importMap = bootstrapModules[bootstrapScripts]),- (idPrefix = inlineScriptWithNonce = void 0),- (bootstrapScriptContent = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (maxHeadersLength = bootstrapScripts[importMap]),+ (inlineStyleWithNonce = nonceStyle = void 0),+ (idPrefix = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -953,14 +921,14 @@ }),- "string" === typeof importMap- ? (bootstrapScriptContent.href = maxHeadersLength = importMap)- : ((bootstrapScriptContent.href = maxHeadersLength =- importMap.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof importMap.integrity- ? importMap.integrity+ "string" === typeof maxHeadersLength+ ? (idPrefix.href = inlineScriptWithNonce = maxHeadersLength)+ : ((idPrefix.href = inlineScriptWithNonce = maxHeadersLength.src),+ (idPrefix.integrity = inlineStyleWithNonce =+ "string" === typeof maxHeadersLength.integrity+ ? maxHeadersLength.integrity : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof importMap || null == importMap.crossOrigin+ (idPrefix.crossOrigin = nonceStyle =+ "string" === typeof maxHeadersLength ||+ null == maxHeadersLength.crossOrigin ? void 0- : "use-credentials" === importMap.crossOrigin+ : "use-credentials" === maxHeadersLength.crossOrigin ? "use-credentials"@@ -970,25 +938,84 @@ onHeaders,- maxHeadersLength,- bootstrapScriptContent+ inlineScriptWithNonce,+ idPrefix ),- externalRuntimeConfig.push(+ bootstrapChunks.push(+ startScriptSrc,+ stringToChunk(escapeTextForBrowser(inlineScriptWithNonce)),+ attributeEnd+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ scriptNonce,+ stringToChunk(escapeTextForBrowser(externalRuntimeConfig)),+ attributeEnd+ ),+ "string" === typeof inlineStyleWithNonce &&+ bootstrapChunks.push(+ scriptIntegirty,+ stringToChunk(escapeTextForBrowser(inlineStyleWithNonce)),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptCrossOrigin,+ stringToChunk(escapeTextForBrowser(nonceStyle)),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (bootstrapScripts = bootstrapModules[nonce]),+ (inlineScriptWithNonce = maxHeadersLength = void 0),+ (nonceStyle = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof bootstrapScripts+ ? (nonceStyle.href = importMap = bootstrapScripts)+ : ((nonceStyle.href = importMap = bootstrapScripts.src),+ (nonceStyle.integrity = inlineScriptWithNonce =+ "string" === typeof bootstrapScripts.integrity+ ? bootstrapScripts.integrity+ : void 0),+ (nonceStyle.crossOrigin = maxHeadersLength =+ "string" === typeof bootstrapScripts ||+ null == bootstrapScripts.crossOrigin+ ? void 0+ : "use-credentials" === bootstrapScripts.crossOrigin+ ? "use-credentials"+ : "")),+ preloadBootstrapScriptOrModule(+ resumableState,+ onHeaders,+ importMap,+ nonceStyle+ ),+ bootstrapChunks.push( startModuleSrc,- stringToChunk(escapeTextForBrowser(maxHeadersLength))+ stringToChunk(escapeTextForBrowser(importMap)),+ attributeEnd ),- nonce &&- externalRuntimeConfig.push(+ externalRuntimeConfig &&+ bootstrapChunks.push( scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))
… 3203 more lines (truncated)
--- +++ @@ -57,3 +57,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -70,4 +69,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray;+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray; function murmurhash3_32_gc(key, seed) {@@ -192,2 +198,5 @@ return textEncoder.encode(content);+}+function byteLengthOfChunk(chunk) {+ return chunk.byteLength; }@@ -372,5 +381,6 @@ };-var PRELOAD_NO_CREDS = [];+var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null; stringToPrecomputedChunk('"></template>');-var startInlineScript = stringToPrecomputedChunk("<script>"),+var startInlineScript = stringToPrecomputedChunk("<script"), endInlineScript = stringToPrecomputedChunk("\x3c/script>"),@@ -378,6 +388,7 @@ startModuleSrc = stringToPrecomputedChunk('<script type="module" src="'),- scriptNonce = stringToPrecomputedChunk('" nonce="'),- scriptIntegirty = stringToPrecomputedChunk('" integrity="'),- scriptCrossOrigin = stringToPrecomputedChunk('" crossorigin="'),- endAsyncScript = stringToPrecomputedChunk('" async="">\x3c/script>'),+ scriptNonce = stringToPrecomputedChunk(' nonce="'),+ scriptIntegirty = stringToPrecomputedChunk(' integrity="'),+ scriptCrossOrigin = stringToPrecomputedChunk(' crossorigin="'),+ endAsyncScript = stringToPrecomputedChunk(' async="">\x3c/script>'),+ startInlineStyle = stringToPrecomputedChunk("<style"), scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -398,11 +409,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -410,4 +432,6 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, stringToChunk(@@ -416,3 +440,3 @@ endInlineScript- );+ )); bootstrapScriptContent = [];@@ -440,5 +464,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -469,3 +494,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -474,62 +499,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- var scriptConfig = bootstrapScripts[importMap];- idPrefix = inlineScriptWithNonce = void 0;- bootstrapScriptContent = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof scriptConfig- ? (bootstrapScriptContent.href = maxHeadersLength = scriptConfig)- : ((bootstrapScriptContent.href = maxHeadersLength = scriptConfig.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof scriptConfig.integrity- ? scriptConfig.integrity- : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof scriptConfig || null == scriptConfig.crossOrigin- ? void 0- : "use-credentials" === scriptConfig.crossOrigin- ? "use-credentials"- : ""));- scriptConfig = resumableState;- var href = maxHeadersLength;- scriptConfig.scriptResources[href] = null;- scriptConfig.moduleScriptResources[href] = null;- scriptConfig = [];- pushLinkImpl(scriptConfig, bootstrapScriptContent);- onHeaders.bootstrapScripts.add(scriptConfig);- externalRuntimeConfig.push(- startScriptSrc,- stringToChunk(escapeTextForBrowser(maxHeadersLength))- );- nonce &&- externalRuntimeConfig.push(- scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(idPrefix))- );- "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- scriptCrossOrigin,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (bootstrapScriptContent = bootstrapModules[bootstrapScripts]),- (inlineScriptWithNonce = maxHeadersLength = void 0),- (idPrefix = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (idPrefix = bootstrapScripts[importMap]),+ (nonceStyle = inlineScriptWithNonce = void 0),+ (inlineStyleWithNonce = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -537,43 +508,101 @@ }),- "string" === typeof bootstrapScriptContent- ? (idPrefix.href = importMap = bootstrapScriptContent)- : ((idPrefix.href = importMap = bootstrapScriptContent.src),- (idPrefix.integrity = inlineScriptWithNonce =- "string" === typeof bootstrapScriptContent.integrity- ? bootstrapScriptContent.integrity+ "string" === typeof idPrefix+ ? (inlineStyleWithNonce.href = maxHeadersLength = idPrefix)+ : ((inlineStyleWithNonce.href = maxHeadersLength = idPrefix.src),+ (inlineStyleWithNonce.integrity = nonceStyle =+ "string" === typeof idPrefix.integrity+ ? idPrefix.integrity : void 0),- (idPrefix.crossOrigin = maxHeadersLength =- "string" === typeof bootstrapScriptContent ||- null == bootstrapScriptContent.crossOrigin+ (inlineStyleWithNonce.crossOrigin = inlineScriptWithNonce =+ "string" === typeof idPrefix || null == idPrefix.crossOrigin ? void 0- : "use-credentials" === bootstrapScriptContent.crossOrigin+ : "use-credentials" === idPrefix.crossOrigin ? "use-credentials" : "")),- (bootstrapScriptContent = resumableState),- (scriptConfig = importMap),- (bootstrapScriptContent.scriptResources[scriptConfig] = null),- (bootstrapScriptContent.moduleScriptResources[scriptConfig] = null),- (bootstrapScriptContent = []),- pushLinkImpl(bootstrapScriptContent, idPrefix),- onHeaders.bootstrapScripts.add(bootstrapScriptContent),- externalRuntimeConfig.push(- startModuleSrc,- stringToChunk(escapeTextForBrowser(importMap))+ (idPrefix = resumableState),+ (bootstrapScriptContent = maxHeadersLength),+ (idPrefix.scriptResources[bootstrapScriptContent] = null),+ (idPrefix.moduleScriptResources[bootstrapScriptContent] = null),+ (idPrefix = []),+ pushLinkImpl(idPrefix, inlineStyleWithNonce),+ onHeaders.bootstrapScripts.add(idPrefix),+ bootstrapChunks.push(+ startScriptSrc,+ stringToChunk(escapeTextForBrowser(maxHeadersLength)),+ attributeEnd ),- nonce &&- externalRuntimeConfig.push(+ externalRuntimeConfig &&+ bootstrapChunks.push( scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))+ stringToChunk(escapeTextForBrowser(externalRuntimeConfig)),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptIntegirty,+ stringToChunk(escapeTextForBrowser(nonceStyle)),+ attributeEnd ), "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))+ bootstrapChunks.push(+ scriptCrossOrigin,+ stringToChunk(escapeTextForBrowser(inlineScriptWithNonce)),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (nonceStyle = bootstrapModules[nonce]),+ (maxHeadersLength = importMap = void 0),+ (inlineScriptWithNonce = {+ rel: "modulepreload",
… 2674 more lines (truncated)
--- +++ @@ -18,3 +18,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -31,4 +30,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray,+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray, jsxPropsParents = new WeakMap(),@@ -36,7 +42,4 @@ function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -202,2 +205,5 @@ 0 !== chunk.length && destination.write(chunk);+}+function byteLengthOfChunk(chunk) {+ return Buffer.byteLength(chunk, "utf8"); }@@ -441,3 +447,7 @@ "aria-rowspan": 0,- "aria-setsize": 0+ "aria-setsize": 0,+ "aria-braillelabel": 0,+ "aria-brailleroledescription": 0,+ "aria-colindextext": 0,+ "aria-rowindextext": 0 },@@ -1373,2 +1383,4 @@ SentStyleInsertionFunction = 8,+ SentCompletedShellId = 32,+ SentMarkShellTime = 64, EXISTS = null,@@ -1376,2 +1388,4 @@ Object.freeze(PRELOAD_NO_CREDS);+var currentlyFlushingRenderState = null,+ endInlineScript = "\x3c/script>"; function escapeEntireInlineScriptContent(scriptText) {@@ -1394,9 +1408,16 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce- ? "<script>"- : '<script nonce="' + escapeTextForBrowser(nonce) + '">',- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ void 0 === externalRuntimeConfig+ ? "<script"+ : '<script nonce="' + escapeTextForBrowser(externalRuntimeConfig) + '"',+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? "<style"+ : '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"',+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -1404,7 +1425,9 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, escapeEntireInlineScriptContent(bootstrapScriptContent),- "\x3c/script>"- );+ endInlineScript+ )); bootstrapScriptContent = [];@@ -1437,5 +1460,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -1466,3 +1490,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -1471,59 +1495,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- maxHeadersLength = bootstrapScripts[importMap];- bootstrapScriptContent = idPrefix = void 0;- var props = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof maxHeadersLength- ? (props.href = inlineScriptWithNonce = maxHeadersLength)- : ((props.href = inlineScriptWithNonce = maxHeadersLength.src),- (props.integrity = bootstrapScriptContent =- "string" === typeof maxHeadersLength.integrity- ? maxHeadersLength.integrity- : void 0),- (props.crossOrigin = idPrefix =- "string" === typeof maxHeadersLength ||- null == maxHeadersLength.crossOrigin- ? void 0- : "use-credentials" === maxHeadersLength.crossOrigin- ? "use-credentials"- : ""));- preloadBootstrapScriptOrModule(- resumableState,- onHeaders,- inlineScriptWithNonce,- props- );- externalRuntimeConfig.push(- '<script src="',- escapeTextForBrowser(inlineScriptWithNonce)- );- nonce &&- externalRuntimeConfig.push('" nonce="', escapeTextForBrowser(nonce));- "string" === typeof bootstrapScriptContent &&- externalRuntimeConfig.push(- '" integrity="',- escapeTextForBrowser(bootstrapScriptContent)- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- '" crossorigin="',- escapeTextForBrowser(idPrefix)- );- externalRuntimeConfig.push('" async="">\x3c/script>');- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (importMap = bootstrapModules[bootstrapScripts]),- (idPrefix = inlineScriptWithNonce = void 0),- (bootstrapScriptContent = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (maxHeadersLength = bootstrapScripts[importMap]),+ (inlineStyleWithNonce = nonceStyle = void 0),+ (idPrefix = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -1531,13 +1504,14 @@ }),- "string" === typeof importMap- ? (bootstrapScriptContent.href = maxHeadersLength = importMap)- : ((bootstrapScriptContent.href = maxHeadersLength = importMap.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof importMap.integrity- ? importMap.integrity+ "string" === typeof maxHeadersLength+ ? (idPrefix.href = inlineScriptWithNonce = maxHeadersLength)+ : ((idPrefix.href = inlineScriptWithNonce = maxHeadersLength.src),+ (idPrefix.integrity = inlineStyleWithNonce =+ "string" === typeof maxHeadersLength.integrity+ ? maxHeadersLength.integrity : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof importMap || null == importMap.crossOrigin+ (idPrefix.crossOrigin = nonceStyle =+ "string" === typeof maxHeadersLength ||+ null == maxHeadersLength.crossOrigin ? void 0- : "use-credentials" === importMap.crossOrigin+ : "use-credentials" === maxHeadersLength.crossOrigin ? "use-credentials"@@ -1547,22 +1521,84 @@ onHeaders,- maxHeadersLength,- bootstrapScriptContent+ inlineScriptWithNonce,+ idPrefix ),- externalRuntimeConfig.push(+ bootstrapChunks.push(+ '<script src="',+ escapeTextForBrowser(inlineScriptWithNonce),+ attributeEnd+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ ' nonce="',+ escapeTextForBrowser(externalRuntimeConfig),+ attributeEnd+ ),+ "string" === typeof inlineStyleWithNonce &&+ bootstrapChunks.push(+ ' integrity="',+ escapeTextForBrowser(inlineStyleWithNonce),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ ' crossorigin="',+ escapeTextForBrowser(nonceStyle),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(' async="">\x3c/script>');+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (bootstrapScripts = bootstrapModules[nonce]),+ (inlineScriptWithNonce = maxHeadersLength = void 0),+ (nonceStyle = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof bootstrapScripts+ ? (nonceStyle.href = importMap = bootstrapScripts)+ : ((nonceStyle.href = importMap = bootstrapScripts.src),+ (nonceStyle.integrity = inlineScriptWithNonce =+ "string" === typeof bootstrapScripts.integrity+ ? bootstrapScripts.integrity+ : void 0),+ (nonceStyle.crossOrigin = maxHeadersLength =+ "string" === typeof bootstrapScripts ||+ null == bootstrapScripts.crossOrigin+ ? void 0+ : "use-credentials" === bootstrapScripts.crossOrigin+ ? "use-credentials"
… 2774 more lines (truncated)
--- +++ @@ -18,3 +18,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -31,4 +30,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray,+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray, scheduleMicrotask = queueMicrotask;@@ -39,2 +45,5 @@ 0 !== chunk.length && destination.write(chunk);+}+function byteLengthOfChunk(chunk) {+ return Buffer.byteLength(chunk, "utf8"); }@@ -220,2 +229,3 @@ var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null, scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -232,9 +242,16 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce- ? "<script>"- : '<script nonce="' + escapeTextForBrowser(nonce) + '">',- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ void 0 === externalRuntimeConfig+ ? "<script"+ : '<script nonce="' + escapeTextForBrowser(externalRuntimeConfig) + '"',+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? "<style"+ : '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"',+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -242,7 +259,9 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ ">", ("" + bootstrapScriptContent).replace(scriptRegex, scriptReplacer), "\x3c/script>"- );+ )); bootstrapScriptContent = [];@@ -268,5 +287,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -297,3 +317,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -302,59 +322,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- var scriptConfig = bootstrapScripts[importMap];- idPrefix = inlineScriptWithNonce = void 0;- bootstrapScriptContent = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof scriptConfig- ? (bootstrapScriptContent.href = maxHeadersLength = scriptConfig)- : ((bootstrapScriptContent.href = maxHeadersLength = scriptConfig.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof scriptConfig.integrity- ? scriptConfig.integrity- : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof scriptConfig || null == scriptConfig.crossOrigin- ? void 0- : "use-credentials" === scriptConfig.crossOrigin- ? "use-credentials"- : ""));- scriptConfig = resumableState;- var href = maxHeadersLength;- scriptConfig.scriptResources[href] = null;- scriptConfig.moduleScriptResources[href] = null;- scriptConfig = [];- pushLinkImpl(scriptConfig, bootstrapScriptContent);- onHeaders.bootstrapScripts.add(scriptConfig);- externalRuntimeConfig.push(- '<script src="',- escapeTextForBrowser(maxHeadersLength)- );- nonce &&- externalRuntimeConfig.push('" nonce="', escapeTextForBrowser(nonce));- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- '" integrity="',- escapeTextForBrowser(idPrefix)- );- "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- '" crossorigin="',- escapeTextForBrowser(inlineScriptWithNonce)- );- externalRuntimeConfig.push('" async="">\x3c/script>');- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (bootstrapScriptContent = bootstrapModules[bootstrapScripts]),- (inlineScriptWithNonce = maxHeadersLength = void 0),- (idPrefix = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (idPrefix = bootstrapScripts[importMap]),+ (nonceStyle = inlineScriptWithNonce = void 0),+ (inlineStyleWithNonce = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -362,40 +331,101 @@ }),- "string" === typeof bootstrapScriptContent- ? (idPrefix.href = importMap = bootstrapScriptContent)- : ((idPrefix.href = importMap = bootstrapScriptContent.src),- (idPrefix.integrity = inlineScriptWithNonce =- "string" === typeof bootstrapScriptContent.integrity- ? bootstrapScriptContent.integrity+ "string" === typeof idPrefix+ ? (inlineStyleWithNonce.href = maxHeadersLength = idPrefix)+ : ((inlineStyleWithNonce.href = maxHeadersLength = idPrefix.src),+ (inlineStyleWithNonce.integrity = nonceStyle =+ "string" === typeof idPrefix.integrity+ ? idPrefix.integrity : void 0),- (idPrefix.crossOrigin = maxHeadersLength =- "string" === typeof bootstrapScriptContent ||- null == bootstrapScriptContent.crossOrigin+ (inlineStyleWithNonce.crossOrigin = inlineScriptWithNonce =+ "string" === typeof idPrefix || null == idPrefix.crossOrigin ? void 0- : "use-credentials" === bootstrapScriptContent.crossOrigin+ : "use-credentials" === idPrefix.crossOrigin ? "use-credentials" : "")),- (bootstrapScriptContent = resumableState),- (scriptConfig = importMap),- (bootstrapScriptContent.scriptResources[scriptConfig] = null),- (bootstrapScriptContent.moduleScriptResources[scriptConfig] = null),- (bootstrapScriptContent = []),- pushLinkImpl(bootstrapScriptContent, idPrefix),- onHeaders.bootstrapScripts.add(bootstrapScriptContent),- externalRuntimeConfig.push(+ (idPrefix = resumableState),+ (bootstrapScriptContent = maxHeadersLength),+ (idPrefix.scriptResources[bootstrapScriptContent] = null),+ (idPrefix.moduleScriptResources[bootstrapScriptContent] = null),+ (idPrefix = []),+ pushLinkImpl(idPrefix, inlineStyleWithNonce),+ onHeaders.bootstrapScripts.add(idPrefix),+ bootstrapChunks.push(+ '<script src="',+ escapeTextForBrowser(maxHeadersLength),+ '"'+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ ' nonce="',+ escapeTextForBrowser(externalRuntimeConfig),+ '"'+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ ' integrity="',+ escapeTextForBrowser(nonceStyle),+ '"'+ ),+ "string" === typeof inlineScriptWithNonce &&+ bootstrapChunks.push(+ ' crossorigin="',+ escapeTextForBrowser(inlineScriptWithNonce),+ '"'+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(' async="">\x3c/script>');+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (nonceStyle = bootstrapModules[nonce]),+ (maxHeadersLength = importMap = void 0),+ (inlineScriptWithNonce = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof nonceStyle+ ? (inlineScriptWithNonce.href = bootstrapScripts = nonceStyle)+ : ((inlineScriptWithNonce.href = bootstrapScripts = nonceStyle.src),+ (inlineScriptWithNonce.integrity = maxHeadersLength =+ "string" === typeof nonceStyle.integrity+ ? nonceStyle.integrity+ : void 0),+ (inlineScriptWithNonce.crossOrigin = importMap =+ "string" === typeof nonceStyle || null == nonceStyle.crossOrigin+ ? void 0+ : "use-credentials" === nonceStyle.crossOrigin+ ? "use-credentials"+ : "")),+ (nonceStyle = resumableState),+ (inlineStyleWithNonce = bootstrapScripts),+ (nonceStyle.scriptResources[inlineStyleWithNonce] = null),+ (nonceStyle.moduleScriptResources[inlineStyleWithNonce] = null),+ (nonceStyle = []),+ pushLinkImpl(nonceStyle, inlineScriptWithNonce),+ onHeaders.bootstrapScripts.add(nonceStyle),+ bootstrapChunks.push( '<script type="module" src="',- escapeTextForBrowser(importMap)+ escapeTextForBrowser(bootstrapScripts),+ '"' ),- nonce &&- externalRuntimeConfig.push('" nonce="', escapeTextForBrowser(nonce)),- "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- '" integrity="',
… 2351 more lines (truncated)
--- +++ @@ -43,8 +43,13 @@ }+ function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable)+ return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+ } function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -317,2 +322,5 @@ return content;+ }+ function byteLengthOfChunk(chunk) {+ return chunk.byteLength; }@@ -802,11 +810,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -814,4 +833,6 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, stringToChunk(@@ -820,3 +841,3 @@ endInlineScript- );+ )); bootstrapScriptContent = [];@@ -852,5 +873,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -881,3 +903,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -886,62 +908,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- maxHeadersLength = bootstrapScripts[importMap];- bootstrapScriptContent = idPrefix = void 0;- var props = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof maxHeadersLength- ? (props.href = inlineScriptWithNonce = maxHeadersLength)- : ((props.href = inlineScriptWithNonce = maxHeadersLength.src),- (props.integrity = bootstrapScriptContent =- "string" === typeof maxHeadersLength.integrity- ? maxHeadersLength.integrity- : void 0),- (props.crossOrigin = idPrefix =- "string" === typeof maxHeadersLength ||- null == maxHeadersLength.crossOrigin- ? void 0- : "use-credentials" === maxHeadersLength.crossOrigin- ? "use-credentials"- : ""));- preloadBootstrapScriptOrModule(- resumableState,- onHeaders,- inlineScriptWithNonce,- props- );- externalRuntimeConfig.push(- startScriptSrc,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))- );- nonce &&- externalRuntimeConfig.push(- scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))- );- "string" === typeof bootstrapScriptContent &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(bootstrapScriptContent))- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptCrossOrigin,- stringToChunk(escapeTextForBrowser(idPrefix))- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (importMap = bootstrapModules[bootstrapScripts]),- (idPrefix = inlineScriptWithNonce = void 0),- (bootstrapScriptContent = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (maxHeadersLength = bootstrapScripts[importMap]),+ (inlineStyleWithNonce = nonceStyle = void 0),+ (idPrefix = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -949,14 +917,14 @@ }),- "string" === typeof importMap- ? (bootstrapScriptContent.href = maxHeadersLength = importMap)- : ((bootstrapScriptContent.href = maxHeadersLength =- importMap.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof importMap.integrity- ? importMap.integrity+ "string" === typeof maxHeadersLength+ ? (idPrefix.href = inlineScriptWithNonce = maxHeadersLength)+ : ((idPrefix.href = inlineScriptWithNonce = maxHeadersLength.src),+ (idPrefix.integrity = inlineStyleWithNonce =+ "string" === typeof maxHeadersLength.integrity+ ? maxHeadersLength.integrity : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof importMap || null == importMap.crossOrigin+ (idPrefix.crossOrigin = nonceStyle =+ "string" === typeof maxHeadersLength ||+ null == maxHeadersLength.crossOrigin ? void 0- : "use-credentials" === importMap.crossOrigin+ : "use-credentials" === maxHeadersLength.crossOrigin ? "use-credentials"@@ -966,25 +934,84 @@ onHeaders,- maxHeadersLength,- bootstrapScriptContent+ inlineScriptWithNonce,+ idPrefix ),- externalRuntimeConfig.push(+ bootstrapChunks.push(+ startScriptSrc,+ stringToChunk(escapeTextForBrowser(inlineScriptWithNonce)),+ attributeEnd+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ scriptNonce,+ stringToChunk(escapeTextForBrowser(externalRuntimeConfig)),+ attributeEnd+ ),+ "string" === typeof inlineStyleWithNonce &&+ bootstrapChunks.push(+ scriptIntegirty,+ stringToChunk(escapeTextForBrowser(inlineStyleWithNonce)),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptCrossOrigin,+ stringToChunk(escapeTextForBrowser(nonceStyle)),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (bootstrapScripts = bootstrapModules[nonce]),+ (inlineScriptWithNonce = maxHeadersLength = void 0),+ (nonceStyle = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof bootstrapScripts+ ? (nonceStyle.href = importMap = bootstrapScripts)+ : ((nonceStyle.href = importMap = bootstrapScripts.src),+ (nonceStyle.integrity = inlineScriptWithNonce =+ "string" === typeof bootstrapScripts.integrity+ ? bootstrapScripts.integrity+ : void 0),+ (nonceStyle.crossOrigin = maxHeadersLength =+ "string" === typeof bootstrapScripts ||+ null == bootstrapScripts.crossOrigin+ ? void 0+ : "use-credentials" === bootstrapScripts.crossOrigin+ ? "use-credentials"+ : "")),+ preloadBootstrapScriptOrModule(+ resumableState,+ onHeaders,+ importMap,+ nonceStyle+ ),+ bootstrapChunks.push( startModuleSrc,- stringToChunk(escapeTextForBrowser(maxHeadersLength))+ stringToChunk(escapeTextForBrowser(importMap)),+ attributeEnd ),- nonce &&- externalRuntimeConfig.push(+ externalRuntimeConfig &&+ bootstrapChunks.push( scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))
… 3203 more lines (truncated)
--- +++ @@ -42,3 +42,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -55,4 +54,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray;+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray; function murmurhash3_32_gc(key, seed) {@@ -167,2 +173,5 @@ return textEncoder.encode(content);+}+function byteLengthOfChunk(chunk) {+ return chunk.byteLength; }@@ -347,5 +356,6 @@ };-var PRELOAD_NO_CREDS = [];+var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null; stringToPrecomputedChunk('"></template>');-var startInlineScript = stringToPrecomputedChunk("<script>"),+var startInlineScript = stringToPrecomputedChunk("<script"), endInlineScript = stringToPrecomputedChunk("\x3c/script>"),@@ -353,6 +363,7 @@ startModuleSrc = stringToPrecomputedChunk('<script type="module" src="'),- scriptNonce = stringToPrecomputedChunk('" nonce="'),- scriptIntegirty = stringToPrecomputedChunk('" integrity="'),- scriptCrossOrigin = stringToPrecomputedChunk('" crossorigin="'),- endAsyncScript = stringToPrecomputedChunk('" async="">\x3c/script>'),+ scriptNonce = stringToPrecomputedChunk(' nonce="'),+ scriptIntegirty = stringToPrecomputedChunk(' integrity="'),+ scriptCrossOrigin = stringToPrecomputedChunk(' crossorigin="'),+ endAsyncScript = stringToPrecomputedChunk(' async="">\x3c/script>'),+ startInlineStyle = stringToPrecomputedChunk("<style"), scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -373,11 +384,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -385,4 +407,6 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, stringToChunk(@@ -391,3 +415,3 @@ endInlineScript- );+ )); bootstrapScriptContent = [];@@ -415,5 +439,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -444,3 +469,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -449,62 +474,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- var scriptConfig = bootstrapScripts[importMap];- idPrefix = inlineScriptWithNonce = void 0;- bootstrapScriptContent = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof scriptConfig- ? (bootstrapScriptContent.href = maxHeadersLength = scriptConfig)- : ((bootstrapScriptContent.href = maxHeadersLength = scriptConfig.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof scriptConfig.integrity- ? scriptConfig.integrity- : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof scriptConfig || null == scriptConfig.crossOrigin- ? void 0- : "use-credentials" === scriptConfig.crossOrigin- ? "use-credentials"- : ""));- scriptConfig = resumableState;- var href = maxHeadersLength;- scriptConfig.scriptResources[href] = null;- scriptConfig.moduleScriptResources[href] = null;- scriptConfig = [];- pushLinkImpl(scriptConfig, bootstrapScriptContent);- onHeaders.bootstrapScripts.add(scriptConfig);- externalRuntimeConfig.push(- startScriptSrc,- stringToChunk(escapeTextForBrowser(maxHeadersLength))- );- nonce &&- externalRuntimeConfig.push(- scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(idPrefix))- );- "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- scriptCrossOrigin,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (bootstrapScriptContent = bootstrapModules[bootstrapScripts]),- (inlineScriptWithNonce = maxHeadersLength = void 0),- (idPrefix = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (idPrefix = bootstrapScripts[importMap]),+ (nonceStyle = inlineScriptWithNonce = void 0),+ (inlineStyleWithNonce = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -512,43 +483,101 @@ }),- "string" === typeof bootstrapScriptContent- ? (idPrefix.href = importMap = bootstrapScriptContent)- : ((idPrefix.href = importMap = bootstrapScriptContent.src),- (idPrefix.integrity = inlineScriptWithNonce =- "string" === typeof bootstrapScriptContent.integrity- ? bootstrapScriptContent.integrity+ "string" === typeof idPrefix+ ? (inlineStyleWithNonce.href = maxHeadersLength = idPrefix)+ : ((inlineStyleWithNonce.href = maxHeadersLength = idPrefix.src),+ (inlineStyleWithNonce.integrity = nonceStyle =+ "string" === typeof idPrefix.integrity+ ? idPrefix.integrity : void 0),- (idPrefix.crossOrigin = maxHeadersLength =- "string" === typeof bootstrapScriptContent ||- null == bootstrapScriptContent.crossOrigin+ (inlineStyleWithNonce.crossOrigin = inlineScriptWithNonce =+ "string" === typeof idPrefix || null == idPrefix.crossOrigin ? void 0- : "use-credentials" === bootstrapScriptContent.crossOrigin+ : "use-credentials" === idPrefix.crossOrigin ? "use-credentials" : "")),- (bootstrapScriptContent = resumableState),- (scriptConfig = importMap),- (bootstrapScriptContent.scriptResources[scriptConfig] = null),- (bootstrapScriptContent.moduleScriptResources[scriptConfig] = null),- (bootstrapScriptContent = []),- pushLinkImpl(bootstrapScriptContent, idPrefix),- onHeaders.bootstrapScripts.add(bootstrapScriptContent),- externalRuntimeConfig.push(- startModuleSrc,- stringToChunk(escapeTextForBrowser(importMap))+ (idPrefix = resumableState),+ (bootstrapScriptContent = maxHeadersLength),+ (idPrefix.scriptResources[bootstrapScriptContent] = null),+ (idPrefix.moduleScriptResources[bootstrapScriptContent] = null),+ (idPrefix = []),+ pushLinkImpl(idPrefix, inlineStyleWithNonce),+ onHeaders.bootstrapScripts.add(idPrefix),+ bootstrapChunks.push(+ startScriptSrc,+ stringToChunk(escapeTextForBrowser(maxHeadersLength)),+ attributeEnd ),- nonce &&- externalRuntimeConfig.push(+ externalRuntimeConfig &&+ bootstrapChunks.push( scriptNonce,- stringToChunk(escapeTextForBrowser(nonce))+ stringToChunk(escapeTextForBrowser(externalRuntimeConfig)),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptIntegirty,+ stringToChunk(escapeTextForBrowser(nonceStyle)),+ attributeEnd ), "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- scriptIntegirty,- stringToChunk(escapeTextForBrowser(inlineScriptWithNonce))+ bootstrapChunks.push(+ scriptCrossOrigin,+ stringToChunk(escapeTextForBrowser(inlineScriptWithNonce)),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (nonceStyle = bootstrapModules[nonce]),+ (maxHeadersLength = importMap = void 0),+ (inlineScriptWithNonce = {+ rel: "modulepreload",
… 2691 more lines (truncated)
--- +++ @@ -19,8 +19,13 @@ }+ function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable)+ return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+ } function objectName(object) {- return Object.prototype.toString- .call(object)- .replace(/^\[object (.*)\]$/, function (m, p0) {- return p0;- });+ object = Object.prototype.toString.call(object);+ return object.slice(8, object.length - 1); }@@ -268,2 +273,7 @@ return content;+ }+ function byteLengthOfChunk(chunk) {+ return "string" === typeof chunk+ ? Buffer.byteLength(chunk, "utf8")+ : chunk.byteLength; }@@ -748,11 +758,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -760,7 +781,9 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, escapeEntireInlineScriptContent(bootstrapScriptContent), endInlineScript- );+ )); bootstrapScriptContent = [];@@ -794,5 +817,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -823,3 +847,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -828,62 +852,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- maxHeadersLength = bootstrapScripts[importMap];- bootstrapScriptContent = idPrefix = void 0;- var props = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof maxHeadersLength- ? (props.href = inlineScriptWithNonce = maxHeadersLength)- : ((props.href = inlineScriptWithNonce = maxHeadersLength.src),- (props.integrity = bootstrapScriptContent =- "string" === typeof maxHeadersLength.integrity- ? maxHeadersLength.integrity- : void 0),- (props.crossOrigin = idPrefix =- "string" === typeof maxHeadersLength ||- null == maxHeadersLength.crossOrigin- ? void 0- : "use-credentials" === maxHeadersLength.crossOrigin- ? "use-credentials"- : ""));- preloadBootstrapScriptOrModule(- resumableState,- onHeaders,- inlineScriptWithNonce,- props- );- externalRuntimeConfig.push(- startScriptSrc,- escapeTextForBrowser(inlineScriptWithNonce)- );- nonce &&- externalRuntimeConfig.push(- scriptNonce,- escapeTextForBrowser(nonce)- );- "string" === typeof bootstrapScriptContent &&- externalRuntimeConfig.push(- scriptIntegirty,- escapeTextForBrowser(bootstrapScriptContent)- );- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptCrossOrigin,- escapeTextForBrowser(idPrefix)- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (importMap = bootstrapModules[bootstrapScripts]),- (idPrefix = inlineScriptWithNonce = void 0),- (bootstrapScriptContent = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (maxHeadersLength = bootstrapScripts[importMap]),+ (inlineStyleWithNonce = nonceStyle = void 0),+ (idPrefix = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -891,14 +861,14 @@ }),- "string" === typeof importMap- ? (bootstrapScriptContent.href = maxHeadersLength = importMap)- : ((bootstrapScriptContent.href = maxHeadersLength =- importMap.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof importMap.integrity- ? importMap.integrity+ "string" === typeof maxHeadersLength+ ? (idPrefix.href = inlineScriptWithNonce = maxHeadersLength)+ : ((idPrefix.href = inlineScriptWithNonce = maxHeadersLength.src),+ (idPrefix.integrity = inlineStyleWithNonce =+ "string" === typeof maxHeadersLength.integrity+ ? maxHeadersLength.integrity : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof importMap || null == importMap.crossOrigin+ (idPrefix.crossOrigin = nonceStyle =+ "string" === typeof maxHeadersLength ||+ null == maxHeadersLength.crossOrigin ? void 0- : "use-credentials" === importMap.crossOrigin+ : "use-credentials" === maxHeadersLength.crossOrigin ? "use-credentials"@@ -908,25 +878,84 @@ onHeaders,- maxHeadersLength,- bootstrapScriptContent+ inlineScriptWithNonce,+ idPrefix ),- externalRuntimeConfig.push(+ bootstrapChunks.push(+ startScriptSrc,+ escapeTextForBrowser(inlineScriptWithNonce),+ attributeEnd+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ scriptNonce,+ escapeTextForBrowser(externalRuntimeConfig),+ attributeEnd+ ),+ "string" === typeof inlineStyleWithNonce &&+ bootstrapChunks.push(+ scriptIntegirty,+ escapeTextForBrowser(inlineStyleWithNonce),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptCrossOrigin,+ escapeTextForBrowser(nonceStyle),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (bootstrapScripts = bootstrapModules[nonce]),+ (inlineScriptWithNonce = maxHeadersLength = void 0),+ (nonceStyle = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof bootstrapScripts+ ? (nonceStyle.href = importMap = bootstrapScripts)+ : ((nonceStyle.href = importMap = bootstrapScripts.src),+ (nonceStyle.integrity = inlineScriptWithNonce =+ "string" === typeof bootstrapScripts.integrity+ ? bootstrapScripts.integrity+ : void 0),+ (nonceStyle.crossOrigin = maxHeadersLength =+ "string" === typeof bootstrapScripts ||+ null == bootstrapScripts.crossOrigin+ ? void 0+ : "use-credentials" === bootstrapScripts.crossOrigin+ ? "use-credentials"+ : "")),+ preloadBootstrapScriptOrModule(+ resumableState,+ onHeaders,+ importMap,+ nonceStyle+ ),+ bootstrapChunks.push( startModuleSrc,- escapeTextForBrowser(maxHeadersLength)+ escapeTextForBrowser(importMap),+ attributeEnd ),- nonce &&- externalRuntimeConfig.push(+ externalRuntimeConfig &&+ bootstrapChunks.push( scriptNonce,
… 3478 more lines (truncated)
--- +++ @@ -22,3 +22,2 @@ REACT_PROFILER_TYPE = Symbol.for("react.profiler"),- REACT_PROVIDER_TYPE = Symbol.for("react.provider"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),@@ -35,4 +34,11 @@ REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),- MAYBE_ITERATOR_SYMBOL = Symbol.iterator,- isArrayImpl = Array.isArray,+ MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+function getIteratorFn(maybeIterable) {+ if (null === maybeIterable || "object" !== typeof maybeIterable) return null;+ maybeIterable =+ (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||+ maybeIterable["@@iterator"];+ return "function" === typeof maybeIterable ? maybeIterable : null;+}+var isArrayImpl = Array.isArray, scheduleMicrotask = queueMicrotask;@@ -124,2 +130,7 @@ return textEncoder.encode(content);+}+function byteLengthOfChunk(chunk) {+ return "string" === typeof chunk+ ? Buffer.byteLength(chunk, "utf8")+ : chunk.byteLength; }@@ -299,5 +310,6 @@ };-var PRELOAD_NO_CREDS = [];+var PRELOAD_NO_CREDS = [],+ currentlyFlushingRenderState = null; stringToPrecomputedChunk('"></template>');-var startInlineScript = stringToPrecomputedChunk("<script>"),+var startInlineScript = stringToPrecomputedChunk("<script"), endInlineScript = stringToPrecomputedChunk("\x3c/script>"),@@ -305,6 +317,7 @@ startModuleSrc = stringToPrecomputedChunk('<script type="module" src="'),- scriptNonce = stringToPrecomputedChunk('" nonce="'),- scriptIntegirty = stringToPrecomputedChunk('" integrity="'),- scriptCrossOrigin = stringToPrecomputedChunk('" crossorigin="'),- endAsyncScript = stringToPrecomputedChunk('" async="">\x3c/script>'),+ scriptNonce = stringToPrecomputedChunk(' nonce="'),+ scriptIntegirty = stringToPrecomputedChunk(' integrity="'),+ scriptCrossOrigin = stringToPrecomputedChunk(' crossorigin="'),+ endAsyncScript = stringToPrecomputedChunk(' async="">\x3c/script>'),+ startInlineStyle = stringToPrecomputedChunk("<style"), scriptRegex = /(<\/|<)(s)(cript)/gi;@@ -325,11 +338,22 @@ ) {+ externalRuntimeConfig =+ "string" === typeof nonce ? nonce : nonce && nonce.script; var inlineScriptWithNonce =- void 0 === nonce+ void 0 === externalRuntimeConfig ? startInlineScript : stringToPrecomputedChunk(- '<script nonce="' + escapeTextForBrowser(nonce) + '">'+ '<script nonce="' ++ escapeTextForBrowser(externalRuntimeConfig) ++ '"' ),- idPrefix = resumableState.idPrefix;- externalRuntimeConfig = [];- var bootstrapScriptContent = resumableState.bootstrapScriptContent,+ nonceStyle = "string" === typeof nonce ? void 0 : nonce && nonce.style,+ inlineStyleWithNonce =+ void 0 === nonceStyle+ ? startInlineStyle+ : stringToPrecomputedChunk(+ '<style nonce="' + escapeTextForBrowser(nonceStyle) + '"'+ ),+ idPrefix = resumableState.idPrefix,+ bootstrapChunks = [],+ bootstrapScriptContent = resumableState.bootstrapScriptContent, bootstrapScripts = resumableState.bootstrapScripts,@@ -337,7 +361,9 @@ void 0 !== bootstrapScriptContent &&- externalRuntimeConfig.push(- inlineScriptWithNonce,+ (bootstrapChunks.push(inlineScriptWithNonce),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(+ endOfStartTag, ("" + bootstrapScriptContent).replace(scriptRegex, scriptReplacer), endInlineScript- );+ )); bootstrapScriptContent = [];@@ -363,5 +389,6 @@ startInlineScript: inlineScriptWithNonce,+ startInlineStyle: inlineStyleWithNonce, preamble: createPreambleState(), externalRuntimeScript: null,- bootstrapChunks: externalRuntimeConfig,+ bootstrapChunks: bootstrapChunks, importMapChunks: bootstrapScriptContent,@@ -392,3 +419,3 @@ },- nonce: nonce,+ nonce: { script: externalRuntimeConfig, style: nonceStyle }, hoistableState: null,@@ -397,59 +424,8 @@ if (void 0 !== bootstrapScripts)- for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {- var scriptConfig = bootstrapScripts[importMap];- idPrefix = inlineScriptWithNonce = void 0;- bootstrapScriptContent = {- rel: "preload",- as: "script",- fetchPriority: "low",- nonce: nonce- };- "string" === typeof scriptConfig- ? (bootstrapScriptContent.href = maxHeadersLength = scriptConfig)- : ((bootstrapScriptContent.href = maxHeadersLength = scriptConfig.src),- (bootstrapScriptContent.integrity = idPrefix =- "string" === typeof scriptConfig.integrity- ? scriptConfig.integrity- : void 0),- (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =- "string" === typeof scriptConfig || null == scriptConfig.crossOrigin- ? void 0- : "use-credentials" === scriptConfig.crossOrigin- ? "use-credentials"- : ""));- scriptConfig = resumableState;- var href = maxHeadersLength;- scriptConfig.scriptResources[href] = null;- scriptConfig.moduleScriptResources[href] = null;- scriptConfig = [];- pushLinkImpl(scriptConfig, bootstrapScriptContent);- onHeaders.bootstrapScripts.add(scriptConfig);- externalRuntimeConfig.push(- startScriptSrc,- escapeTextForBrowser(maxHeadersLength)- );- nonce &&- externalRuntimeConfig.push(scriptNonce, escapeTextForBrowser(nonce));- "string" === typeof idPrefix &&- externalRuntimeConfig.push(- scriptIntegirty,- escapeTextForBrowser(idPrefix)- );- "string" === typeof inlineScriptWithNonce &&- externalRuntimeConfig.push(- scriptCrossOrigin,- escapeTextForBrowser(inlineScriptWithNonce)- );- externalRuntimeConfig.push(endAsyncScript);- }- if (void 0 !== bootstrapModules)- for (- bootstrapScripts = 0;- bootstrapScripts < bootstrapModules.length;- bootstrapScripts++- )- (bootstrapScriptContent = bootstrapModules[bootstrapScripts]),- (inlineScriptWithNonce = maxHeadersLength = void 0),- (idPrefix = {- rel: "modulepreload",+ for (importMap = 0; importMap < bootstrapScripts.length; importMap++)+ (idPrefix = bootstrapScripts[importMap]),+ (nonceStyle = inlineScriptWithNonce = void 0),+ (inlineStyleWithNonce = {+ rel: "preload",+ as: "script", fetchPriority: "low",@@ -457,40 +433,101 @@ }),- "string" === typeof bootstrapScriptContent- ? (idPrefix.href = importMap = bootstrapScriptContent)- : ((idPrefix.href = importMap = bootstrapScriptContent.src),- (idPrefix.integrity = inlineScriptWithNonce =- "string" === typeof bootstrapScriptContent.integrity- ? bootstrapScriptContent.integrity+ "string" === typeof idPrefix+ ? (inlineStyleWithNonce.href = maxHeadersLength = idPrefix)+ : ((inlineStyleWithNonce.href = maxHeadersLength = idPrefix.src),+ (inlineStyleWithNonce.integrity = nonceStyle =+ "string" === typeof idPrefix.integrity+ ? idPrefix.integrity : void 0),- (idPrefix.crossOrigin = maxHeadersLength =- "string" === typeof bootstrapScriptContent ||- null == bootstrapScriptContent.crossOrigin+ (inlineStyleWithNonce.crossOrigin = inlineScriptWithNonce =+ "string" === typeof idPrefix || null == idPrefix.crossOrigin ? void 0- : "use-credentials" === bootstrapScriptContent.crossOrigin+ : "use-credentials" === idPrefix.crossOrigin ? "use-credentials" : "")),- (bootstrapScriptContent = resumableState),- (scriptConfig = importMap),- (bootstrapScriptContent.scriptResources[scriptConfig] = null),- (bootstrapScriptContent.moduleScriptResources[scriptConfig] = null),- (bootstrapScriptContent = []),- pushLinkImpl(bootstrapScriptContent, idPrefix),- onHeaders.bootstrapScripts.add(bootstrapScriptContent),- externalRuntimeConfig.push(+ (idPrefix = resumableState),+ (bootstrapScriptContent = maxHeadersLength),+ (idPrefix.scriptResources[bootstrapScriptContent] = null),+ (idPrefix.moduleScriptResources[bootstrapScriptContent] = null),+ (idPrefix = []),+ pushLinkImpl(idPrefix, inlineStyleWithNonce),+ onHeaders.bootstrapScripts.add(idPrefix),+ bootstrapChunks.push(+ startScriptSrc,+ escapeTextForBrowser(maxHeadersLength),+ attributeEnd+ ),+ externalRuntimeConfig &&+ bootstrapChunks.push(+ scriptNonce,+ escapeTextForBrowser(externalRuntimeConfig),+ attributeEnd+ ),+ "string" === typeof nonceStyle &&+ bootstrapChunks.push(+ scriptIntegirty,+ escapeTextForBrowser(nonceStyle),+ attributeEnd+ ),+ "string" === typeof inlineScriptWithNonce &&+ bootstrapChunks.push(+ scriptCrossOrigin,+ escapeTextForBrowser(inlineScriptWithNonce),+ attributeEnd+ ),+ pushCompletedShellIdAttribute(bootstrapChunks, resumableState),+ bootstrapChunks.push(endAsyncScript);+ if (void 0 !== bootstrapModules)+ for (nonce = 0; nonce < bootstrapModules.length; nonce++)+ (nonceStyle = bootstrapModules[nonce]),+ (maxHeadersLength = importMap = void 0),+ (inlineScriptWithNonce = {+ rel: "modulepreload",+ fetchPriority: "low",+ nonce: externalRuntimeConfig+ }),+ "string" === typeof nonceStyle+ ? (inlineScriptWithNonce.href = bootstrapScripts = nonceStyle)+ : ((inlineScriptWithNonce.href = bootstrapScripts = nonceStyle.src),+ (inlineScriptWithNonce.integrity = maxHeadersLength =+ "string" === typeof nonceStyle.integrity+ ? nonceStyle.integrity+ : void 0),
… 2957 more lines (truncated)
--- +++ @@ -418,3 +418,3 @@ };- exports.version = "19.1.8";+ exports.version = "19.2.7"; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
--- +++ @@ -209,2 +209,2 @@ };-exports.version = "19.1.8";+exports.version = "19.2.7";
--- +++ @@ -338,3 +338,3 @@ };- exports.version = "19.1.8";+ exports.version = "19.2.7"; })();
--- +++ @@ -151,2 +151,2 @@ };-exports.version = "19.1.8";+exports.version = "19.2.7";
--- +++ @@ -2,3 +2,3 @@ "name": "react-dom",- "version": "19.1.8",+ "version": "19.2.7", "description": "React package for working with the DOM.",@@ -19,6 +19,6 @@ "dependencies": {- "scheduler": "^0.26.0"+ "scheduler": "^0.27.0" }, "peerDependencies": {- "react": "^19.1.8"+ "react": "^19.2.7" },
--- +++ @@ -15,4 +15,2 @@ exports.renderToReadableStream = s.renderToReadableStream;-if (s.resume) {- exports.resume = s.resume;-}+exports.resume = s.resume;
--- +++ @@ -14,5 +14,3 @@ exports.renderToReadableStream = b.renderToReadableStream;-if (b.resume) {- exports.resume = b.resume;-}+exports.resume = b.resume; exports.renderToString = l.renderToString;
--- +++ @@ -16,4 +16,2 @@ exports.renderToStaticMarkup = l.renderToStaticMarkup;-if (b.resume) {- exports.resume = b.resume;-}+exports.resume = b.resume;
--- +++ @@ -15,4 +15,4 @@ exports.renderToPipeableStream = s.renderToPipeableStream;-if (s.resumeToPipeableStream) {- exports.resumeToPipeableStream = s.resumeToPipeableStream;-}+exports.renderToReadableStream = s.renderToReadableStream;+exports.resumeToPipeableStream = s.resumeToPipeableStream;+exports.resume = s.resume;
rollup npm BURST ×38
4.59.0
4.59.1
4.60.0
4.60.1
4.60.2
4.60.3
4.60.4
4.61.0
4.61.1
4.62.0
4.62.1
4.62.2
BURST
2 releases in 9m: 0.2.0, 0.2.1
info · registry-verified · 2015-05-17 · 11y ago
BURST
3 releases in 34m: 0.6.0, 0.6.1, 0.6.2
info · registry-verified · 2015-05-26 · 11y ago
BURST
2 releases in 5m: 0.6.3, 0.6.4
info · registry-verified · 2015-05-26 · 11y ago
BURST
2 releases in 53m: 0.7.4, 0.7.5
info · registry-verified · 2015-06-06 · 11y ago
BURST
2 releases in 41m: 0.9.0, 0.9.1
info · registry-verified · 2015-07-10 · 11y ago
BURST
3 releases in 39m: 0.17.1, 0.17.2, 0.17.3
info · registry-verified · 2015-09-30 · 10y ago
BURST
2 releases in 29m: 0.23.0, 0.23.1
info · registry-verified · 2015-12-30 · 10y ago
BURST
2 releases in 3m: 0.34.6, 0.34.7
info · registry-verified · 2016-08-07 · 9y ago
BURST
2 releases in 5m: 0.35.1, 0.35.2
info · registry-verified · 2016-09-10 · 9y ago
BURST
2 releases in 16m: 0.35.5, 0.35.6
info · registry-verified · 2016-09-10 · 9y ago
BURST
2 releases in 43m: 0.36.2, 0.36.3
info · registry-verified · 2016-10-09 · 9y ago
BURST
2 releases in 57m: 0.39.1, 0.39.2
info · registry-verified · 2016-12-30 · 9y ago
BURST
2 releases in 30m: 0.44.0, 0.45.0
info · registry-verified · 2017-07-10 · 9y ago
BURST
2 releases in 10m: 0.47.1, 0.47.2
info · registry-verified · 2017-08-12 · 8y ago
BURST
2 releases in 54m: 0.47.3, 0.47.4
info · registry-verified · 2017-08-13 · 8y ago
BURST
2 releases in 41m: 0.48.1, 0.48.2
info · registry-verified · 2017-08-20 · 8y ago
BURST
2 releases in 8m: 0.51.4, 0.51.5
info · registry-verified · 2017-11-11 · 8y ago
BURST
2 releases in 45m: 0.60.3, 0.60.4
info · registry-verified · 2018-06-13 · 8y ago
BURST
2 releases in 54m: 0.60.6, 0.60.7
info · registry-verified · 2018-06-14 · 8y ago
BURST
2 releases in 4m: 0.63.1, 0.63.2
info · registry-verified · 2018-07-18 · 7y ago
BURST
2 releases in 48m: 0.67.2, 0.67.3
info · registry-verified · 2018-11-17 · 7y ago
BURST
2 releases in 26m: 1.2.5, 1.3.0
info · registry-verified · 2019-02-26 · 7y ago
BURST
2 releases in 44m: 1.4.2, 1.5.0
info · registry-verified · 2019-03-07 · 7y ago
BURST
2 releases in 39m: 1.7.1, 1.7.2
info · registry-verified · 2019-03-24 · 7y ago
BURST
2 releases in 38m: 1.9.2, 1.9.3
info · registry-verified · 2019-04-10 · 7y ago
BURST
2 releases in 59m: 1.19.0, 1.19.1
info · registry-verified · 2019-08-05 · 6y ago
BURST
2 releases in 37m: 1.26.1, 1.26.2
info · registry-verified · 2019-10-31 · 6y ago
BURST
2 releases in 34m: 2.3.5, 2.4.0
info · registry-verified · 2020-04-09 · 6y ago
BURST
2 releases in 10m: 2.5.0, 2.6.0
info · registry-verified · 2020-04-10 · 6y ago
BURST
2 releases in 57m: 2.7.4, 2.7.5
info · registry-verified · 2020-04-29 · 6y ago
BURST
2 releases in 34m: 2.10.6, 2.10.7
info · registry-verified · 2020-05-22 · 6y ago
BURST
2 releases in 29m: 2.11.1, 2.11.2
info · registry-verified · 2020-05-28 · 6y ago
BURST
2 releases in 48m: 2.26.1, 2.26.2
info · registry-verified · 2020-08-16 · 5y ago
BURST
2 releases in 38m: 2.52.5, 2.52.6
info · registry-verified · 2021-07-01 · 5y ago
BURST
2 releases in 15m: 2.58.2, 2.58.3
info · registry-verified · 2021-10-25 · 4y ago
BURST
2 releases in 48m: 2.75.2, 2.75.3
info · registry-verified · 2022-05-29 · 4y ago
BURST
2 releases in 19m: 4.22.4, 3.29.5
info · registry-verified · 2024-09-21 · 1y ago
BURST
2 releases in 34m: 2.80.0, 3.30.0
info · registry-verified · 2026-02-22 · 4mo ago
release diff 4.62.1 → 4.62.2
+0 added · -0 removed · ~19 modified
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b @@ -29,3 +29,3 @@ -var version = "4.62.1";+var version = "4.62.2"; const package_ = {@@ -8189,2 +8189,5 @@ }+ get moduleSideEffects() {+ return this.moduleInfo.moduleSideEffects;+ } getFileName() {@@ -18961,2 +18964,3 @@ }+ const renderedDependencies = this.getRenderedDependencies(); return (this.renderedChunkInfo = {@@ -18966,4 +18970,4 @@ implicitlyLoadedBefore: Array.from(this.implicitlyLoadedBefore, resolveFileName),- importedBindings: getImportedBindingsPerDependency(this.getRenderedDependencies(), resolveFileName),- imports: Array.from(this.dependencies, resolveFileName),+ importedBindings: getImportedBindingsPerDependency(renderedDependencies, resolveFileName),+ imports: Array.from(renderedDependencies.keys(), resolveFileName), modules: this.renderedModules,@@ -19469,2 +19473,14 @@ const reexports = reexportSpecifiers.get(dependency) || null;+ if (imports === null &&+ reexports === null &&+ dependency instanceof ExternalChunk &&+ !dependency.moduleSideEffects &&+ !this.outputOptions.hoistTransitiveImports) {+ // A side-effect-free external dependency without imported or+ // re-exported bindings can only be present because chunk assignment+ // placed otherwise unrelated modules into this chunk. When transitive+ // import hoisting is disabled, rendering it would emit a spurious+ // side effect import, see https://github.com/rollup/rollup/issues/6111+ continue;+ } const namedExportsMode = dependency instanceof ExternalChunk || dependency.exportMode !== 'default';
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b @@ -44,3 +44,3 @@ -var version = "4.62.1";+var version = "4.62.2"; const package_ = {@@ -12286,2 +12286,5 @@ }+ get moduleSideEffects() {+ return this.moduleInfo.moduleSideEffects;+ } getFileName() {@@ -20457,2 +20460,3 @@ }+ const renderedDependencies = this.getRenderedDependencies(); return (this.renderedChunkInfo = {@@ -20462,4 +20466,4 @@ implicitlyLoadedBefore: Array.from(this.implicitlyLoadedBefore, resolveFileName),- importedBindings: getImportedBindingsPerDependency(this.getRenderedDependencies(), resolveFileName),- imports: Array.from(this.dependencies, resolveFileName),+ importedBindings: getImportedBindingsPerDependency(renderedDependencies, resolveFileName),+ imports: Array.from(renderedDependencies.keys(), resolveFileName), modules: this.renderedModules,@@ -20965,2 +20969,14 @@ const reexports = reexportSpecifiers.get(dependency) || null;+ if (imports === null &&+ reexports === null &&+ dependency instanceof ExternalChunk &&+ !dependency.moduleSideEffects &&+ !this.outputOptions.hoistTransitiveImports) {+ // A side-effect-free external dependency without imported or+ // re-exported bindings can only be present because chunk assignment+ // placed otherwise unrelated modules into this chunk. When transitive+ // import hoisting is disabled, rendering it would emit a spurious+ // side effect import, see https://github.com/rollup/rollup/issues/6111+ continue;+ } const namedExportsMode = dependency instanceof ExternalChunk || dependency.exportMode !== 'default';
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,4 +2,4 @@ @license- Rollup.js v4.62.1- Fri, 19 Jun 2026 12:41:14 GMT - commit caacf701b89e5be4a94b3ffdbf70b51e5cfa3a1a+ Rollup.js v4.62.2+ Fri, 19 Jun 2026 14:55:11 GMT - commit 8faa18777374582bb813d54ce3623f4acf1f9e0b
--- +++ @@ -2,3 +2,3 @@ "name": "rollup",- "version": "4.62.1",+ "version": "4.62.2", "description": "Next-generation ES module bundler",@@ -116,27 +116,27 @@ "fsevents": "~2.3.2",- "@rollup/rollup-darwin-arm64": "4.62.1",- "@rollup/rollup-android-arm64": "4.62.1",- "@rollup/rollup-win32-arm64-msvc": "4.62.1",- "@rollup/rollup-freebsd-arm64": "4.62.1",- "@rollup/rollup-linux-arm64-gnu": "4.62.1",- "@rollup/rollup-linux-arm64-musl": "4.62.1",- "@rollup/rollup-android-arm-eabi": "4.62.1",- "@rollup/rollup-linux-arm-gnueabihf": "4.62.1",- "@rollup/rollup-linux-arm-musleabihf": "4.62.1",- "@rollup/rollup-win32-ia32-msvc": "4.62.1",- "@rollup/rollup-linux-loong64-gnu": "4.62.1",- "@rollup/rollup-linux-loong64-musl": "4.62.1",- "@rollup/rollup-linux-riscv64-gnu": "4.62.1",- "@rollup/rollup-linux-riscv64-musl": "4.62.1",- "@rollup/rollup-linux-ppc64-gnu": "4.62.1",- "@rollup/rollup-linux-ppc64-musl": "4.62.1",- "@rollup/rollup-linux-s390x-gnu": "4.62.1",- "@rollup/rollup-darwin-x64": "4.62.1",- "@rollup/rollup-win32-x64-gnu": "4.62.1",- "@rollup/rollup-win32-x64-msvc": "4.62.1",- "@rollup/rollup-freebsd-x64": "4.62.1",- "@rollup/rollup-linux-x64-gnu": "4.62.1",- "@rollup/rollup-linux-x64-musl": "4.62.1",- "@rollup/rollup-openbsd-x64": "4.62.1",- "@rollup/rollup-openharmony-arm64": "4.62.1"+ "@rollup/rollup-darwin-arm64": "4.62.2",+ "@rollup/rollup-android-arm64": "4.62.2",+ "@rollup/rollup-win32-arm64-msvc": "4.62.2",+ "@rollup/rollup-freebsd-arm64": "4.62.2",+ "@rollup/rollup-linux-arm64-gnu": "4.62.2",+ "@rollup/rollup-linux-arm64-musl": "4.62.2",+ "@rollup/rollup-android-arm-eabi": "4.62.2",+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",+ "@rollup/rollup-linux-arm-musleabihf": "4.62.2",+ "@rollup/rollup-win32-ia32-msvc": "4.62.2",+ "@rollup/rollup-linux-loong64-gnu": "4.62.2",+ "@rollup/rollup-linux-loong64-musl": "4.62.2",+ "@rollup/rollup-linux-riscv64-gnu": "4.62.2",+ "@rollup/rollup-linux-riscv64-musl": "4.62.2",+ "@rollup/rollup-linux-ppc64-gnu": "4.62.2",+ "@rollup/rollup-linux-ppc64-musl": "4.62.2",+ "@rollup/rollup-linux-s390x-gnu": "4.62.2",+ "@rollup/rollup-darwin-x64": "4.62.2",+ "@rollup/rollup-win32-x64-gnu": "4.62.2",+ "@rollup/rollup-win32-x64-msvc": "4.62.2",+ "@rollup/rollup-freebsd-x64": "4.62.2",+ "@rollup/rollup-linux-x64-gnu": "4.62.2",+ "@rollup/rollup-linux-x64-musl": "4.62.2",+ "@rollup/rollup-openbsd-x64": "4.62.2",+ "@rollup/rollup-openharmony-arm64": "4.62.2" },
@types/jest npm BURST ×12
16.0.12
29.5.7
29.5.8
16.0.13
29.5.9
16.0.14
29.5.10
29.5.11
29.5.12
29.5.13
29.5.14
30.0.0
BURST
2 releases in 0m: 18.0.0, 16.0.6
info · registry-verified · 2017-01-30 · 9y ago
BURST
2 releases in 4m: 16.0.8, 21.1.10
info · registry-verified · 2017-12-28 · 8y ago
BURST
2 releases in 6m: 23.3.14, 24.0.0
info · registry-verified · 2019-02-05 · 7y ago
BURST
2 releases in 38m: 24.0.7, 24.0.8
info · registry-verified · 2019-02-25 · 7y ago
BURST
2 releases in 0m: 24.0.14, 16.0.9
info · registry-verified · 2019-06-13 · 7y ago
BURST
2 releases in 26m: 25.2.0, 25.2.1
info · registry-verified · 2020-04-03 · 6y ago
BURST
2 releases in 13m: 26.0.11, 26.0.12
info · registry-verified · 2020-08-31 · 5y ago
BURST
2 releases in 0m: 26.0.24, 16.0.10
info · registry-verified · 2021-07-06 · 5y ago
BURST
2 releases in 0m: 29.5.5, 16.0.11
info · registry-verified · 2023-09-15 · 2y ago
BURST
2 releases in 0m: 29.5.6, 16.0.12
info · registry-verified · 2023-10-18 · 2y ago
BURST
2 releases in 0m: 29.5.8, 16.0.13
info · registry-verified · 2023-11-07 · 2y ago
BURST
2 releases in 0m: 29.5.9, 16.0.14
info · registry-verified · 2023-11-21 · 2y ago
release diff 29.5.14 → 30.0.0
+0 added · -0 removed · ~3 modified
--- +++ @@ -115,2 +115,37 @@ /**+ * Advances all timers by `msToRun` milliseconds. All pending macro-tasks that have been+ * queued by `setTimeout()`, `setInterval()` and `setImmediate()`, and would be executed+ * within this time frame will be executed.+ */+ function advanceTimersByTime(msToRun: number): void;+ /**+ * Asynchronous equivalent of `jest.advanceTimersByTime()`. It also yields to the event loop,+ * allowing any scheduled promise callbacks to execute _before_ running the timers.+ *+ * @remarks+ * Not available when using legacy fake timers implementation.+ */+ function advanceTimersByTimeAsync(msToRun: number): Promise<void>;+ /**+ * Advances all timers by the needed milliseconds to execute callbacks currently scheduled with `requestAnimationFrame`.+ * `advanceTimersToNextFrame()` is a helpful way to execute code that is scheduled using `requestAnimationFrame`.+ *+ * @remarks+ * Not available when using legacy fake timers implementation.+ */+ function advanceTimersToNextFrame(): void;+ /**+ * Advances all timers by the needed milliseconds so that only the next timeouts/intervals will run.+ * Optionally, you can provide steps, so it will run steps amount of next timeouts/intervals.+ */+ function advanceTimersToNextTimer(step?: number): void;+ /**+ * Asynchronous equivalent of `jest.advanceTimersToNextTimer()`. It also yields to the event loop,+ * allowing any scheduled promise callbacks to execute _before_ running the timers.+ *+ * @remarks+ * Not available when using legacy fake timers implementation.+ */+ function advanceTimersToNextTimerAsync(steps?: number): Promise<void>;+ /** * Disables automatic mocking in the module loader.@@ -217,8 +252,2 @@ /**- * (renamed to `createMockFromModule` in Jest 26.0.0+)- * Use the automatic mocking system to generate a mocked version of the given module.- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- function genMockFromModule<T>(moduleName: string): T;- /** * Returns `true` if test environment has been torn down.@@ -253,2 +282,12 @@ /**+ * Registers a callback function that is invoked whenever a mock is generated for a module.+ * This callback is passed the module path and the newly created mock object, and must return+ * the (potentially modified) mock object.+ *+ * If multiple callbacks are registered, they will be called in the order they were added.+ * Each callback receives the result of the previous callback as the `moduleMock` parameter,+ * making it possible to apply sequential transformations.+ */+ function onGenerateMock<T>(cb: (modulePath: string, moduleMock: T) => T): typeof jest;+ /** * Returns the actual module instead of a mock, bypassing all checks on@@ -283,3 +322,6 @@ */- function retryTimes(numRetries: number, options?: { logErrorsBeforeRetry?: boolean }): typeof jest;+ function retryTimes(+ numRetries: number,+ options?: { logErrorsBeforeRetry?: boolean; waitBeforeRetry?: number; retryImmediately?: boolean },+ ): typeof jest; /**@@ -330,28 +372,7 @@ /**- * Advances all timers by `msToRun` milliseconds. All pending macro-tasks that have been- * queued by `setTimeout()`, `setInterval()` and `setImmediate()`, and would be executed- * within this time frame will be executed.- */- function advanceTimersByTime(msToRun: number): void;- /**- * Asynchronous equivalent of `jest.advanceTimersByTime()`. It also yields to the event loop,- * allowing any scheduled promise callbacks to execute _before_ running the timers.- *- * @remarks- * Not available when using legacy fake timers implementation.- */- function advanceTimersByTimeAsync(msToRun: number): Promise<void>;- /**- * Advances all timers by the needed milliseconds so that only the next timeouts/intervals will run.- * Optionally, you can provide steps, so it will run steps amount of next timeouts/intervals.- */- function advanceTimersToNextTimer(step?: number): void;- /**- * Asynchronous equivalent of `jest.advanceTimersToNextTimer()`. It also yields to the event loop,- * allowing any scheduled promise callbacks to execute _before_ running the timers.- *- * @remarks- * Not available when using legacy fake timers implementation.- */- function advanceTimersToNextTimerAsync(steps?: number): Promise<void>;+ * Indicates that the module system should never return a mocked version of+ * the specified module when it is being imported (e.g. that it should always+ * return the real module).+ */+ function unstable_unmockModule(moduleName: string): typeof jest; /**@@ -653,2 +674,8 @@ /**+ * Validate every element of an array against a condition or type It is the+ * inverse of `expect.arrayOf`.+ */+ // eslint-disable-next-line @definitelytyped/no-unnecessary-generics+ arrayOf<E = any>(arr: E): any;+ /** * `expect.not.objectContaining(object)` matches any received object@@ -691,3 +718,3 @@ /**- * Matches anything but null or undefined. You can use it inside `toEqual` or `toBeCalledWith` instead+ * Matches anything but null or undefined. You can use it inside `toEqual` or `toHaveBeenCalledWith` instead * of a literal value. For example, if you want to check that a mock function is called with a@@ -700,3 +727,3 @@ * [1].map(x => mock(x));- * expect(mock).toBeCalledWith(expect.anything());+ * expect(mock).toHaveBeenCalledWith(expect.anything()); * });@@ -706,3 +733,3 @@ * Matches anything that was created with the given constructor.- * You can use it inside `toEqual` or `toBeCalledWith` instead of a literal value.+ * You can use it inside `toEqual` or `toHaveBeenCalledWith` instead of a literal value. *@@ -717,3 +744,3 @@ * randocall(mock);- * expect(mock).toBeCalledWith(expect.any(Number));+ * expect(mock).toHaveBeenCalledWith(expect.any(Number)); * });@@ -723,3 +750,3 @@ * Matches any array made up entirely of elements in the provided array.- * You can use it inside `toEqual` or `toBeCalledWith` instead of a literal value.+ * You can use it inside `toEqual` or `toHaveBeenCalledWith` instead of a literal value. *@@ -729,2 +756,7 @@ arrayContaining<E = any>(arr: readonly E[]): any;+ /**+ * Validate every element of an array against a condition or type+ */+ // eslint-disable-next-line @definitelytyped/no-unnecessary-generics+ arrayOf<E = any>(arr: E): any; /**@@ -802,13 +834,4 @@ /**- * Ensures the last call to a mock function was provided specific args.- *- * Optionally, you can provide a type for the expected arguments via a generic.- * Note that the type must be either an array or a tuple.- *- * @deprecated in favor of `toHaveBeenLastCalledWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- lastCalledWith<E extends any[]>(...args: E): R;- /**- * Ensure that the last call to a mock function has returned a specified value.+ * Checks that a value is what you expect. It uses `Object.is` to check strict equality.+ * Don't use `toBe` with floating-point numbers. *@@ -816,33 +839,2 @@ * This is particularly useful for ensuring expected objects have the right structure.- *- * @deprecated in favor of `toHaveLastReturnedWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- lastReturnedWith<E = any>(expected?: E): R;- /**- * Ensure that a mock function is called with specific arguments on an Nth call.- *- * Optionally, you can provide a type for the expected arguments via a generic.- * Note that the type must be either an array or a tuple.- *- * @deprecated in favor of `toHaveBeenNthCalledWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- nthCalledWith<E extends any[]>(nthCall: number, ...params: E): R;- /**- * Ensure that the nth call to a mock function has returned a specified value.- *- * Optionally, you can provide a type for the expected value via a generic.- * This is particularly useful for ensuring expected objects have the right structure.- *- * @deprecated in favor of `toHaveNthReturnedWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- nthReturnedWith<E = any>(n: number, expected?: E): R;- /**- * Checks that a value is what you expect. It uses `Object.is` to check strict equality.- * Don't use `toBe` with floating-point numbers.- *- * Optionally, you can provide a type for the expected value via a generic.- * This is particularly useful for ensuring expected objects have the right structure. */@@ -850,24 +842,2 @@ toBe<E = any>(expected: E): R;- /**- * Ensures that a mock function is called.- *- * @deprecated in favor of `toHaveBeenCalled`- */- toBeCalled(): R;- /**- * Ensures that a mock function is called an exact number of times.- *- * @deprecated in favor of `toHaveBeenCalledTimes`- */- toBeCalledTimes(expected: number): R;- /**- * Ensure that a mock function is called with specific arguments.- *- * Optionally, you can provide a type for the expected arguments via a generic.- * Note that the type must be either an array or a tuple.- *- * @deprecated in favor of `toHaveBeenCalledWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- toBeCalledWith<E extends any[]>(...args: E): R; /**@@ -1101,15 +1071,3 @@ /**- * Ensure that a mock function has returned (as opposed to thrown) at least once.- *- * @deprecated in favor of `toHaveReturned`- */- toReturn(): R;- /**- * Ensure that a mock function has returned (as opposed to thrown) a specified number of times.- *- * @deprecated in favor of `toHaveReturnedTimes`- */- toReturnTimes(count: number): R;- /**- * Ensure that a mock function has returned a specified value at least once.+ * Use to test that objects have the same types as well as structure. *@@ -1117,12 +1075,2 @@ * This is particularly useful for ensuring expected objects have the right structure.- *- * @deprecated in favor of `toHaveReturnedWith`- */- // eslint-disable-next-line @definitelytyped/no-unnecessary-generics- toReturnWith<E = any>(value?: E): R;- /**- * Use to test that objects have the same types as well as structure.- *- * Optionally, you can provide a type for the expected value via a generic.- * This is particularly useful for ensuring expected objects have the right structure.
… 10 more lines (truncated)
--- +++ @@ -2,3 +2,3 @@ "name": "@types/jest",- "version": "29.5.14",+ "version": "30.0.0", "description": "TypeScript definitions for jest",@@ -131,7 +131,2 @@ "url": "https://github.com/domdomegg"- },- {- "name": "Tom Mrazauskas",- "githubUsername": "mrazauskas",- "url": "https://github.com/mrazauskas" }@@ -140,8 +135,2 @@ "types": "index.d.ts",- "exports": {- ".": {- "types": "./index.d.ts"- },- "./package.json": "./package.json"- }, "repository": {@@ -153,8 +142,8 @@ "dependencies": {- "expect": "^29.0.0",- "pretty-format": "^29.0.0"+ "expect": "^30.0.0",+ "pretty-format": "^30.0.0" }, "peerDependencies": {},- "typesPublisherContentHash": "03b921cd51b4ea0ab99ff3733f9e799bed833eccc13adaa2aaeb088345807f4d",- "typeScriptVersion": "4.8"+ "typesPublisherContentHash": "0fa4b32f7923c817b941e83858439e9ac13f522d9363e704f6140143388fc42e",+ "typeScriptVersion": "5.1" }
@types/node npm critical-tier BURST ×555
24.13.2
22.19.21
20.19.43
26.0.0
25.9.4
22.20.0
26.0.1
26.1.0
26.1.1
25.9.5
24.13.3
22.20.1
BURST
2 releases in 4m: 6.0.44, 6.0.45
info · registry-verified · 2016-10-06 · 9y ago
BURST
2 releases in 0m: 4.2.0, 0.12.0
info · registry-verified · 2017-01-10 · 9y ago
BURST
2 releases in 0m: 7.0.0, 6.0.60
info · registry-verified · 2017-01-11 · 9y ago
BURST
2 releases in 8m: 6.0.61, 7.0.2
info · registry-verified · 2017-01-23 · 9y ago
BURST
2 releases in 0m: 4.2.1, 6.0.62
info · registry-verified · 2017-01-25 · 9y ago
BURST
3 releases in 0m: 0.12.1, 4.2.3, 6.0.64
info · registry-verified · 2017-02-28 · 9y ago
BURST
2 releases in 6m: 6.0.65, 7.0.7
info · registry-verified · 2017-03-09 · 9y ago
BURST
5 releases in 47m: 4.2.4, 0.12.2, 6.0.66, 7.0.9, 7.0.10
info · registry-verified · 2017-03-22 · 9y ago
BURST
2 releases in 8m: 6.0.68, 7.0.12
info · registry-verified · 2017-03-27 · 9y ago
BURST
3 releases in 1m: 4.2.5, 0.12.3, 6.0.69
info · registry-verified · 2017-04-17 · 9y ago
BURST
4 releases in 3m: 0.12.4, 4.2.6, 6.0.70, 7.0.13
info · registry-verified · 2017-04-18 · 9y ago
BURST
3 releases in 41m: 4.2.7, 6.0.72, 7.0.16
info · registry-verified · 2017-05-03 · 9y ago
BURST
2 releases in 12m: 7.0.17, 7.0.18
info · registry-verified · 2017-05-05 · 9y ago
BURST
2 releases in 0m: 4.2.8, 6.0.73
info · registry-verified · 2017-05-05 · 9y ago
BURST
3 releases in 21m: 7.0.19, 7.0.20, 7.0.21
info · registry-verified · 2017-05-19 · 9y ago
BURST
2 releases in 23m: 6.0.74, 7.0.23
info · registry-verified · 2017-06-01 · 9y ago
BURST
2 releases in 0m: 7.0.24, 6.0.75
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 39m: 4.2.9, 6.0.76, 7.0.25, 7.0.26
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 2m: 0.12.5, 4.2.10, 6.0.77, 7.0.27
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 0m: 0.12.6, 7.0.28, 4.2.11, 6.0.78
info · registry-verified · 2017-06-06 · 9y ago
BURST
2 releases in 0m: 7.0.32, 8.0.0
info · registry-verified · 2017-06-19 · 9y ago
BURST
4 releases in 36m: 6.0.79, 7.0.33, 4.2.12, 8.0.6
info · registry-verified · 2017-06-29 · 9y ago
BURST
3 releases in 2m: 7.0.34, 8.0.10, 6.0.80
info · registry-verified · 2017-07-10 · 9y ago
BURST
3 releases in 1m: 4.2.13, 7.0.35, 8.0.11
info · registry-verified · 2017-07-12 · 9y ago
BURST
3 releases in 1m: 6.0.82, 7.0.36, 8.0.12
info · registry-verified · 2017-07-13 · 9y ago
BURST
4 releases in 1m: 6.0.83, 7.0.37, 8.0.13, 4.2.14
info · registry-verified · 2017-07-14 · 9y ago
BURST
5 releases in 1m: 4.2.15, 0.12.7, 6.0.84, 8.0.14, 7.0.38
info · registry-verified · 2017-07-17 · 8y ago
BURST
5 releases in 6m: 0.12.8, 4.2.16, 6.0.85, 7.0.39, 8.0.15
info · registry-verified · 2017-07-22 · 8y ago
BURST
7 releases in 51m: 4.2.17, 6.0.86, 7.0.40, 8.0.21, 4.2.18, 7.0.41, 8.0.22
info · registry-verified · 2017-08-14 · 8y ago
BURST
5 releases in 2m: 6.0.87, 0.12.9, 4.2.19, 8.0.23, 7.0.42
info · registry-verified · 2017-08-16 · 8y ago
BURST
5 releases in 2m: 6.0.88, 8.0.25, 0.12.10, 7.0.43, 4.2.20
info · registry-verified · 2017-08-24 · 8y ago
BURST
2 releases in 10m: 8.0.35, 8.0.36
info · registry-verified · 2017-10-16 · 8y ago
BURST
2 releases in 21m: 7.0.44, 8.0.37
info · registry-verified · 2017-10-16 · 8y ago
BURST
3 releases in 34m: 8.0.38, 8.0.39, 8.0.40
info · registry-verified · 2017-10-16 · 8y ago
BURST
3 releases in 60m: 8.0.42, 8.0.43, 8.0.44
info · registry-verified · 2017-10-17 · 8y ago
BURST
5 releases in 10m: 0.12.11, 6.0.90, 4.2.21, 8.0.45, 7.0.45
info · registry-verified · 2017-10-18 · 8y ago
BURST
4 releases in 28m: 6.0.91, 4.2.22, 8.0.52, 7.0.47
info · registry-verified · 2017-11-14 · 8y ago
BURST
2 releases in 11m: 7.0.48, 8.0.53
info · registry-verified · 2017-11-15 · 8y ago
BURST
2 releases in 1m: 4.0.31, 8.0.56
info · registry-verified · 2017-12-06 · 8y ago
BURST
4 releases in 2m: 6.0.93, 4.0.32, 7.0.49, 8.0.58
info · registry-verified · 2017-12-11 · 8y ago
BURST
5 releases in 36m: 0.12.12, 7.0.50, 8.5.1, 6.0.94, 4.0.33
info · registry-verified · 2017-12-13 · 8y ago
BURST
5 releases in 3m: 0.12.13, 8.5.2, 4.0.34, 7.0.51, 6.0.95
info · registry-verified · 2017-12-20 · 8y ago
BURST
2 releases in 36m: 8.5.3, 8.5.4
info · registry-verified · 2018-01-03 · 8y ago
BURST
2 releases in 30m: 7.0.52, 4.0.35
info · registry-verified · 2018-01-05 · 8y ago
BURST
2 releases in 0m: 8.5.6, 6.0.96
info · registry-verified · 2018-01-05 · 8y ago
BURST
2 releases in 45m: 8.5.8, 9.3.0
info · registry-verified · 2018-01-08 · 8y ago
BURST
4 releases in 3m: 6.0.97, 8.5.10, 9.4.1, 7.0.53
info · registry-verified · 2018-02-06 · 8y ago
BURST
3 releases in 30m: 8.9.0, 9.4.2, 6.0.98
info · registry-verified · 2018-02-07 · 8y ago
BURST
3 releases in 1m: 9.4.3, 6.0.99, 8.9.1
info · registry-verified · 2018-02-08 · 8y ago
BURST
2 releases in 4m: 7.0.54, 4.0.36
info · registry-verified · 2018-02-09 · 8y ago
BURST
3 releases in 0m: 9.4.4, 6.0.100, 8.9.2
info · registry-verified · 2018-02-09 · 8y ago
BURST
2 releases in 0m: 9.4.5, 8.9.3
info · registry-verified · 2018-02-10 · 8y ago
BURST
6 releases in 2m: 4.0.37, 7.0.55, 0.12.15, 8.9.4, 6.0.101, 9.4.6
info · registry-verified · 2018-02-13 · 8y ago
BURST
4 releases in 34m: 6.0.102, 7.0.56, 9.4.7, 8.9.5
info · registry-verified · 2018-03-08 · 8y ago
BURST
2 releases in 2m: 4.0.38, 8.10.0
info · registry-verified · 2018-03-22 · 8y ago
BURST
3 releases in 1m: 6.0.103, 7.0.57, 9.6.0
info · registry-verified · 2018-03-22 · 8y ago
BURST
3 releases in 45m: 7.0.58, 9.6.1, 8.10.1
info · registry-verified · 2018-03-28 · 8y ago
BURST
3 releases in 55m: 4.0.39, 6.0.104, 0.12.16
info · registry-verified · 2018-04-03 · 8y ago
BURST
3 releases in 22m: 7.0.59, 9.6.2, 8.10.2
info · registry-verified · 2018-04-03 · 8y ago
BURST
3 releases in 29m: 8.10.5, 8.10.6, 9.6.3
info · registry-verified · 2018-04-10 · 8y ago
BURST
5 releases in 34m: 7.0.61, 9.6.5, 8.10.8, 4.0.40, 6.0.106
info · registry-verified · 2018-04-13 · 8y ago
BURST
2 releases in 0m: 10.0.0, 9.6.7
info · registry-verified · 2018-04-26 · 8y ago
BURST
2 releases in 51m: 7.0.62, 6.0.107
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 25m: 4.0.41, 9.6.8
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 0m: 10.0.3, 9.6.9
info · registry-verified · 2018-05-02 · 8y ago
BURST
4 releases in 59m: 0.12.17, 7.0.63, 9.6.10, 4.0.42
info · registry-verified · 2018-05-03 · 8y ago
BURST
2 releases in 27m: 6.0.108, 8.10.12
info · registry-verified · 2018-05-03 · 8y ago
BURST
2 releases in 1m: 9.6.12, 10.0.4
info · registry-verified · 2018-05-04 · 8y ago
BURST
5 releases in 3m: 9.6.13, 6.0.109, 10.0.5, 8.10.13, 7.0.64
info · registry-verified · 2018-05-08 · 8y ago
BURST
2 releases in 3m: 9.6.14, 10.0.6
info · registry-verified · 2018-05-08 · 8y ago
BURST
3 releases in 1m: 9.6.15, 10.0.8, 8.10.14
info · registry-verified · 2018-05-10 · 8y ago
BURST
3 releases in 0m: 10.0.9, 9.6.16, 8.10.15
info · registry-verified · 2018-05-14 · 8y ago
BURST
3 releases in 2m: 8.10.16, 9.6.17, 10.1.1
info · registry-verified · 2018-05-17 · 8y ago
BURST
7 releases in 2m: 7.0.65, 0.12.18, 8.10.17, 6.0.111, 4.0.43, 9.6.18, 10.1.2
info · registry-verified · 2018-05-18 · 8y ago
BURST
2 releases in 2m: 9.6.19, 10.1.4
info · registry-verified · 2018-05-30 · 8y ago
BURST
4 releases in 2m: 6.0.112, 8.10.18, 9.6.20, 10.3.0
info · registry-verified · 2018-05-31 · 8y ago
BURST
3 releases in 56m: 8.10.19, 9.6.21, 10.3.2
info · registry-verified · 2018-06-07 · 8y ago
BURST
5 releases in 2m: 4.0.44, 6.0.113, 7.0.66, 8.10.20, 10.3.3
info · registry-verified · 2018-06-13 · 8y ago
BURST
7 releases in 5m: 0.12.19, 4.0.45, 6.0.114, 8.10.21, 7.0.67, 9.6.23, 10.5.2
info · registry-verified · 2018-07-06 · 8y ago
BURST
3 releases in 0m: 8.10.22, 9.6.24, 10.5.4
info · registry-verified · 2018-07-28 · 7y ago
BURST
5 releases in 2m: 6.0.115, 7.0.68, 8.10.23, 9.6.25, 10.5.5
info · registry-verified · 2018-08-01 · 7y ago
BURST
6 releases in 6m: 0.12.20, 4.0.46, 6.0.116, 7.0.69, 8.10.24, 10.5.7
info · registry-verified · 2018-08-06 · 7y ago
BURST
3 releases in 0m: 8.10.25, 9.6.27, 10.5.8
info · registry-verified · 2018-08-11 · 7y ago
BURST
3 releases in 1m: 8.10.26, 9.6.28, 10.7.1
info · registry-verified · 2018-08-15 · 7y ago
BURST
2 releases in 23m: 10.7.2, 10.9.0
info · registry-verified · 2018-08-23 · 7y ago
BURST
3 releases in 0m: 8.10.27, 9.6.29, 10.9.1
info · registry-verified · 2018-08-24 · 7y ago
BURST
3 releases in 0m: 8.10.28, 9.6.30, 10.9.2
info · registry-verified · 2018-08-25 · 7y ago
BURST
6 releases in 0m: 4.0.47, 6.0.117, 7.0.70, 8.10.29, 9.6.31, 10.9.4
info · registry-verified · 2018-08-30 · 7y ago
BURST
2 releases in 0m: 8.10.30, 10.10.2
info · registry-verified · 2018-09-21 · 7y ago
BURST
2 releases in 0m: 9.6.32, 10.10.3
info · registry-verified · 2018-09-22 · 7y ago
BURST
8 releases in 59m: 8.10.33, 9.6.33, 10.11.4, 4.0.48, 6.0.118, 7.0.71, 8.10.34, 9.6.34
info · registry-verified · 2018-10-03 · 7y ago
BURST
2 releases in 0m: 8.10.35, 10.11.5
info · registry-verified · 2018-10-08 · 7y ago
BURST
7 releases in 1m: 0.12.21, 4.9.0, 6.14.0, 7.10.0, 8.10.36, 9.6.35, 10.11.6
info · registry-verified · 2018-10-09 · 7y ago
BURST
7 releases in 1m: 0.12.22, 4.9.1, 6.14.1, 7.10.1, 8.10.37, 9.6.36, 10.12.2
info · registry-verified · 2018-11-01 · 7y ago
BURST
2 releases in 0m: 9.6.37, 10.12.6
info · registry-verified · 2018-11-12 · 7y ago
BURST
2 releases in 3m: 6.14.2, 7.10.2
info · registry-verified · 2018-11-15 · 7y ago
BURST
3 releases in 19m: 8.10.38, 9.6.38, 10.12.8
info · registry-verified · 2018-11-15 · 7y ago
BURST
2 releases in 31m: 9.6.39, 10.12.9
info · registry-verified · 2018-11-15 · 7y ago
BURST
2 releases in 17m: 9.6.40, 10.12.11
info · registry-verified · 2018-11-29 · 7y ago
BURST
4 releases in 35m: 10.12.16, 8.10.39, 9.6.41, 10.12.17
info · registry-verified · 2018-12-18 · 7y ago
BURST
6 releases in 5m: 10.12.24, 9.6.42, 8.10.40, 7.10.3, 6.14.3, 4.9.2
info · registry-verified · 2019-02-08 · 7y ago
BURST
2 releases in 1m: 11.9.0, 10.12.25
info · registry-verified · 2019-02-12 · 7y ago
BURST
2 releases in 1m: 11.9.3, 10.12.26
info · registry-verified · 2019-02-12 · 7y ago
BURST
2 releases in 1m: 11.9.5, 10.12.27
info · registry-verified · 2019-02-22 · 7y ago
BURST
15 releases in 40m: 11.10.1, 10.12.28, 9.6.43, 8.10.41, 7.10.4, 6.14.4, 4.9.3, 0.12.23, 11.10.2, 11.10.3, 11.10.4, 10.12.29, 9.6.44, 8.10.42, 7.10.5
info · registry-verified · 2019-03-02 · 7y ago
BURST
4 releases in 1m: 11.10.5, 10.12.30, 9.6.45, 8.10.43
info · registry-verified · 2019-03-06 · 7y ago
BURST
2 releases in 5m: 11.10.6, 11.11.0
info · registry-verified · 2019-03-08 · 7y ago
BURST
2 releases in 13m: 11.11.2, 10.14.0
info · registry-verified · 2019-03-12 · 7y ago
BURST
4 releases in 1m: 11.11.3, 10.14.1, 9.6.46, 8.10.44
info · registry-verified · 2019-03-12 · 7y ago
BURST
2 releases in 1m: 11.11.5, 10.14.2
info · registry-verified · 2019-03-21 · 7y ago
BURST
4 releases in 4m: 11.11.6, 10.14.3, 9.6.47, 8.10.45
info · registry-verified · 2019-03-22 · 7y ago
BURST
2 releases in 1m: 11.11.7, 10.14.4
info · registry-verified · 2019-03-25 · 7y ago
BURST
3 releases in 15m: 11.12.3, 11.12.4, 11.13.0
info · registry-verified · 2019-04-01 · 7y ago
BURST
2 releases in 19m: 11.13.3, 11.13.4
info · registry-verified · 2019-04-10 · 7y ago
BURST
4 releases in 4m: 11.13.6, 10.14.5, 8.10.46, 6.14.5
info · registry-verified · 2019-04-19 · 7y ago
BURST
3 releases in 1m: 11.13.8, 10.14.6, 8.10.47
info · registry-verified · 2019-04-26 · 7y ago
BURST
4 releases in 1m: 9.6.48, 8.10.48, 7.10.6, 6.14.6
info · registry-verified · 2019-04-29 · 7y ago
BURST
2 releases in 1m: 12.0.0, 11.13.10
info · registry-verified · 2019-05-03 · 7y ago
BURST
2 releases in 0m: 11.13.11, 10.14.7
info · registry-verified · 2019-05-17 · 7y ago
BURST
2 releases in 1m: 12.0.3, 11.13.12
info · registry-verified · 2019-05-28 · 7y ago
BURST
5 releases in 2m: 12.0.4, 11.13.13, 10.14.8, 9.6.49, 8.10.49
info · registry-verified · 2019-05-30 · 7y ago
BURST
3 releases in 1m: 12.0.8, 11.13.14, 10.14.9
info · registry-verified · 2019-06-11 · 7y ago
BURST
4 releases in 5m: 12.0.9, 12.0.10, 11.13.15, 10.14.10
info · registry-verified · 2019-06-21 · 7y ago
BURST
7 releases in 42m: 12.0.11, 11.13.16, 10.14.11, 8.10.50, 12.0.12, 11.13.17, 10.14.12
info · registry-verified · 2019-07-03 · 7y ago
BURST
8 releases in 38m: 12.6.7, 11.13.18, 10.14.13, 9.6.50, 8.10.51, 7.10.7, 6.14.7, 12.6.8
info · registry-verified · 2019-07-17 · 6y ago
BURST
3 releases in 9m: 12.7.1, 11.13.19, 10.14.15
info · registry-verified · 2019-08-07 · 6y ago
BURST
3 releases in 0m: 10.14.16, 9.6.51, 8.10.52
info · registry-verified · 2019-08-20 · 6y ago
BURST
4 releases in 1m: 12.7.3, 11.13.20, 10.14.17, 8.10.53
info · registry-verified · 2019-08-30 · 6y ago
BURST
4 releases in 1m: 12.7.5, 10.14.18, 9.6.52, 8.10.54
info · registry-verified · 2019-09-11 · 6y ago
BURST
3 releases in 1m: 12.7.6, 11.13.21, 10.14.19
info · registry-verified · 2019-09-24 · 6y ago
BURST
3 releases in 1m: 12.7.10, 11.13.22, 10.14.20
info · registry-verified · 2019-10-03 · 6y ago
BURST
2 releases in 1m: 12.7.12, 10.14.21
info · registry-verified · 2019-10-08 · 6y ago
BURST
3 releases in 1m: 12.11.1, 10.14.22, 8.10.55
info · registry-verified · 2019-10-15 · 6y ago
BURST
3 releases in 37m: 12.11.3, 12.11.4, 12.11.5
info · registry-verified · 2019-10-22 · 6y ago
BURST
2 releases in 1m: 12.11.6, 11.13.23
info · registry-verified · 2019-10-23 · 6y ago
BURST
9 releases in 7m: 12.11.7, 11.15.0, 10.17.0, 9.6.53, 8.10.56, 7.10.8, 6.14.8, 4.9.4, 0.12.24
info · registry-verified · 2019-10-24 · 6y ago
BURST
12 releases in 29m: 12.12.2, 11.15.1, 10.17.1, 9.6.54, 8.10.57, 7.10.9, 6.14.9, 12.12.3, 11.15.2, 10.17.2, 9.6.55, 8.10.58
info · registry-verified · 2019-10-30 · 6y ago
BURST
2 releases in 1m: 12.12.4, 10.17.3
info · registry-verified · 2019-11-01 · 6y ago
BURST
2 releases in 1m: 12.12.6, 10.17.4
info · registry-verified · 2019-11-05 · 6y ago
BURST
3 releases in 1m: 12.12.7, 10.17.5, 8.10.59
info · registry-verified · 2019-11-08 · 6y ago
BURST
2 releases in 33m: 12.12.10, 12.12.11
info · registry-verified · 2019-11-19 · 6y ago
BURST
4 releases in 53m: 12.12.13, 11.15.3, 10.17.6, 12.12.14
info · registry-verified · 2019-11-25 · 6y ago
BURST
2 releases in 1m: 12.12.15, 10.17.7
info · registry-verified · 2019-12-09 · 6y ago
BURST
2 releases in 1m: 12.12.16, 10.17.8
info · registry-verified · 2019-12-09 · 6y ago
BURST
2 releases in 1m: 12.12.17, 10.17.9
info · registry-verified · 2019-12-10 · 6y ago
BURST
2 releases in 1m: 12.12.19, 10.17.10
info · registry-verified · 2019-12-17 · 6y ago
BURST
2 releases in 1m: 12.12.20, 10.17.11
info · registry-verified · 2019-12-17 · 6y ago
BURST
3 releases in 5m: 13.1.0, 12.12.22, 10.17.12
info · registry-verified · 2019-12-23 · 6y ago
BURST
2 releases in 1m: 13.1.1, 10.17.13
info · registry-verified · 2019-12-26 · 6y ago
BURST
4 releases in 6m: 13.1.3, 13.1.4, 12.12.24, 11.15.4
info · registry-verified · 2020-01-03 · 6y ago
BURST
2 releases in 1m: 13.1.8, 12.12.25
info · registry-verified · 2020-01-17 · 6y ago
BURST
4 releases in 2m: 13.5.1, 12.12.26, 11.15.5, 10.17.14
info · registry-verified · 2020-01-28 · 6y ago
BURST
4 releases in 2m: 13.7.1, 12.12.27, 11.15.6, 10.17.15
info · registry-verified · 2020-02-11 · 6y ago
BURST
5 releases in 11m: 13.7.3, 13.7.4, 12.12.28, 11.15.7, 10.17.16
info · registry-verified · 2020-02-19 · 6y ago
BURST
3 releases in 1m: 13.7.7, 12.12.29, 10.17.17
info · registry-verified · 2020-02-28 · 6y ago
BURST
2 releases in 5m: 13.9.1, 12.12.30
info · registry-verified · 2020-03-13 · 6y ago
BURST
2 releases in 34m: 13.9.4, 12.12.31
info · registry-verified · 2020-03-25 · 6y ago
BURST
3 releases in 1m: 13.9.5, 12.12.32, 11.15.8
info · registry-verified · 2020-03-27 · 6y ago
BURST
3 releases in 1m: 13.9.6, 12.12.33, 11.15.9
info · registry-verified · 2020-03-30 · 6y ago
BURST
4 releases in 29m: 13.9.7, 12.12.34, 10.17.18, 13.9.8
info · registry-verified · 2020-03-30 · 6y ago
BURST
4 releases in 1m: 13.11.1, 12.12.35, 11.15.10, 10.17.19
info · registry-verified · 2020-04-08 · 6y ago
BURST
3 releases in 1m: 8.10.60, 7.10.10, 6.14.10
info · registry-verified · 2020-04-13 · 6y ago
BURST
4 releases in 2m: 13.13.0, 12.12.36, 11.15.11, 10.17.20
info · registry-verified · 2020-04-17 · 6y ago
BURST
4 releases in 2m: 13.13.2, 12.12.37, 11.15.12, 10.17.21
info · registry-verified · 2020-04-22 · 6y ago
BURST
2 releases in 1m: 13.13.5, 12.12.38
info · registry-verified · 2020-05-05 · 6y ago
BURST
4 releases in 39m: 14.0.0, 13.13.6, 14.0.1, 12.12.39
info · registry-verified · 2020-05-12 · 6y ago
BURST
10 releases in 48m: 14.0.2, 10.17.22, 14.0.3, 12.12.40, 11.15.13, 10.17.23, 9.6.56, 8.10.61, 7.10.11, 13.13.7
info · registry-verified · 2020-05-19 · 6y ago
BURST
5 releases in 2m: 14.0.4, 13.13.8, 12.12.41, 11.15.14, 10.17.24
info · registry-verified · 2020-05-19 · 6y ago
BURST
3 releases in 1m: 14.0.5, 13.13.9, 12.12.42
info · registry-verified · 2020-05-21 · 6y ago
BURST
4 releases in 57m: 14.0.7, 14.0.8, 12.12.43, 14.0.9
info · registry-verified · 2020-06-01 · 6y ago
BURST
3 releases in 1m: 14.0.11, 13.13.10, 12.12.44
info · registry-verified · 2020-06-04 · 6y ago
BURST
5 releases in 2m: 14.0.12, 13.13.11, 12.12.45, 11.15.15, 10.17.25
info · registry-verified · 2020-06-08 · 6y ago
BURST
5 releases in 2m: 14.0.13, 13.13.12, 12.12.47, 11.15.16, 10.17.26
info · registry-verified · 2020-06-09 · 6y ago
BURST
7 releases in 14m: 14.0.15, 14.0.16, 13.13.13, 14.0.17, 12.12.48, 11.15.17, 14.0.18
info · registry-verified · 2020-07-06 · 6y ago
BURST
5 releases in 2m: 14.0.21, 13.13.14, 12.12.49, 11.15.18, 10.17.27
info · registry-verified · 2020-07-10 · 6y ago
BURST
2 releases in 1m: 14.0.24, 12.12.51
info · registry-verified · 2020-07-20 · 5y ago
BURST
7 releases in 3m: 14.0.25, 13.13.15, 12.12.52, 11.15.19, 10.17.28, 9.6.57, 8.10.62
info · registry-verified · 2020-07-23 · 5y ago
BURST
2 releases in 0m: 12.12.53, 11.15.20
info · registry-verified · 2020-07-24 · 5y ago
BURST
9 releases in 4m: 14.6.3, 13.13.16, 12.12.55, 11.15.21, 10.17.29, 9.6.58, 8.10.63, 7.10.12, 6.14.11
info · registry-verified · 2020-09-02 · 5y ago
BURST
4 releases in 1m: 13.13.17, 12.12.56, 11.15.22, 10.17.30
info · registry-verified · 2020-09-08 · 5y ago
BURST
5 releases in 2m: 14.10.0, 13.13.18, 12.12.57, 11.15.23, 10.17.31
info · registry-verified · 2020-09-10 · 5y ago
BURST
5 releases in 2m: 14.10.1, 13.13.19, 12.12.58, 11.15.24, 10.17.32
info · registry-verified · 2020-09-11 · 5y ago
BURST
6 releases in 49m: 10.17.33, 14.10.2, 13.13.20, 12.12.59, 11.15.25, 10.17.34
info · registry-verified · 2020-09-15 · 5y ago
BURST
9 releases in 4m: 14.10.3, 13.13.21, 12.12.60, 11.15.26, 10.17.35, 9.6.59, 8.10.64, 7.10.13, 6.14.12
info · registry-verified · 2020-09-16 · 5y ago
BURST
2 releases in 0m: 12.12.61, 11.15.27
info · registry-verified · 2020-09-16 · 5y ago
BURST
3 releases in 35m: 14.11.0, 12.12.62, 14.11.1
info · registry-verified · 2020-09-17 · 5y ago
BURST
5 releases in 2m: 14.11.4, 13.13.22, 12.12.63, 11.15.28, 10.17.36
info · registry-verified · 2020-10-06 · 5y ago
BURST
5 releases in 2m: 14.11.5, 13.13.23, 12.12.64, 11.15.29, 10.17.37
info · registry-verified · 2020-10-06 · 5y ago
BURST
5 releases in 2m: 14.11.6, 13.13.24, 12.12.65, 11.15.30, 10.17.38
info · registry-verified · 2020-10-08 · 5y ago
BURST
2 releases in 1m: 14.11.7, 12.12.66
info · registry-verified · 2020-10-08 · 5y ago
BURST
5 releases in 2m: 14.11.8, 13.13.25, 12.12.67, 11.15.31, 10.17.39
info · registry-verified · 2020-10-09 · 5y ago
BURST
11 releases in 4m: 14.11.9, 13.13.26, 12.12.68, 11.15.32, 10.17.40, 9.6.60, 8.10.65, 7.10.14, 6.14.13, 4.9.5, 0.12.25
info · registry-verified · 2020-10-16 · 5y ago
BURST
3 releases in 1m: 14.14.0, 13.13.27, 12.12.69
info · registry-verified · 2020-10-20 · 5y ago
BURST
3 releases in 1m: 14.14.1, 12.12.70, 10.17.41
info · registry-verified · 2020-10-21 · 5y ago
BURST
5 releases in 2m: 14.14.2, 13.13.28, 12.19.0, 11.15.33, 10.17.42
info · registry-verified · 2020-10-21 · 5y ago
BURST
6 releases in 10m: 14.14.4, 14.14.5, 13.13.29, 12.19.2, 11.15.34, 10.17.43
info · registry-verified · 2020-10-26 · 5y ago
BURST
7 releases in 3m: 14.14.6, 13.13.30, 12.19.3, 11.15.35, 10.17.44, 9.6.61, 8.10.66
info · registry-verified · 2020-10-28 · 5y ago
BURST
2 releases in 1m: 14.14.7, 12.19.4
info · registry-verified · 2020-11-09 · 5y ago
BURST
5 releases in 2m: 14.14.8, 13.13.31, 12.19.5, 11.15.36, 10.17.45
info · registry-verified · 2020-11-17 · 5y ago
BURST
5 releases in 2m: 14.14.9, 13.13.32, 12.19.6, 11.15.37, 10.17.46
info · registry-verified · 2020-11-19 · 5y ago
BURST
5 releases in 2m: 14.14.10, 13.13.33, 12.19.7, 11.15.38, 10.17.47
info · registry-verified · 2020-11-25 · 5y ago
BURST
4 releases in 1m: 13.13.34, 12.19.8, 11.15.39, 10.17.48
info · registry-verified · 2020-11-30 · 5y ago
BURST
2 releases in 1m: 14.14.11, 13.13.35
info · registry-verified · 2020-12-08 · 5y ago
BURST
5 releases in 2m: 14.14.13, 13.13.36, 12.19.9, 11.15.40, 10.17.49
info · registry-verified · 2020-12-12 · 5y ago
BURST
9 releases in 13m: 14.14.15, 13.13.37, 12.19.10, 11.15.41, 14.14.16, 13.13.38, 12.19.11, 11.15.42, 10.17.50
info · registry-verified · 2020-12-23 · 5y ago
BURST
2 releases in 33m: 14.14.18, 14.14.19
info · registry-verified · 2021-01-01 · 5y ago
BURST
4 releases in 2m: 14.14.20, 13.13.39, 12.19.12, 11.15.43
info · registry-verified · 2021-01-04 · 5y ago
BURST
5 releases in 2m: 14.14.21, 13.13.40, 12.19.14, 11.15.44, 10.17.51
info · registry-verified · 2021-01-14 · 5y ago
BURST
3 releases in 50m: 14.14.23, 13.13.41, 14.14.24
info · registry-verified · 2021-02-03 · 5y ago
BURST
2 releases in 1m: 14.14.25, 12.19.16
info · registry-verified · 2021-02-04 · 5y ago
BURST
2 releases in 1m: 14.14.27, 12.20.0
info · registry-verified · 2021-02-12 · 5y ago
BURST
5 releases in 2m: 14.14.28, 13.13.42, 12.20.1, 11.15.45, 10.17.52
info · registry-verified · 2021-02-14 · 5y ago
BURST
5 releases in 2m: 14.14.29, 13.13.43, 12.20.2, 11.15.46, 10.17.53
info · registry-verified · 2021-02-18 · 5y ago
BURST
3 releases in 1m: 14.14.30, 13.13.44, 12.20.3
info · registry-verified · 2021-02-19 · 5y ago
BURST
5 releases in 2m: 14.14.31, 13.13.45, 12.20.4, 11.15.47, 10.17.54
info · registry-verified · 2021-02-19 · 5y ago
BURST
2 releases in 0m: 11.15.48, 10.17.55
info · registry-verified · 2021-03-07 · 5y ago
BURST
3 releases in 2m: 14.14.33, 13.13.46, 12.20.5
info · registry-verified · 2021-03-09 · 5y ago
BURST
4 releases in 2m: 14.14.35, 13.13.47, 12.20.6, 11.15.49
info · registry-verified · 2021-03-15 · 5y ago
BURST
5 releases in 2m: 14.14.37, 13.13.48, 12.20.7, 11.15.50, 10.17.56
info · registry-verified · 2021-03-27 · 5y ago
BURST
6 releases in 32m: 14.14.38, 14.14.39, 13.13.49, 12.20.8, 11.15.51, 10.17.57
info · registry-verified · 2021-04-14 · 5y ago
BURST
5 releases in 2m: 14.14.41, 13.13.50, 12.20.9, 11.15.52, 10.17.58
info · registry-verified · 2021-04-15 · 5y ago
BURST
2 releases in 1m: 15.0.0, 14.14.42
info · registry-verified · 2021-04-26 · 5y ago
BURST
6 releases in 2m: 15.0.1, 14.14.43, 13.13.51, 12.20.11, 11.15.53, 10.17.59
info · registry-verified · 2021-04-27 · 5y ago
BURST
3 releases in 1m: 15.0.2, 14.14.44, 12.20.12
info · registry-verified · 2021-05-04 · 5y ago
BURST
6 releases in 2m: 15.0.3, 14.14.45, 13.13.52, 12.20.13, 11.15.54, 10.17.60
info · registry-verified · 2021-05-12 · 5y ago
BURST
2 releases in 1m: 15.6.1, 14.17.1
info · registry-verified · 2021-05-25 · 5y ago
BURST
3 releases in 1m: 15.6.2, 14.17.2, 12.20.14
info · registry-verified · 2021-06-02 · 5y ago
BURST
3 releases in 1m: 15.12.2, 14.17.3, 12.20.15
info · registry-verified · 2021-06-07 · 5y ago
BURST
2 releases in 1m: 16.0.0, 15.14.1
info · registry-verified · 2021-07-03 · 5y ago
BURST
3 releases in 1m: 16.0.1, 14.17.5, 12.20.16
info · registry-verified · 2021-07-07 · 5y ago
BURST
2 releases in 1m: 16.3.1, 15.14.2
info · registry-verified · 2021-07-09 · 5y ago
BURST
4 releases in 1m: 16.4.2, 15.14.3, 14.17.6, 12.20.17
info · registry-verified · 2021-07-24 · 4y ago
BURST
2 releases in 1m: 16.4.6, 15.14.4
info · registry-verified · 2021-07-28 · 4y ago
BURST
4 releases in 1m: 16.4.10, 15.14.5, 14.17.7, 12.20.18
info · registry-verified · 2021-08-01 · 4y ago
BURST
3 releases in 1m: 16.4.11, 15.14.6, 14.17.8
info · registry-verified · 2021-08-04 · 4y ago
BURST
4 releases in 2m: 16.4.12, 15.14.7, 14.17.9, 12.20.19
info · registry-verified · 2021-08-04 · 4y ago
BURST
3 releases in 1m: 16.6.2, 15.14.8, 14.17.10
info · registry-verified · 2021-08-18 · 4y ago
BURST
4 releases in 1m: 16.7.1, 15.14.9, 14.17.11, 12.20.20
info · registry-verified · 2021-08-21 · 4y ago
BURST
3 releases in 1m: 16.7.2, 14.17.12, 12.20.21
info · registry-verified · 2021-08-26 · 4y ago
BURST
3 releases in 1m: 16.7.9, 14.17.13, 12.20.22
info · registry-verified · 2021-08-31 · 4y ago
BURST
3 releases in 1m: 16.7.10, 14.17.14, 12.20.23
info · registry-verified · 2021-08-31 · 4y ago
BURST
3 releases in 1m: 16.7.13, 14.17.15, 12.20.24
info · registry-verified · 2021-09-07 · 4y ago
BURST
2 releases in 0m: 14.17.16, 12.20.25
info · registry-verified · 2021-09-14 · 4y ago
BURST
2 releases in 1m: 16.9.2, 14.17.17
info · registry-verified · 2021-09-16 · 4y ago
BURST
4 releases in 29m: 16.9.5, 14.17.18, 12.20.26, 16.9.6
info · registry-verified · 2021-09-21 · 4y ago
BURST
3 releases in 1m: 16.10.1, 14.17.19, 12.20.27
info · registry-verified · 2021-09-25 · 4y ago
BURST
2 releases in 1m: 16.10.2, 14.17.20
info · registry-verified · 2021-09-29 · 4y ago
BURST
3 releases in 1m: 16.10.3, 14.17.21, 12.20.28
info · registry-verified · 2021-10-05 · 4y ago
BURST
3 releases in 1m: 16.10.4, 14.17.22, 12.20.29
info · registry-verified · 2021-10-12 · 4y ago
BURST
4 releases in 60m: 16.10.6, 14.17.23, 12.20.30, 16.10.7
info · registry-verified · 2021-10-13 · 4y ago
BURST
3 releases in 60m: 14.17.24, 12.20.31, 16.10.8
info · registry-verified · 2021-10-13 · 4y ago
BURST
2 releases in 0m: 14.17.25, 12.20.32
info · registry-verified · 2021-10-13 · 4y ago
BURST
3 releases in 1m: 16.10.9, 14.17.26, 12.20.33
info · registry-verified · 2021-10-13 · 4y ago
BURST
2 releases in 1m: 16.11.0, 14.17.27
info · registry-verified · 2021-10-14 · 4y ago
BURST
2 releases in 1m: 16.11.3, 14.17.28
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 16.11.4, 14.17.29, 12.20.34
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 16.11.5, 14.17.30, 12.20.35
info · registry-verified · 2021-10-25 · 4y ago
BURST
3 releases in 1m: 16.11.6, 14.17.32, 12.20.36
info · registry-verified · 2021-10-25 · 4y ago
BURST
3 releases in 1m: 16.11.7, 14.17.33, 12.20.37
info · registry-verified · 2021-11-08 · 4y ago
BURST
2 releases in 1m: 16.11.8, 14.17.34
info · registry-verified · 2021-11-18 · 4y ago
BURST
2 releases in 1m: 17.0.0, 16.11.14
info · registry-verified · 2021-12-15 · 4y ago
BURST
4 releases in 2m: 17.0.2, 16.11.15, 14.18.2, 12.20.38
info · registry-verified · 2021-12-20 · 4y ago
BURST
2 releases in 1m: 17.0.3, 16.11.16
info · registry-verified · 2021-12-23 · 4y ago
BURST
2 releases in 1m: 17.0.4, 16.11.17
info · registry-verified · 2021-12-23 · 4y ago
BURST
3 releases in 1m: 17.0.5, 14.18.3, 12.20.39
info · registry-verified · 2021-12-26 · 4y ago
BURST
3 releases in 1m: 17.0.6, 14.18.4, 12.20.40
info · registry-verified · 2022-01-01 · 4y ago
BURST
2 releases in 1m: 17.0.7, 16.11.18
info · registry-verified · 2022-01-03 · 4y ago
BURST
4 releases in 2m: 17.0.8, 16.11.19, 14.18.5, 12.20.41
info · registry-verified · 2022-01-04 · 4y ago
BURST
4 releases in 2m: 17.0.9, 16.11.20, 14.18.6, 12.20.42
info · registry-verified · 2022-01-17 · 4y ago
BURST
3 releases in 1m: 17.0.10, 16.11.21, 14.18.8
info · registry-verified · 2022-01-18 · 4y ago
BURST
4 releases in 1m: 17.0.14, 16.11.22, 14.18.10, 12.20.43
info · registry-verified · 2022-02-01 · 4y ago
BURST
4 releases in 2m: 17.0.17, 16.11.23, 14.18.11, 12.20.44
info · registry-verified · 2022-02-10 · 4y ago
BURST
4 releases in 2m: 17.0.18, 16.11.25, 14.18.12, 12.20.46
info · registry-verified · 2022-02-14 · 4y ago
BURST
4 releases in 1m: 17.0.24, 16.11.27, 14.18.13, 12.20.48
info · registry-verified · 2022-04-14 · 4y ago
BURST
4 releases in 1m: 17.0.26, 16.11.28, 14.18.14, 12.20.49
info · registry-verified · 2022-04-24 · 4y ago
BURST
3 releases in 1m: 17.0.27, 16.11.29, 14.18.15
info · registry-verified · 2022-04-25 · 4y ago
BURST
2 releases in 1m: 17.0.28, 16.11.30
info · registry-verified · 2022-04-26 · 4y ago
BURST
4 releases in 1m: 17.0.29, 16.11.31, 14.18.16, 12.20.50
info · registry-verified · 2022-04-26 · 4y ago
BURST
2 releases in 1m: 17.0.30, 16.11.32
info · registry-verified · 2022-04-28 · 4y ago
BURST
2 releases in 1m: 17.0.31, 16.11.33
info · registry-verified · 2022-05-01 · 4y ago
BURST
4 releases in 1m: 17.0.32, 16.11.34, 14.18.17, 12.20.51
info · registry-verified · 2022-05-10 · 4y ago
BURST
4 releases in 1m: 17.0.33, 16.11.35, 14.18.18, 12.20.52
info · registry-verified · 2022-05-12 · 4y ago
BURST
2 releases in 1m: 17.0.34, 16.11.36
info · registry-verified · 2022-05-16 · 4y ago
BURST
4 releases in 1m: 17.0.37, 16.11.37, 14.18.19, 12.20.53
info · registry-verified · 2022-05-31 · 4y ago
BURST
4 releases in 1m: 17.0.38, 16.11.38, 14.18.20, 12.20.54
info · registry-verified · 2022-05-31 · 4y ago
BURST
4 releases in 1m: 17.0.41, 16.11.39, 14.18.21, 12.20.55
info · registry-verified · 2022-06-07 · 4y ago
BURST
2 releases in 1m: 17.0.43, 16.11.40
info · registry-verified · 2022-06-14 · 4y ago
BURST
2 releases in 1m: 17.0.44, 16.11.41
info · registry-verified · 2022-06-15 · 4y ago
BURST
2 releases in 1m: 18.0.0, 17.0.45
info · registry-verified · 2022-06-15 · 4y ago
BURST
2 releases in 1m: 18.0.1, 16.11.43
info · registry-verified · 2022-07-03 · 4y ago
BURST
3 releases in 1m: 18.0.4, 16.11.44, 14.18.22
info · registry-verified · 2022-07-13 · 3y ago
BURST
2 releases in 1m: 18.0.5, 16.11.45
info · registry-verified · 2022-07-15 · 3y ago
BURST
2 releases in 1m: 18.6.2, 16.11.46
info · registry-verified · 2022-07-28 · 3y ago
BURST
3 releases in 1m: 18.6.3, 16.11.47, 14.18.23
info · registry-verified · 2022-07-30 · 3y ago
BURST
2 releases in 30m: 18.7.0, 18.7.1
info · registry-verified · 2022-08-10 · 3y ago
BURST
2 releases in 1m: 18.7.2, 16.11.48
info · registry-verified · 2022-08-12 · 3y ago
BURST
3 releases in 1m: 18.7.5, 16.11.49, 14.18.24
info · registry-verified · 2022-08-15 · 3y ago
BURST
2 releases in 1m: 18.7.7, 16.11.50
info · registry-verified · 2022-08-19 · 3y ago
BURST
2 releases in 1m: 18.7.8, 16.11.51
info · registry-verified · 2022-08-19 · 3y ago
BURST
3 releases in 1m: 18.7.9, 16.11.52, 14.18.25
info · registry-verified · 2022-08-21 · 3y ago
BURST
2 releases in 1m: 18.7.10, 16.11.53
info · registry-verified · 2022-08-22 · 3y ago
BURST
3 releases in 1m: 18.7.11, 16.11.54, 14.18.26
info · registry-verified · 2022-08-23 · 3y ago
BURST
2 releases in 1m: 18.7.12, 16.11.56
info · registry-verified · 2022-08-24 · 3y ago
BURST
3 releases in 1m: 18.7.15, 16.11.57, 14.18.27
info · registry-verified · 2022-09-05 · 3y ago
BURST
3 releases in 1m: 18.7.16, 16.11.58, 14.18.28
info · registry-verified · 2022-09-07 · 3y ago
BURST
3 releases in 1m: 18.7.18, 16.11.59, 14.18.29
info · registry-verified · 2022-09-13 · 3y ago
BURST
3 releases in 1m: 18.7.19, 16.11.60, 14.18.30
info · registry-verified · 2022-09-23 · 3y ago
BURST
2 releases in 1m: 18.7.22, 16.11.61
info · registry-verified · 2022-09-26 · 3y ago
BURST
3 releases in 1m: 18.7.23, 16.11.62, 14.18.31
info · registry-verified · 2022-09-26 · 3y ago
BURST
2 releases in 1m: 18.8.0, 16.11.63
info · registry-verified · 2022-10-02 · 3y ago
BURST
2 releases in 1m: 18.8.1, 16.11.64
info · registry-verified · 2022-10-03 · 3y ago
BURST
3 releases in 1m: 18.8.4, 16.11.65, 14.18.32
info · registry-verified · 2022-10-10 · 3y ago
BURST
3 releases in 60m: 18.11.1, 16.11.67, 18.11.2
info · registry-verified · 2022-10-18 · 3y ago
BURST
2 releases in 1m: 18.11.4, 16.18.0
info · registry-verified · 2022-10-23 · 3y ago
BURST
2 releases in 1m: 18.11.6, 16.18.1
info · registry-verified · 2022-10-26 · 3y ago
BURST
3 releases in 1m: 18.11.7, 16.18.2, 14.18.33
info · registry-verified · 2022-10-26 · 3y ago
BURST
2 releases in 1m: 18.11.8, 16.18.3
info · registry-verified · 2022-10-30 · 3y ago
BURST
3 releases in 1m: 18.11.10, 16.18.4, 14.18.34
info · registry-verified · 2022-11-30 · 3y ago
BURST
3 releases in 31m: 16.18.5, 18.11.11, 16.18.6
info · registry-verified · 2022-12-05 · 3y ago
BURST
2 releases in 1m: 18.11.12, 16.18.7
info · registry-verified · 2022-12-08 · 3y ago
BURST
2 releases in 1m: 18.11.13, 16.18.8
info · registry-verified · 2022-12-10 · 3y ago
BURST
2 releases in 1m: 18.11.15, 16.18.9
info · registry-verified · 2022-12-13 · 3y ago
BURST
3 releases in 2m: 18.11.16, 16.18.10, 14.18.35
info · registry-verified · 2022-12-16 · 3y ago
BURST
3 releases in 1m: 18.11.18, 16.18.11, 14.18.36
info · registry-verified · 2022-12-26 · 3y ago
BURST
2 releases in 1m: 18.11.19, 16.18.12
info · registry-verified · 2023-02-04 · 3y ago
BURST
2 releases in 1m: 18.14.2, 16.18.13
info · registry-verified · 2023-02-26 · 3y ago
BURST
3 releases in 1m: 18.14.3, 16.18.14, 14.18.37
info · registry-verified · 2023-03-02 · 3y ago
BURST
2 releases in 1m: 18.15.2, 16.18.15
info · registry-verified · 2023-03-13 · 3y ago
BURST
3 releases in 1m: 18.15.3, 16.18.16, 14.18.38
info · registry-verified · 2023-03-14 · 3y ago
BURST
6 releases in 31m: 18.15.4, 16.18.17, 14.18.39, 18.15.5, 16.18.18, 14.18.40
info · registry-verified · 2023-03-20 · 3y ago
BURST
2 releases in 1m: 18.15.6, 16.18.19
info · registry-verified · 2023-03-23 · 3y ago
BURST
2 releases in 1m: 18.15.8, 16.18.20
info · registry-verified · 2023-03-24 · 3y ago
BURST
3 releases in 1m: 18.15.10, 16.18.21, 14.18.41
info · registry-verified · 2023-03-25 · 3y ago
BURST
3 releases in 1m: 18.15.11, 16.18.22, 14.18.42
info · registry-verified · 2023-03-28 · 3y ago
BURST
2 releases in 1m: 18.15.12, 16.18.24
info · registry-verified · 2023-04-19 · 3y ago
BURST
3 releases in 1m: 18.16.1, 16.18.25, 14.18.43
info · registry-verified · 2023-04-25 · 3y ago
BURST
2 releases in 1m: 20.0.0, 18.16.4
info · registry-verified · 2023-05-05 · 3y ago
BURST
4 releases in 1m: 20.1.0, 18.16.5, 16.18.26, 14.18.45
info · registry-verified · 2023-05-05 · 3y ago
BURST
4 releases in 1m: 20.1.1, 18.16.6, 16.18.27, 14.18.46
info · registry-verified · 2023-05-08 · 3y ago
BURST
3 releases in 2m: 20.1.2, 18.16.7, 16.18.28
info · registry-verified · 2023-05-10 · 3y ago
BURST
3 releases in 1m: 20.1.3, 18.16.8, 16.18.29
info · registry-verified · 2023-05-11 · 3y ago
BURST
4 releases in 1m: 20.1.4, 18.16.9, 16.18.30, 14.18.47
info · registry-verified · 2023-05-13 · 3y ago
BURST
2 releases in 1m: 20.1.5, 18.16.10
info · registry-verified · 2023-05-16 · 3y ago
BURST
2 releases in 2m: 20.1.6, 18.16.11
info · registry-verified · 2023-05-16 · 3y ago
BURST
3 releases in 1m: 20.1.7, 18.16.12, 16.18.31
info · registry-verified · 2023-05-16 · 3y ago
BURST
2 releases in 2m: 20.2.1, 18.16.13
info · registry-verified · 2023-05-18 · 3y ago
BURST
3 releases in 1m: 20.2.2, 18.16.14, 16.18.32
info · registry-verified · 2023-05-21 · 3y ago
BURST
4 releases in 2m: 20.2.4, 18.16.15, 16.18.33, 14.18.48
info · registry-verified · 2023-05-25 · 3y ago
BURST
3 releases in 1m: 20.2.5, 18.16.16, 16.18.34
info · registry-verified · 2023-05-26 · 3y ago
BURST
4 releases in 1m: 20.2.6, 18.16.17, 16.18.35, 14.18.49
info · registry-verified · 2023-06-10 · 3y ago
BURST
4 releases in 2m: 20.3.1, 18.16.18, 16.18.36, 14.18.51
info · registry-verified · 2023-06-13 · 3y ago
BURST
2 releases in 0m: 16.18.37, 14.18.52
info · registry-verified · 2023-06-26 · 3y ago
BURST
4 releases in 1m: 20.3.3, 18.16.19, 16.18.38, 14.18.53
info · registry-verified · 2023-06-30 · 3y ago
BURST
4 releases in 1m: 20.4.3, 18.16.20, 16.18.39, 14.18.54
info · registry-verified · 2023-07-21 · 2y ago
BURST
2 releases in 1m: 20.4.4, 18.17.0
info · registry-verified · 2023-07-22 · 2y ago
BURST
2 releases in 2m: 20.4.5, 18.17.1
info · registry-verified · 2023-07-25 · 2y ago
BURST
2 releases in 2m: 20.4.7, 18.17.2
info · registry-verified · 2023-08-04 · 2y ago
BURST
2 releases in 1m: 20.4.8, 18.17.3
info · registry-verified · 2023-08-05 · 2y ago
BURST
3 releases in 1m: 20.4.9, 18.17.4, 16.18.40
info · registry-verified · 2023-08-08 · 2y ago
BURST
2 releases in 2m: 20.4.10, 18.17.5
info · registry-verified · 2023-08-11 · 2y ago
BURST
2 releases in 30m: 18.17.6, 20.5.1
info · registry-verified · 2023-08-18 · 2y ago
BURST
3 releases in 2m: 20.5.2, 18.17.7, 16.18.42
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 2m: 20.5.3, 18.17.8, 16.18.43, 14.18.55
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 6m: 20.5.4, 18.17.9, 16.18.44, 14.18.56
info · registry-verified · 2023-08-23 · 2y ago
BURST
6 releases in 31m: 20.5.5, 18.17.10, 16.18.45, 20.5.6, 18.17.11, 16.18.46
info · registry-verified · 2023-08-24 · 2y ago
BURST
2 releases in 1m: 20.5.7, 18.17.12
info · registry-verified · 2023-08-28 · 2y ago
BURST
4 releases in 1m: 20.5.8, 18.17.13, 16.18.47, 14.18.57
info · registry-verified · 2023-09-01 · 2y ago
BURST
4 releases in 2m: 20.5.9, 18.17.14, 16.18.48, 14.18.58
info · registry-verified · 2023-09-02 · 2y ago
BURST
2 releases in 0m: 16.18.49, 14.18.59
info · registry-verified · 2023-09-08 · 2y ago
BURST
3 releases in 1m: 20.6.0, 18.17.15, 16.18.50
info · registry-verified · 2023-09-08 · 2y ago
BURST
4 releases in 1m: 20.6.1, 18.17.16, 16.18.51, 14.18.60
info · registry-verified · 2023-09-15 · 2y ago
BURST
4 releases in 1m: 20.6.2, 18.17.17, 16.18.52, 14.18.61
info · registry-verified · 2023-09-16 · 2y ago
BURST
4 releases in 2m: 20.6.3, 18.17.18, 16.18.53, 14.18.62
info · registry-verified · 2023-09-20 · 2y ago
BURST
4 releases in 1m: 20.6.4, 18.17.19, 16.18.54, 14.18.63
info · registry-verified · 2023-09-23 · 2y ago
BURST
2 releases in 1m: 20.7.0, 18.18.0
info · registry-verified · 2023-09-25 · 2y ago
BURST
3 releases in 1m: 20.7.2, 18.18.1, 16.18.55
info · registry-verified · 2023-09-29 · 2y ago
BURST
3 releases in 2m: 20.8.1, 18.18.2, 16.18.56
info · registry-verified · 2023-10-02 · 2y ago
BURST
3 releases in 2m: 20.8.2, 18.18.3, 16.18.57
info · registry-verified · 2023-10-02 · 2y ago
BURST
3 releases in 1m: 20.8.3, 18.18.4, 16.18.58
info · registry-verified · 2023-10-06 · 2y ago
BURST
2 releases in 1m: 20.8.5, 18.18.5
info · registry-verified · 2023-10-12 · 2y ago
BURST
3 releases in 1m: 20.8.7, 18.18.6, 16.18.59
info · registry-verified · 2023-10-18 · 2y ago
BURST
2 releases in 2m: 20.8.9, 18.18.7
info · registry-verified · 2023-10-25 · 2y ago
BURST
3 releases in 1m: 20.8.10, 18.18.8, 16.18.60
info · registry-verified · 2023-10-31 · 2y ago
BURST
3 releases in 1m: 20.9.0, 18.18.9, 16.18.61
info · registry-verified · 2023-11-07 · 2y ago
BURST
3 releases in 1m: 20.9.2, 18.18.10, 16.18.62
info · registry-verified · 2023-11-18 · 2y ago
BURST
3 releases in 1m: 20.9.3, 18.18.11, 16.18.63
info · registry-verified · 2023-11-21 · 2y ago
BURST
3 releases in 1m: 20.9.4, 18.18.12, 16.18.64
info · registry-verified · 2023-11-22 · 2y ago
BURST
3 releases in 1m: 20.9.5, 18.18.13, 16.18.65
info · registry-verified · 2023-11-23 · 2y ago
BURST
3 releases in 1m: 20.10.1, 18.18.14, 16.18.66
info · registry-verified · 2023-11-29 · 2y ago
BURST
2 releases in 1m: 20.10.2, 18.19.1
info · registry-verified · 2023-12-01 · 2y ago
BURST
3 releases in 1m: 20.10.3, 18.19.2, 16.18.67
info · registry-verified · 2023-12-03 · 2y ago
BURST
3 releases in 2m: 20.10.4, 18.19.3, 16.18.68
info · registry-verified · 2023-12-07 · 2y ago
BURST
3 releases in 2m: 20.10.6, 18.19.4, 16.18.69
info · registry-verified · 2023-12-30 · 2y ago
BURST
3 releases in 1m: 20.10.7, 18.19.5, 16.18.70
info · registry-verified · 2024-01-07 · 2y ago
BURST
2 releases in 5m: 20.10.8, 18.19.6
info · registry-verified · 2024-01-09 · 2y ago
BURST
3 releases in 2m: 20.11.1, 18.19.7, 16.18.71
info · registry-verified · 2024-01-15 · 2y ago
BURST
2 releases in 1m: 20.11.5, 18.19.8
info · registry-verified · 2024-01-17 · 2y ago
BURST
3 releases in 1m: 20.11.6, 18.19.9, 16.18.75
info · registry-verified · 2024-01-24 · 2y ago
BURST
3 releases in 1m: 20.11.7, 18.19.10, 16.18.76
info · registry-verified · 2024-01-26 · 2y ago
BURST
3 releases in 1m: 20.11.12, 18.19.11, 16.18.77
info · registry-verified · 2024-01-30 · 2y ago
BURST
3 releases in 2m: 20.11.14, 18.19.12, 16.18.78
info · registry-verified · 2024-01-31 · 2y ago
BURST
2 releases in 1m: 20.11.15, 18.19.13
info · registry-verified · 2024-02-01 · 2y ago
BURST
3 releases in 1m: 20.11.16, 18.19.14, 16.18.79
info · registry-verified · 2024-02-01 · 2y ago
BURST
3 releases in 2m: 20.11.17, 18.19.15, 16.18.80
info · registry-verified · 2024-02-08 · 2y ago
BURST
3 releases in 2m: 20.11.18, 18.19.16, 16.18.81
info · registry-verified · 2024-02-15 · 2y ago
BURST
3 releases in 2m: 20.11.19, 18.19.17, 16.18.82
info · registry-verified · 2024-02-15 · 2y ago
BURST
3 releases in 2m: 20.11.20, 18.19.18, 16.18.83
info · registry-verified · 2024-02-22 · 2y ago
BURST
3 releases in 2m: 20.11.21, 18.19.19, 16.18.84
info · registry-verified · 2024-02-27 · 2y ago
BURST
3 releases in 2m: 20.11.22, 18.19.20, 16.18.85
info · registry-verified · 2024-02-28 · 2y ago
BURST
3 releases in 2m: 20.11.23, 18.19.21, 16.18.86
info · registry-verified · 2024-02-29 · 2y ago
BURST
3 releases in 2m: 20.11.25, 18.19.22, 16.18.87
info · registry-verified · 2024-03-06 · 2y ago
BURST
3 releases in 2m: 20.11.26, 18.19.23, 16.18.88
info · registry-verified · 2024-03-11 · 2y ago
BURST
3 releases in 2m: 20.11.27, 18.19.24, 16.18.89
info · registry-verified · 2024-03-13 · 2y ago
BURST
3 releases in 2m: 20.11.29, 18.19.25, 16.18.90
info · registry-verified · 2024-03-18 · 2y ago
BURST
3 releases in 2m: 20.11.30, 18.19.26, 16.18.91
info · registry-verified · 2024-03-19 · 2y ago
BURST
7 releases in 60m: 20.12.0, 18.19.27, 16.18.92, 20.12.1, 18.19.28, 16.18.93, 20.12.2
info · registry-verified · 2024-03-30 · 2y ago
BURST
3 releases in 2m: 20.12.3, 18.19.29, 16.18.94
info · registry-verified · 2024-04-02 · 2y ago
BURST
3 releases in 1m: 20.12.5, 18.19.30, 16.18.95
info · registry-verified · 2024-04-05 · 2y ago
BURST
3 releases in 2m: 20.12.6, 18.19.31, 16.18.96
info · registry-verified · 2024-04-09 · 2y ago
BURST
3 releases in 2m: 20.12.10, 18.19.32, 16.18.97
info · registry-verified · 2024-05-06 · 2y ago
BURST
2 releases in 2m: 20.12.11, 18.19.33
info · registry-verified · 2024-05-08 · 2y ago
BURST
2 releases in 36m: 20.12.14, 20.13.0
info · registry-verified · 2024-05-31 · 2y ago
BURST
3 releases in 2m: 20.14.1, 18.19.34, 16.18.98
info · registry-verified · 2024-06-03 · 2y ago
BURST
2 releases in 0m: 20.14.3, 18.19.35
info · registry-verified · 2024-06-17 · 2y ago
BURST
3 releases in 0m: 20.14.4, 18.19.36, 16.18.99
info · registry-verified · 2024-06-17 · 2y ago
BURST
3 releases in 1m: 20.14.6, 18.19.37, 16.18.100
info · registry-verified · 2024-06-19 · 2y ago
BURST
3 releases in 1m: 20.14.7, 18.19.38, 16.18.101
info · registry-verified · 2024-06-20 · 2y ago
BURST
2 releases in 0m: 20.14.8, 18.19.39
info · registry-verified · 2024-06-22 · 2y ago
BURST
3 releases in 1m: 20.14.11, 18.19.40, 16.18.102
info · registry-verified · 2024-07-16 · 1y ago
BURST
2 releases in 0m: 18.19.41, 16.18.103
info · registry-verified · 2024-07-18 · 1y ago
BURST
3 releases in 0m: 20.14.12, 18.19.42, 16.18.104
info · registry-verified · 2024-07-23 · 1y ago
BURST
2 releases in 0m: 22.0.0, 20.14.13
info · registry-verified · 2024-07-28 · 1y ago
BURST
3 releases in 0m: 22.0.3, 20.14.14, 18.19.43
info · registry-verified · 2024-08-02 · 1y ago
BURST
4 releases in 1m: 22.2.0, 20.14.15, 18.19.44, 16.18.105
info · registry-verified · 2024-08-09 · 1y ago
BURST
2 releases in 0m: 22.4.0, 20.15.0
info · registry-verified · 2024-08-16 · 1y ago
BURST
3 releases in 0m: 22.4.1, 20.16.1, 18.19.45
info · registry-verified · 2024-08-19 · 1y ago
BURST
2 releases in 0m: 18.19.46, 16.18.106
info · registry-verified · 2024-08-26 · 1y ago
BURST
3 releases in 0m: 22.5.1, 20.16.2, 18.19.47
info · registry-verified · 2024-08-28 · 1y ago
BURST
3 releases in 1m: 22.5.2, 20.16.3, 18.19.48
info · registry-verified · 2024-09-01 · 1y ago
BURST
4 releases in 1m: 22.5.3, 20.16.4, 18.19.49, 16.18.107
info · registry-verified · 2024-09-04 · 1y ago
BURST
4 releases in 1m: 22.5.4, 20.16.5, 18.19.50, 16.18.108
info · registry-verified · 2024-09-04 · 1y ago
BURST
2 releases in 0m: 22.6.1, 20.16.6
info · registry-verified · 2024-09-23 · 1y ago
BURST
5 releases in 26m: 22.6.2, 20.16.7, 18.19.51, 16.18.109, 22.7.0
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.1, 20.16.8, 18.19.52, 16.18.110
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.2, 20.16.9, 18.19.53, 16.18.111
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.4, 20.16.10, 18.19.54, 16.18.112
info · registry-verified · 2024-09-27 · 1y ago
BURST
4 releases in 1m: 22.7.5, 20.16.11, 18.19.55, 16.18.113
info · registry-verified · 2024-10-07 · 1y ago
BURST
4 releases in 1m: 22.7.6, 20.16.12, 18.19.56, 16.18.114
info · registry-verified · 2024-10-16 · 1y ago
BURST
3 releases in 1m: 22.7.7, 20.16.13, 18.19.57
info · registry-verified · 2024-10-19 · 1y ago
BURST
3 releases in 1m: 22.7.8, 20.16.14, 18.19.58
info · registry-verified · 2024-10-22 · 1y ago
BURST
4 releases in 1m: 22.7.9, 20.16.15, 18.19.59, 16.18.115
info · registry-verified · 2024-10-23 · 1y ago
BURST
2 releases in 0m: 22.8.0, 20.17.1
info · registry-verified · 2024-10-25 · 1y ago
BURST
3 releases in 1m: 22.8.2, 20.17.2, 18.19.60
info · registry-verified · 2024-10-28 · 1y ago
BURST
5 releases in 25m: 22.8.3, 22.8.4, 20.17.3, 18.19.61, 16.18.116
info · registry-verified · 2024-10-29 · 1y ago
BURST
4 releases in 1m: 22.8.5, 20.17.4, 18.19.62, 16.18.117
info · registry-verified · 2024-10-31 · 1y ago
BURST
4 releases in 1m: 22.8.6, 20.17.5, 18.19.63, 16.18.118
info · registry-verified · 2024-10-31 · 1y ago
BURST
4 releases in 1m: 22.8.7, 20.17.6, 18.19.64, 16.18.119
info · registry-verified · 2024-11-03 · 1y ago
BURST
3 releases in 1m: 22.9.3, 20.17.7, 18.19.65
info · registry-verified · 2024-11-23 · 1y ago
BURST
4 releases in 1m: 22.9.4, 20.17.8, 18.19.66, 16.18.120
info · registry-verified · 2024-11-25 · 1y ago
BURST
4 releases in 1m: 22.10.1, 20.17.9, 18.19.67, 16.18.121
info · registry-verified · 2024-11-28 · 1y ago
BURST
4 releases in 1m: 22.10.2, 20.17.10, 18.19.68, 16.18.122
info · registry-verified · 2024-12-11 · 1y ago
BURST
4 releases in 1m: 22.10.3, 20.17.11, 18.19.69, 16.18.123
info · registry-verified · 2025-01-01 · 1y ago
BURST
2 releases in 0m: 20.17.12, 18.19.70
info · registry-verified · 2025-01-06 · 1y ago
BURST
4 releases in 1m: 22.10.7, 20.17.14, 18.19.71, 16.18.124
info · registry-verified · 2025-01-16 · 1y ago
BURST
4 releases in 1m: 22.10.8, 20.17.15, 18.19.73, 16.18.125
info · registry-verified · 2025-01-23 · 1y ago
BURST
3 releases in 1m: 22.10.9, 20.17.16, 18.19.74
info · registry-verified · 2025-01-23 · 1y ago
BURST
4 releases in 1m: 22.13.1, 20.17.17, 18.19.75, 16.18.126
info · registry-verified · 2025-02-04 · 1y ago
BURST
2 releases in 0m: 22.13.2, 20.17.18
info · registry-verified · 2025-02-13 · 1y ago
BURST
4 releases in 33m: 22.13.3, 22.13.4, 20.17.19, 18.19.76
info · registry-verified · 2025-02-13 · 1y ago
BURST
4 releases in 60m: 22.13.6, 20.17.20, 18.19.77, 22.13.7
info · registry-verified · 2025-02-28 · 1y ago
BURST
2 releases in 0m: 20.17.21, 18.19.78
info · registry-verified · 2025-02-28 · 1y ago
BURST
2 releases in 0m: 22.13.8, 20.17.22
info · registry-verified · 2025-03-01 · 1y ago
BURST
3 releases in 1m: 22.13.9, 20.17.23, 18.19.79
info · registry-verified · 2025-03-03 · 1y ago
BURST
3 releases in 1m: 22.13.10, 20.17.24, 18.19.80
info · registry-verified · 2025-03-08 · 1y ago
BURST
3 releases in 1m: 22.13.11, 20.17.25, 18.19.81
info · registry-verified · 2025-03-21 · 1y ago
BURST
3 releases in 1m: 22.13.12, 20.17.26, 18.19.82
info · registry-verified · 2025-03-24 · 1y ago
BURST
3 releases in 1m: 22.13.13, 20.17.27, 18.19.83
info · registry-verified · 2025-03-24 · 1y ago
BURST
3 releases in 1m: 22.13.14, 20.17.28, 18.19.84
info · registry-verified · 2025-03-27 · 1y ago
BURST
3 releases in 1m: 22.13.15, 20.17.29, 18.19.85
info · registry-verified · 2025-04-01 · 1y ago
BURST
3 releases in 0m: 22.13.17, 20.17.30, 18.19.86
info · registry-verified · 2025-04-01 · 1y ago
BURST
3 releases in 0m: 22.15.2, 20.17.31, 18.19.87
info · registry-verified · 2025-04-25 · 1y ago
BURST
2 releases in 0m: 22.15.3, 20.17.32
info · registry-verified · 2025-04-28 · 1y ago
BURST
6 releases in 30m: 22.15.4, 20.17.33, 18.19.88, 22.15.5, 20.17.34, 18.19.89
info · registry-verified · 2025-05-05 · 1y ago
BURST
9 releases in 59m: 22.15.6, 20.17.35, 18.19.90, 22.15.7, 20.17.36, 18.19.91, 22.15.8, 20.17.37, 18.19.92
info · registry-verified · 2025-05-05 · 1y ago
BURST
3 releases in 1m: 22.15.9, 20.17.38, 18.19.93
info · registry-verified · 2025-05-05 · 1y ago
BURST
6 releases in 45m: 22.15.10, 20.17.39, 18.19.94, 22.15.11, 20.17.40, 18.19.95
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 0m: 22.15.12, 20.17.41, 18.19.96
info · registry-verified · 2025-05-06 · 1y ago
BURST
2 releases in 0m: 22.15.13, 20.17.42
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 1m: 22.15.14, 20.17.43, 18.19.97
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 1m: 22.15.15, 20.17.44, 18.19.98
info · registry-verified · 2025-05-07 · 1y ago
BURST
3 releases in 0m: 22.15.16, 20.17.45, 18.19.99
info · registry-verified · 2025-05-08 · 1y ago
BURST
3 releases in 0m: 22.15.17, 20.17.46, 18.19.100
info · registry-verified · 2025-05-08 · 1y ago
BURST
2 releases in 0m: 22.15.18, 20.17.47
info · registry-verified · 2025-05-14 · 1y ago
BURST
3 releases in 0m: 22.15.19, 20.17.48, 18.19.101
info · registry-verified · 2025-05-19 · 1y ago
BURST
3 releases in 0m: 22.15.20, 20.17.49, 18.19.102
info · registry-verified · 2025-05-20 · 1y ago
BURST
3 releases in 0m: 22.15.21, 20.17.50, 18.19.103
info · registry-verified · 2025-05-20 · 1y ago
BURST
3 releases in 0m: 22.15.22, 20.17.51, 18.19.104
info · registry-verified · 2025-05-27 · 1y ago
BURST
3 releases in 1m: 22.15.24, 20.17.52, 18.19.105
info · registry-verified · 2025-05-28 · 1y ago
BURST
6 releases in 26m: 22.15.25, 20.17.53, 18.19.106, 22.15.26, 20.17.54, 18.19.107
info · registry-verified · 2025-05-29 · 1y ago
BURST
3 releases in 0m: 22.15.27, 20.17.55, 18.19.108
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 0m: 22.15.28, 20.17.56, 18.19.109
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 0m: 22.15.29, 20.17.57, 18.19.110
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 1m: 22.15.30, 20.17.58, 18.19.111
info · registry-verified · 2025-06-05 · 1y ago
BURST
2 releases in 0m: 24.0.0, 22.15.31
info · registry-verified · 2025-06-10 · 1y ago
BURST
2 releases in 0m: 24.0.2, 22.15.32
info · registry-verified · 2025-06-16 · 1y ago
BURST
3 releases in 1m: 24.0.3, 20.19.1, 18.19.112
info · registry-verified · 2025-06-16 · 1y ago
BURST
2 releases in 0m: 24.0.4, 22.15.33
info · registry-verified · 2025-06-24 · 1y ago
BURST
4 releases in 0m: 24.0.7, 22.15.34, 20.19.2, 18.19.113
info · registry-verified · 2025-06-28 · 1y ago
BURST
4 releases in 1m: 24.0.9, 22.15.35, 20.19.3, 18.19.114
info · registry-verified · 2025-07-01 · 1y ago
BURST
4 releases in 0m: 24.0.10, 22.16.0, 20.19.4, 18.19.115
info · registry-verified · 2025-07-01 · 1y ago
BURST
4 releases in 0m: 24.0.11, 22.16.1, 20.19.5, 18.19.116
info · registry-verified · 2025-07-08 · 1y ago
BURST
4 releases in 1m: 24.0.12, 22.16.2, 20.19.6, 18.19.117
info · registry-verified · 2025-07-09 · 1y ago
BURST
4 releases in 0m: 24.0.13, 22.16.3, 20.19.7, 18.19.118
info · registry-verified · 2025-07-10 · 1y ago
BURST
4 releases in 0m: 24.0.14, 22.16.4, 20.19.8, 18.19.119
info · registry-verified · 2025-07-15 · 12mo ago
BURST
4 releases in 0m: 24.0.15, 22.16.5, 20.19.9, 18.19.120
info · registry-verified · 2025-07-19 · 11mo ago
BURST
4 releases in 1m: 24.2.1, 22.17.1, 20.19.10, 18.19.122
info · registry-verified · 2025-08-08 · 11mo ago
BURST
4 releases in 0m: 24.3.0, 22.17.2, 20.19.11, 18.19.123
info · registry-verified · 2025-08-15 · 11mo ago
BURST
4 releases in 0m: 24.3.1, 22.18.1, 20.19.13, 18.19.124
info · registry-verified · 2025-09-04 · 10mo ago
BURST
2 releases in 0m: 24.3.2, 22.18.2
info · registry-verified · 2025-09-12 · 10mo ago
BURST
3 releases in 0m: 24.3.3, 22.18.3, 20.19.14
info · registry-verified · 2025-09-13 · 10mo ago
BURST
4 releases in 1m: 24.5.0, 22.18.4, 20.19.15, 18.19.125
info · registry-verified · 2025-09-15 · 10mo ago
BURST
4 releases in 0m: 24.5.1, 22.18.5, 20.19.16, 18.19.126
info · registry-verified · 2025-09-16 · 9mo ago
BURST
4 releases in 0m: 24.5.2, 22.18.6, 20.19.17, 18.19.127
info · registry-verified · 2025-09-18 · 9mo ago
BURST
4 releases in 0m: 24.6.0, 22.18.7, 20.19.18, 18.19.128
info · registry-verified · 2025-09-29 · 9mo ago
BURST
4 releases in 0m: 24.6.1, 22.18.8, 20.19.19, 18.19.129
info · registry-verified · 2025-09-30 · 9mo ago
BURST
4 releases in 0m: 24.7.1, 22.18.9, 20.19.20, 18.19.130
info · registry-verified · 2025-10-09 · 9mo ago
BURST
3 releases in 0m: 24.7.2, 22.18.10, 20.19.21
info · registry-verified · 2025-10-11 · 9mo ago
BURST
3 releases in 0m: 24.8.1, 22.18.11, 20.19.22
info · registry-verified · 2025-10-17 · 8mo ago
BURST
3 releases in 0m: 24.9.1, 22.18.12, 20.19.23
info · registry-verified · 2025-10-21 · 8mo ago
BURST
3 releases in 0m: 24.9.2, 22.18.13, 20.19.24
info · registry-verified · 2025-10-28 · 8mo ago
BURST
2 releases in 0m: 24.10.0, 22.19.0
info · registry-verified · 2025-11-03 · 8mo ago
BURST
3 releases in 0m: 24.10.1, 22.19.1, 20.19.25
info · registry-verified · 2025-11-11 · 8mo ago
BURST
3 releases in 0m: 24.10.2, 22.19.2, 20.19.26
info · registry-verified · 2025-12-08 · 7mo ago
BURST
2 releases in 0m: 25.0.0, 24.10.3
info · registry-verified · 2025-12-10 · 7mo ago
BURST
4 releases in 0m: 25.0.2, 24.10.4, 22.19.3, 20.19.27
info · registry-verified · 2025-12-14 · 7mo ago
BURST
7 releases in 43m: 25.0.4, 24.10.5, 22.19.4, 20.19.28, 25.0.5, 24.10.6, 22.19.5
info · registry-verified · 2026-01-10 · 6mo ago
BURST
2 releases in 0m: 25.0.6, 24.10.7
info · registry-verified · 2026-01-10 · 6mo ago
BURST
4 releases in 1m: 25.0.8, 24.10.8, 22.19.6, 20.19.29
info · registry-verified · 2026-01-13 · 6mo ago
BURST
4 releases in 33m: 25.0.9, 24.10.9, 22.19.7, 20.19.30
info · registry-verified · 2026-01-15 · 5mo ago
BURST
3 releases in 0m: 24.10.10, 22.19.8, 20.19.31
info · registry-verified · 2026-02-03 · 5mo ago
BURST
4 releases in 0m: 25.2.1, 24.10.11, 22.19.9, 20.19.32
info · registry-verified · 2026-02-05 · 5mo ago
BURST
4 releases in 1m: 25.2.2, 24.10.12, 22.19.10, 20.19.33
info · registry-verified · 2026-02-08 · 5mo ago
BURST
3 releases in 0m: 25.2.3, 24.10.13, 22.19.11
info · registry-verified · 2026-02-10 · 5mo ago
BURST
4 releases in 1m: 25.3.1, 24.10.14, 22.19.12, 20.19.34
info · registry-verified · 2026-02-26 · 4mo ago
BURST
4 releases in 1m: 25.3.2, 24.10.15, 22.19.13, 20.19.35
info · registry-verified · 2026-02-26 · 4mo ago
BURST
4 releases in 1m: 25.3.4, 24.11.1, 22.19.14, 20.19.36
info · registry-verified · 2026-03-05 · 4mo ago
BURST
4 releases in 1m: 25.3.5, 24.11.2, 22.19.15, 20.19.37
info · registry-verified · 2026-03-06 · 4mo ago
BURST
4 releases in 0m: 25.5.1, 24.12.1, 22.19.16, 20.19.38
info · registry-verified · 2026-04-03 · 3mo ago
BURST
4 releases in 0m: 25.5.2, 24.12.2, 22.19.17, 20.19.39
info · registry-verified · 2026-04-03 · 3mo ago
BURST
4 releases in 0m: 25.6.2, 24.12.3, 22.19.18, 20.19.40
info · registry-verified · 2026-05-07 · 2mo ago
BURST
3 releases in 0m: 24.12.4, 22.19.19, 20.19.41
info · registry-verified · 2026-05-11 · 2mo ago
BURST
4 releases in 0m: 25.9.2, 24.13.1, 22.19.20, 20.19.42 · ACTIVE
info · registry-verified · 2026-06-05 · 1mo ago
BURST
4 releases in 0m: 25.9.3, 24.13.2, 22.19.21, 20.19.43 · ACTIVE
info · registry-verified · 2026-06-10 · 1mo ago
BURST
2 releases in 0m: 26.0.0, 25.9.4 · ACTIVE
info · registry-verified · 2026-06-19 · 23d ago
BURST
4 releases in 0m: 26.1.1, 25.9.5, 24.13.3, 22.20.1 · ACTIVE
info · registry-verified · 2026-07-08 · 4d ago
release diff 24.13.3 → 22.20.1
+3 added · -4 removed · ~59 modified
+36 more files not shown
--- +++ @@ -7,3 +7,2 @@ * import { spawn } from 'node:child_process';- * import { once } from 'node:events'; * const ls = spawn('ls', ['-lh', '/usr']);@@ -18,4 +17,5 @@ *- * const [code] = await once(ls, 'close');- * console.log(`child process exited with code ${code}`);+ * ls.on('close', (code) => {+ * console.log(`child process exited with code ${code}`);+ * }); * ```@@ -65,3 +65,3 @@ * stalling the event loop while spawned processes complete.- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/child_process.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/child_process.js) */@@ -460,3 +460,3 @@ * @since v0.5.9- * @param sendHandle `undefined`, or a [`net.Socket`](https://nodejs.org/docs/latest-v24.x/api/net.html#class-netsocket), [`net.Server`](https://nodejs.org/docs/latest-v24.x/api/net.html#class-netserver), or [`dgram.Socket`](https://nodejs.org/docs/latest-v24.x/api/dgram.html#class-dgramsocket) object.+ * @param sendHandle `undefined`, or a [`net.Socket`](https://nodejs.org/docs/latest-v22.x/api/net.html#class-netsocket), [`net.Server`](https://nodejs.org/docs/latest-v22.x/api/net.html#class-netserver), or [`dgram.Socket`](https://nodejs.org/docs/latest-v22.x/api/dgram.html#class-dgramsocket) object. * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties:@@ -721,3 +721,2 @@ * import { spawn } from 'node:child_process';- * import { once } from 'node:events'; * const ls = spawn('ls', ['-lh', '/usr']);@@ -732,4 +731,5 @@ *- * const [code] = await once(ls, 'close');- * console.log(`child process exited with code ${code}`);+ * ls.on('close', (code) => {+ * console.log(`child process exited with code ${code}`);+ * }); * ```
--- +++ @@ -3,3 +3,3 @@ * that can distribute workloads among their application threads. When process isolation- * is not needed, use the [`worker_threads`](https://nodejs.org/docs/latest-v24.x/api/worker_threads.html)+ * is not needed, use the [`worker_threads`](https://nodejs.org/docs/latest-v22.x/api/worker_threads.html) * module instead, which allows running multiple application threads within a single Node.js instance.@@ -52,3 +52,3 @@ * On Windows, it is not yet possible to set up a named pipe server in a worker.- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/cluster.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/cluster.js) */@@ -82,4 +82,4 @@ * Configures the stdio of forked processes. Because the cluster module relies on IPC to function, this configuration must- * contain an `'ipc'` entry. When this option is provided, it overrides `silent`. See [`child_prcess.spawn()`](https://nodejs.org/docs/latest-v24.x/api/child_process.html#child_processspawncommand-args-options)'s- * [`stdio`](https://nodejs.org/docs/latest-v24.x/api/child_process.html#optionsstdio).+ * contain an `'ipc'` entry. When this option is provided, it overrides `silent`. See [`child_prcess.spawn()`](https://nodejs.org/docs/latest-v22.x/api/child_process.html#child_processspawncommand-args-options)'s+ * [`stdio`](https://nodejs.org/docs/latest-v22.x/api/child_process.html#optionsstdio). */@@ -101,3 +101,3 @@ * Specify the kind of serialization used for sending messages between processes. Possible values are `'json'` and `'advanced'`.- * See [Advanced serialization for `child_process`](https://nodejs.org/docs/latest-v24.x/api/child_process.html#advanced-serialization) for more details.+ * See [Advanced serialization for `child_process`](https://nodejs.org/docs/latest-v22.x/api/child_process.html#advanced-serialization) for more details. * @default false@@ -144,6 +144,6 @@ /**- * All workers are created using [`child_process.fork()`](https://nodejs.org/docs/latest-v24.x/api/child_process.html#child_processforkmodulepath-args-options), the returned object+ * All workers are created using [`child_process.fork()`](https://nodejs.org/docs/latest-v22.x/api/child_process.html#child_processforkmodulepath-args-options), the returned object * from this function is stored as `.process`. In a worker, the global `process` is stored. *- * See: [Child Process module](https://nodejs.org/docs/latest-v24.x/api/child_process.html#child_processforkmodulepath-args-options).+ * See: [Child Process module](https://nodejs.org/docs/latest-v22.x/api/child_process.html#child_processforkmodulepath-args-options). *@@ -158,3 +158,3 @@ *- * In the primary, this sends a message to a specific worker. It is identical to [`ChildProcess.send()`](https://nodejs.org/docs/latest-v24.x/api/child_process.html#subprocesssendmessage-sendhandle-options-callback).+ * In the primary, this sends a message to a specific worker. It is identical to [`ChildProcess.send()`](https://nodejs.org/docs/latest-v22.x/api/child_process.html#subprocesssendmessage-sendhandle-options-callback). *@@ -200,3 +200,3 @@ * In a worker, `process.kill()` exists, but it is not this function;- * it is [`kill()`](https://nodejs.org/docs/latest-v24.x/api/process.html#processkillpid-signal).+ * it is [`kill()`](https://nodejs.org/docs/latest-v22.x/api/process.html#processkillpid-signal). * @since v0.9.12@@ -414,3 +414,3 @@ * The scheduling policy, either `cluster.SCHED_RR` for round-robin or `cluster.SCHED_NONE` to leave it to the operating system. This is a- * global setting and effectively frozen once either the first worker is spawned, or [`.setupPrimary()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clustersetupprimarysettings)+ * global setting and effectively frozen once either the first worker is spawned, or [`.setupPrimary()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clustersetupprimarysettings) * is called, whichever comes first.@@ -425,4 +425,4 @@ /**- * After calling [`.setupPrimary()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clustersetupprimarysettings)- * (or [`.fork()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clusterforkenv)) this settings object will contain+ * After calling [`.setupPrimary()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clustersetupprimarysettings)+ * (or [`.fork()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clusterforkenv)) this settings object will contain * the settings, including the default values.@@ -433,3 +433,3 @@ readonly settings: ClusterSettings;- /** @deprecated since v16.0.0 - use [`.setupPrimary()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clustersetupprimarysettings) instead. */+ /** @deprecated since v16.0.0 - use [`.setupPrimary()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clustersetupprimarysettings) instead. */ setupMaster(settings?: ClusterSettings): void;@@ -438,3 +438,3 @@ *- * Any settings changes only affect future calls to [`.fork()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clusterforkenv)+ * Any settings changes only affect future calls to [`.fork()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clusterforkenv) * and have no effect on workers that are already running.@@ -442,3 +442,3 @@ * The only attribute of a worker that cannot be set via `.setupPrimary()` is the `env` passed to- * [`.fork()`](https://nodejs.org/docs/latest-v24.x/api/cluster.html#clusterforkenv).+ * [`.fork()`](https://nodejs.org/docs/latest-v22.x/api/cluster.html#clusterforkenv). *
--- +++ @@ -39,3 +39,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/http.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/http.js) */@@ -274,3 +274,3 @@ * `server.keepAliveTimeout` to extend the internal socket timeout.- * @since 24.6.0+ * @since 22.19.0 * @default 1000@@ -343,13 +343,2 @@ /**- * A callback which receives an- * incoming request and returns a boolean, to control which upgrade attempts- * should be accepted. Accepted upgrades will fire an `'upgrade'` event (or- * their sockets will be destroyed, if no listener is registered) while- * rejected upgrades will fire a `'request'` event like any non-upgrade- * request.- * @since v24.9.0- * @default () => server.listenerCount('upgrade') > 0- */- shouldUpgradeCallback?: ((request: InstanceType<Request>) => boolean) | undefined;- /** * If set to `true`, an error is thrown when writing to an HTTP response which does not have a body.@@ -359,10 +348,2 @@ rejectNonStandardBodyWrites?: boolean | undefined;- /**- * If set to `true`, requests without `Content-Length` or `Transfer-Encoding` headers (indicating no body)- * will be initialized with an already-ended body stream, so they will never emit any stream events- * (like `'data'` or `'end'`). You can use `req.readableEnded` to detect this case.- * @default false- * @since v24.12.0- */- optimizeEmptyRequests?: boolean | undefined; }@@ -468,3 +449,3 @@ * This option applies only to new incoming connections.- * @since v24.6.0+ * @since v22.19.0 * @default 1000@@ -949,3 +930,3 @@ * Attempting to set a header field name or value that contains invalid characters- * will result in a `Error` being thrown.+ * will result in a [`TypeError`](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-typeerror) being thrown. * @since v0.1.30@@ -1030,3 +1011,2 @@ * import http from 'node:http';- * const agent = new http.Agent({ keepAlive: true }); *@@ -1484,10 +1464,2 @@ }- interface ProxyEnv extends NodeJS.ProcessEnv {- HTTP_PROXY?: string | undefined;- HTTPS_PROXY?: string | undefined;- NO_PROXY?: string | undefined;- http_proxy?: string | undefined;- https_proxy?: string | undefined;- no_proxy?: string | undefined;- } interface AgentOptions extends NodeJS.PartialOptions<TcpSocketConnectOpts> {@@ -1503,9 +1475,7 @@ /**- * Milliseconds to subtract from- * the server-provided `keep-alive: timeout=...` hint when determining socket- * expiration time. This buffer helps ensure the agent closes the socket- * slightly before the server does, reducing the chance of sending a request- * on a socket that’s about to be closed by the server.- * @since v24.7.0+ * Milliseconds to subtract from the server-provided `keep-alive: timeout=...` hint when determining socket+ * expiration time. This buffer helps ensure the agent closes the socket slightly before the server does, reducing+ * the chance of sending a request on a socket that’s about to be closed by the server. * @default 1000+ * @since v22.20.0 */@@ -1533,18 +1503,2 @@ scheduling?: "fifo" | "lifo" | undefined;- /**- * Environment variables for proxy configuration. See- * [Built-in Proxy Support](https://nodejs.org/docs/latest-v24.x/api/http.html#built-in-proxy-support) for details.- * @since v24.5.0- */- proxyEnv?: ProxyEnv | undefined;- /**- * Default port to use when the port is not specified in requests.- * @since v24.5.0- */- defaultPort?: number | undefined;- /**- * The protocol to use for the agent.- * @since v24.5.0- */- protocol?: string | undefined; }@@ -1604,3 +1558,3 @@ *- * `options` in [`socket.connect()`](https://nodejs.org/docs/latest-v24.x/api/net.html#socketconnectoptions-connectlistener) are also supported.+ * `options` in [`socket.connect()`](https://nodejs.org/docs/latest-v22.x/api/net.html#socketconnectoptions-connectlistener) are also supported. *@@ -1672,27 +1626,16 @@ *- * By default, this function behaves identically to `net.createConnection()`, synchronously- * returning the created socket. The optional `callback` parameter in the signature is not- * used by this default implementation.- *- * However, custom agents may override this method to provide greater flexibility,- * for example, to create sockets asynchronously. When overriding `createConnection`:- *- * 1. **Synchronous socket creation**: The overriding method can return the socket/stream directly.- * 2. **Asynchronous socket creation**: The overriding method can accept the `callback` and pass- * the created socket/stream to it (e.g., `callback(null, newSocket)`). If an error occurs during- * socket creation, it should be passed as the first argument to the `callback` (e.g., `callback(err)`).- *- * The agent will call the provided `createConnection` function with `options` and this internal- * `callback`. The `callback` provided by the agent has a signature of `(err, stream)`.+ * By default, this function is the same as `net.createConnection()`. However,+ * custom agents may override this method in case greater flexibility is desired.+ *+ * A socket/stream can be supplied in one of two ways: by returning the+ * socket/stream from this function, or by passing the socket/stream to `callback`.+ *+ * This method is guaranteed to return an instance of the `net.Socket` class,+ * a subclass of `stream.Duplex`, unless the user specifies a socket+ * type other than `net.Socket`.+ *+ * `callback` has a signature of `(err, stream)`. * @since v0.11.4- * @param options Options containing connection details. Check `net.createConnection()`- * for the format of the options. For custom agents, this object is passed- * to the custom `createConnection` function.- * @param callback (Optional, primarily for custom agents) A function to be called by a custom- * `createConnection` implementation when the socket is created, especially for- * asynchronous operations.- * @returns `stream.Duplex` The created socket. This is returned by the default implementation- * or by a custom synchronous `createConnection` implementation. If a- * custom `createConnection` uses the `callback` for asynchronous operation,- * this return value might not be the primary way to obtain the socket.+ * @param options Options containing connection details. Check `createConnection` for the format of the options+ * @param callback Callback function that receives the created socket */
--- +++ @@ -8,3 +8,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/tls.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/tls.js) */@@ -202,2 +202,8 @@ session?: Buffer | undefined;+ /**+ * If true, specifies that the OCSP status request extension will be+ * added to the client hello and an 'OCSPResponse' event will be+ * emitted on the socket before establishing a secure communication+ */+ requestOCSP?: boolean | undefined; }@@ -482,3 +488,2 @@ addListener(event: "OCSPResponse", listener: (response: NonSharedBuffer) => void): this;- addListener(event: "secure", listener: () => void): this; addListener(event: "secureConnect", listener: () => void): this;@@ -488,3 +493,2 @@ emit(event: "OCSPResponse", response: NonSharedBuffer): boolean;- emit(event: "secure"): boolean; emit(event: "secureConnect"): boolean;@@ -494,3 +498,2 @@ on(event: "OCSPResponse", listener: (response: NonSharedBuffer) => void): this;- on(event: "secure", listener: () => void): this; on(event: "secureConnect", listener: () => void): this;@@ -500,3 +503,2 @@ once(event: "OCSPResponse", listener: (response: NonSharedBuffer) => void): this;- once(event: "secure", listener: () => void): this; once(event: "secureConnect", listener: () => void): this;@@ -506,3 +508,2 @@ prependListener(event: "OCSPResponse", listener: (response: NonSharedBuffer) => void): this;- prependListener(event: "secure", listener: () => void): this; prependListener(event: "secureConnect", listener: () => void): this;@@ -512,3 +513,2 @@ prependOnceListener(event: "OCSPResponse", listener: (response: NonSharedBuffer) => void): this;- prependOnceListener(event: "secure", listener: () => void): this; prependOnceListener(event: "secureConnect", listener: () => void): this;@@ -556,8 +556,2 @@ rejectUnauthorized?: boolean | undefined;- /**- * If true, specifies that the OCSP status request extension will be- * added to the client hello and an 'OCSPResponse' event will be- * emitted on the socket before establishing a secure communication.- */- requestOCSP?: boolean | undefined; }@@ -833,2 +827,9 @@ }+ /**+ * @deprecated since v0.11.3 Use `tls.TLSSocket` instead.+ */+ interface SecurePair {+ encrypted: TLSSocket;+ cleartext: TLSSocket;+ } type SecureVersion = "TLSv1.3" | "TLSv1.2" | "TLSv1.1" | "TLSv1";@@ -1131,2 +1132,41 @@ function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket;+ /**+ * Creates a new secure pair object with two streams, one of which reads and writes+ * the encrypted data and the other of which reads and writes the cleartext data.+ * Generally, the encrypted stream is piped to/from an incoming encrypted data+ * stream and the cleartext one is used as a replacement for the initial encrypted+ * stream.+ *+ * `tls.createSecurePair()` returns a `tls.SecurePair` object with `cleartext` and `encrypted` stream properties.+ *+ * Using `cleartext` has the same API as {@link TLSSocket}.+ *+ * The `tls.createSecurePair()` method is now deprecated in favor of`tls.TLSSocket()`. For example, the code:+ *+ * ```js+ * pair = tls.createSecurePair(// ... );+ * pair.encrypted.pipe(socket);+ * socket.pipe(pair.encrypted);+ * ```+ *+ * can be replaced by:+ *+ * ```js+ * secureSocket = tls.TLSSocket(socket, options);+ * ```+ *+ * where `secureSocket` has the same API as `pair.cleartext`.+ * @since v0.3.2+ * @deprecated Since v0.11.3 - Use {@link TLSSocket} instead.+ * @param context A secure context object as returned by `tls.createSecureContext()`+ * @param isServer `true` to specify that this TLS connection should be opened as a server.+ * @param requestCert `true` to specify whether a server should request a certificate from a connecting client. Only applies when `isServer` is `true`.+ * @param rejectUnauthorized If not `false` a server automatically reject clients with invalid certificates. Only applies when `isServer` is `true`.+ */+ function createSecurePair(+ context?: SecureContext,+ isServer?: boolean,+ requestCert?: boolean,+ rejectUnauthorized?: boolean,+ ): SecurePair; /**@@ -1187,3 +1227,3 @@ * Not all supported ciphers are enabled by default. See- * [Modifying the default TLS cipher suite](https://nodejs.org/docs/latest-v24.x/api/tls.html#modifying-the-default-tls-cipher-suite).+ * [Modifying the default TLS cipher suite](https://nodejs.org/docs/latest-v22.x/api/tls.html#modifying-the-default-tls-cipher-suite). *@@ -1226,3 +1266,3 @@ * ```- * @since v24.5.0+ * @since v22.19.0 * @param certs An array of CA certificates in PEM format.@@ -1263,3 +1303,3 @@ * changed using CLI options using `--tls-default-ciphers`.- * @since v19.8.0+ * @since v0.11.3 */
--- +++ @@ -3,3 +3,3 @@ * invariants.- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/assert.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/assert.js) */@@ -46,9 +46,2 @@ strict?: boolean | undefined;- /**- * If set to `true`, skips prototype and constructor- * comparison in deep equality checks.- * @since v24.9.0- * @default false- */- skipPrototype?: boolean | undefined; }@@ -62,3 +55,3 @@ * The `Assert` class allows creating independent assertion instances with custom options.- * @since v24.6.0+ * @since v22.19.0 */@@ -76,4 +69,3 @@ * **Important**: When destructuring assertion methods from an `Assert` instance,- * the methods lose their connection to the instance's configuration options (such- * as `diff`, `strict`, and `skipPrototype` settings).+ * the methods lose their connection to the instance's configuration options (such as `diff` and `strict` settings). * The destructured methods will fall back to default behavior instead.@@ -91,29 +83,2 @@ *- * The `skipPrototype` option affects all deep equality methods:- *- * ```js- * class Foo {- * constructor(a) {- * this.a = a;- * }- * }- *- * class Bar {- * constructor(a) {- * this.a = a;- * }- * }- *- * const foo = new Foo(1);- * const bar = new Bar(1);- *- * // Default behavior - fails due to different constructors- * const assert1 = new Assert();- * assert1.deepStrictEqual(foo, bar); // AssertionError- *- * // Skip prototype comparison - passes if properties are equal- * const assert2 = new Assert({ skipPrototype: true });- * assert2.deepStrictEqual(foo, bar); // OK- * ```- * * When destructured, methods lose access to the instance's `this` context and revert to default assertion behavior@@ -122,6 +87,6 @@ * destructuring and call methods directly on the instance.- * @since v24.6.0+ * @since v22.19.0 */ new(- options?: AssertOptions & { strict?: true | undefined },+ options?: AssertOptions & { strict?: true }, ): AssertStrict;@@ -214,5 +179,3 @@ calls(exact?: number): () => void;- calls(fn: undefined, exact?: number): () => void;- calls<Func extends (...args: any[]) => any>(fn: Func, exact?: number): Func;- calls<Func extends (...args: any[]) => any>(fn?: Func, exact?: number): Func | (() => void);+ calls<Func extends (...args: any[]) => any>(fn?: Func, exact?: number): Func; /**@@ -933,3 +896,3 @@ * If `asyncFn` is a function and it throws an error synchronously, `assert.rejects()` will return a rejected `Promise` with that error. If the- * function does not return a promise, `assert.rejects()` will return a rejected `Promise` with an [ERR_INVALID_RETURN_VALUE](https://nodejs.org/docs/latest-v24.x/api/errors.html#err_invalid_return_value)+ * function does not return a promise, `assert.rejects()` will return a rejected `Promise` with an [ERR_INVALID_RETURN_VALUE](https://nodejs.org/docs/latest-v22.x/api/errors.html#err_invalid_return_value) * error. In both cases the error handler is skipped.@@ -1003,3 +966,3 @@ * the function does not return a promise, `assert.doesNotReject()` will return a- * rejected `Promise` with an [ERR_INVALID_RETURN_VALUE](https://nodejs.org/docs/latest-v24.x/api/errors.html#err_invalid_return_value) error. In both cases+ * rejected `Promise` with an [ERR_INVALID_RETURN_VALUE](https://nodejs.org/docs/latest-v22.x/api/errors.html#err_invalid_return_value) error. In both cases * the error handler is skipped.@@ -1066,3 +1029,3 @@ * undefined, a default error message is assigned. If the `message` parameter is an- * instance of an [Error](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-error) then it will be thrown instead of the `{@link AssertionError}`.+ * instance of an [Error](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-error) then it will be thrown instead of the `{@link AssertionError}`. * @since v13.6.0, v12.16.0@@ -1089,3 +1052,3 @@ * undefined, a default error message is assigned. If the `message` parameter is an- * instance of an [Error](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-error) then it will be thrown instead of the `{@link AssertionError}`.+ * instance of an [Error](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-error) then it will be thrown instead of the `{@link AssertionError}`. * @since v13.6.0, v12.16.0
--- +++ @@ -42,5 +42,5 @@ * more on color support in terminal environments, read the tty- * [`getColorDepth()`](https://nodejs.org/docs/latest-v24.x/api/tty.html#writestreamgetcolordepthenv) documentation.+ * [`getColorDepth()`](https://nodejs.org/docs/latest-v22.x/api/tty.html#writestreamgetcolordepthenv) documentation. * @since v15.0.0- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/assert/strict.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/assert/strict.js) */
--- +++ @@ -4,4 +4,4 @@ *- * * [`AsyncLocalStorage`](https://nodejs.org/docs/latest-v24.x/api/async_context.html#class-asynclocalstorage) tracks async context- * * [`process.getActiveResourcesInfo()`](https://nodejs.org/docs/latest-v24.x/api/process.html#processgetactiveresourcesinfo) tracks active resources+ * * [`AsyncLocalStorage`](https://nodejs.org/docs/latest-v22.x/api/async_context.html#class-asynclocalstorage) tracks async context+ * * [`process.getActiveResourcesInfo()`](https://nodejs.org/docs/latest-v22.x/api/process.html#processgetactiveresourcesinfo) tracks active resources *@@ -14,3 +14,3 @@ * @experimental- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/async_hooks.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/async_hooks.js) */@@ -46,3 +46,3 @@ * Promise contexts may not get precise `executionAsyncIds` by default.- * See the section on [promise execution tracking](https://nodejs.org/docs/latest-v24.x/api/async_hooks.html#promise-execution-tracking).+ * See the section on [promise execution tracking](https://nodejs.org/docs/latest-v22.x/api/async_hooks.html#promise-execution-tracking). * @since v8.1.0@@ -119,3 +119,3 @@ * Promise contexts may not get valid `triggerAsyncId`s by default. See- * the section on [promise execution tracking](https://nodejs.org/docs/latest-v24.x/api/async_hooks.html#promise-execution-tracking).+ * the section on [promise execution tracking](https://nodejs.org/docs/latest-v22.x/api/async_hooks.html#promise-execution-tracking). * @return The ID of the resource responsible for calling the callback that is currently being executed.@@ -321,12 +321,2 @@ triggerAsyncId(): number;- }- interface AsyncLocalStorageOptions {- /**- * The default value to be used when no store is provided.- */- defaultValue?: any;- /**- * A name for the `AsyncLocalStorage` value.- */- name?: string | undefined; }@@ -382,7 +372,2 @@ /**- * Creates a new instance of `AsyncLocalStorage`. Store is only provided within a- * `run()` call or after an `enterWith()` call.- */- constructor(options?: AsyncLocalStorageOptions);- /** * Binds the given function to the current execution context.@@ -447,7 +432,2 @@ getStore(): T | undefined;- /**- * The name of the `AsyncLocalStorage` instance if provided.- * @since v24.0.0- */- readonly name: string; /**
--- +++ @@ -48,3 +48,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/buffer.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/buffer.js) */
--- +++ @@ -0,0 +1,14 @@+// Polyfills for the explicit resource management types added in TypeScript 5.2.++interface SymbolConstructor {+ readonly dispose: unique symbol;+ readonly asyncDispose: unique symbol;+}++interface Disposable {+ [Symbol.dispose](): void;+}++interface AsyncDisposable {+ [Symbol.asyncDispose](): PromiseLike<void>;+}
--- +++ @@ -0,0 +1,9 @@+// Declaration files in this directory contain types relating to TypeScript library features+// that are not included in all TypeScript versions supported by DefinitelyTyped, but+// which can be made backwards-compatible without needing `typesVersions`.+// If adding declarations to this directory, please specify which versions of TypeScript require them,+// so that they can be removed when no longer needed.++/// <reference path="disposable.d.ts" />+/// <reference path="indexable.d.ts" />+/// <reference path="iterators.d.ts" />
--- +++ @@ -0,0 +1,20 @@+// Polyfill for ES2022's .at() method on string/array prototypes, added to TypeScript in 4.6.++interface RelativeIndexable<T> {+ at(index: number): T | undefined;+}++interface String extends RelativeIndexable<string> {}+interface Array<T> extends RelativeIndexable<T> {}+interface ReadonlyArray<T> extends RelativeIndexable<T> {}+interface Int8Array extends RelativeIndexable<number> {}+interface Uint8Array extends RelativeIndexable<number> {}+interface Uint8ClampedArray extends RelativeIndexable<number> {}+interface Int16Array extends RelativeIndexable<number> {}+interface Uint16Array extends RelativeIndexable<number> {}+interface Int32Array extends RelativeIndexable<number> {}+interface Uint32Array extends RelativeIndexable<number> {}+interface Float32Array extends RelativeIndexable<number> {}+interface Float64Array extends RelativeIndexable<number> {}+interface BigInt64Array extends RelativeIndexable<bigint> {}+interface BigUint64Array extends RelativeIndexable<bigint> {}
--- +++ @@ -5,3 +5,2 @@ // if lib.esnext.iterator is loaded.-// TODO: remove once this package no longer supports TS 5.5, and replace NodeJS.BuiltinIteratorReturn with BuiltinIteratorReturn.
--- +++ @@ -7,4 +7,4 @@ * * A `Console` class with methods such as `console.log()`, `console.error()`, and `console.warn()` that can be used to write to any Node.js stream.- * * A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstdout) and- * [`process.stderr`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.+ * * A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and+ * [`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module. *@@ -12,3 +12,3 @@ * synchronous like the browser APIs they resemble, nor are they consistently- * asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v24.x/api/process.html#a-note-on-process-io) for+ * asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for * more information.@@ -56,3 +56,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/console.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/console.js) */@@ -72,3 +72,3 @@ * starts with `"Assertion failed"`. If provided, `message` is formatted using- * [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args).+ * [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args). *@@ -154,3 +154,3 @@ /**- * Uses [`util.inspect()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilinspectobject-options) on `obj` and prints the resulting string to `stdout`.+ * Uses [`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) on `obj` and prints the resulting string to `stdout`. * This function bypasses any custom `inspect()` function defined on `obj`.@@ -169,3 +169,3 @@ * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)- * (the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args)).+ * (the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)). *@@ -180,4 +180,4 @@ * If formatting elements (e.g. `%d`) are not found in the first string then- * [`util.inspect()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilinspectobject-options) is called on each argument and the- * resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args)+ * [`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) is called on each argument and the+ * resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) * for more information.@@ -213,3 +213,3 @@ * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)- * (the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args)).+ * (the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)). *@@ -223,3 +223,3 @@ *- * See [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args) for more information.+ * See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information. * @since v0.1.100@@ -299,3 +299,3 @@ /**- * Prints to `stderr` the string `'Trace: '`, followed by the [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args)+ * Prints to `stderr` the string `'Trace: '`, followed by the [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) * formatted message and stack trace to the current position in the code.@@ -363,4 +363,4 @@ * * A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.- * * A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstdout) and- * [`process.stderr`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.+ * * A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and+ * [`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module. *@@ -368,3 +368,3 @@ * synchronous like the browser APIs they resemble, nor are they consistently- * asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v24.x/api/process.html#a-note-on-process-io) for+ * asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for * more information.@@ -412,3 +412,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/console.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/console.js) */@@ -433,6 +433,5 @@ * Specifies options that are passed along to- * `util.inspect()`. Can be an options object or, if different options- * for stdout and stderr are desired, a `Map` from stream objects to options.+ * [`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options). */- inspectOptions?: InspectOptions | ReadonlyMap<NodeJS.WritableStream, InspectOptions> | undefined;+ inspectOptions?: InspectOptions | undefined; /**
--- +++ @@ -16,3 +16,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/crypto.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/crypto.js) */@@ -99,3 +99,3 @@ namespace constants {- // https://nodejs.org/dist/latest-v24.x/docs/api/crypto.html#crypto-constants+ // https://nodejs.org/dist/latest-v22.x/docs/api/crypto.html#crypto-constants const OPENSSL_VERSION_NUMBER: number;@@ -594,4 +594,14 @@ /**- * For asymmetric keys, this property represents the type of the key. See the- * supported [asymmetric key types](https://nodejs.org/docs/latest-v24.x/api/crypto.html#asymmetric-key-types).+ * For asymmetric keys, this property represents the type of the key. Supported key+ * types are:+ *+ * * `'rsa'` (OID 1.2.840.113549.1.1.1)+ * * `'rsa-pss'` (OID 1.2.840.113549.1.1.10)+ * * `'dsa'` (OID 1.2.840.10040.4.1)+ * * `'ec'` (OID 1.2.840.10045.2.1)+ * * `'x25519'` (OID 1.3.101.110)+ * * `'x448'` (OID 1.3.101.111)+ * * `'ed25519'` (OID 1.3.101.112)+ * * `'ed448'` (OID 1.3.101.113)+ * * `'dh'` (OID 1.2.840.113549.1.3.1) *@@ -753,5 +763,5 @@ options?: stream.TransformOptions,- ): Cipheriv;- /**- * Instances of the `Cipheriv` class are used to encrypt data. The class can be+ ): Cipher;+ /**+ * Instances of the `Cipher` class are used to encrypt data. The class can be * used in one of two ways:@@ -764,6 +774,6 @@ * The {@link createCipheriv} method is- * used to create `Cipheriv` instances. `Cipheriv` objects are not to be created+ * used to create `Cipher` instances. `Cipher` objects are not to be created * directly using the `new` keyword. *- * Example: Using `Cipheriv` objects as streams:+ * Example: Using `Cipher` objects as streams: *@@ -802,3 +812,3 @@ *- * Example: Using `Cipheriv` and piped streams:+ * Example: Using `Cipher` and piped streams: *@@ -873,3 +883,3 @@ */- class Cipheriv extends stream.Transform {+ class Cipher extends stream.Transform { private constructor();@@ -894,3 +904,3 @@ /**- * Once the `cipher.final()` method has been called, the `Cipheriv` object can no+ * Once the `cipher.final()` method has been called, the `Cipher` object can no * longer be used to encrypt data. Attempts to call `cipher.final()` more than@@ -904,3 +914,3 @@ /**- * When using block encryption algorithms, the `Cipheriv` class will automatically+ * When using block encryption algorithms, the `Cipher` class will automatically * add padding to the input data to the appropriate block size. To disable the@@ -920,3 +930,3 @@ }- interface CipherCCM extends Cipheriv {+ interface CipherCCM extends Cipher { setAAD(@@ -929,3 +939,3 @@ }- interface CipherGCM extends Cipheriv {+ interface CipherGCM extends Cipher { setAAD(@@ -938,3 +948,3 @@ }- interface CipherOCB extends Cipheriv {+ interface CipherOCB extends Cipher { setAAD(@@ -947,3 +957,3 @@ }- interface CipherChaCha20Poly1305 extends Cipheriv {+ interface CipherChaCha20Poly1305 extends Cipher { setAAD(@@ -957,3 +967,3 @@ /**- * Creates and returns a `Decipheriv` object that uses the given `algorithm`, `key` and initialization vector (`iv`).+ * Creates and returns a `Decipher` object that uses the given `algorithm`, `key` and initialization vector (`iv`). *@@ -1014,5 +1024,5 @@ options?: stream.TransformOptions,- ): Decipheriv;- /**- * Instances of the `Decipheriv` class are used to decrypt data. The class can be+ ): Decipher;+ /**+ * Instances of the `Decipher` class are used to decrypt data. The class can be * used in one of two ways:@@ -1025,6 +1035,6 @@ * The {@link createDecipheriv} method is- * used to create `Decipheriv` instances. `Decipheriv` objects are not to be created+ * used to create `Decipher` instances. `Decipher` objects are not to be created * directly using the `new` keyword. *- * Example: Using `Decipheriv` objects as streams:+ * Example: Using `Decipher` objects as streams: *@@ -1067,3 +1077,3 @@ *- * Example: Using `Decipheriv` and piped streams:+ * Example: Using `Decipher` and piped streams: *@@ -1123,3 +1133,3 @@ */- class Decipheriv extends stream.Transform {+ class Decipher extends stream.Transform { private constructor();@@ -1144,3 +1154,3 @@ /**- * Once the `decipher.final()` method has been called, the `Decipheriv` object can+ * Once the `decipher.final()` method has been called, the `Decipher` object can * no longer be used to decrypt data. Attempts to call `decipher.final()` more@@ -1167,3 +1177,3 @@ }- interface DecipherCCM extends Decipheriv {+ interface DecipherCCM extends Decipher { setAuthTag(buffer: NodeJS.ArrayBufferView): this;@@ -1176,3 +1186,3 @@ }- interface DecipherGCM extends Decipheriv {+ interface DecipherGCM extends Decipher { setAuthTag(buffer: NodeJS.ArrayBufferView): this;@@ -1185,3 +1195,3 @@ }- interface DecipherOCB extends Decipheriv {+ interface DecipherOCB extends Decipher { setAuthTag(buffer: NodeJS.ArrayBufferView): this;@@ -1194,3 +1204,3 @@ }- interface DecipherChaCha20Poly1305 extends Decipheriv {+ interface DecipherChaCha20Poly1305 extends Decipher { setAuthTag(buffer: NodeJS.ArrayBufferView): this;@@ -1313,3 +1323,2 @@ */- // TODO: signing algorithm type function createSign(algorithm: string, options?: stream.WritableOptions): Sign;@@ -1323,3 +1332,2 @@ dsaEncoding?: DSAEncoding | undefined;- context?: ArrayBuffer | NodeJS.ArrayBufferView | undefined; }@@ -2470,30 +2478,3 @@ function timingSafeEqual(a: NodeJS.ArrayBufferView, b: NodeJS.ArrayBufferView): boolean;- type KeyType =- | "dh"- | "dsa"- | "ec"- | "ed25519"- | "ed448"- | "ml-dsa-44"- | "ml-dsa-65"- | "ml-dsa-87"- | "ml-kem-1024"- | "ml-kem-512"- | "ml-kem-768"- | "rsa-pss"- | "rsa"- | "slh-dsa-sha2-128f"- | "slh-dsa-sha2-128s"- | "slh-dsa-sha2-192f"- | "slh-dsa-sha2-192s"- | "slh-dsa-sha2-256f"- | "slh-dsa-sha2-256s"- | "slh-dsa-shake-128f"- | "slh-dsa-shake-128s"- | "slh-dsa-shake-192f"- | "slh-dsa-shake-192s"- | "slh-dsa-shake-256f"- | "slh-dsa-shake-256s"- | "x25519"- | "x448";+ type KeyType = "rsa" | "rsa-pss" | "dsa" | "ec" | "ed25519" | "ed448" | "x25519" | "x448"; type KeyFormat = "pem" | "der" | "jwk";@@ -2512,5 +2493,2 @@ interface X448KeyPairKeyObjectOptions {}- interface MLDSAKeyPairKeyObjectOptions {}- interface MLKEMKeyPairKeyObjectOptions {}- interface SLHDSAKeyPairKeyObjectOptions {} interface ECKeyPairKeyObjectOptions {@@ -2679,29 +2657,2 @@ }- interface MLDSAKeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {- publicKeyEncoding: {- type: "spki";- format: PubF;- };- privateKeyEncoding: BasePrivateKeyEncodingOptions<PrivF> & {- type: "pkcs8";- };- }- interface MLKEMKeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {- publicKeyEncoding: {- type: "spki";- format: PubF;- };- privateKeyEncoding: BasePrivateKeyEncodingOptions<PrivF> & {- type: "pkcs8";- };- }- interface SLHDSAKeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {- publicKeyEncoding: {- type: "spki";- format: PubF;- };- privateKeyEncoding: BasePrivateKeyEncodingOptions<PrivF> & {- type: "pkcs8";- };- } interface KeyPairSyncResult<T1 extends string | Buffer, T2 extends string | Buffer> {@@ -2711,8 +2662,8 @@ /**- * Generates a new asymmetric key pair of the given `type`.- * See the supported [asymmetric key types](https://nodejs.org/docs/latest-v24.x/api/crypto.html#asymmetric-key-types).+ * Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC,+ * Ed25519, Ed448, X25519, X448, and DH are currently supported. * * If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function- * behaves as if {@link KeyObject.export `keyObject.export()`} had been called on its result. Otherwise,- * the respective part of the key is returned as a {@link KeyObject `KeyObject`}.+ * behaves as if `keyObject.export()` had been called on its result. Otherwise,+ * the respective part of the key is returned as a `KeyObject`. *@@ -2749,4 +2700,3 @@ * @since v10.12.0- * @param type The asymmetric key type to generate. See the- * supported [asymmetric key types](https://nodejs.org/docs/latest-v24.x/api/crypto.html#asymmetric-key-types).+ * @param type Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`, `'ed448'`, `'x25519'`, `'x448'`, or `'dh'`. */@@ -2888,129 +2838,9 @@ function generateKeyPairSync(type: "x448", options?: X448KeyPairKeyObjectOptions): KeyPairKeyObjectResult;- function generateKeyPairSync(- type: "ml-dsa-44" | "ml-dsa-65" | "ml-dsa-87",- options: MLDSAKeyPairOptions<"pem", "pem">,- ): KeyPairSyncResult<string, string>;- function generateKeyPairSync(- type: "ml-dsa-44" | "ml-dsa-65" | "ml-dsa-87",- options: MLDSAKeyPairOptions<"pem", "der">,- ): KeyPairSyncResult<string, NonSharedBuffer>;
… 1305 more lines (truncated)
--- +++ @@ -25,3 +25,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/dgram.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/dgram.js) */
--- +++ @@ -22,3 +22,3 @@ * @since v15.1.0, v14.17.0- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/diagnostics_channel.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/diagnostics_channel.js) */
--- +++ @@ -43,4 +43,4 @@ *- * See the [Implementation considerations section](https://nodejs.org/docs/latest-v24.x/api/dns.html#implementation-considerations) for more information.- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/dns.js)+ * See the [Implementation considerations section](https://nodejs.org/docs/latest-v22.x/api/dns.html#implementation-considerations) for more information.+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/dns.js) */@@ -73,3 +73,3 @@ /**- * One or more [supported `getaddrinfo`](https://nodejs.org/docs/latest-v24.x/api/dns.html#supported-getaddrinfo-flags) flags. Multiple flags may be+ * One or more [supported `getaddrinfo`](https://nodejs.org/docs/latest-v22.x/api/dns.html#supported-getaddrinfo-flags) flags. Multiple flags may be * passed by bitwise `OR`ing their values.@@ -86,3 +86,3 @@ * addresses before IPv4 addresses. Default value is configurable using- * {@link setDefaultResultOrder} or [`--dns-result-order`](https://nodejs.org/docs/latest-v24.x/api/cli.html#--dns-result-orderorder).+ * {@link setDefaultResultOrder} or [`--dns-result-order`](https://nodejs.org/docs/latest-v22.x/api/cli.html#--dns-result-orderorder). * @default `verbatim` (addresses are not reordered)@@ -135,3 +135,3 @@ * important consequences on the behavior of any Node.js program. Please take some- * time to consult the [Implementation considerations section](https://nodejs.org/docs/latest-v24.x/api/dns.html#implementation-considerations)+ * time to consult the [Implementation considerations section](https://nodejs.org/docs/latest-v22.x/api/dns.html#implementation-considerations) * before using `dns.lookup()`.@@ -157,3 +157,3 @@ *- * If this method is invoked as its [util.promisify()](https://nodejs.org/docs/latest-v24.x/api/util.html#utilpromisifyoriginal) ed+ * If this method is invoked as its [util.promisify()](https://nodejs.org/docs/latest-v22.x/api/util.html#utilpromisifyoriginal) ed * version, and `all` is not set to `true`, it returns a `Promise` for an `Object` with `address` and `family` properties.@@ -197,3 +197,3 @@ *- * On an error, `err` is an [`Error`](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-error) object,+ * On an error, `err` is an [`Error`](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-error) object, * where `err.code` is the error code.@@ -208,3 +208,3 @@ *- * If this method is invoked as its [util.promisify()](https://nodejs.org/docs/latest-v24.x/api/util.html#utilpromisifyoriginal) ed+ * If this method is invoked as its [util.promisify()](https://nodejs.org/docs/latest-v22.x/api/util.html#utilpromisifyoriginal) ed * version, it returns a `Promise` for an `Object` with `hostname` and `service` properties.@@ -339,3 +339,3 @@ *- * On error, `err` is an [`Error`](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-error) object,+ * On error, `err` is an [`Error`](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-error) object, * where `err.code` is one of the `DNS error codes`.@@ -654,3 +654,3 @@ * ```- * @since v23.9.0, v22.15.0+ * @since v22.15.0 */@@ -718,4 +718,4 @@ *- * On error, `err` is an [`Error`](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-error) object, where `err.code` is- * one of the [DNS error codes](https://nodejs.org/docs/latest-v24.x/api/dns.html#error-codes).+ * On error, `err` is an [`Error`](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-error) object, where `err.code` is+ * one of the [DNS error codes](https://nodejs.org/docs/latest-v22.x/api/dns.html#error-codes). * @since v0.1.16@@ -727,3 +727,3 @@ /**- * Get the default value for `order` in {@link lookup} and [`dnsPromises.lookup()`](https://nodejs.org/docs/latest-v24.x/api/dns.html#dnspromiseslookuphostname-options).+ * Get the default value for `order` in {@link lookup} and [`dnsPromises.lookup()`](https://nodejs.org/docs/latest-v22.x/api/dns.html#dnspromiseslookuphostname-options). * The value could be:@@ -782,3 +782,3 @@ /**- * Set the default value of `order` in {@link lookup} and [`dnsPromises.lookup()`](https://nodejs.org/docs/latest-v24.x/api/dns.html#dnspromiseslookuphostname-options).+ * Set the default value of `order` in {@link lookup} and [`dnsPromises.lookup()`](https://nodejs.org/docs/latest-v22.x/api/dns.html#dnspromiseslookuphostname-options). * The value could be:@@ -790,4 +790,4 @@ * The default is `verbatim` and {@link setDefaultResultOrder} have higher- * priority than [`--dns-result-order`](https://nodejs.org/docs/latest-v24.x/api/cli.html#--dns-result-orderorder). When using- * [worker threads](https://nodejs.org/docs/latest-v24.x/api/worker_threads.html), {@link setDefaultResultOrder} from the main+ * priority than [`--dns-result-order`](https://nodejs.org/docs/latest-v22.x/api/cli.html#--dns-result-orderorder). When using+ * [worker threads](https://nodejs.org/docs/latest-v22.x/api/worker_threads.html), {@link setDefaultResultOrder} from the main * thread won't affect the default dns orders in workers.@@ -842,3 +842,3 @@ * Creating a new resolver uses the default server settings. Setting- * the servers used for a resolver using [`resolver.setServers()`](https://nodejs.org/docs/latest-v24.x/api/dns.html#dnssetserversservers) does not affect+ * the servers used for a resolver using [`resolver.setServers()`](https://nodejs.org/docs/latest-v22.x/api/dns.html#dnssetserversservers) does not affect * other resolvers:
--- +++ @@ -317,3 +317,3 @@ * ```- * @since v23.9.0, v22.15.0+ * @since v22.15.0 */
--- +++ @@ -14,3 +14,3 @@ * @deprecated Since v1.4.2 - Deprecated- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/domain.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/domain.js) */@@ -26,5 +26,6 @@ /**- * An array of event emitters that have been explicitly added to the domain.+ * An array of timers and event emitters that have been explicitly added+ * to the domain. */- members: EventEmitter[];+ members: Array<EventEmitter | NodeJS.Timer>; /**@@ -92,7 +93,10 @@ *- * If the `EventEmitter` was already bound to a domain, it is removed from that- * one, and bound to this one instead.- * @param emitter emitter to be added to the domain+ * This also works with timers that are returned from `setInterval()` and `setTimeout()`. If their callback function throws, it will be caught by+ * the domain `'error'` handler.+ *+ * If the Timer or `EventEmitter` was already bound to a domain, it is removed+ * from that one, and bound to this one instead.+ * @param emitter emitter or timer to be added to the domain */- add(emitter: EventEmitter): void;+ add(emitter: EventEmitter | NodeJS.Timer): void; /**@@ -100,5 +104,5 @@ * specified emitter.- * @param emitter emitter to be removed from the domain+ * @param emitter emitter or timer to be removed from the domain */- remove(emitter: EventEmitter): void;+ remove(emitter: EventEmitter | NodeJS.Timer): void; /**
--- +++ @@ -34,3 +34,3 @@ * ```- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/events.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/events.js) */
--- +++ @@ -18,3 +18,3 @@ * forms, and are accessible using both CommonJS syntax and ES6 Modules (ESM).- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/fs.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/fs.js) */@@ -250,2 +250,8 @@ parentPath: string;+ /**+ * Alias for `dirent.parentPath`.+ * @since v20.1.0+ * @deprecated Since v20.12.0+ */+ path: string; }@@ -328,3 +334,4 @@ * fulfills when disposal is complete.- * @since v24.1.0+ * @since v22.17.0+ * @experimental */@@ -334,3 +341,4 @@ * `undefined`.- * @since v24.1.0+ * @since v22.17.0+ * @experimental */@@ -458,226 +466,2 @@ prependOnceListener<K extends keyof ReadStreamEvents>(event: K, listener: ReadStreamEvents[K]): this;- }- export interface Utf8StreamOptions {- /**- * Appends writes to dest file instead of truncating it.- * @default true- */- append?: boolean | undefined;- /**- * Which type of data you can send to the write- * function, supported values are `'utf8'` or `'buffer'`.- * @default 'utf8'- */- contentMode?: "utf8" | "buffer" | undefined;- /**- * A path to a file to be written to (mode controlled by the- * append option).- */- dest?: string | undefined;- /**- * A file descriptor, something that is returned by `fs.open()`- * or `fs.openSync()`.- */- fd?: number | undefined;- /**- * An object that has the same API as the `fs` module, useful- * for mocking, testing, or customizing the behavior of the stream.- */- fs?: object | undefined;- /**- * Perform a `fs.fsyncSync()` every time a write is- * completed.- */- fsync?: boolean | undefined;- /**- * The maximum length of the internal buffer. If a write- * operation would cause the buffer to exceed `maxLength`, the data written is- * dropped and a drop event is emitted with the dropped data- */- maxLength?: number | undefined;- /**- * The maximum number of bytes that can be written;- * @default 16384- */- maxWrite?: number | undefined;- /**- * The minimum length of the internal buffer that is- * required to be full before flushing.- */- minLength?: number | undefined;- /**- * Ensure directory for `dest` file exists when true.- * @default false- */- mkdir?: boolean | undefined;- /**- * Specify the creating file mode (see `fs.open()`).- */- mode?: number | string | undefined;- /**- * Calls flush every `periodicFlush` milliseconds.- */- periodicFlush?: number | undefined;- /**- * A function that will be called when `write()`,- * `writeSync()`, or `flushSync()` encounters an `EAGAIN` or `EBUSY` error.- * If the return value is `true` the operation will be retried, otherwise it- * will bubble the error. The `err` is the error that caused this function to- * be called, `writeBufferLen` is the length of the buffer that was written,- * and `remainingBufferLen` is the length of the remaining buffer that the- * stream did not try to write.- */- retryEAGAIN?: ((err: Error | null, writeBufferLen: number, remainingBufferLen: number) => boolean) | undefined;- /**- * Perform writes synchronously.- */- sync?: boolean | undefined;- }- /**- * An optimized UTF-8 stream writer that allows for flushing all the internal- * buffering on demand. It handles `EAGAIN` errors correctly, allowing for- * customization, for example, by dropping content if the disk is busy.- * @since v24.6.0- * @experimental- */- export class Utf8Stream extends EventEmitter {- constructor(options: Utf8StreamOptions);- /**- * Whether the stream is appending to the file or truncating it.- */- readonly append: boolean;- /**- * The type of data that can be written to the stream. Supported- * values are `'utf8'` or `'buffer'`.- * @default 'utf8'- */- readonly contentMode: "utf8" | "buffer";- /**- * Close the stream immediately, without flushing the internal buffer.- */- destroy(): void;- /**- * Close the stream gracefully, flushing the internal buffer before closing.- */- end(): void;- /**- * The file descriptor that is being written to.- */- readonly fd: number;- /**- * The file that is being written to.- */- readonly file: string;- /**- * Writes the current buffer to the file if a write was not in progress. Do- * nothing if `minLength` is zero or if it is already writing.- */- flush(callback: (err: Error | null) => void): void;- /**- * Flushes the buffered data synchronously. This is a costly operation.- */- flushSync(): void;- /**- * Whether the stream is performing a `fs.fsyncSync()` after every- * write operation.- */- readonly fsync: boolean;- /**- * The maximum length of the internal buffer. If a write- * operation would cause the buffer to exceed `maxLength`, the data written is- * dropped and a drop event is emitted with the dropped data.- */- readonly maxLength: number;- /**- * The minimum length of the internal buffer that is required to be- * full before flushing.- */- readonly minLength: number;- /**- * Whether the stream should ensure that the directory for the- * `dest` file exists. If `true`, it will create the directory if it does not- * exist.- * @default false- */- readonly mkdir: boolean;- /**- * The mode of the file that is being written to.- */- readonly mode: number | string;- /**- * The number of milliseconds between flushes. If set to `0`, no- * periodic flushes will be performed.- */- readonly periodicFlush: number;- /**- * Reopen the file in place, useful for log rotation.- * @param file A path to a file to be written to (mode- * controlled by the append option).- */- reopen(file: PathLike): void;- /**- * Whether the stream is writing synchronously or asynchronously.- */- readonly sync: boolean;- /**- * When the `options.contentMode` is set to `'utf8'` when the stream is created,- * the `data` argument must be a string. If the `contentMode` is set to `'buffer'`,- * the `data` argument must be a `Buffer`.- * @param data The data to write.- */- write(data: string | Buffer): boolean;- /**- * Whether the stream is currently writing data to the file.- */- readonly writing: boolean;- /**- * Calls `utf8Stream.destroy()`.- */- [Symbol.dispose](): void;- /**- * events.EventEmitter- * 1. change- * 2. close- * 3. error- */- addListener(event: "close", listener: () => void): this;- addListener(event: "drain", listener: () => void): this;- addListener(event: "drop", listener: (data: string | Buffer) => void): this;- addListener(event: "error", listener: (error: Error) => void): this;- addListener(event: "finish", listener: () => void): this;- addListener(event: "ready", listener: () => void): this;- addListener(event: "write", listener: (n: number) => void): this;- addListener(event: string, listener: (...args: any[]) => void): this;- on(event: "close", listener: () => void): this;- on(event: "drain", listener: () => void): this;- on(event: "drop", listener: (data: string | Buffer) => void): this;- on(event: "error", listener: (error: Error) => void): this;- on(event: "finish", listener: () => void): this;- on(event: "ready", listener: () => void): this;- on(event: "write", listener: (n: number) => void): this;- on(event: string, listener: (...args: any[]) => void): this;- once(event: "close", listener: () => void): this;- once(event: "drain", listener: () => void): this;- once(event: "drop", listener: (data: string | Buffer) => void): this;- once(event: "error", listener: (error: Error) => void): this;- once(event: "finish", listener: () => void): this;- once(event: "ready", listener: () => void): this;- once(event: "write", listener: (n: number) => void): this;- once(event: string, listener: (...args: any[]) => void): this;- prependListener(event: "close", listener: () => void): this;- prependListener(event: "drain", listener: () => void): this;- prependListener(event: "drop", listener: (data: string | Buffer) => void): this;- prependListener(event: "error", listener: (error: Error) => void): this;- prependListener(event: "finish", listener: () => void): this;- prependListener(event: "ready", listener: () => void): this;- prependListener(event: "write", listener: (n: number) => void): this;- prependListener(event: string, listener: (...args: any[]) => void): this;- prependOnceListener(event: "close", listener: () => void): this;- prependOnceListener(event: "drain", listener: () => void): this;- prependOnceListener(event: "drop", listener: (data: string | Buffer) => void): this;- prependOnceListener(event: "error", listener: (error: Error) => void): this;
… 55 more lines (truncated)
--- +++ @@ -23,3 +23,2 @@ Dirent,- EncodingOption, GlobOptions,@@ -502,3 +501,3 @@ * filehandle is closed.- * @since v20.4.0, v18.8.0+ * @since v20.4.0 */@@ -990,36 +989,2 @@ ): Promise<string | NonSharedBuffer>;- interface DisposableTempDir extends AsyncDisposable {- /**- * The path of the created directory.- */- path: string;- /**- * A function which removes the created directory.- */- remove(): Promise<void>;- /**- * The same as `remove`.- */- [Symbol.asyncDispose](): Promise<void>;- }- /**- * The resulting Promise holds an async-disposable object whose `path` property- * holds the created directory path. When the object is disposed, the directory- * and its contents will be removed asynchronously if it still exists. If the- * directory cannot be deleted, disposal will throw an error. The object has an- * async `remove()` method which will perform the same task.- *- * Both this function and the disposal function on the resulting object are- * async, so it should be used with `await` + `await using` as in- * `await using dir = await fsPromises.mkdtempDisposable('prefix')`.- *- * <!-- TODO: link MDN docs for disposables once https://github.com/mdn/content/pull/38027 lands -->- *- * For detailed information, see the documentation of `fsPromises.mkdtemp()`.- *- * The optional `options` argument can be a string specifying an encoding, or an- * object with an `encoding` property specifying the character encoding to use.- * @since v24.4.0- */- function mkdtempDisposable(prefix: PathLike, options?: EncodingOption): Promise<DisposableTempDir>; /**
--- +++ @@ -161,3 +161,4 @@ /** An iterable iterator returned by the Node.js API. */- interface Iterator<T, TReturn = undefined, TNext = any> extends IteratorObject<T, TReturn, TNext> {+ // Default TReturn/TNext in v22 is `any`, for compatibility with the previously-used IterableIterator.+ interface Iterator<T, TReturn = any, TNext = any> extends IteratorObject<T, TReturn, TNext> { [Symbol.iterator](): NodeJS.Iterator<T, TReturn, TNext>;@@ -166,3 +167,4 @@ /** An async iterable iterator returned by the Node.js API. */- interface AsyncIterator<T, TReturn = undefined, TNext = any> extends AsyncIteratorObject<T, TReturn, TNext> {+ // Default TReturn/TNext in v22 is `any`, for compatibility with the previously-used AsyncIterableIterator.+ interface AsyncIterator<T, TReturn = any, TNext = any> extends AsyncIteratorObject<T, TReturn, TNext> { [Symbol.asyncIterator](): NodeJS.AsyncIterator<T, TReturn, TNext>;
--- +++ @@ -14,3 +14,2 @@ | BigInt64Array<TArrayBuffer>- | Float16Array<TArrayBuffer> | Float32Array<TArrayBuffer>@@ -23,3 +22,2 @@ // while maintaining compatibility with TS <=5.6.- // TODO: remove once @types/node no longer supports TS 5.6, and replace with native types. type NonSharedUint8Array = Uint8Array<ArrayBuffer>;@@ -33,3 +31,2 @@ type NonSharedBigInt64Array = BigInt64Array<ArrayBuffer>;- type NonSharedFloat16Array = Float16Array<ArrayBuffer>; type NonSharedFloat32Array = Float32Array<ArrayBuffer>;
--- +++ @@ -8,3 +8,3 @@ * @since v8.4.0- * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/http2.js)+ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/http2.js) */@@ -36,2 +36,8 @@ // Http2Stream+ export interface StreamPriorityOptions {+ exclusive?: boolean | undefined;+ parent?: number | undefined;+ weight?: number | undefined;+ silent?: boolean | undefined;+ } export interface StreamState {@@ -41,5 +47,3 @@ remoteClose?: number | undefined;- /** @deprecated */ sumDependencyWeight?: number | undefined;- /** @deprecated */ weight?: number | undefined;@@ -152,5 +156,6 @@ /**- * @deprecated Priority signaling is no longer supported in Node.js.- */- priority(options: unknown): void;+ * Updates the priority for this `Http2Stream` instance.+ * @since v8.4.0+ */+ priority(options: StreamPriorityOptions): void; /**@@ -454,3 +459,3 @@ headers: OutgoingHttpHeaders,- options?: Pick<ClientSessionRequestOptions, "exclusive" | "parent">,+ options?: StreamPriorityOptions, callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void,@@ -689,2 +694,3 @@ parent?: number | undefined;+ weight?: number | undefined; waitForTrailers?: boolean | undefined;@@ -1673,4 +1679,6 @@ event: "sessionError",- listener: (err: Error) => void,- session: ServerHttp2Session<Http1Request, Http1Response, Http2Request, Http2Response>,+ listener: (+ err: Error,+ session: ServerHttp2Session<Http1Request, Http1Response, Http2Request, Http2Response>,+ ) => void, ): this;@@ -2069,3 +2077,3 @@ * Attempting to set a header field name or value that contains invalid characters will result in a- * [TypeError](https://nodejs.org/docs/latest-v24.x/api/errors.html#class-typeerror) being thrown.+ * [TypeError](https://nodejs.org/docs/latest-v22.x/api/errors.html#class-typeerror) being thrown. *
@types/react npm BURST ×109
19.2.13
19.2.14
19.2.15
18.3.29
17.0.92
16.14.70
15.7.37
19.2.16
18.3.30
17.0.93
19.2.17
18.3.31
BURST
2 releases in 28m: 15.0.19, 15.0.20
info · registry-verified · 2017-03-24 · 9y ago
BURST
2 releases in 0m: 16.0.0, 15.6.1
info · registry-verified · 2017-08-01 · 8y ago
BURST
2 releases in 0m: 16.0.6, 15.6.3
info · registry-verified · 2017-09-25 · 8y ago
BURST
2 releases in 6m: 15.6.4, 16.0.7
info · registry-verified · 2017-09-25 · 8y ago
BURST
2 releases in 0m: 16.0.17, 15.6.5
info · registry-verified · 2017-10-22 · 8y ago
BURST
2 releases in 0m: 16.0.23, 15.6.7
info · registry-verified · 2017-11-15 · 8y ago
BURST
2 releases in 23m: 15.6.9, 16.0.30
info · registry-verified · 2017-12-13 · 8y ago
BURST
2 releases in 0m: 16.0.34, 15.6.11
info · registry-verified · 2018-01-03 · 8y ago
BURST
2 releases in 1m: 15.6.12, 16.0.35
info · registry-verified · 2018-01-24 · 8y ago
BURST
2 releases in 0m: 16.0.37, 15.6.13
info · registry-verified · 2018-02-12 · 8y ago
BURST
2 releases in 1m: 15.6.14, 16.0.38
info · registry-verified · 2018-02-13 · 8y ago
BURST
2 releases in 0m: 16.1.0, 15.6.15
info · registry-verified · 2018-03-27 · 8y ago
BURST
2 releases in 10m: 15.6.16, 16.3.15
info · registry-verified · 2018-05-31 · 8y ago
BURST
2 releases in 12m: 15.6.17, 16.4.1
info · registry-verified · 2018-06-20 · 8y ago
BURST
2 releases in 0m: 15.6.18, 16.4.4
info · registry-verified · 2018-06-28 · 8y ago
BURST
2 releases in 0m: 15.6.19, 16.4.8
info · registry-verified · 2018-08-06 · 7y ago
BURST
2 releases in 40m: 16.7.0, 16.7.1
info · registry-verified · 2018-11-09 · 7y ago
BURST
2 releases in 0m: 15.6.20, 16.7.3
info · registry-verified · 2018-11-11 · 7y ago
BURST
2 releases in 2m: 15.6.21, 16.7.8
info · registry-verified · 2018-11-28 · 7y ago
BURST
2 releases in 0m: 16.8.3, 15.6.22
info · registry-verified · 2019-02-13 · 7y ago
BURST
2 releases in 0m: 16.8.14, 15.6.24
info · registry-verified · 2019-04-19 · 7y ago
BURST
2 releases in 0m: 16.8.19, 15.6.25
info · registry-verified · 2019-05-28 · 7y ago
BURST
2 releases in 0m: 16.8.20, 15.6.26
info · registry-verified · 2019-06-13 · 7y ago
BURST
2 releases in 0m: 16.8.24, 15.6.27
info · registry-verified · 2019-07-31 · 6y ago
BURST
3 releases in 42m: 16.9.8, 15.6.28, 16.9.9
info · registry-verified · 2019-10-16 · 6y ago
BURST
2 releases in 37m: 16.9.28, 16.9.29
info · registry-verified · 2020-03-31 · 6y ago
BURST
2 releases in 46m: 16.9.40, 16.9.41
info · registry-verified · 2020-06-24 · 6y ago
BURST
2 releases in 0m: 16.9.51, 15.6.30
info · registry-verified · 2020-10-05 · 5y ago
BURST
2 releases in 0m: 16.9.55, 15.6.31
info · registry-verified · 2020-10-28 · 5y ago
BURST
2 releases in 1m: 16.14.0, 15.7.0
info · registry-verified · 2020-11-20 · 5y ago
BURST
2 releases in 0m: 17.0.0, 16.14.1
info · registry-verified · 2020-11-20 · 5y ago
BURST
2 releases in 0m: 17.0.1, 16.14.3
info · registry-verified · 2021-02-02 · 5y ago
BURST
2 releases in 0m: 17.0.2, 16.14.4
info · registry-verified · 2021-02-12 · 5y ago
BURST
2 releases in 0m: 17.0.3, 16.14.5
info · registry-verified · 2021-03-07 · 5y ago
BURST
2 releases in 0m: 17.0.5, 16.14.6
info · registry-verified · 2021-05-04 · 5y ago
BURST
2 releases in 0m: 17.0.8, 16.14.8
info · registry-verified · 2021-05-26 · 5y ago
BURST
2 releases in 0m: 17.0.12, 16.14.9
info · registry-verified · 2021-07-01 · 5y ago
BURST
3 releases in 0m: 17.0.13, 16.14.10, 15.7.1
info · registry-verified · 2021-07-01 · 5y ago
BURST
3 releases in 0m: 17.0.14, 16.14.11, 15.7.2
info · registry-verified · 2021-07-07 · 5y ago
BURST
3 releases in 1m: 17.0.16, 16.14.12, 15.7.3
info · registry-verified · 2021-08-06 · 4y ago
BURST
2 releases in 0m: 17.0.17, 16.14.13
info · registry-verified · 2021-08-11 · 4y ago
BURST
2 releases in 0m: 17.0.19, 16.14.14
info · registry-verified · 2021-08-19 · 4y ago
BURST
2 releases in 0m: 17.0.20, 16.14.15
info · registry-verified · 2021-09-05 · 4y ago
BURST
2 releases in 33m: 17.0.23, 17.0.24
info · registry-verified · 2021-09-21 · 4y ago
BURST
2 releases in 0m: 17.0.25, 15.7.4
info · registry-verified · 2021-09-29 · 4y ago
BURST
2 releases in 0m: 17.0.27, 16.14.16
info · registry-verified · 2021-10-03 · 4y ago
BURST
3 releases in 0m: 17.0.29, 16.14.17, 15.7.5
info · registry-verified · 2021-10-12 · 4y ago
BURST
2 releases in 0m: 17.0.31, 16.14.18
info · registry-verified · 2021-10-21 · 4y ago
BURST
2 releases in 0m: 16.14.19, 15.7.6
info · registry-verified · 2021-10-23 · 4y ago
BURST
2 releases in 0m: 17.0.33, 16.14.20
info · registry-verified · 2021-10-25 · 4y ago
BURST
2 releases in 0m: 17.0.35, 16.14.21
info · registry-verified · 2021-11-15 · 4y ago
BURST
2 releases in 0m: 17.0.39, 16.14.23
info · registry-verified · 2022-02-03 · 4y ago
BURST
3 releases in 0m: 17.0.40, 16.14.24, 15.7.7
info · registry-verified · 2022-03-10 · 4y ago
BURST
2 releases in 0m: 18.0.0, 17.0.44
info · registry-verified · 2022-04-07 · 4y ago
BURST
2 releases in 0m: 18.0.5, 16.14.25
info · registry-verified · 2022-04-14 · 4y ago
BURST
3 releases in 1m: 18.0.9, 17.0.45, 16.14.26
info · registry-verified · 2022-05-06 · 4y ago
BURST
3 releases in 0m: 18.0.13, 17.0.46, 16.14.27
info · registry-verified · 2022-06-16 · 4y ago
BURST
3 releases in 0m: 18.0.14, 17.0.47, 16.14.28
info · registry-verified · 2022-06-16 · 4y ago
BURST
3 releases in 0m: 17.0.48, 16.14.29, 15.7.8
info · registry-verified · 2022-07-27 · 3y ago
BURST
3 releases in 0m: 18.0.16, 16.14.30, 15.7.9
info · registry-verified · 2022-08-07 · 3y ago
BURST
3 releases in 0m: 18.0.18, 17.0.49, 16.14.31
info · registry-verified · 2022-08-30 · 3y ago
BURST
4 releases in 0m: 18.0.20, 17.0.50, 16.14.32, 15.7.10
info · registry-verified · 2022-09-13 · 3y ago
BURST
3 releases in 1m: 18.0.23, 17.0.51, 16.14.33
info · registry-verified · 2022-10-25 · 3y ago
BURST
4 releases in 1m: 18.0.24, 17.0.52, 16.14.34, 15.7.11
info · registry-verified · 2022-10-27 · 3y ago
BURST
4 releases in 1m: 18.0.27, 17.0.53, 16.14.35, 15.7.12
info · registry-verified · 2023-01-18 · 3y ago
BURST
4 releases in 0m: 18.0.30, 17.0.54, 16.14.36, 15.7.13
info · registry-verified · 2023-03-27 · 3y ago
BURST
3 releases in 0m: 18.0.31, 17.0.55, 16.14.37
info · registry-verified · 2023-03-28 · 3y ago
BURST
4 releases in 2m: 18.0.33, 17.0.56, 16.14.38, 15.7.14
info · registry-verified · 2023-04-03 · 3y ago
BURST
3 releases in 1m: 18.0.34, 17.0.57, 16.14.39
info · registry-verified · 2023-04-10 · 3y ago
BURST
4 releases in 0m: 18.0.35, 17.0.58, 16.14.40, 15.7.16
info · registry-verified · 2023-04-12 · 3y ago
BURST
2 releases in 30m: 18.0.36, 18.0.37
info · registry-verified · 2023-04-17 · 3y ago
BURST
4 releases in 0m: 18.2.6, 17.0.59, 16.14.41, 15.7.17
info · registry-verified · 2023-05-06 · 3y ago
BURST
3 releases in 0m: 17.0.60, 16.14.42, 15.7.18
info · registry-verified · 2023-05-25 · 3y ago
BURST
4 releases in 0m: 18.2.10, 17.0.61, 16.14.43, 15.7.19
info · registry-verified · 2023-06-10 · 3y ago
BURST
4 releases in 1m: 18.2.19, 17.0.63, 16.14.44, 15.7.20
info · registry-verified · 2023-08-08 · 2y ago
BURST
4 releases in 0m: 18.2.20, 17.0.64, 16.14.45, 15.7.21
info · registry-verified · 2023-08-09 · 2y ago
BURST
4 releases in 1m: 18.2.21, 17.0.65, 16.14.46, 15.7.22
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 1m: 18.2.23, 17.0.66, 16.14.47, 15.7.23
info · registry-verified · 2023-09-26 · 2y ago
BURST
3 releases in 0m: 18.2.24, 17.0.67, 16.14.48
info · registry-verified · 2023-10-01 · 2y ago
BURST
4 releases in 0m: 18.2.28, 17.0.68, 16.14.49, 15.7.24
info · registry-verified · 2023-10-10 · 2y ago
BURST
4 releases in 0m: 18.2.29, 17.0.69, 16.14.50, 15.7.25
info · registry-verified · 2023-10-18 · 2y ago
BURST
4 releases in 1m: 18.2.37, 17.0.70, 16.14.51, 15.7.26
info · registry-verified · 2023-11-07 · 2y ago
BURST
4 releases in 0m: 18.2.38, 17.0.71, 16.14.52, 15.7.27
info · registry-verified · 2023-11-21 · 2y ago
BURST
3 releases in 1m: 18.2.44, 17.0.72, 16.14.53
info · registry-verified · 2023-12-12 · 2y ago
BURST
4 releases in 2m: 18.2.45, 17.0.73, 16.14.54, 15.7.28
info · registry-verified · 2023-12-13 · 2y ago
BURST
3 releases in 0m: 18.2.46, 17.0.74, 16.14.55
info · registry-verified · 2023-12-28 · 2y ago
BURST
4 releases in 1m: 18.2.48, 17.0.75, 16.14.56, 15.7.29
info · registry-verified · 2024-01-15 · 2y ago
BURST
4 releases in 1m: 18.2.59, 17.0.76, 16.14.57, 15.7.30
info · registry-verified · 2024-02-26 · 2y ago
BURST
3 releases in 0m: 18.2.66, 17.0.77, 16.14.58
info · registry-verified · 2024-03-14 · 2y ago
BURST
3 releases in 29m: 18.2.67, 17.0.79, 16.14.59
info · registry-verified · 2024-03-18 · 2y ago
BURST
3 releases in 0m: 18.2.71, 17.0.80, 16.14.60
info · registry-verified · 2024-03-26 · 2y ago
BURST
3 releases in 0m: 18.3.6, 17.0.81, 16.14.61
info · registry-verified · 2024-09-16 · 1y ago
BURST
2 releases in 0m: 18.3.7, 17.0.82
info · registry-verified · 2024-09-17 · 1y ago
BURST
3 releases in 0m: 18.3.10, 17.0.83, 16.14.62
info · registry-verified · 2024-09-27 · 1y ago
BURST
2 releases in 0m: 19.0.0, 18.3.14
info · registry-verified · 2024-12-05 · 1y ago
BURST
5 releases in 0m: 19.0.12, 18.3.19, 17.0.84, 16.14.63, 15.7.31
info · registry-verified · 2025-03-19 · 1y ago
BURST
3 releases in 54m: 19.0.13, 19.0.14, 19.1.0
info · registry-verified · 2025-04-02 · 1y ago
BURST
2 releases in 0m: 19.1.3, 18.3.21
info · registry-verified · 2025-05-06 · 1y ago
BURST
4 releases in 0m: 19.1.5, 18.3.22, 17.0.86, 16.14.64
info · registry-verified · 2025-05-21 · 1y ago
BURST
4 releases in 0m: 19.1.6, 18.3.23, 17.0.87, 16.14.65
info · registry-verified · 2025-05-27 · 1y ago
BURST
5 releases in 0m: 19.1.11, 18.3.24, 17.0.88, 16.14.66, 15.7.32
info · registry-verified · 2025-08-22 · 10mo ago
BURST
2 releases in 8m: 15.7.33, 15.7.34
info · registry-verified · 2025-08-22 · 10mo ago
BURST
2 releases in 0m: 19.1.16, 18.3.25
info · registry-verified · 2025-09-30 · 9mo ago
BURST
4 releases in 0m: 19.2.1, 18.3.26, 17.0.89, 16.14.67
info · registry-verified · 2025-10-06 · 9mo ago
BURST
4 releases in 0m: 19.2.6, 18.3.27, 17.0.90, 16.14.68
info · registry-verified · 2025-11-18 · 7mo ago
BURST
6 releases in 27m: 19.2.12, 18.3.28, 17.0.91, 16.14.69, 15.7.36, 19.2.13
info · registry-verified · 2026-02-05 · 5mo ago
BURST
5 releases in 0m: 19.2.15, 18.3.29, 17.0.92, 16.14.70, 15.7.37
info · registry-verified · 2026-05-19 · 1mo ago
BURST
3 releases in 0m: 19.2.16, 18.3.30, 17.0.93 · ACTIVE
info · registry-verified · 2026-06-01 · 1mo ago
BURST
2 releases in 0m: 19.2.17, 18.3.31 · ACTIVE
info · registry-verified · 2026-06-05 · 1mo ago
release diff 19.2.17 → 18.3.31
+0 added · -1 removed · ~10 modified
--- +++ @@ -32,69 +32,51 @@ -type NativeSubmitEvent = SubmitEvent;+type NativeToggleEvent = ToggleEvent; declare module "." {+ export type Usable<T> = PromiseLike<T> | Context<T>;++ export function use<T>(usable: Usable<T>): T;++ interface ServerContextJSONArray extends ReadonlyArray<ServerContextJSONValue> {}+ export type ServerContextJSONValue =+ | string+ | boolean+ | number+ | null+ | ServerContextJSONArray+ | { [key: string]: ServerContextJSONValue };+ export interface ServerContext<T extends ServerContextJSONValue> {+ Provider: Provider<T>;+ }+ /**+ * Accepts a context object (the value returned from `React.createContext` or `React.createServerContext`) and returns the current+ * context value, as given by the nearest context provider for the given context.+ *+ * @version 16.8.0+ * @see {@link https://react.dev/reference/react/useContext}+ */+ function useContext<T extends ServerContextJSONValue>(context: ServerContext<T>): T;+ export function createServerContext<T extends ServerContextJSONValue>(+ globalName: string,+ defaultValue: T,+ ): ServerContext<T>;++ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type+ export function cache<CachedFunction extends Function>(fn: CachedFunction): CachedFunction;+ export function unstable_useCacheRefresh(): () => void; - // @enableViewTransition- export interface ViewTransitionInstance {- /**- * The {@link ViewTransitionProps name} that was used in the corresponding {@link ViewTransition} component or `"auto"` if the `name` prop was omitted.- */- name: string;+ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS {+ functions: (formData: FormData) => void | Promise<void>; } - export type ViewTransitionClassPerType = Record<"default" | (string & {}), "none" | "auto" | (string & {})>;- export type ViewTransitionClass = ViewTransitionClassPerType | ViewTransitionClassPerType[string];-- export interface ViewTransitionProps {- children?: ReactNode | undefined;+ export interface TransitionStartFunction { /**- * Assigns the {@link https://developer.chrome.com/blog/view-transitions-update-io24#view-transition-class `view-transition-class`} class to the underlying DOM node.+ * Marks all state updates inside the async function as transitions+ *+ * @see {https://react.dev/reference/react/useTransition#starttransition}+ *+ * @param callback */- default?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` or its parent Component is mounted and there's no other with the same name being deleted.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- enter?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` or its parent Component is unmounted and there's no other with the same name being deleted.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- exit?: ViewTransitionClass | undefined;- /**- * "auto" will automatically assign a view-transition-name to the inner DOM node.- * That way you can add a View Transition to a Component without controlling its DOM nodes styling otherwise.- *- * A difference between this and the browser's built-in view-transition-name: auto is that switching the DOM nodes within the `<ViewTransition>` component preserves the same name so this example cross-fades between the DOM nodes instead of causing an exit and enter.- * @default "auto"- */- name?: "auto" | (string & {}) | undefined;- /**- * The `<ViewTransition>` or its parent Component is mounted and there's no other `<ViewTransition>` with the same name being deleted.- */- onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * The `<ViewTransition>` or its parent Component is unmounted and there's no other `<ViewTransition>` with the same name being deleted.- */- onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * This `<ViewTransition>` is being mounted and another `<ViewTransition>` instance with the same name is being unmounted elsewhere.- */- onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * The content of `<ViewTransition>` has changed either due to DOM mutations or because an inner child `<ViewTransition>` has resized.- */- onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- ref?: Ref<ViewTransitionInstance> | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` is being mounted and another instance with the same name is being unmounted elsewhere.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- share?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if the content of this `<ViewTransition>` has changed either due to DOM mutations or because an inner child has resized.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- update?: ViewTransitionClass | undefined;+ (callback: () => Promise<VoidOrUndefinedOnly>): void; }@@ -102,27 +84,82 @@ /**- * Opt-in for using {@link https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API View Transitions} in React.- * View Transitions only trigger for async updates like {@link startTransition}, {@link useDeferredValue}, Actions or <{@link Suspense}> revealing from fallback to content.- * Synchronous updates provide an opt-out but also guarantee that they commit immediately which View Transitions can't.+ * Similar to `useTransition` but allows uses where hooks are not available. *- * @see {@link https://react.dev/reference/react/ViewTransition `<ViewTransition>` reference documentation}+ * @param callback An _asynchronous_ function which causes state updates that can be deferred. */- export const ViewTransition: ExoticComponent<ViewTransitionProps>;+ export function startTransition(scope: () => Promise<VoidOrUndefinedOnly>): void;++ export function useOptimistic<State>(+ passthrough: State,+ ): [State, (action: State | ((pendingState: State) => State)) => void];+ export function useOptimistic<State, Action>(+ passthrough: State,+ reducer: (state: State, action: Action) => State,+ ): [State, (action: Action) => void];++ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES {+ cleanup: () => VoidOrUndefinedOnly;+ }++ export function useActionState<State>(+ action: (state: Awaited<State>) => State | Promise<State>,+ initialState: Awaited<State>,+ permalink?: string,+ ): [state: Awaited<State>, dispatch: () => void, isPending: boolean];+ export function useActionState<State, Payload>(+ action: (state: Awaited<State>, payload: Payload) => State | Promise<State>,+ initialState: Awaited<State>,+ permalink?: string,+ ): [state: Awaited<State>, dispatch: (payload: Payload) => void, isPending: boolean];++ interface DOMAttributes<T> {+ // Transition Events+ onTransitionCancel?: TransitionEventHandler<T> | undefined;+ onTransitionCancelCapture?: TransitionEventHandler<T> | undefined;+ onTransitionRun?: TransitionEventHandler<T> | undefined;+ onTransitionRunCapture?: TransitionEventHandler<T> | undefined;+ onTransitionStart?: TransitionEventHandler<T> | undefined;+ onTransitionStartCapture?: TransitionEventHandler<T> | undefined;+ }++ type ToggleEventHandler<T = Element> = EventHandler<ToggleEvent<T>>;++ interface HTMLAttributes<T> {+ popover?: "" | "auto" | "manual" | "hint" | undefined;+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined;+ popoverTarget?: string | undefined;+ onToggle?: ToggleEventHandler<T> | undefined;+ onBeforeToggle?: ToggleEventHandler<T> | undefined;+ }++ interface ToggleEvent<T = Element> extends SyntheticEvent<T, NativeToggleEvent> {+ oldState: "closed" | "open";+ newState: "closed" | "open";+ }++ interface LinkHTMLAttributes<T> {+ precedence?: string | undefined;+ }++ interface StyleHTMLAttributes<T> {+ href?: string | undefined;+ precedence?: string | undefined;+ } /**- * @see {@link https://react.dev/reference/react/addTransitionType `addTransitionType` reference documentation}+ * @internal Use `Awaited<ReactNode>` instead */- export function addTransitionType(type: string): void;-- // @enableFragmentRefs- export interface FragmentInstance {}-- export interface FragmentProps {- ref?: Ref<FragmentInstance> | undefined;- }-- interface SubmitEvent<T = Element> extends SyntheticEvent<T, NativeSubmitEvent> {- /**- * Only available in react@canary- */- submitter: HTMLElement | null;+ // Helper type to enable `Awaited<ReactNode>`.+ // Must be a copy of the non-thenables of `ReactNode`.+ type AwaitedReactNode =+ | ReactElement+ | string+ | number+ | Iterable<AwaitedReactNode>+ | ReactPortal+ | boolean+ | null+ | undefined;+ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES {+ promises: Promise<AwaitedReactNode>;+ bigints: bigint; }
--- +++ @@ -45,3 +45,2 @@ export interface SuspenseProps {- // @enableCPUSuspense /**@@ -51,12 +50,9 @@ */- defer?: boolean | undefined;+ unstable_expectedLoadTime?: number | undefined; } - export type SuspenseListRevealOrder = "forwards" | "backwards" | "together" | "independent";- export type SuspenseListTailMode = "collapsed" | "hidden" | "visible";+ export type SuspenseListRevealOrder = "forwards" | "backwards" | "together";+ export type SuspenseListTailMode = "collapsed" | "hidden"; export interface SuspenseListCommonProps {- }-- interface DirectionalSuspenseListProps extends SuspenseListCommonProps { /**@@ -68,8 +64,10 @@ */- children: Iterable<ReactElement> | AsyncIterable<ReactElement>;+ children: ReactElement | Iterable<ReactElement>;+ }++ interface DirectionalSuspenseListProps extends SuspenseListCommonProps { /** * Defines the order in which the `SuspenseList` children should be revealed.- * @default "forwards" */- revealOrder?: "forwards" | "backwards" | "unstable_legacy-backwards" | undefined;+ revealOrder: "forwards" | "backwards"; /**@@ -77,7 +75,5 @@ *+ * - By default, `SuspenseList` will show all fallbacks in the list. * - `collapsed` shows only the next fallback in the list.- * - `hidden` doesn't show any unloaded items.- * - `visible` shows all fallbacks in the list.- *- * @default "hidden"+ * - `hidden` doesn’t show any unloaded items. */@@ -87,3 +83,2 @@ interface NonDirectionalSuspenseListProps extends SuspenseListCommonProps {- children: ReactNode; /**@@ -91,3 +86,3 @@ */- revealOrder: Exclude<SuspenseListRevealOrder, DirectionalSuspenseListProps["revealOrder"]>;+ revealOrder?: Exclude<SuspenseListRevealOrder, DirectionalSuspenseListProps["revealOrder"]> | undefined; /**@@ -95,3 +90,3 @@ */- tail?: never;+ tail?: never | undefined; }@@ -113,2 +108,10 @@ + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type+ export function experimental_useEffectEvent<T extends Function>(event: T): T;++ /**+ * Warning: Only available in development builds.+ */+ function captureOwnerStack(): string | null;+ type Reference = object;@@ -122,62 +125,7 @@ - // @enableGestureTransition- // Implemented by the specific renderer e.g. `react-dom`.- // Keep in mind that augmented interfaces merge their JSDoc so if you put- // JSDoc here and in the renderer, the IDE will display both.- export interface GestureProvider {}- export interface GestureOptions {- rangeStart?: number | undefined;- rangeEnd?: number | undefined;- }- export type GestureOptionsRequired = {- [P in keyof GestureOptions]-?: NonNullable<GestureOptions[P]>;- };- /** */- export function unstable_startGestureTransition(- provider: GestureProvider,- scope: () => void,- options?: GestureOptions,- ): () => void;-- interface ViewTransitionProps {- onGestureEnter?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureExit?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureShare?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureUpdate?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- }-- // @enableSrcObject- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES {- srcObject: Blob;- }-- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES {- srcObject: Blob | MediaSource | MediaStream;- }-- // @enableOptimisticKey- export const optimisticKey: unique symbol;-- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES {- optimisticKey: typeof optimisticKey;+ export interface HTMLAttributes<T> {+ /**+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/inert}+ */+ inert?: boolean | undefined; }
--- +++ @@ -20,3 +20,2 @@ interface PointerEvent extends Event {}-interface SubmitEvent extends Event {} interface ToggleEvent extends Event {}@@ -162,5 +161 @@ interface TrustedHTML {}--interface Blob {}-interface MediaStream {}-interface MediaSource {}
--- +++ @@ -7,2 +7,3 @@ import * as CSS from "csstype";+import * as PropTypes from "prop-types"; @@ -18,4 +19,2 @@ type NativePointerEvent = PointerEvent;-type NativeSubmitEvent = SubmitEvent;-type NativeToggleEvent = ToggleEvent; type NativeTransitionEvent = TransitionEvent;@@ -36,21 +35,2 @@ declare const UNDEFINED_VOID_ONLY: unique symbol;--/**- * @internal Use `Awaited<ReactNode>` instead- */-// Helper type to enable `Awaited<ReactNode>`.-// Must be a copy of the non-thenables of `ReactNode`.-type AwaitedReactNode =- | React.ReactElement- | string- | number- | bigint- | Iterable<React.ReactNode>- | React.ReactPortal- | boolean- | null- | undefined- | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES[- keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES- ]; @@ -116,3 +96,4 @@ * Similar to {@link JSXElementConstructor}, but with extra properties like- * {@link FunctionComponent.defaultProps defaultProps }.+ * {@link FunctionComponent.defaultProps defaultProps } and+ * {@link ComponentClass.contextTypes contextTypes}. *@@ -129,3 +110,4 @@ * Similar to {@link ComponentType}, but without extra properties like- * {@link FunctionComponent.defaultProps defaultProps }.+ * {@link FunctionComponent.defaultProps defaultProps } and+ * {@link ComponentClass.contextTypes contextTypes}. *@@ -136,7 +118,22 @@ props: P,- ) => ReactNode | Promise<ReactNode>)- // constructor signature must match React.Component- | (new(props: P, context: any) => Component<any, any>);-- /**+ /**+ * @deprecated+ *+ * @see {@link https://legacy.reactjs.org/docs/legacy-context.html#referencing-context-in-stateless-function-components React Docs}+ */+ deprecatedLegacyContext?: any,+ ) => ReactNode)+ | (new(+ props: P,+ /**+ * @deprecated+ *+ * @see {@link https://legacy.reactjs.org/docs/legacy-context.html#referencing-context-in-lifecycle-methods React Docs}+ */+ deprecatedLegacyContext?: any,+ ) => Component<any, any>);++ /**+ * A readonly ref container where {@link current} cannot be mutated.+ * * Created by {@link createRef}, or {@link useRef} when passed `null`.@@ -157,3 +154,3 @@ */- current: T;+ readonly current: T | null; }@@ -180,3 +177,2 @@ | void- | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[@@ -193,11 +189,18 @@ - type Ref<T> = RefCallback<T> | RefObject<T | null> | null;- /**- * @deprecated Use `Ref` instead. String refs are no longer supported.- * If you're typing a library with support for React versions with string refs, use `RefAttributes<T>['ref']` instead.- */- type LegacyRef<T> = Ref<T>;- /**- * @deprecated Use `ComponentRef<T>` instead- *+ type Ref<T> = RefCallback<T> | RefObject<T> | null;+ /**+ * A legacy implementation of refs where you can pass a string to a ref prop.+ *+ * @see {@link https://react.dev/reference/react/Component#refs React Docs}+ *+ * @example+ *+ * ```tsx+ * <div ref="myRef" />+ * ```+ */+ // TODO: Remove the string ref special case from `PropsWithRef` once we remove LegacyRef+ type LegacyRef<T> = string | Ref<T>;++ /** * Retrieves the type of the 'ref' prop for a given component type or tag name.@@ -221,6 +224,14 @@ | ForwardRefExoticComponent<any>- | { new(props: any, context: any): Component<any> }- | ((props: any) => ReactNode)+ | { new(props: any): Component<any> }+ | ((props: any, deprecatedLegacyContext?: any) => ReactNode) | keyof JSX.IntrinsicElements,- > = ComponentRef<C>;+ > =+ // need to check first if `ref` is a valid prop for [email protected]+ // otherwise it will infer `{}` instead of `never`+ "ref" extends keyof ComponentPropsWithRef<C>+ ? NonNullable<ComponentPropsWithRef<C>["ref"]> extends RefAttributes<+ infer Instance+ >["ref"] ? Instance+ : never+ : never; @@ -228,4 +239,2 @@ - interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES {}- /**@@ -235,9 +244,3 @@ */- type Key =- | string- | number- | bigint- | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES[- keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES- ];+ type Key = string | number | bigint; @@ -300,3 +303,3 @@ */- ref?: Ref<T> | undefined;+ ref?: LegacyRef<T> | undefined; }@@ -325,3 +328,3 @@ interface ReactElement<- P = unknown,+ P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>,@@ -341,9 +344,3 @@ - /**- * @deprecated Use `ReactElement<P, React.FunctionComponent<P>>`- */ interface FunctionComponentElement<P> extends ReactElement<P, FunctionComponent<P>> {- /**- * @deprecated Use `element.props.ref` instead.- */ ref?: ("ref" extends keyof P ? P extends { ref?: infer R | undefined } ? R : never : never) | undefined;@@ -351,14 +348,5 @@ - /**- * @deprecated Use `ReactElement<P, React.ComponentClass<P>>`- */ type CElement<P, T extends Component<P, ComponentState>> = ComponentElement<P, T>;- /**- * @deprecated Use `ReactElement<P, React.ComponentClass<P>>`- */ interface ComponentElement<P, T extends Component<P, ComponentState>> extends ReactElement<P, ComponentClass<P>> {- /**- * @deprecated Use `element.props.ref` instead.- */- ref?: Ref<T> | undefined;+ ref?: LegacyRef<T> | undefined; }@@ -371,5 +359,2 @@ // string fallback for custom web-components- /**- * @deprecated Use `ReactElement<P, string>`- */ interface DOMElement<P extends HTMLAttributes<T> | SVGAttributes<T>, T extends Element>@@ -377,6 +362,3 @@ {- /**- * @deprecated Use `element.props.ref` instead.- */- ref: Ref<T>;+ ref: LegacyRef<T>; }@@ -387,3 +369,3 @@ interface DetailedReactHTMLElement<P extends HTMLAttributes<T>, T extends HTMLElement> extends DOMElement<P, T> {- type: HTMLElementType;+ type: keyof ReactHTML; }@@ -392,3 +374,3 @@ interface ReactSVGElement extends DOMElement<SVGAttributes<SVGElement>, SVGElement> {- type: SVGElementType;+ type: keyof ReactSVG; }@@ -398,2 +380,70 @@ }++ //+ // Factories+ // ----------------------------------------------------------------------++ /** @deprecated */+ type Factory<P> = (props?: Attributes & P, ...children: ReactNode[]) => ReactElement<P>;++ /** @deprecated */+ type SFCFactory<P> = FunctionComponentFactory<P>;++ /** @deprecated */+ type FunctionComponentFactory<P> = (+ props?: Attributes & P,+ ...children: ReactNode[]+ ) => FunctionComponentElement<P>;++ /** @deprecated */+ type ComponentFactory<P, T extends Component<P, ComponentState>> = (+ props?: ClassAttributes<T> & P,+ ...children: ReactNode[]+ ) => CElement<P, T>;++ /** @deprecated */+ type CFactory<P, T extends Component<P, ComponentState>> = ComponentFactory<P, T>;+ /** @deprecated */+ type ClassicFactory<P> = CFactory<P, ClassicComponent<P, ComponentState>>;++ /** @deprecated */+ type DOMFactory<P extends DOMAttributes<T>, T extends Element> = (+ props?: ClassAttributes<T> & P | null,+ ...children: ReactNode[]+ ) => DOMElement<P, T>;++ /** @deprecated */+ interface HTMLFactory<T extends HTMLElement> extends DetailedHTMLFactory<AllHTMLAttributes<T>, T> {}++ /** @deprecated */+ interface DetailedHTMLFactory<P extends HTMLAttributes<T>, T extends HTMLElement> extends DOMFactory<P, T> {+ (props?: ClassAttributes<T> & P | null, ...children: ReactNode[]): DetailedReactHTMLElement<P, T>;+ }++ /** @deprecated */+ interface SVGFactory extends DOMFactory<SVGAttributes<SVGElement>, SVGElement> {
… 1504 more lines (truncated)
--- +++ @@ -2,3 +2,3 @@ "name": "@types/react",- "version": "19.2.17",+ "version": "18.3.31", "description": "TypeScript definitions for react",@@ -166,7 +166,2 @@ },- "./compiler-runtime": {- "types": {- "default": "./compiler-runtime.d.ts"- }- }, "./experimental": {@@ -204,2 +199,3 @@ "dependencies": {+ "@types/prop-types": "*", "csstype": "^3.2.2"@@ -207,3 +203,3 @@ "peerDependencies": {},- "typesPublisherContentHash": "f6d087e89b6a483b6ea2519d4f16498227ceb3260f6a6414fed750badc869721",+ "typesPublisherContentHash": "8ee185c606f82e91e22bd6c41a581f0b284f09472333a0d30863f96a4e72d74a", "typeScriptVersion": "5.3"
--- +++ @@ -32,69 +32,51 @@ -type NativeSubmitEvent = SubmitEvent;+type NativeToggleEvent = ToggleEvent; declare module "." {+ export type Usable<T> = PromiseLike<T> | Context<T>;++ export function use<T>(usable: Usable<T>): T;++ interface ServerContextJSONArray extends ReadonlyArray<ServerContextJSONValue> {}+ export type ServerContextJSONValue =+ | string+ | boolean+ | number+ | null+ | ServerContextJSONArray+ | { [key: string]: ServerContextJSONValue };+ export interface ServerContext<T extends ServerContextJSONValue> {+ Provider: Provider<T>;+ }+ /**+ * Accepts a context object (the value returned from `React.createContext` or `React.createServerContext`) and returns the current+ * context value, as given by the nearest context provider for the given context.+ *+ * @version 16.8.0+ * @see {@link https://react.dev/reference/react/useContext}+ */+ function useContext<T extends ServerContextJSONValue>(context: ServerContext<T>): T;+ export function createServerContext<T extends ServerContextJSONValue>(+ globalName: string,+ defaultValue: T,+ ): ServerContext<T>;++ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type+ export function cache<CachedFunction extends Function>(fn: CachedFunction): CachedFunction;+ export function unstable_useCacheRefresh(): () => void; - // @enableViewTransition- export interface ViewTransitionInstance {- /**- * The {@link ViewTransitionProps name} that was used in the corresponding {@link ViewTransition} component or `"auto"` if the `name` prop was omitted.- */- name: string;+ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS {+ functions: (formData: FormData) => void | Promise<void>; } - export type ViewTransitionClassPerType = Record<"default" | (string & {}), "none" | "auto" | (string & {})>;- export type ViewTransitionClass = ViewTransitionClassPerType | ViewTransitionClassPerType[string];-- export interface ViewTransitionProps {- children?: ReactNode | undefined;+ export interface TransitionStartFunction { /**- * Assigns the {@link https://developer.chrome.com/blog/view-transitions-update-io24#view-transition-class `view-transition-class`} class to the underlying DOM node.+ * Marks all state updates inside the async function as transitions+ *+ * @see {https://react.dev/reference/react/useTransition#starttransition}+ *+ * @param callback */- default?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` or its parent Component is mounted and there's no other with the same name being deleted.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- enter?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` or its parent Component is unmounted and there's no other with the same name being deleted.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- exit?: ViewTransitionClass | undefined;- /**- * "auto" will automatically assign a view-transition-name to the inner DOM node.- * That way you can add a View Transition to a Component without controlling its DOM nodes styling otherwise.- *- * A difference between this and the browser's built-in view-transition-name: auto is that switching the DOM nodes within the `<ViewTransition>` component preserves the same name so this example cross-fades between the DOM nodes instead of causing an exit and enter.- * @default "auto"- */- name?: "auto" | (string & {}) | undefined;- /**- * The `<ViewTransition>` or its parent Component is mounted and there's no other `<ViewTransition>` with the same name being deleted.- */- onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * The `<ViewTransition>` or its parent Component is unmounted and there's no other `<ViewTransition>` with the same name being deleted.- */- onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * This `<ViewTransition>` is being mounted and another `<ViewTransition>` instance with the same name is being unmounted elsewhere.- */- onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- /**- * The content of `<ViewTransition>` has changed either due to DOM mutations or because an inner child `<ViewTransition>` has resized.- */- onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);- ref?: Ref<ViewTransitionInstance> | undefined;- /**- * Combined with {@link className} if this `<ViewTransition>` is being mounted and another instance with the same name is being unmounted elsewhere.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- share?: ViewTransitionClass | undefined;- /**- * Combined with {@link className} if the content of this `<ViewTransition>` has changed either due to DOM mutations or because an inner child has resized.- * `"none"` is a special value that deactivates the view transition name under that condition.- */- update?: ViewTransitionClass | undefined;+ (callback: () => Promise<VoidOrUndefinedOnly>): void; }@@ -102,27 +84,82 @@ /**- * Opt-in for using {@link https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API View Transitions} in React.- * View Transitions only trigger for async updates like {@link startTransition}, {@link useDeferredValue}, Actions or <{@link Suspense}> revealing from fallback to content.- * Synchronous updates provide an opt-out but also guarantee that they commit immediately which View Transitions can't.+ * Similar to `useTransition` but allows uses where hooks are not available. *- * @see {@link https://react.dev/reference/react/ViewTransition `<ViewTransition>` reference documentation}+ * @param callback An _asynchronous_ function which causes state updates that can be deferred. */- export const ViewTransition: ExoticComponent<ViewTransitionProps>;+ export function startTransition(scope: () => Promise<VoidOrUndefinedOnly>): void;++ export function useOptimistic<State>(+ passthrough: State,+ ): [State, (action: State | ((pendingState: State) => State)) => void];+ export function useOptimistic<State, Action>(+ passthrough: State,+ reducer: (state: State, action: Action) => State,+ ): [State, (action: Action) => void];++ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES {+ cleanup: () => VoidOrUndefinedOnly;+ }++ export function useActionState<State>(+ action: (state: Awaited<State>) => State | Promise<State>,+ initialState: Awaited<State>,+ permalink?: string,+ ): [state: Awaited<State>, dispatch: () => void, isPending: boolean];+ export function useActionState<State, Payload>(+ action: (state: Awaited<State>, payload: Payload) => State | Promise<State>,+ initialState: Awaited<State>,+ permalink?: string,+ ): [state: Awaited<State>, dispatch: (payload: Payload) => void, isPending: boolean];++ interface DOMAttributes<T> {+ // Transition Events+ onTransitionCancel?: TransitionEventHandler<T> | undefined;+ onTransitionCancelCapture?: TransitionEventHandler<T> | undefined;+ onTransitionRun?: TransitionEventHandler<T> | undefined;+ onTransitionRunCapture?: TransitionEventHandler<T> | undefined;+ onTransitionStart?: TransitionEventHandler<T> | undefined;+ onTransitionStartCapture?: TransitionEventHandler<T> | undefined;+ }++ type ToggleEventHandler<T = Element> = EventHandler<ToggleEvent<T>>;++ interface HTMLAttributes<T> {+ popover?: "" | "auto" | "manual" | "hint" | undefined;+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined;+ popoverTarget?: string | undefined;+ onToggle?: ToggleEventHandler<T> | undefined;+ onBeforeToggle?: ToggleEventHandler<T> | undefined;+ }++ interface ToggleEvent<T = Element> extends SyntheticEvent<T, NativeToggleEvent> {+ oldState: "closed" | "open";+ newState: "closed" | "open";+ }++ interface LinkHTMLAttributes<T> {+ precedence?: string | undefined;+ }++ interface StyleHTMLAttributes<T> {+ href?: string | undefined;+ precedence?: string | undefined;+ } /**- * @see {@link https://react.dev/reference/react/addTransitionType `addTransitionType` reference documentation}+ * @internal Use `Awaited<ReactNode>` instead */- export function addTransitionType(type: string): void;-- // @enableFragmentRefs- export interface FragmentInstance {}-- export interface FragmentProps {- ref?: Ref<FragmentInstance> | undefined;- }-- interface SubmitEvent<T = Element> extends SyntheticEvent<T, NativeSubmitEvent> {- /**- * Only available in react@canary- */- submitter: HTMLElement | null;+ // Helper type to enable `Awaited<ReactNode>`.+ // Must be a copy of the non-thenables of `ReactNode`.+ type AwaitedReactNode =+ | ReactElement+ | string+ | number+ | Iterable<AwaitedReactNode>+ | ReactPortal+ | boolean+ | null+ | undefined;+ interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES {+ promises: Promise<AwaitedReactNode>;+ bigints: bigint; }
--- +++ @@ -45,3 +45,2 @@ export interface SuspenseProps {- // @enableCPUSuspense /**@@ -51,12 +50,9 @@ */- defer?: boolean | undefined;+ unstable_expectedLoadTime?: number | undefined; } - export type SuspenseListRevealOrder = "forwards" | "backwards" | "together" | "independent";- export type SuspenseListTailMode = "collapsed" | "hidden" | "visible";+ export type SuspenseListRevealOrder = "forwards" | "backwards" | "together";+ export type SuspenseListTailMode = "collapsed" | "hidden"; export interface SuspenseListCommonProps {- }-- interface DirectionalSuspenseListProps extends SuspenseListCommonProps { /**@@ -68,8 +64,10 @@ */- children: Iterable<ReactElement> | AsyncIterable<ReactElement>;+ children: ReactElement | Iterable<ReactElement>;+ }++ interface DirectionalSuspenseListProps extends SuspenseListCommonProps { /** * Defines the order in which the `SuspenseList` children should be revealed.- * @default "forwards" */- revealOrder?: "forwards" | "backwards" | "unstable_legacy-backwards" | undefined;+ revealOrder: "forwards" | "backwards"; /**@@ -77,7 +75,5 @@ *+ * - By default, `SuspenseList` will show all fallbacks in the list. * - `collapsed` shows only the next fallback in the list.- * - `hidden` doesn't show any unloaded items.- * - `visible` shows all fallbacks in the list.- *- * @default "hidden"+ * - `hidden` doesn’t show any unloaded items. */@@ -87,3 +83,2 @@ interface NonDirectionalSuspenseListProps extends SuspenseListCommonProps {- children: ReactNode; /**@@ -91,3 +86,3 @@ */- revealOrder: Exclude<SuspenseListRevealOrder, DirectionalSuspenseListProps["revealOrder"]>;+ revealOrder?: Exclude<SuspenseListRevealOrder, DirectionalSuspenseListProps["revealOrder"]> | undefined; /**@@ -95,3 +90,3 @@ */- tail?: never;+ tail?: never | undefined; }@@ -113,2 +108,10 @@ + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type+ export function experimental_useEffectEvent<T extends Function>(event: T): T;++ /**+ * Warning: Only available in development builds.+ */+ function captureOwnerStack(): string | null;+ type Reference = object;@@ -122,62 +125,7 @@ - // @enableGestureTransition- // Implemented by the specific renderer e.g. `react-dom`.- // Keep in mind that augmented interfaces merge their JSDoc so if you put- // JSDoc here and in the renderer, the IDE will display both.- export interface GestureProvider {}- export interface GestureOptions {- rangeStart?: number | undefined;- rangeEnd?: number | undefined;- }- export type GestureOptionsRequired = {- [P in keyof GestureOptions]-?: NonNullable<GestureOptions[P]>;- };- /** */- export function unstable_startGestureTransition(- provider: GestureProvider,- scope: () => void,- options?: GestureOptions,- ): () => void;-- interface ViewTransitionProps {- onGestureEnter?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureExit?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureShare?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- onGestureUpdate?: (- timeline: GestureProvider,- options: GestureOptionsRequired,- instance: ViewTransitionInstance,- types: Array<string>,- ) => void | (() => void);- }-- // @enableSrcObject- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES {- srcObject: Blob;- }-- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES {- srcObject: Blob | MediaSource | MediaStream;- }-- // @enableOptimisticKey- export const optimisticKey: unique symbol;-- interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES {- optimisticKey: typeof optimisticKey;+ export interface HTMLAttributes<T> {+ /**+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/inert}+ */+ inert?: boolean | undefined; }
--- +++ @@ -20,3 +20,2 @@ interface PointerEvent extends Event {}-interface SubmitEvent extends Event {} interface ToggleEvent extends Event {}@@ -162,5 +161 @@ interface TrustedHTML {}--interface Blob {}-interface MediaStream {}-interface MediaSource {}
--- +++ @@ -7,2 +7,3 @@ import * as CSS from "csstype";+import * as PropTypes from "prop-types"; @@ -18,4 +19,2 @@ type NativePointerEvent = PointerEvent;-type NativeSubmitEvent = SubmitEvent;-type NativeToggleEvent = ToggleEvent; type NativeTransitionEvent = TransitionEvent;@@ -36,21 +35,2 @@ declare const UNDEFINED_VOID_ONLY: unique symbol;--/**- * @internal Use `Awaited<ReactNode>` instead- */-// Helper type to enable `Awaited<ReactNode>`.-// Must be a copy of the non-thenables of `ReactNode`.-type AwaitedReactNode =- | React.ReactElement- | string- | number- | bigint- | Iterable<React.ReactNode>- | React.ReactPortal- | boolean- | null- | undefined- | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES[- keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES- ]; @@ -116,3 +96,4 @@ * Similar to {@link JSXElementConstructor}, but with extra properties like- * {@link FunctionComponent.defaultProps defaultProps }.+ * {@link FunctionComponent.defaultProps defaultProps } and+ * {@link ComponentClass.contextTypes contextTypes}. *@@ -129,3 +110,4 @@ * Similar to {@link ComponentType}, but without extra properties like- * {@link FunctionComponent.defaultProps defaultProps }.+ * {@link FunctionComponent.defaultProps defaultProps } and+ * {@link ComponentClass.contextTypes contextTypes}. *@@ -136,7 +118,22 @@ props: P,+ /**+ * @deprecated+ *+ * @see {@link https://legacy.reactjs.org/docs/legacy-context.html#referencing-context-in-stateless-function-components React Docs}+ */+ deprecatedLegacyContext?: any, ) => ReactElement<any, any> | null)- // constructor signature must match React.Component- | (new(props: P, context: any) => Component<any, any>);-- /**+ | (new(+ props: P,+ /**+ * @deprecated+ *+ * @see {@link https://legacy.reactjs.org/docs/legacy-context.html#referencing-context-in-lifecycle-methods React Docs}+ */+ deprecatedLegacyContext?: any,+ ) => Component<any, any>);++ /**+ * A readonly ref container where {@link current} cannot be mutated.+ * * Created by {@link createRef}, or {@link useRef} when passed `null`.@@ -157,3 +154,3 @@ */- current: T;+ readonly current: T | null; }@@ -180,3 +177,2 @@ | void- | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[@@ -193,11 +189,18 @@ - type Ref<T> = RefCallback<T> | RefObject<T | null> | null;- /**- * @deprecated Use `Ref` instead. String refs are no longer supported.- * If you're typing a library with support for React versions with string refs, use `RefAttributes<T>['ref']` instead.- */- type LegacyRef<T> = Ref<T>;- /**- * @deprecated Use `ComponentRef<T>` instead- *+ type Ref<T> = RefCallback<T> | RefObject<T> | null;+ /**+ * A legacy implementation of refs where you can pass a string to a ref prop.+ *+ * @see {@link https://react.dev/reference/react/Component#refs React Docs}+ *+ * @example+ *+ * ```tsx+ * <div ref="myRef" />+ * ```+ */+ // TODO: Remove the string ref special case from `PropsWithRef` once we remove LegacyRef+ type LegacyRef<T> = string | Ref<T>;++ /** * Retrieves the type of the 'ref' prop for a given component type or tag name.@@ -221,6 +224,14 @@ | ForwardRefExoticComponent<any>- | { new(props: any, context: any): Component<any> }- | ((props: any) => ReactElement | null)+ | { new(props: any): Component<any> }+ | ((props: any, deprecatedLegacyContext?: any) => ReactElement | null) | keyof JSX.IntrinsicElements,- > = ComponentRef<C>;+ > =+ // need to check first if `ref` is a valid prop for [email protected]+ // otherwise it will infer `{}` instead of `never`+ "ref" extends keyof ComponentPropsWithRef<C>+ ? NonNullable<ComponentPropsWithRef<C>["ref"]> extends RefAttributes<+ infer Instance+ >["ref"] ? Instance+ : never+ : never; @@ -228,4 +239,2 @@ - interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES {}- /**@@ -235,9 +244,3 @@ */- type Key =- | string- | number- | bigint- | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES[- keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES- ];+ type Key = string | number | bigint; @@ -300,3 +303,3 @@ */- ref?: Ref<T> | undefined;+ ref?: LegacyRef<T> | undefined; }@@ -325,3 +328,3 @@ interface ReactElement<- P = unknown,+ P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>,@@ -341,9 +344,3 @@ - /**- * @deprecated Use `ReactElement<P, React.FunctionComponent<P>>`- */ interface FunctionComponentElement<P> extends ReactElement<P, FunctionComponent<P>> {- /**- * @deprecated Use `element.props.ref` instead.- */ ref?: ("ref" extends keyof P ? P extends { ref?: infer R | undefined } ? R : never : never) | undefined;@@ -351,14 +348,5 @@ - /**- * @deprecated Use `ReactElement<P, React.ComponentClass<P>>`- */ type CElement<P, T extends Component<P, ComponentState>> = ComponentElement<P, T>;- /**- * @deprecated Use `ReactElement<P, React.ComponentClass<P>>`- */ interface ComponentElement<P, T extends Component<P, ComponentState>> extends ReactElement<P, ComponentClass<P>> {- /**- * @deprecated Use `element.props.ref` instead.- */- ref?: Ref<T> | undefined;+ ref?: LegacyRef<T> | undefined; }@@ -371,5 +359,2 @@ // string fallback for custom web-components- /**- * @deprecated Use `ReactElement<P, string>`- */ interface DOMElement<P extends HTMLAttributes<T> | SVGAttributes<T>, T extends Element>@@ -377,6 +362,3 @@ {- /**- * @deprecated Use `element.props.ref` instead.- */- ref: Ref<T>;+ ref: LegacyRef<T>; }@@ -387,3 +369,3 @@ interface DetailedReactHTMLElement<P extends HTMLAttributes<T>, T extends HTMLElement> extends DOMElement<P, T> {- type: HTMLElementType;+ type: keyof ReactHTML; }@@ -392,3 +374,3 @@ interface ReactSVGElement extends DOMElement<SVGAttributes<SVGElement>, SVGElement> {- type: SVGElementType;+ type: keyof ReactSVG; }@@ -398,2 +380,70 @@ }++ //+ // Factories+ // ----------------------------------------------------------------------++ /** @deprecated */+ type Factory<P> = (props?: Attributes & P, ...children: ReactNode[]) => ReactElement<P>;++ /** @deprecated */+ type SFCFactory<P> = FunctionComponentFactory<P>;++ /** @deprecated */+ type FunctionComponentFactory<P> = (+ props?: Attributes & P,+ ...children: ReactNode[]+ ) => FunctionComponentElement<P>;++ /** @deprecated */+ type ComponentFactory<P, T extends Component<P, ComponentState>> = (+ props?: ClassAttributes<T> & P,+ ...children: ReactNode[]+ ) => CElement<P, T>;++ /** @deprecated */+ type CFactory<P, T extends Component<P, ComponentState>> = ComponentFactory<P, T>;+ /** @deprecated */+ type ClassicFactory<P> = CFactory<P, ClassicComponent<P, ComponentState>>;++ /** @deprecated */+ type DOMFactory<P extends DOMAttributes<T>, T extends Element> = (+ props?: ClassAttributes<T> & P | null,+ ...children: ReactNode[]+ ) => DOMElement<P, T>;++ /** @deprecated */+ interface HTMLFactory<T extends HTMLElement> extends DetailedHTMLFactory<AllHTMLAttributes<T>, T> {}++ /** @deprecated */+ interface DetailedHTMLFactory<P extends HTMLAttributes<T>, T extends HTMLElement> extends DOMFactory<P, T> {+ (props?: ClassAttributes<T> & P | null, ...children: ReactNode[]): DetailedReactHTMLElement<P, T>;+ }++ /** @deprecated */+ interface SVGFactory extends DOMFactory<SVGAttributes<SVGElement>, SVGElement> {+ (
… 1490 more lines (truncated)
webpack-cli npm BURST ×8
5.1.2
5.1.3
5.1.4
6.0.0
6.0.1
7.0.0
7.0.1
7.0.2
7.0.3
7.1.0
7.2.0
7.2.1
BURST
5 releases in 41m: 1.3.4, 1.3.5, 1.3.7, 1.3.8, 1.3.9
info · registry-verified · 2017-10-05 · 8y ago
BURST
2 releases in 47m: 1.4.1, 1.4.2
info · registry-verified · 2017-10-22 · 8y ago
BURST
2 releases in 30m: 1.4.3, 1.4.4
info · registry-verified · 2017-10-26 · 8y ago
BURST
2 releases in 25m: 1.4.7, 1.4.8
info · registry-verified · 2017-12-06 · 8y ago
BURST
2 releases in 32m: 1.5.1, 1.5.2
info · registry-verified · 2017-12-09 · 8y ago
BURST
2 releases in 4m: 2.0.3, 2.0.4
info · registry-verified · 2018-01-14 · 8y ago
BURST
2 releases in 24m: 2.1.1, 2.1.2
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 54m: 3.2.2, 3.2.3
info · registry-verified · 2019-02-05 · 7y ago
release diff 7.2.0 → 7.2.1
+0 added · -0 removed · ~2 modified
--- +++ @@ -2336,3 +2336,6 @@ }- const { default: CLIPlugin } = (await import("./plugins/cli-plugin.js")).default;+ // Node's CJS interop nests the class under `.default.default`; Bun honors+ // `__esModule` and unwraps once already, leaving the class one level up.+ const cliPluginModule = (await import("./plugins/cli-plugin.js")).default;+ const CLIPlugin = cliPluginModule.default ?? cliPluginModule; // `getArguments()` already returns a name-keyed map of exactly the argument
--- +++ @@ -2,3 +2,3 @@ "name": "webpack-cli",- "version": "7.2.0",+ "version": "7.2.1", "description": "CLI for webpack & friends",
pypi — by downloads
charset-normalizer pypi critical-tier YANK
3.3.1
3.3.2
3.4.0
3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.4.6
3.4.7
3.4.8
3.4.9
YANK
3.4.8 marked yanked (still downloadable) · ACTIVE
high · registry-verified · 2026-07-06 · 6d ago
release diff 3.4.7 → 3.4.9
+0 added · -0 removed · ~17 modified
--- +++ @@ -9,3 +9,3 @@ USE_MYPYC = os.getenv("CHARSET_NORMALIZER_USE_MYPYC", "0") == "1"-MYPYC_SPEC = "mypy>=1.4.1,<=1.20"+MYPYC_SPEC = "mypy>=1.4.1,<2.2"
--- +++ @@ -1,3 +1,3 @@ [build-system]-requires = ["setuptools>=68,<82.1"]+requires = ["setuptools>=68,<83.1"] build-backend = "backend"@@ -47,6 +47,7 @@ "nox==2024.4.15; python_version == '3.7'",- "nox==2026.2.9; python_version >= '3.8'",+ "nox==2026.2.9; python_version == '3.8'",+ "nox>=2026.4.10; python_version >= '3.9'", "build==1.1.1; python_version == '3.7'", "build==1.2.2.post1; python_version == '3.8'",- "build==1.4.0; python_version >= '3.9'"+ "build==1.4.3; python_version >= '3.9'" ]@@ -55,6 +56,8 @@ "pytest==8.3.5; python_version == '3.8'",- "pytest==8.4.1; python_version >= '3.9'",+ "pytest==8.4.2; python_version == '3.9'",+ "pytest==9.0.3; python_version >= '3.10'", "coverage==7.2.7; python_version == '3.7'", "coverage==7.6.1; python_version == '3.8'",- "coverage==7.10.4; python_version >= '3.9'",+ "coverage==7.10.7; python_version == '3.9'",+ "coverage>=7.13.5; python_version >= '3.10'" ]@@ -104 +107,4 @@ warn_unused_ignores = false++[tool.codespell]+ignore-words-list = "Tham,Vai,intoto"
--- +++ @@ -3,2 +3,3 @@ import logging+from functools import lru_cache from os import PathLike@@ -41,15 +42,7 @@ # testing them first costs negligible time for non-CJK files.-_mb_supported: list[str] = []-_sb_supported: list[str] = []--for _supported_enc in IANA_SUPPORTED:- try:- if is_multi_byte_encoding(_supported_enc):- _mb_supported.append(_supported_enc)- else:- _sb_supported.append(_supported_enc)- except ImportError:- _sb_supported.append(_supported_enc)--IANA_SUPPORTED_MB_FIRST: list[str] = _mb_supported + _sb_supported+# Stable sort on a boolean key: multibyte (False) first, IANA order kept+# within each group.+IANA_SUPPORTED_MB_FIRST: list[str] = sorted(+ IANA_SUPPORTED, key=lambda encoding: not is_multi_byte_encoding(encoding)+) @@ -186,2 +179,9 @@ + # Avoid unoptimized RSS usage.+ # this cache is mostly interesting for+ # local usage. Garbage collected at the+ # end. Like it should.+ cached_mess_ratio = lru_cache(maxsize=None)(mess_ratio)+ cached_coherence_ratio = lru_cache(maxsize=None)(coherence_ratio)+ # When a definitive result (chaos=0.0 and good coherence) is found after testing@@ -348,4 +348,14 @@ + # Single-byte candidates of regular size defer the expensive whole+ # payload decode until after chunk probing: single-byte codecs are+ # stateless (1 byte == 1 char) so decoding chunk slices is provably+ # identical to slicing the decoded payload, and candidates rejected+ # by chaos probing (the common case) never pay the full decode nor+ # the payload hash.+ deferred_decoding: bool = (+ not is_multi_byte_decoder and not is_too_large_sequence+ )+ try:- if is_too_large_sequence and is_multi_byte_decoder is False:+ if is_too_large_sequence and not is_multi_byte_decoder: str(@@ -353,3 +363,3 @@ sequences[: int(50e4)]- if strip_sig_or_bom is False+ if not strip_sig_or_bom else sequences[len(sig_payload) : int(50e4)]@@ -358,3 +368,3 @@ )- else:+ elif not deferred_decoding: # UTF-7 BOM is encoded in modified Base64 whose byte boundary@@ -376,3 +386,3 @@ sequences- if strip_sig_or_bom is False+ if not strip_sig_or_bom else sequences[len(sig_payload) :]@@ -411,2 +421,175 @@ )++ max_chunk_gave_up: int = int(len(r_) / 4)++ max_chunk_gave_up = max(max_chunk_gave_up, 2)+ early_stop_count: int = 0+ lazy_str_hard_failure = False++ md_chunks: list[str] = []+ md_ratios = []++ try:+ for chunk in cut_sequence_chunks(+ sequences,+ encoding_iana,+ r_,+ chunk_size,+ bom_or_sig_available,+ strip_sig_or_bom,+ sig_payload,+ is_multi_byte_decoder,+ decoded_payload,+ deferred_decoding,+ ):+ md_chunks.append(chunk)++ md_ratios.append(+ cached_mess_ratio(+ chunk,+ threshold,+ explain and 1 <= len(cp_isolation) <= 2,+ )+ )++ if md_ratios[-1] >= threshold:+ early_stop_count += 1++ if (early_stop_count >= max_chunk_gave_up) or (+ bom_or_sig_available and not strip_sig_or_bom+ ):+ break+ except (+ UnicodeDecodeError,+ LookupError,+ ) as e: # Lazy str loading may have missed something there+ if deferred_decoding:+ # Deferred single-byte validation failed on a chunk (or the+ # codec is unavailable on this interpreter build): identical+ # outcome and bookkeeping to the eager full-decode failure.+ logger.log(+ TRACE,+ "Code page %s does not fit given bytes sequence at ALL. %s",+ encoding_iana,+ str(e),+ )+ tested_but_hard_failure.append(encoding_iana)+ continue+ logger.log(+ TRACE,+ "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s",+ encoding_iana,+ str(e),+ )+ early_stop_count = max_chunk_gave_up+ lazy_str_hard_failure = True++ # We might want to check the sequence again with the whole content+ # Only if initial MD tests passes+ if (+ not lazy_str_hard_failure+ and is_too_large_sequence+ and not is_multi_byte_decoder+ ):+ try:+ sequences[int(50e3) :].decode(encoding_iana, errors="strict")+ except UnicodeDecodeError as e:+ logger.log(+ TRACE,+ "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s",+ encoding_iana,+ str(e),+ )+ tested_but_hard_failure.append(encoding_iana)+ continue++ mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0+ if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up:+ tested_but_soft_failure.append(encoding_iana)+ if encoding_iana in IANA_SUPPORTED_SIMILAR:+ soft_failure_skip.update(IANA_SUPPORTED_SIMILAR[encoding_iana])+ # Cache this soft-failure so identical decoding from other encodings+ # can be skipped immediately.+ if decoded_payload is not None and not is_multi_byte_decoder:+ payload_result_cache.setdefault(+ hash(decoded_payload), (mean_mess_ratio, [], False)+ )+ logger.log(+ TRACE,+ "%s was excluded because of initial chaos probing. Gave up %i time(s). "+ "Computed mean chaos is %f %%.",+ encoding_iana,+ early_stop_count,+ round(mean_mess_ratio * 100, ndigits=3),+ )+ # Preparing those fallbacks in case we got nothing.+ if (+ enable_fallback+ and encoding_iana+ in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"]+ and not lazy_str_hard_failure+ ):+ # Always fully decode payload before.+ # We've missed a UnicodeDecodeError proof+ # while issuing release 3.4.8+ # see https://github.com/jawah/charset_normalizer/issues/771+ if decoded_payload is None:+ try:+ decoded_payload = str(+ (+ sequences+ if not strip_sig_or_bom+ else sequences[len(sig_payload) :]+ ),+ encoding=encoding_iana,+ )+ except (UnicodeDecodeError, LookupError):+ logger.log(+ TRACE,+ "%s does not decode the whole payload: fallback entry withheld.",+ encoding_iana,+ )+ continue+ if is_too_large_sequence:+ # Don't retain huge payload in RAM.+ decoded_payload = None++ fallback_entry = CharsetMatch(+ sequences,+ encoding_iana,+ threshold,+ bom_or_sig_available,+ [],+ decoded_payload,+ preemptive_declaration=specified_encoding,+ )+ if encoding_iana == specified_encoding:+ fallback_specified = fallback_entry+ elif encoding_iana == "ascii":+ fallback_ascii = fallback_entry+ else:+ fallback_u8 = fallback_entry+ continue++ if deferred_decoding:+ # The candidate passed chaos probing: perform the whole payload+ # decode (validation + payload reuse) that was deferred earlier.+ try:+ decoded_payload = str(+ (+ sequences+ if not strip_sig_or_bom+ else sequences[len(sig_payload) :]+ ),+ encoding=encoding_iana,+ )+ except (UnicodeDecodeError, LookupError) as e:+ logger.log(+ TRACE,+ "Code page %s does not fit given bytes sequence at ALL. %s",+ encoding_iana,+ str(e),+ )+ tested_but_hard_failure.append(encoding_iana)+ continue @@ -432,3 +615,3 @@ if (- is_too_large_sequence is False+ not is_too_large_sequence or encoding_iana@@ -482,3 +665,6 @@
… 149 more lines (truncated)
--- +++ @@ -4,5 +4,3 @@ from codecs import IncrementalDecoder-from collections import Counter from functools import lru_cache-from typing import Counter as TypeCounter @@ -17,10 +15,7 @@ )-from .md import is_suspiciously_successive_range+from .md import _ASCII_CHAR_INFO, _char_info, is_suspiciously_successive_range from .models import CoherenceMatches from .utils import (- is_accentuated,- is_latin, is_multi_byte_encoding, is_unicode_range_secondary,- unicode_range, )@@ -47,3 +42,8 @@ if chunk:- character_range: str | None = unicode_range(chunk)+ chunk_codepoint = ord(chunk)+ character_range: str | None = (+ _ASCII_CHAR_INFO[chunk_codepoint].range+ if chunk_codepoint < 128+ else _char_info(chunk).range+ ) @@ -52,3 +52,3 @@ - if is_unicode_range_secondary(character_range) is False:+ if not is_unicode_range_secondary(character_range): if character_range not in seen_ranges:@@ -75,3 +75,9 @@ for character in characters:- if unicode_range(character) == primary_range:+ codepoint = ord(character)+ info = (+ _ASCII_CHAR_INFO[codepoint]+ if codepoint < 128+ else _char_info(character)+ )+ if info.range == primary_range: languages.append(language)@@ -88,3 +94,7 @@ """- unicode_ranges: list[str] = encoding_unicode_range(iana_name)+ try:+ unicode_ranges: list[str] = encoding_unicode_range(iana_name)+ except ImportError: # Defensive: encoding unavailable on this build.+ return []+ primary_range: str | None = None@@ -132,5 +142,7 @@ for character in FREQUENCIES[language]:- if not target_have_accents and is_accentuated(character):+ codepoint = ord(character)+ info = _ASCII_CHAR_INFO[codepoint] if codepoint < 128 else _char_info(character)+ if not target_have_accents and info.accentuated: target_have_accents = True- if target_pure_latin and is_latin(character) is False:+ if target_pure_latin and not info.latin: target_pure_latin = False@@ -149,3 +161,9 @@ characters_set: frozenset[str] = frozenset(characters)- source_have_accents = any(is_accentuated(character) for character in characters)+ source_have_accents = False+ for character in characters:+ codepoint = ord(character)+ info = _ASCII_CHAR_INFO[codepoint] if codepoint < 128 else _char_info(character)+ if info.accentuated:+ source_have_accents = True+ break @@ -154,6 +172,6 @@ - if ignore_non_latin and target_pure_latin is False:- continue-- if target_have_accents is False and source_have_accents:+ if ignore_non_latin and not target_pure_latin:+ continue++ if not target_have_accents and source_have_accents: continue@@ -186,3 +204,2 @@ character_approved_count: int = 0- frequencies_language_set: frozenset[str] = _FREQUENCIES_SET[language] lang_rank: dict[str, int] = _FREQUENCIES_RANK[language]@@ -193,2 +210,3 @@ large_alphabet: bool = target_language_characters_count > 26+ large_alphabet_threshold: float = target_language_characters_count / 3 @@ -198,27 +216,14 @@ - # Pre-built rank dict for ordered_characters (avoids repeated list slicing).- ordered_rank: dict[str, int] = {- char: rank for rank, char in enumerate(ordered_characters)- }-- # Pre-compute characters common to both orderings.- # Avoids repeated `c in ordered_rank` dict lookups in the inner counts.- common_chars: list[tuple[int, int]] = [- (lr, ordered_rank[c]) for c, lr in lang_rank.items() if c in ordered_rank- ]-- # Pre-extract lr and orr arrays for faster iteration in the inner loop.- # Plain integer loops with local arrays are much faster under mypyc than- # generator expression sums over a list of tuples.- common_count: int = len(common_chars)- common_lr: list[int] = [p[0] for p in common_chars]- common_orr: list[int] = [p[1] for p in common_chars]-- for character, character_rank in zip(- ordered_characters, range(0, ordered_characters_count)- ):- if character not in frequencies_language_set:- continue-- character_rank_in_language: int = lang_rank[character]+ # Single pass: characters present in the language vocabulary, as+ # (language rank, popularity rank) pairs. The scoring below only ever+ # needs ranks, never the characters themselves.+ common_lr: list[int] = []+ common_orr: list[int] = []+ for popularity_rank, character in enumerate(ordered_characters):+ language_rank = lang_rank.get(character)+ if language_rank is not None:+ common_lr.append(language_rank)+ common_orr.append(popularity_rank)++ for character_rank_in_language, character_rank in zip(common_lr, common_orr): character_rank_projection: int = int(character_rank * expected_projection_ratio)@@ -226,3 +231,3 @@ if (- large_alphabet is False+ not large_alphabet and abs(character_rank_projection - character_rank_in_language) > 4@@ -232,5 +237,5 @@ if (- large_alphabet is True+ large_alphabet and abs(character_rank_projection - character_rank_in_language)- < target_language_characters_count / 3+ < large_alphabet_threshold ):@@ -239,11 +244,23 @@ - # Count how many characters appear "before" in both orderings,- # and how many appear "at or after" in both orderings.- # Single pass over pre-extracted arrays — much faster under mypyc- # than two generator expression sums.+ if character_rank_in_language == 0:+ # before_match_count is structurally 0 here (no pair can have a+ # smaller language rank): the historic "before <= 4" acceptance+ # always holds. (The symmetric "after_len == 0" case is+ # impossible: language ranks are strictly below the language+ # character count, hence after_len >= 1.)+ character_approved_count += 1+ continue++ after_len: int = target_language_characters_count - character_rank_in_language++ # Count how many characters appear "before" in both orderings, and+ # how many appear "at or after" in both orderings. Both counts grow+ # monotonically and the approval thresholds+ # (before / rank >= 0.4 or after / after_len >= 0.4) are known+ # upfront, expressed below as exact integer comparisons: exit as+ # soon as one is crossed. before_match_count: int = 0 after_match_count: int = 0- for i in range(common_count):- lr_i: int = common_lr[i]- orr_i: int = common_orr[i]++ for lr_i, orr_i in zip(common_lr, common_orr): if lr_i < character_rank_in_language:@@ -251,2 +268,5 @@ before_match_count += 1+ if 5 * before_match_count >= 2 * character_rank_in_language:+ character_approved_count += 1+ break else:@@ -254,19 +274,5 @@ after_match_count += 1-- after_len: int = target_language_characters_count - character_rank_in_language-- if character_rank_in_language == 0 and before_match_count <= 4:- character_approved_count += 1- continue-- if after_len == 0 and after_match_count <= 4:- character_approved_count += 1- continue-- if (- character_rank_in_language > 0- and before_match_count / character_rank_in_language >= 0.4- ) or (after_len > 0 and after_match_count / after_len >= 0.4):- character_approved_count += 1- continue+ if 5 * after_match_count >= 2 * after_len:+ character_approved_count += 1+ break @@ -293,12 +299,15 @@ for character in decoded_sequence:- if character.isalpha() is False:- continue-- # ASCII fast-path: a-z and A-Z are always "Basic Latin".- # Avoids unicode_range() function call overhead for the most common case.- character_ord: int = ord(character)- if character_ord < 128:- character_range: str | None = "Basic Latin"+ # Reuse the per-codepoint CharInfo cache: info.alpha and info.range+ # are computed with the very same str.isalpha() / unicode_range()+ # calls this loop historically made per character occurrence.+ codepoint: int = ord(character)+ if codepoint < 128:+ info = _ASCII_CHAR_INFO[codepoint] else:- character_range = unicode_range(character)+ info = _char_info(character)++ if not info.alpha:+ continue++ character_range: str | None = info.range @@ -317,5 +326,4 @@ for discovered_range in layers:- if (- is_suspiciously_successive_range(discovered_range, character_range)- is False+ if not is_suspiciously_successive_range(+ discovered_range, character_range ):@@ -324,6 +332,3 @@ elif single_layer_key is not None:- if (- is_suspiciously_successive_range(single_layer_key, character_range)- is False- ):+ if not is_suspiciously_successive_range(single_layer_key, character_range): layer_target_range = single_layer_key@@ -404,3 +409,2 @@
… 24 more lines (truncated)
--- +++ @@ -5,3 +5,2 @@ import typing-from json import dumps from os.path import abspath, basename, dirname, join, realpath@@ -338,2 +337,4 @@ if args.minimal is False:+ from json import dumps+ print(
--- +++ @@ -11,3 +11,2 @@ "utf_7": [- b"\x2b\x2f\x76\x38\x2d", b"\x2b\x2f\x76\x38",@@ -416,4 +415,3 @@ filter(- lambda x: x.endswith("_codec") is False- and x not in {"rot_13", "tactis", "mbcs"},+ lambda x: not x.endswith("_codec") and x not in {"rot_13", "tactis", "mbcs"}, list(set(aliases.values())) + IANA_NO_ALIASES,@@ -2050 +2048,8 @@ }++# prebuilt list of secondary range names.+_SECONDARY_RANGE_NAMES: frozenset[str] = frozenset(+ range_name+ for range_name in UNICODE_RANGES_COMBINED+ if any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD)+)
--- +++ @@ -61,3 +61,3 @@ }- and r.bom is False # type: ignore[union-attr]+ and not r.bom # type: ignore[union-attr] and len(byte_str) < TOO_SMALL_SEQUENCE@@ -71,3 +71,3 @@ - if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE:+ if not should_rename_legacy and encoding in CHARDET_CORRESPONDENCE: encoding = CHARDET_CORRESPONDENCE[encoding]
--- +++ @@ -48,10 +48,3 @@ class CharInfo:- """Pre-computed character properties shared across all detectors.-- Instantiated once and reused via :meth:`update` on every character- in the hot loop so that redundant calls to str methods- (``isalpha``, ``isupper``, …) and cached utility functions- (``_character_flags``, ``is_punctuation``, …) are avoided when- several plugins need the same information.- """+ """Pre-computed character properties shared across all detectors.""" @@ -75,25 +68,35 @@ "sym",+ "range",+ "sep",+ "emoticon",+ "safe",+ "common_cjk", ) - def __init__(self) -> None:- self.character: str = ""- self.printable: bool = False- self.alpha: bool = False- self.upper: bool = False- self.lower: bool = False- self.space: bool = False- self.digit: bool = False- self.is_ascii: bool = False- self.case_variable: bool = False- self.flags: int = 0- self.accentuated: bool = False- self.latin: bool = False- self.is_cjk: bool = False- self.is_arabic: bool = False- self.is_glyph: bool = False- self.punct: bool = False- self.sym: bool = False-- def update(self, character: str) -> None:- """Update all properties for *character* (called once per character)."""+ character: str+ printable: bool+ alpha: bool+ upper: bool+ lower: bool+ space: bool+ digit: bool+ is_ascii: bool+ case_variable: bool+ flags: int+ accentuated: bool+ latin: bool+ is_cjk: bool+ is_arabic: bool+ is_glyph: bool+ punct: bool+ sym: bool+ range: str | None+ sep: bool+ emoticon: bool+ safe: bool+ common_cjk: bool++ def __init__(self, character: str) -> None:+ """Compute all properties for *character* (built once per codepoint,+ every branch assigns every slot).""" self.character = character@@ -204,2 +207,22 @@ + self.range = unicode_range(character)+ self.sep = is_separator(character)+ self.emoticon = is_emoticon(character)+ self.safe = character in COMMON_SAFE_ASCII_CHARACTERS+ self.common_cjk = character in COMMON_CJK_CHARACTERS+++# Per-codepoint cache of CharInfo instances+# At most UTF-8 size allocated.+@lru_cache(maxsize=None)+def _char_info(character: str) -> CharInfo:+ """Build (once per codepoint) and cache the CharInfo for *character*."""+ return CharInfo(character)+++# ASCII table indexed by codepoint.+_ASCII_CHAR_INFO: list[CharInfo] = [+ CharInfo(chr(_codepoint)) for _codepoint in range(128)+]+ @@ -257,9 +280,6 @@ - if (- character != self._last_printable_char- and character not in COMMON_SAFE_ASCII_CHARACTERS- ):+ if character != self._last_printable_char and not info.safe: if info.punct: self._punctuation_count += 1- elif not info.digit and info.sym and not is_emoticon(character):+ elif not info.digit and info.sym and not info.emoticon: self._symbol_count += 2@@ -407,3 +427,3 @@ - if info.space or info.punct or character in COMMON_SAFE_ASCII_CHARACTERS:+ if info.space or info.punct or info.safe: self._last_printable_seen = None@@ -414,3 +434,3 @@ self._last_printable_seen = character- self._last_printable_range = unicode_range(character)+ self._last_printable_range = info.range return@@ -418,6 +438,8 @@ unicode_range_a: str | None = self._last_printable_range- unicode_range_b: str | None = unicode_range(character)-- if is_suspiciously_successive_range(unicode_range_a, unicode_range_b):- self._suspicious_successive_range_count += 1+ unicode_range_b: str | None = info.range++ # Identical non-None ranges can never be suspicious.+ if unicode_range_a != unicode_range_b or unicode_range_a is None:+ if is_suspiciously_successive_range(unicode_range_a, unicode_range_b):+ self._suspicious_successive_range_count += 1 @@ -460,2 +482,4 @@ "_buffer_upper_count",+ "_buffer_first_lower",+ "_buffer_has_non_ascii", )@@ -479,2 +503,4 @@ self._buffer_upper_count: int = 0+ self._buffer_first_lower: bool = False+ self._buffer_has_non_ascii: bool = False @@ -483,2 +509,4 @@ if info.alpha:+ if self._buffer_length == 0:+ self._buffer_first_lower = info.lower self._buffer_length += 1@@ -488,2 +516,4 @@ self._buffer_upper_count += 1+ if not info.is_ascii:+ self._buffer_has_non_ascii = True @@ -504,3 +534,3 @@ return- if info.space or info.punct or is_separator(character):+ if info.space or info.punct or info.sep: self._word_count += 1@@ -523,2 +553,12 @@ self._foreign_long_count += 1+ elif (+ self._buffer_has_non_ascii+ and self._buffer_first_lower+ and self._buffer_upper_count == buffer_length - 1+ ):+ # Inverse capitalization detector.+ # No natural writing produces such words.+ # see https://github.com/jawah/charset_normalizer/issues/731+ self._foreign_long_count += 1+ self._is_current_word_bad = True if buffer_length >= 24 and self._foreign_long_watch:@@ -545,2 +585,4 @@ self._buffer_upper_count = 0+ self._buffer_first_lower = False+ self._buffer_has_non_ascii = False elif (@@ -569,2 +611,4 @@ self._buffer_upper_count = 0+ self._buffer_first_lower = False+ self._buffer_has_non_ascii = False @@ -594,3 +638,3 @@ - if character not in COMMON_CJK_CHARACTERS:+ if not info.common_cjk: self._uncommon_count += 1@@ -809,3 +853,2 @@ -@lru_cache(maxsize=2048) def mess_ratio(@@ -825,2 +868,16 @@ step = 128++ # str.isascii() is O(1) (the flag lives in the str header). Six of the+ # nine detectors provably keep a 0.0 ratio on ASCII-only input and are+ # therefore not fed at all.+ is_pure_ascii: bool = decoded_sequence.isascii()++ # Cached per-codepoint character properties (see CharInfo). ASCII+ # characters resolve through the immutable import-time table; anything+ # else goes through the lru_cache-backed slow path.+ ascii_info = _ASCII_CHAR_INFO+ char_info = _char_info++ mean_mess_ratio: float+ info: CharInfo @@ -851,12 +908,13 @@ - # Single reusable CharInfo object (avoids per-character allocation).- info: CharInfo = CharInfo()- info_update = info.update-- mean_mess_ratio: float- for block_start in range(0, seq_len, step): for character in decoded_sequence[block_start : block_start + step]:- # Pre-compute all character properties once (shared across all plugins).- info_update(character)+ # Character properties computed once per distinct codepoint+ # (shared across all plugins and all mess_ratio calls).+ # ord() doubles as the ASCII table index and, unlike+ # str.isascii(), lowers to a mypyc primitive.+ codepoint: int = ord(character)+ if codepoint < 128:+ info = ascii_info[codepoint]+ else:+ info = char_info(character) @@ -865,2 +923,9 @@ d_sw_feed(character, info)++ if is_pure_ascii:+ # The six remaining detectors provably stay at 0.0 (see above).+ if info.printable:+ d_sp_feed(character, info)+ continue+ d_au_feed(character, info)@@ -901,6 +966,7 @@ # Flush last word buffer in SuperWeirdWordPlugin via trailing newline.- info_update("\n")- d_sw_feed("\n", info)- d_au_feed("\n", info)- d_up_feed("\n", info)+ nl_info = ascii_info[10] # "\n"+ d_sw_feed("\n", nl_info)+ if not is_pure_ascii:+ d_au_feed("\n", nl_info)+ d_up_feed("\n", nl_info)
--- +++ @@ -3,3 +3,2 @@ from encodings.aliases import aliases-from json import dumps from re import sub@@ -368,2 +367,4 @@ def to_json(self) -> str:+ from json import dumps+ return dumps(self.__dict__, ensure_ascii=True, indent=4)
--- +++ @@ -12,6 +12,2 @@ -from _multibytecodec import ( # type: ignore[import-not-found,import]- MultibyteIncrementalDecoder,-)- from .constant import (@@ -21,3 +17,3 @@ UNICODE_RANGES_COMBINED,- UNICODE_SECONDARY_RANGE_KEYWORD,+ _SECONDARY_RANGE_NAMES, UTF8_MAXIMAL_ALLOCATION,@@ -37,3 +33,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def _character_flags(character: str) -> int:@@ -72,3 +67,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_accentuated(character: str) -> bool:@@ -97,3 +91,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def unicode_range(character: str) -> str | None:@@ -114,3 +107,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_latin(character: str) -> bool:@@ -119,3 +111,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_punctuation(character: str) -> bool:@@ -134,3 +125,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_symbol(character: str) -> bool:@@ -149,3 +139,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_emoticon(character: str) -> bool:@@ -159,3 +148,2 @@ -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_separator(character: str) -> bool:@@ -214,5 +202,4 @@ -@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) def is_unicode_range_secondary(range_name: str) -> bool:- return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD)+ return range_name in _SECONDARY_RANGE_NAMES @@ -222,4 +209,4 @@ return (- character.isspace() is False # includes \n \t \r \v- and character.isprintable() is False+ not character.isspace() # includes \n \t \r \v+ and not character.isprintable() and character != "\x1a" # Why? Its the ASCII substitute character.@@ -241,5 +228,14 @@ + decoded_zone: str = sequence[: min(seq_len, search_zone)].decode(+ "ascii", errors="ignore"+ )++ # Cheap literal pre-filter.+ lowered_zone: str = decoded_zone.lower()+ if "coding" not in lowered_zone and "charset" not in lowered_zone:+ return None+ results: list[str] = findall( RE_POSSIBLE_ENCODING_INDICATION,- sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"),+ decoded_zone, )@@ -269,3 +265,3 @@ """- return name in {+ if name in { "utf_8",@@ -279,6 +275,27 @@ "utf_7",- } or issubclass(- importlib.import_module(f"encodings.{name}").IncrementalDecoder,- MultibyteIncrementalDecoder,- )+ }:+ return True++ # Besides the Unicode family above, every multibyte codec shipped with+ # Python is implemented by _multibytecodec through exactly one of the six+ # cjkcodecs providers below. Probing those providers directly (getcodec)+ # classifies a name without importing its "encodings.<name>" module:+ # classifying the whole IANA_SUPPORTED list would otherwise import many+ # modules and dominate "import charset_normalizer" wall time.+ # see https://github.com/jawah/charset_normalizer/issues/742+ for provider in (+ "_codecs_cn",+ "_codecs_hk",+ "_codecs_iso2022",+ "_codecs_jp",+ "_codecs_kr",+ "_codecs_tw",+ ):+ try:+ importlib.import_module(provider).getcodec(name) # type: ignore[attr-defined]+ except (ImportError, AttributeError, LookupError): # Defensive: edge cases+ continue+ return True++ return False @@ -378,4 +395,5 @@ decoded_payload: str | None = None,+ deferred_decoding: bool = False, ) -> Generator[str, None, None]:- if decoded_payload and is_multi_byte_decoder is False:+ if decoded_payload and not is_multi_byte_decoder: for i in offsets:@@ -385,2 +403,17 @@ yield chunk+ elif deferred_decoding:+ # Deferred single-byte probing: the whole payload is not decoded+ # yet. Single-byte codecs are stateless (1 byte == 1 char), hence+ # decode(base)[i:j] == decode(base[i:j]): slicing the raw bytes+ # yields exactly the chunks the branch above would have produced,+ # short trailing chunks included, and raises UnicodeDecodeError on+ # invalid bytes just like the whole-payload decode would.+ base_bytes = (+ sequences if not strip_sig_or_bom else sequences[len(sig_payload) :]+ )+ for i in offsets:+ cut_sequence = base_bytes[i : i + chunk_size]+ if not cut_sequence:+ break+ yield str(cut_sequence, encoding_iana) else:@@ -393,3 +426,3 @@ - if bom_or_sig_available and strip_sig_or_bom is False:+ if bom_or_sig_available and not strip_sig_or_bom: cut_sequence = sig_payload + cut_sequence@@ -413,3 +446,3 @@ - if bom_or_sig_available and strip_sig_or_bom is False:+ if bom_or_sig_available and not strip_sig_or_bom: cut_sequence = sig_payload + cut_sequence
--- +++ @@ -6,3 +6,3 @@ -__version__ = "3.4.7"+__version__ = "3.4.9" VERSION = __version__.split(".")
--- +++ @@ -59 +59,16 @@ assert "Cyrillic" in best_guess.alphabets+++def test_regression_gh771_fallback_entry_on_undecodable_payload():+ chaos = b'=][;:!?*&^%$#@ (){}<>~|_+ "quoted" ' * 90+ gap_position = 512 + (len(chaos) // 5 - 512) // 2+ payload = chaos[:gap_position] + "\u00e9".encode() + chaos[gap_position:]++ results = from_bytes(payload) # must not raise+ best_guess = results.best()++ assert best_guess is not None, "fallback machinery gave no result at all"+ assert best_guess.encoding == "utf_8", (+ f"expected the utf_8 fallback, got {best_guess.encoding}"+ )+ assert str(best_guess), "best match must decode without error"
grpcio-status pypi YANK ×10BURST ×6INSTALL-EXEC
1.71.2
1.74.0
1.75.0
1.75.1
1.76.0
1.78.0
1.78.1
1.80.0
1.81.0
1.81.1
1.82.0
1.82.1
YANK
1.45.0 marked yanked (still downloadable)
high · registry-verified · 2022-03-23 · 4y ago
YANK
1.48.0 marked yanked (still downloadable)
high · registry-verified · 2022-07-28 · 3y ago
YANK
1.49.0 marked yanked (still downloadable)
high · registry-verified · 2022-09-15 · 3y ago
YANK
1.51.0 marked yanked (still downloadable)
high · registry-verified · 2022-11-21 · 3y ago
YANK
1.52.0 marked yanked (still downloadable)
high · registry-verified · 2023-02-06 · 3y ago
YANK
1.55.0 marked yanked (still downloadable)
high · registry-verified · 2023-05-22 · 3y ago
YANK
1.65.0 marked yanked (still downloadable)
high · registry-verified · 2024-07-11 · 2y ago
YANK
1.72.0 marked yanked (still downloadable)
high · registry-verified · 2025-04-25 · 1y ago
YANK
1.78.1 marked yanked (still downloadable)
high · registry-verified · 2026-02-20 · 4mo ago
YANK
1.82.0 marked yanked (still downloadable) · ACTIVE
high · registry-verified · 2026-07-06 · 6d ago
BURST
2 releases in 33m: 1.22.1, 1.23.0
info · registry-verified · 2019-08-15 · 6y ago
BURST
4 releases in 37m: 1.46.5, 1.47.2, 1.48.2, 1.49.1
info · registry-verified · 2022-09-22 · 3y ago
BURST
2 releases in 11m: 1.53.1, 1.54.2
info · registry-verified · 2023-05-12 · 3y ago
BURST
2 releases in 2m: 1.54.3, 1.53.2
info · registry-verified · 2023-08-02 · 2y ago
BURST
5 releases in 54m: 1.64.3, 1.63.2, 1.62.3, 1.61.3, 1.60.2
info · registry-verified · 2024-08-06 · 1y ago
BURST
2 releases in 9m: 1.59.5, 1.58.3
info · registry-verified · 2024-08-06 · 1y ago
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 1.81.1 → 1.82.1
+0 added · -0 removed · ~5 modified
--- +++ @@ -16,2 +16,2 @@ -VERSION = '1.81.1'+VERSION = '1.82.1'
--- +++ @@ -56,3 +56,3 @@ INSTALL_REQUIRES = (- "protobuf>=6.33.5,<8.0.0",+ "protobuf>=7.35.1,<8.0.0", "grpcio>={version}".format(version=grpc_version.VERSION),
anyio pypi YANKBURST ×2
4.6.2
4.7.0
4.8.0
4.9.0
4.10.0
4.11.0
4.12.0
4.12.1
4.13.0
4.14.0
4.14.1
4.14.2
YANK
4.6.2 marked yanked (still downloadable)
high · registry-verified · 2024-10-13 · 1y ago
BURST
2 releases in 5m: 4.5.1, 4.6.1
info · registry-verified · 2024-10-13 · 1y ago
BURST
2 releases in 3m: 4.5.2, 4.6.2
info · registry-verified · 2024-10-13 · 1y ago
release diff 4.14.1 → 4.14.2
artifact too large or unavailable
attrs pypi YANK
22.1.0
22.2.0
23.1.0
23.2.0
24.1.0
24.2.0
24.3.0
25.1.0
25.2.0
25.3.0
25.4.0
26.1.0
YANK
21.1.0 marked yanked (still downloadable)
high · registry-verified · 2021-05-06 · 5y ago
release diff 25.4.0 → 26.1.0
+3 added · -2 removed · ~44 modified
--- +++ @@ -5,2 +5,5 @@ from __future__ import annotations++import functools+import time @@ -174 +177,56 @@ at(c)+++class TestCachedProperties:+ @attrs.define+ class Slotted:+ x: int = 0++ @functools.cached_property+ def cached(self):+ time.sleep(0.1)+ return 42++ @attrs.define(slots=False)+ class Unslotted:+ x: int = 0++ @functools.cached_property+ def cached(self):+ time.sleep(0.1)+ return 42++ def test_first_access(self):+ """+ Benchmark first access to a cached property (computation + storage).+ """+ for _ in range(ROUNDS):+ c = self.Slotted(42)+ _ = c.cached++ def test_repeated_access(self):+ """+ Benchmark repeated access to a cached property (should use stored+ value).+ """+ c = self.Slotted(42)+ _ = c.cached # Prime the cache++ for _ in range(ROUNDS):+ _ = c.cached++ def test_create_cached_property_class(self):+ """+ Benchmark creating a class with a cached property+ """+ for _ in range(ROUNDS):++ @attrs.define+ class LocalC:+ x: int+ y: str+ z: dict[str, int]++ @functools.cached_property+ def cached(self):+ return 42
--- +++ @@ -131,2 +131,7 @@ [[tool.sponcon.sponsors]]+title = "Kraken Tech"+url = "https://kraken.tech/"+img = "Kraken.svg"++[[tool.sponcon.sponsors]] title = "Privacy Solutions"@@ -139,2 +144,7 @@ img = "FilePreviews.svg"++[[tool.sponcon.sponsors]]+title = "TestMu AI"+url = "https://www.testmuai.com/?utm_medium=sponsor&utm_source=structlog"+img = "TestMu-AI.svg"
--- +++ @@ -465,2 +465,11 @@ + # Resolve default field alias before executing field_transformer, so that+ # the transformer receives fully populated Attribute objects with usable+ # alias values.+ for a in attrs:+ if not a.alias:+ # Evolve is very slow, so we hold our nose and do it dirty.+ _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name))+ _OBJ_SETATTR.__get__(a)("alias_is_default", True)+ if field_transformer is not None:@@ -482,9 +491,8 @@ - # Resolve default field alias after executing field_transformer.- # This allows field_transformer to differentiate between explicit vs- # default aliases and supply their own defaults.+ # Resolve default field alias for any new attributes that the+ # field_transformer may have added without setting an alias. for a in attrs: if not a.alias:- # Evolve is very slow, so we hold our nose and do it dirty. _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name))+ _OBJ_SETATTR.__get__(a)("alias_is_default", True) @@ -571,3 +579,3 @@ """- if isinstance(self, BaseException) and name in ("__notes__",):+ if isinstance(self, BaseException) and name == "__notes__": BaseException.__delattr__(self, name)@@ -1098,5 +1106,3 @@ def add_replace(self):- self._cls_dict["__replace__"] = self._add_method_dunders(- lambda self, **changes: evolve(self, **changes)- )+ self._cls_dict["__replace__"] = self._add_method_dunders(evolve) return self@@ -1886,3 +1892,3 @@ """- Return the tuple of *attrs* attributes for a class.+ Return the tuple of *attrs* attributes for a class or instance. @@ -1892,6 +1898,6 @@ Args:- cls (type): Class to introspect.+ cls (type): Class or instance to introspect. Raises:- TypeError: If *cls* is not a class.+ TypeError: If *cls* is neither a class nor an *attrs* instance. @@ -1906,2 +1912,3 @@ .. versionchanged:: 23.1.0 Add support for generic classes.+ .. versionchanged:: 26.1.0 Add support for instances. """@@ -1910,4 +1917,8 @@ if generic_base is None and not isinstance(cls, type):- msg = "Passed object must be a class."- raise TypeError(msg)+ type_ = type(cls)+ if getattr(type_, "__attrs_attrs__", None) is None:+ msg = "Passed object must be a class or attrs instance."+ raise TypeError(msg)++ return fields(type_) @@ -2018,3 +2029,3 @@ if a.on_setattr is not None:- if frozen is True:+ if frozen is True and a.on_setattr is not setters.NO_OP: msg = "Frozen classes can't use on_setattr."@@ -2431,2 +2442,4 @@ any explicit overrides and default private-attribute-name handling.+ - ``alias_is_default`` (`bool`): Whether the ``alias`` was automatically+ generated (``True``) or explicitly provided by the user (``False``). - ``inherited`` (`bool`): Whether or not that attribute has been inherited@@ -2456,2 +2469,3 @@ .. versionadded:: 22.2.0 *alias*+ .. versionadded:: 26.1.0 *alias_is_default* @@ -2480,2 +2494,3 @@ "alias",+ "alias_is_default", )@@ -2502,2 +2517,3 @@ alias=None,+ alias_is_default=None, ):@@ -2536,2 +2552,6 @@ bound_setattr("alias", alias)+ bound_setattr(+ "alias_is_default",+ alias is None if alias_is_default is None else alias_is_default,+ ) @@ -2571,2 +2591,3 @@ ca.alias,+ ca.alias is None, )@@ -2588,2 +2609,16 @@ new._setattrs(changes.items())++ if "alias" in changes and "alias_is_default" not in changes:+ # Explicit alias provided -- no longer the default.+ _OBJ_SETATTR.__get__(new)("alias_is_default", False)+ elif (+ "name" in changes+ and "alias" not in changes+ # Don't auto-generate alias if the user picked picked the old one.+ and self.alias_is_default+ ):+ # Name changed, alias was auto-generated -- update it.+ _OBJ_SETATTR.__get__(new)(+ "alias", _default_init_alias_for(new.name)+ ) @@ -2605,2 +2640,13 @@ """+ if len(state) < len(self.__slots__):+ # Pre-26.1.0 pickle without alias_is_default -- infer it+ # heuristically.+ state_dict = dict(zip(self.__slots__, state))+ alias_is_default = state_dict.get(+ "alias"+ ) is None or state_dict.get("alias") == _default_init_alias_for(+ state_dict["name"]+ )+ state = (*state, alias_is_default)+ self._setattrs(zip(self.__slots__, state))@@ -2628,3 +2674,3 @@ validator=None,- repr=True,+ repr=(name != "alias_is_default"), cmp=None,@@ -3089,5 +3135,3 @@ else:- self.__call__ = lambda value, instance, field: self.converter(- value, instance, field- )+ self.__call__ = self.converter
--- +++ @@ -3,4 +3,2 @@ from __future__ import annotations--from typing import ClassVar @@ -18,4 +16,6 @@ - msg = "can't set attribute"- args: ClassVar[tuple[str]] = [msg]+ def __init__(self):+ msg = "can't set attribute"+ super().__init__(msg)+ self.msg = msg
--- +++ @@ -81,3 +81,5 @@ .. versionadded:: 21.3.0- """+ .. versionchanged:: 26.1.0 The contextmanager is nestable.+ """+ prev = get_run_validators() set_run_validators(False)@@ -86,3 +88,3 @@ finally:- set_run_validators(True)+ set_run_validators(prev)
--- +++ @@ -132,2 +132,3 @@ inherited=False,+ alias_is_default=True, ),@@ -145,2 +146,3 @@ inherited=False,+ alias_is_default=True, ),@@ -203,2 +205,3 @@ inherited=False,+ alias_is_default=True, ),@@ -216,2 +219,3 @@ inherited=False,+ alias_is_default=True, ),@@ -262,9 +266,16 @@ - with pytest.raises(FrozenInstanceError) as e:+ with pytest.raises(+ FrozenInstanceError, match="can't set attribute"+ ) as e: frozen.x = 2 - with pytest.raises(FrozenInstanceError) as e:+ assert e.value.msg == e.value.args[0] == "can't set attribute"+ assert 1 == frozen.x++ with pytest.raises(+ FrozenInstanceError, match="can't set attribute"+ ) as e: del frozen.x - assert e.value.args[0] == "can't set attribute"+ assert e.value.msg == e.value.args[0] == "can't set attribute" assert 1 == frozen.x
--- +++ @@ -180,3 +180,3 @@ "metadata=mappingproxy({'field_order': 1}), type='int', converter=None, "- "kw_only=False, inherited=False, on_setattr=None, alias=None)",+ "kw_only=False, inherited=False, on_setattr=None, alias='x')", ) == e.value.args@@ -234,2 +234,146 @@ assert ["x"] == [a.name for a in attr.fields(Base)]++ def test_hook_alias_available(self):+ """+ The field_transformer receives attributes with default aliases+ already resolved, not None.++ Regression test for #1479.+ """+ seen = []++ def hook(cls, attribs):+ seen[:] = [(a.name, a.alias, a.alias_is_default) for a in attribs]+ return attribs++ @attr.s(auto_attribs=True, field_transformer=hook)+ class C:+ _private: int+ _explicit: int = attr.ib(alias="_explicit")+ public: int++ assert [+ ("_private", "private", True),+ ("_explicit", "_explicit", False),+ ("public", "public", True),+ ] == seen++ def test_hook_evolve_name_updates_auto_alias(self):+ """+ When a field_transformer evolves a field's name, the alias is+ automatically updated if it was auto-generated.++ Regression test for #1479.+ """++ def hook(cls, attribs):+ return [a.evolve(name="renamed") for a in attribs]++ @attr.s(auto_attribs=True, field_transformer=hook)+ class C:+ _original: int++ f = attr.fields(C).renamed++ assert "renamed" == f.alias+ assert f.alias_is_default is True++ def test_hook_evolve_name_keeps_explicit_alias(self):+ """+ When a field_transformer evolves a field's name but the field had+ an explicit alias, the alias is preserved.++ Regression test for #1479.+ """++ def hook(cls, attribs):+ return [a.evolve(name="renamed") for a in attribs]++ @attr.s(auto_attribs=True, field_transformer=hook)+ class C:+ original: int = attr.ib(alias="my_alias")++ f = attr.fields(C).renamed++ assert "my_alias" == f.alias+ assert f.alias_is_default is False++ def test_hook_new_field_without_alias(self):+ """+ When a field_transformer adds a brand-new field without setting an+ alias, the post-transformer alias resolution fills it in.++ Regression test for #1479.+ """++ def hook(cls, attribs):+ return [+ *list(attribs),+ attr.Attribute(+ name="_extra",+ default=0,+ validator=None,+ repr=True,+ cmp=None,+ hash=None,+ init=True,+ metadata={},+ type=int,+ converter=None,+ kw_only=False,+ eq=True,+ eq_key=None,+ order=True,+ order_key=None,+ on_setattr=None,+ alias=None,+ inherited=False,+ ),+ ]++ @attr.s(auto_attribs=True, field_transformer=hook)+ class C:+ x: int++ f = attr.fields(C)._extra++ assert "extra" == f.alias+ assert f.alias_is_default is True++ def test_hook_explicit_alias_matching_default(self):+ """+ When a user explicitly sets an alias that happens to equal the+ auto-generated default, alias_is_default is still False.++ Regression test for #1479.+ """++ @attr.s(auto_attribs=True)+ class C:+ _private: int = attr.ib(alias="private")++ f = attr.fields(C)._private++ assert "private" == f.alias+ assert f.alias_is_default is False++ def test_hook_evolve_alias_sets_not_default(self):+ """+ When a field_transformer uses evolve() to set an explicit alias,+ alias_is_default becomes False.++ Regression test for #1479.+ """++ def hook(cls, attribs):+ return [a.evolve(alias="custom") for a in attribs]++ @attr.s(auto_attribs=True, field_transformer=hook)+ class C:+ x: int++ f = attr.fields(C).x++ assert "custom" == f.alias+ assert f.alias_is_default is False
--- +++ @@ -11,3 +11,5 @@ import itertools+import pickle import sys+import types import unicodedata@@ -118,5 +120,3 @@ - @pytest.mark.parametrize(- "wrap", [lambda v: v, lambda v: [v], lambda v: and_(v)]- )+ @pytest.mark.parametrize("wrap", [lambda v: v, lambda v: [v], and_]) def test_validator_decorator(self, wrap):@@ -247,3 +247,3 @@ "metadata=mappingproxy({}), type=None, converter=None, "- "kw_only=False, inherited=False, on_setattr=None, alias=None)",+ "kw_only=False, inherited=False, on_setattr=None, alias='y')", ) == e.value.args@@ -1552,8 +1552,15 @@ """- Raises `TypeError` on non-classes.- """- with pytest.raises(TypeError) as e:- fields(C())-- assert "Passed object must be a class." == e.value.args[0]+ Returns the class fields for *attrs* instances too.+ """+ assert fields(C()) is fields(C)++ def test_handler_non_attrs_instance(self):+ """+ Raises `TypeError` on non-*attrs* instances.+ """+ with pytest.raises(+ TypeError,+ match=r"Passed object must be a class or attrs instance\.",+ ):+ fields(object()) @@ -1777,5 +1784,3 @@ """- C = make_class(- "C", {"x": attr.ib(converter=lambda v: int(v))}, frozen=True- )+ C = make_class("C", {"x": attr.ib(converter=int)}, frozen=True) C("1")@@ -2391,2 +2396,97 @@ + def test_alias_is_default(self):+ """+ alias_is_default is True for auto-generated aliases and False for+ explicitly provided ones -- even if the explicit value matches the+ auto-generated default.+ """++ @attrs.define+ class C:+ auto: int+ _private_auto: int+ explicit: int = attrs.field(alias="custom")+ _matches_default: int = attrs.field(alias="matches_default")++ fields = attr.fields_dict(C)++ assert fields["auto"].alias_is_default is True+ assert fields["_private_auto"].alias_is_default is True+ assert fields["explicit"].alias_is_default is False+ assert fields["_matches_default"].alias_is_default is False++ def test_alias_is_default_pickle_roundtrip(self):+ """+ alias_is_default survives pickle round-tripping.+ """++ @attrs.define+ class C:+ auto: int+ explicit: int = attrs.field(alias="custom")++ fields = attr.fields(C)++ for a in fields:+ restored = pickle.loads(pickle.dumps(a))++ assert a.alias == restored.alias+ assert a.alias_is_default == restored.alias_is_default++ X = (+ b"\x80\x05\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+ b"ute\x94\x93\x94)\x81\x94(\x8c\x01x\x94h\x00\x8c\x08_Nothing\x94\x93"+ b"\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins\x94"+ b"\x8c\x03int\x94\x93\x94N\x89\x89Nh\x04t\x94b."+ )+ Y = (+ b"\x80\x05\x95b\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+ b"ute\x94\x93\x94)\x81\x94(\x8c\x02_y\x94h\x00\x8c\x08_Nothing\x94"+ b"\x93\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins"+ b"\x94\x8c\x03int\x94\x93\x94N\x89\x89N\x8c\x01y\x94t\x94b."+ )+ Z = (+ b"\x80\x05\x95c\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+ b"ute\x94\x93\x94)\x81\x94(\x8c\x01z\x94h\x00\x8c\x08_Nothing\x94\x93"+ b"\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins\x94"+ b"\x8c\x03int\x94\x93\x94N\x89\x89N\x8c\x03_z_\x94t\x94b."+ )++ @pytest.mark.parametrize(+ ("pickle_data", "name", "alias", "alias_is_default"),+ [+ (X, "x", "x", True),+ (Y, "_y", "y", True),+ (Z, "z", "_z_", False),+ ],+ )+ def test_can_unpickle_25_3_attributes(+ self, pickle_data, name, alias, alias_is_default+ ):+ """+ Can unpickle attributes created in 25.3.+ """++ assert Attribute(+ name=name,+ alias=alias,+ alias_is_default=alias_is_default,+ default=attrs.NOTHING,+ validator=None,+ repr=True,+ cmp=None,+ eq=True,+ eq_key=None,+ order=True,+ order_key=None,+ hash=None,+ init=True,+ metadata=types.MappingProxyType({}),+ type=int,+ converter=None,+ kw_only=False,+ inherited=False,+ on_setattr=None,+ ) == pickle.loads(pickle_data)+
--- +++ @@ -53,3 +53,3 @@ '"(self: DefineConverter, with_converter: str | Buffer | '- 'SupportsInt | SupportsIndex | SupportsTrunc) -> None"',+ 'SupportsInt | SupportsIndex) -> None"', ),
--- +++ @@ -223,2 +223,12 @@ + @pytest.mark.parametrize("nop", [None, setters.NO_OP])+ def test_frozen_on_setattr_nops(self, nop):+ """+ on_setattr on frozen classes can be used for None and NO_OP.+ """++ @attr.s(frozen=True)+ class C:+ x = attr.ib(on_setattr=nop)+ def test_setattr_reset_if_no_custom_setattr(self, slots):
--- +++ @@ -7,2 +7,3 @@ import re+import sys @@ -99,2 +100,18 @@ + def test_disabled_ctx_nested(self):+ """+ Nested contextmanagers restore correct state.+ """+ assert _config._run_validators is True++ with validator_module.disabled():+ assert _config._run_validators is False++ with validator_module.disabled():+ assert _config._run_validators is False++ assert _config._run_validators is False++ assert _config._run_validators is True+ @@ -229,6 +246,9 @@ - assert (- "'func' must be one of None, fullmatch, match, search."- == ei.value.args[0]- )+ if sys.version_info >= (3, 15):+ errmsg = (+ "'func' must be one of None, fullmatch, prefixmatch, search."+ )+ else:+ errmsg = "'func' must be one of None, fullmatch, match, search."+ assert errmsg == ei.value.args[0]
--- +++ @@ -66,2 +66,3 @@ alias=_default_init_alias_for(name),+ alias_is_default=True, )
--- +++ @@ -94,2 +94,11 @@ num: int = attrs.field(validator=attrs.validators.ge(0))++[email protected]+class ValidatedOptionalOverTuple:+ num: int | None = attrs.field(+ validator=attrs.validators.optional(+ (attrs.validators.instance_of(int), attrs.validators.ge(0)) # ty:ignore [invalid-argument-type]+ )+ )
certifi pypi critical-tier YANKBURST ×4
2025.4.26
2025.6.15
2025.7.9
2025.7.14
2025.8.3
2025.10.5
2025.11.12
2026.1.4
2026.2.25
2026.4.22
2026.5.20
2026.6.17
YANK
2022.5.18 marked yanked (still downloadable)
high · registry-verified · 2022-05-18 · 4y ago
BURST
3 releases in 21m: 0.0.2, 0.0.3, 0.0.4
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 2m: 0.0.5, 0.0.6
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 39m: 2015.9.6, 2015.9.6.1
info · registry-verified · 2015-09-06 · 10y ago
BURST
2 releases in 4m: 2017.7.27, 2017.7.27.1
info · registry-verified · 2017-07-27 · 8y ago
release diff 2026.5.20 → 2026.6.17
+0 added · -0 removed · ~5 modified
--- +++ @@ -3,2 +3,2 @@ __all__ = ["contents", "where"]-__version__ = "2026.05.20"+__version__ = "2026.06.17"
cffi pypi YANKBURST ×3INSTALL-EXEC
1.14.2
1.14.3
1.14.4
1.14.5
1.14.6
1.15.0
1.15.1
1.16.0
1.17.0
1.17.1
2.0.0
2.1.0
YANK
1.0.2 marked yanked (still downloadable)
high · registry-verified · 2015-05-25 · 11y ago
BURST
2 releases in 20m: 0.8.4, 0.8.5
info · registry-verified · 2014-07-05 · 12y ago
BURST
2 releases in 41m: 1.4.0, 1.4.1
info · registry-verified · 2015-12-17 · 10y ago
BURST
2 releases in 21m: 1.9.0, 1.9.1
info · registry-verified · 2016-11-12 · 9y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 2.0.0 → 2.1.0
+22 added · -0 removed · ~86 modified
new files touching dangerous APIs: src/cffi/_cffi_gen_src.py, testing/cffi1/test_cffi_gen_src.py, testing/cffi1/test_cffi_gen_src_meson.py
+44 more files not shown
--- +++ @@ -0,0 +1,216 @@+# Integrated from the cffi-buildtool project by Rose Davidson+# (https://github.com/inklesspen/cffi-buildtool), under the following+# license:+#+# MIT License+#+# Copyright (c) 2024, Rose Davidson+#+# Permission is hereby granted, free of charge, to any person obtaining a+# copy of this software and associated documentation files (the+# "Software"), to deal in the Software without restriction, including+# without limitation the rights to use, copy, modify, merge, publish,+# distribute, sublicense, and/or sell copies of the Software, and to+# permit persons to whom the Software is furnished to do so, subject to+# the following conditions:+#+# The above copyright notice and this permission notice (including the+# next paragraph) shall be included in all copies or substantial portions+# of the Software.+#+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.+"""Implementation of the ``cffi-gen-src`` command-line tool.++This module is private; the command line is the only supported+interface. Two subcommands:++``exec-python``+ Execute a Python script that constructs a :class:`cffi.FFI`+ (the same kind of script that the CFFI docs' "Main mode of usage"+ describes) and emit the generated C source.++``read-sources``+ Create the :class:`cffi.FFI` from a separate ``cdef`` file and C+ source prelude, then emit the generated C source.+"""++import argparse+import io+import os+import sys++from .api import FFI+++def _execfile(pysrc, filename, globs):+ compiled = compile(source=pysrc, filename=filename, mode='exec')+ exec(compiled, globs, globs)+++def find_ffi_in_python_script(pysrc, filename, ffivar):+ """Execute ``pysrc`` and return the :class:`FFI` object it defines.++ The script is executed with ``__name__`` set to ``"cffi.gen_src"``,+ so a trailing ``if __name__ == "__main__": ffibuilder.compile()``+ block in the script is skipped.++ ``ffivar`` is the name bound by the script to the :class:`FFI`+ object, or to a callable that returns one.++ Raises :class:`NameError` if the name is not bound by the script,+ or :class:`TypeError` if the name does not resolve to an+ :class:`FFI` instance.+ """+ filename = os.path.abspath(filename)+ globs = {'__name__': 'cffi.gen_src', '__file__': filename}+ old_path = sys.path[:]+ sys.path.insert(0, os.path.dirname(filename))+ try:+ _execfile(pysrc, filename, globs)+ if ffivar not in globs:+ raise NameError(+ "Expected to find the FFI object with the name %r, "+ "but it was not found." % (ffivar,)+ )+ ffi = globs[ffivar]+ if not isinstance(ffi, FFI) and callable(ffi):+ # Maybe it's a callable that returns a FFI+ ffi = ffi()+ if not isinstance(ffi, FFI):+ raise TypeError(+ "Found an object with the name %r but it was not an "+ "instance of cffi.api.FFI" % (ffivar,)+ )+ return ffi+ finally:+ sys.path[:] = old_path+++def make_ffi_from_sources(modulename, cdef, csrc):+ """Create an :class:`FFI` from ``cdef`` text and a C source prelude."""+ ffibuilder = FFI()+ ffibuilder.cdef(cdef)+ ffibuilder.set_source(modulename, csrc)+ return ffibuilder+++def generate_c_source(ffi):+ """Return the C source that :meth:`FFI.emit_c_code` would write."""+ output = io.StringIO()+ ffi.emit_c_code(output)+ return output.getvalue()+++def write_c_source(output, generated):+ if output == '-':+ sys.stdout.write(generated)+ return+ with open(output, 'w', encoding='utf-8') as f:+ f.write(generated)+++def same_input_file(file1, file2):+ if file1 is file2:+ return True+ try:+ return os.path.samefile(file1.name, file2.name)+ except OSError:+ return False+++def exec_python(*, output, pyfile, ffi_var):+ with pyfile:+ ffi = find_ffi_in_python_script(pyfile.read(), pyfile.name, ffi_var)+ generated = generate_c_source(ffi)+ write_c_source(output, generated)+++def read_sources(*, output, module_name, cdef_input, csrc_input):+ with csrc_input, cdef_input:+ csrc = csrc_input.read()+ cdef = cdef_input.read()+ ffi = make_ffi_from_sources(module_name, cdef, csrc)+ generated = generate_c_source(ffi)+ write_c_source(output, generated)+++def _prog():+ # The same parser serves both documented invocations; make --help+ # and usage messages show the one that was actually used.+ argv0 = os.path.basename(sys.argv[0]) if sys.argv else ''+ if argv0.startswith('cffi-gen-src'):+ return 'cffi-gen-src'+ return 'python -m cffi.gen_src'+++parser = argparse.ArgumentParser(+ prog=_prog(),+ description='Generate CFFI C source for extension modules.',+)+subparsers = parser.add_subparsers(dest='mode')++exec_python_parser = subparsers.add_parser(+ 'exec-python',+ help='Execute a Python script that defines an FFI object',+)+exec_python_parser.add_argument(+ '--ffi-var',+ default='ffibuilder',+ help="Name of the FFI object in the Python script; defaults to 'ffibuilder'.",+)+exec_python_parser.add_argument(+ 'pyfile',+ type=argparse.FileType('r', encoding='utf-8'),+ help='Path to the Python script',+)+exec_python_parser.add_argument(+ 'output',+ help='Output path for the C source',+)++read_sources_parser = subparsers.add_parser(+ 'read-sources',+ help='Read cdef and C source prelude files that define an FFI object',+)+read_sources_parser.add_argument(+ 'module_name',+ help='Full name of the generated module, including packages',+)+read_sources_parser.add_argument(+ 'cdef',+ type=argparse.FileType('r', encoding='utf-8'),+ help='File containing C definitions',+)+read_sources_parser.add_argument(+ 'csrc',+ type=argparse.FileType('r', encoding='utf-8'),+ help='File containing C source prelude',+)+read_sources_parser.add_argument(+ 'output',+ help='Output path for the C source',+)+++def run(args=None):+ args = parser.parse_args(args=args)+ if args.mode == 'exec-python':+ exec_python(output=args.output, pyfile=args.pyfile, ffi_var=args.ffi_var)+ elif args.mode == 'read-sources':+ if same_input_file(args.cdef, args.csrc):+ parser.error('cdef and csrc are the same file and should not be')+ read_sources(+ output=args.output,+ module_name=args.module_name,+ cdef_input=args.cdef,+ csrc_input=args.csrc,+ )+ else:+ parser.error('a subcommand is required: exec-python or read-sources')+ parser.exit(0)
--- +++ @@ -0,0 +1,213 @@+"""Tests for the cffi-gen-src command-line tool.++The command line is the tool's only public interface, so these+tests drive it exclusively through subprocesses.+"""++import os+import shutil+import subprocess+import sys+import sysconfig++import pytest++pytestmark = [+ pytest.mark.thread_unsafe(reason="spawns subprocesses, slow"),+]+++SIMPLE_SCRIPT = """\+from cffi import FFI++ffibuilder = FFI()++ffibuilder.cdef("int square(int n);")++ffibuilder.set_source("squared._squared", '#include "square.h"')++something_else = 42++if __name__ == "__main__":+ ffibuilder.compile(verbose=True)+"""++CALLABLE_SCRIPT = """\+from cffi import FFI++def make_ffi():+ ffibuilder = FFI()+ ffibuilder.cdef("int square(int n);")+ ffibuilder.set_source("squared._squared", '#include "square.h"')+ return ffibuilder++def something_else():+ return 42+"""+++def _cffi_gen_src_path():+ """Locate the installed ``cffi-gen-src`` script, or return None."""+ exe = "cffi-gen-src" + (".exe" if sys.platform == "win32" else "")+ candidate = os.path.join(sysconfig.get_path("scripts"), exe)+ if os.path.exists(candidate):+ return candidate+ return shutil.which("cffi-gen-src")+++def _run(argv, *args):+ return subprocess.run(+ [*argv, *args],+ stdin=subprocess.DEVNULL,+ capture_output=True,+ text=True,+ )+++# `cffi-gen-src` can also be invoked via `python -m cffi.gen_src`.+# This fixture enables testing both invocations.[email protected](params=["module", "script"])+def run_cffi_gen_src(request):+ """Run the cffi-gen-src CLI in a subprocess, via both invocations."""+ if request.param == "script":+ script = _cffi_gen_src_path()+ if script is None:+ pytest.skip("the cffi-gen-src script is not installed")+ argv = [script]+ else:+ argv = [sys.executable, "-m", "cffi.gen_src"]++ def run(*args):+ return _run(argv, *args)++ return run+++def test_exec_python(tmp_path, run_cffi_gen_src):+ pyfile = tmp_path / "_squared_build.py"+ pyfile.write_text(SIMPLE_SCRIPT)+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src("exec-python", str(pyfile), str(output))+ assert proc.returncode == 0, proc.stderr+ generated = output.read_text()+ assert "square" in generated+ # sanity check: the emitted C source is the thing meson-python will compile+ assert "PyInit" in generated or "_cffi_f_" in generated+++def test_exec_python_ffi_var(tmp_path, run_cffi_gen_src):+ pyfile = tmp_path / "_squared_build.py"+ pyfile.write_text(CALLABLE_SCRIPT)+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src(+ "exec-python", "--ffi-var", "make_ffi", str(pyfile), str(output)+ )+ assert proc.returncode == 0, proc.stderr+ assert "square" in output.read_text()+++def test_exec_python_supports_file_and_script_imports(tmp_path, run_cffi_gen_src):+ helper = tmp_path / "helper.py"+ helper.write_text("HEADER = '#include \"square.h\"'\n")+ pyfile = tmp_path / "_squared_build.py"+ pyfile.write_text("""\+import os++from cffi import FFI++assert os.path.basename(__file__) == "_squared_build.py"++def make_ffi():+ from helper import HEADER++ ffibuilder = FFI()+ ffibuilder.cdef("int square(int n);")+ ffibuilder.set_source("squared._squared", HEADER)+ return ffibuilder+""")+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src(+ "exec-python", "--ffi-var", "make_ffi", str(pyfile), str(output)+ )+ assert proc.returncode == 0, proc.stderr+ assert "square" in output.read_text()+++def test_exec_python_name_not_found(tmp_path, run_cffi_gen_src):+ pyfile = tmp_path / "_squared_build.py"+ pyfile.write_text(SIMPLE_SCRIPT)+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src(+ "exec-python", "--ffi-var", "notfound", str(pyfile), str(output)+ )+ assert proc.returncode != 0+ assert "NameError" in proc.stderr+ assert "'notfound'" in proc.stderr++[email protected](+ "script", [SIMPLE_SCRIPT, CALLABLE_SCRIPT], ids=["simple", "callable"]+)+def test_exec_python_wrong_type(tmp_path, run_cffi_gen_src, script):+ pyfile = tmp_path / "_squared_build.py"+ pyfile.write_text(script)+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src(+ "exec-python", "--ffi-var", "something_else", str(pyfile), str(output)+ )+ assert proc.returncode != 0+ assert "not an instance of cffi.api.FFI" in proc.stderr+++def test_read_sources(tmp_path, run_cffi_gen_src):+ cdef = tmp_path / "squared.cdef.txt"+ cdef.write_text("int square(int n);\n")+ csrc = tmp_path / "squared.csrc.c"+ csrc.write_text('#include "square.h"\n')+ output = tmp_path / "out.c"+ proc = run_cffi_gen_src(+ "read-sources", "squared._squared", str(cdef), str(csrc), str(output)+ )+ assert proc.returncode == 0, proc.stderr+ generated = output.read_text()+ assert "square" in generated+ assert "PyInit" in generated or "_cffi_f_" in generated+++def test_read_sources_same_input_fails(run_cffi_gen_src):+ proc = run_cffi_gen_src("read-sources", "_squared", "-", "-", "-")+ assert proc.returncode != 0+ assert "are the same file and should not be" in proc.stderr+++def test_no_subcommand(run_cffi_gen_src):+ proc = run_cffi_gen_src()+ assert proc.returncode != 0+ assert "a subcommand is required" in proc.stderr+++def test_module_help_names_module_invocation():+ proc = _run([sys.executable, "-m", "cffi.gen_src"], "--help")+ assert proc.returncode == 0, proc.stderr+ assert proc.stdout.startswith("usage: python -m cffi.gen_src")+++def test_script_help_names_script_invocation():+ script = _cffi_gen_src_path()+ if script is None:+ pytest.skip("the cffi-gen-src script is not installed")+ proc = _run([script], "--help")+ assert proc.returncode == 0, proc.stderr+ assert proc.stdout.startswith("usage: cffi-gen-src")+++def test_import_is_inert():+ # importing the entry-point module must not run the CLI+ proc = subprocess.run(+ [sys.executable, "-c", "import cffi.gen_src"],+ capture_output=True,+ text=True,+ )+ assert proc.returncode == 0, proc.stderr+ assert proc.stdout == ""+ assert proc.stderr == ""
--- +++ @@ -0,0 +1,88 @@+"""End-to-end test: build a self-contained CFFI extension with meson-python.++The test provisions a fresh nested venv under ``tmp_path`` using the+stdlib :mod:`venv` module, installs ``cffi`` (from the current source+tree) and ``meson-python`` into it, installs one of the small example+projects that live under ``testing/cffi1/cffi_gen_src_examples/``, and then+imports the built extension to confirm it works.++"""++import os+import re+import shutil+import subprocess+import sys+from pathlib import Path++import pytest++import cffi++pytestmark = [+ pytest.mark.thread_unsafe(reason="spawns subprocesses, slow"),+]++try:+ import mesonpy+except ImportError:+ pytest.skip("Test requires meson-python", allow_module_level=True)+++HERE = Path(__file__).resolve().parent+EXAMPLE_PROJECT = HERE / "cffi_gen_src_examples" / "exec_python_example"+EXAMPLE_PROJECT2 = HERE / "cffi_gen_src_examples" / "read_sources_example"+CFFI_DIR = HERE.parent.parent+++def _venv_python(venv_dir):+ if sys.platform == "win32":+ return venv_dir / "Scripts" / "python.exe"+ return venv_dir / "bin" / "python"++[email protected]("project", [EXAMPLE_PROJECT, EXAMPLE_PROJECT2])+def test_meson_python_build(tmp_path, project):+ venv_dir = tmp_path / "venv"+ subprocess.check_call([sys.executable, "-m", "venv", str(venv_dir)])+ venv_python = _venv_python(venv_dir)+ assert venv_python.exists(), venv_python++ # Upgrade pip so --no-build-isolation behaves consistently with recent+ # resolver behaviour on older base images.+ subprocess.check_call([+ str(venv_python), "-m", "pip", "install", "--upgrade", "pip",+ ])++ # Install build-time deps into the nested venv.+ subprocess.check_call([+ str(venv_python), "-m", "pip", "install", "meson-python", CFFI_DIR+ ])++ # Copy the example project so nothing is written back into the+ # source tree+ project_dir = tmp_path / "project"+ shutil.copytree(project, project_dir)++ # The example meson.build files locate the codegen tool with+ # find_program('cffi-gen-src'), which searches PATH. pip only puts+ # an environment's scripts directory on PATH for isolated builds,+ # so with --no-build-isolation the nested venv's script must be+ # made findable by hand.+ env = os.environ.copy()+ env["PATH"] = str(venv_python.parent) + os.pathsep + env.get("PATH", "")++ # --no-build-isolation to ensure the test runs against the CFFI build we want to test+ proc = subprocess.run([+ str(venv_python), "-m", "pip", "install", "-v",+ "--no-build-isolation", str(project_dir),+ ], env=env, capture_output=True, text=True)+ assert proc.returncode == 0, proc.stdout + proc.stderr++ # Confirm the built extension imports and behaves as expected.+ subprocess.check_call([+ str(venv_python), "-c",+ "from squared import squared; "+ "assert squared(7) == 49; "+ "assert squared(-3) == 9",+ ])
--- +++ @@ -221,3 +221,3 @@ -class Window(object):+class Window: def __init__(self, window):@@ -331,3 +331,2 @@ lib.wbkgdset(self._win, _chtype(ch) | attr)- return None @@ -337,3 +336,2 @@ _chtype(tl), _chtype(tr), _chtype(bl), _chtype(br))- return None @@ -341,3 +339,2 @@ lib.box(self._win, vertint, horint)- return None @@ -515,5 +512,3 @@ raise error("is_linetouched: line number outside of boundaries")- if code == lib.FALSE:- return False- return True+ return code != lib.FALSE @@ -652,3 +647,2 @@ lib.filter()- return None @@ -915,3 +909,2 @@ lib.noqiflush()- return None @@ -1018,3 +1011,2 @@ lib.setsyx(y, x)- return None @@ -1026,3 +1018,2 @@ globals()["_initialised_color"] = True- return None @@ -1072,3 +1063,2 @@ lib.use_env(flag)- return None
--- +++ @@ -37,3 +37,3 @@ -class _PyExport(object):+class _PyExport: def __init__(self, tp, func):
--- +++ @@ -35,3 +35,3 @@ name = ffi.string(dirent.d_name)- if name == b'.' or name == b'..':+ if name in {b'.', b'..'}: continue
--- +++ @@ -5,4 +5,2 @@ """-from __future__ import print_function- import argparse@@ -49,3 +47,3 @@ fcntl.ioctl(target, lib.BTRFS_IOC_SNAP_CREATE_V2, args_buffer)-except IOError as e:+except OSError as e: print(e)
--- +++ @@ -1,2 +1 @@-from __future__ import print_function import cffi
--- +++ @@ -1,2 +1 @@-from __future__ import print_function import csv
--- +++ @@ -1,2 +1 @@-from __future__ import print_function import sys
--- +++ @@ -1,2 +1 @@-from __future__ import print_function import _cffi_backend
--- +++ @@ -1,2 +1 @@-from __future__ import print_function import sys, os
--- +++ @@ -1,3 +1 @@-from __future__ import print_function- referents = [] # list "object descriptor -> python object"@@ -26,3 +24,3 @@ -class Ref(object):+class Ref: """For use in 'with Ref(x) as ob': open an object descriptor
--- +++ @@ -1,2 +1 @@-from __future__ import print_function # A Linux-only demo@@ -29,3 +28,3 @@ print('%3d %s' % (dirent.d_type, name))- if dirent.d_type == 4 and name != '.' and name != '..':+ if dirent.d_type == 4 and name not in {'.', '..'}: walk(dirfd, name)
--- +++ @@ -1,2 +1 @@-from __future__ import print_function # A Linux-only demo, using set_source() instead of hard-coding the exact layouts@@ -29,3 +28,3 @@ print('%3d %s' % (dirent.d_type, name))- if dirent.d_type == lib.DT_DIR and name != '.' and name != '..':+ if dirent.d_type == lib.DT_DIR and name not in {'.', '..'}: walk(dirfd, name)
--- +++ @@ -1,2 +1 @@-from __future__ import print_function # A Linux-only demo@@ -63,3 +62,3 @@ print('%3d %s' % (dirent.d_type, name))- if dirent.d_type == 4 and name != '.' and name != '..':+ if dirent.d_type == 4 and name not in {'.', '..'}: walk(dirfd, name)
--- +++ @@ -37,3 +37,3 @@ name = ffi.string(dirent.d_name)- if name == b'.' or name == b'..':+ if name in {b'.', b'..'}: continue
--- +++ @@ -1,2 +1 @@-from __future__ import print_function __author__ = "Israel Fruchter <[email protected]>"
--- +++ @@ -1,3 +1 @@-# -*- coding: utf-8 -*--# # CFFI documentation build configuration file, created by@@ -39,4 +37,4 @@ # General information about the project.-project = u'CFFI'-copyright = u'2012-2025, Armin Rigo, Maciej Fijalkowski'+project = 'CFFI'+copyright = '2012-2025, Armin Rigo, Maciej Fijalkowski' @@ -47,5 +45,5 @@ # The short X.Y version.-version = '2.0'+version = '2.1' # The full version, including alpha/beta/rc tags.-release = '2.0.0'+release = '2.1.0' @@ -174,4 +172,4 @@ latex_documents = [- ('index', 'CFFI.tex', u'CFFI Documentation',- u'Armin Rigo, Maciej Fijalkowski', 'manual'),+ ('index', 'CFFI.tex', 'CFFI Documentation',+ 'Armin Rigo, Maciej Fijalkowski', 'manual'), ]
--- +++ @@ -2,5 +2,4 @@ requires = [- # first version that supports Python 3.12; older versions may work- # with previous Python versions, but are not tested- "setuptools >= 66.1"+ # Required for PEP 639 support+ "setuptools >= 77.0.3" ]@@ -10,3 +9,3 @@ name = "cffi"-version = "2.0.0"+version = "2.1.0" dependencies = [@@ -14,7 +13,8 @@ ]-requires-python = ">=3.9"+requires-python = ">=3.10" description = "Foreign Function Interface for Python calling C code."-readme = {file = "README.md", content-type = "text/markdown"}-license = "MIT"+readme = "README.md"+license = "MIT-0"+license-files = ["LICENSE"] classifiers = [@@ -22,3 +22,2 @@ "Programming Language :: Python :: 3",- "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10",@@ -28,2 +27,3 @@ "Programming Language :: Python :: 3.14",+ "Programming Language :: Python :: 3.15", "Programming Language :: Python :: Free Threading :: 2 - Beta",@@ -38,3 +38,2 @@ {name = "Matt Clay"},- {name = "Matti Picus"}, ]@@ -44,2 +43,5 @@ +[project.scripts]+cffi-gen-src = "cffi._cffi_gen_src:run"+ [project.urls]@@ -47,3 +49,3 @@ Changelog = "https://cffi.readthedocs.io/en/latest/whatsnew.html"-Downloads = "https://github.com/python-cffi/cffi/releases"+Download = "https://github.com/python-cffi/cffi/releases" Contact = "https://groups.google.com/forum/#!forum/python-cffi"
--- +++ @@ -156,3 +156,3 @@ -if 'darwin' in sys.platform:+if sysconfig.get_platform().startswith('macosx'): # priority is given to `pkg_config`, but always fall back on SDK's libffi.
--- +++ @@ -18,2 +18,5 @@ pass++is_ios = sys.platform == 'ios'+ @@ -65,3 +68,3 @@ import sys-assert __version__ == "2.0.0", ("This test_c.py file is for testing a version"+assert __version__ == "2.1.0", ("This test_c.py file is for testing a version" " of cffi that differs from the one that we"@@ -74,3 +77,3 @@ bitem2bchr = lambda x: x- class U(object):+ class U: def __add__(self, other):@@ -459,3 +462,3 @@ assert p[0] == cast(BCharP, 0)- assert p[0] != None+ assert p[0] is not None assert repr(p[0]) == "<cdata 'int *' NULL>"@@ -494,4 +497,4 @@ x = cast(p, 42)- assert (x == None) is False- assert (x != None) is True+ assert (x is None) is False+ assert (x is not None) is True assert (x == ["hello"]) is False@@ -499,3 +502,3 @@ y = cast(p, 0)- assert (y == None) is False+ assert (y is None) is False @@ -1232,2 +1235,7 @@ [email protected](+ is_ios,+ reason="For an unknown reason f(1, cast(BInt, 42)) returns 36792864",+ raises=AssertionError,+) def test_call_function_9():@@ -1364,2 +1372,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback():@@ -1380,2 +1389,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") @pytest.mark.thread_unsafe("mocks sys.unraiseablehook")@@ -1437,2 +1447,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_return_type():@@ -1457,2 +1468,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_a_lot_of_callbacks():@@ -1472,2 +1484,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_receiving_tiny_struct():@@ -1487,2 +1500,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_tiny_struct():@@ -1504,2 +1518,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_receiving_struct():@@ -1520,2 +1535,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_struct():@@ -1539,2 +1555,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_receiving_big_struct():@@ -1563,2 +1580,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_big_struct():@@ -1588,2 +1606,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_void():@@ -1696,2 +1715,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_enum():@@ -1712,2 +1732,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_enum_unsigned():@@ -1729,2 +1750,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_char():@@ -1743,2 +1765,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_callback_returning_wchar_t():@@ -2312,2 +2335,4 @@ #+ if is_ios:+ return # cannot allocate executable memory for the callback() below def cb(p):@@ -2548,2 +2573,3 @@ [email protected](is_ios, reason="Cannot allocate executable memory on iOS") def test_errno_callback():@@ -2993,4 +3019,4 @@ try:- import posix, io- posix.fdopen = io.open+ import posix+ posix.fdopen = open except ImportError:@@ -2998,2 +3024,7 @@ [email protected](+ is_ios,+ reason="For an unknown reason fscanf() doesn't read anything on 3.14"+ " and crashes on 3.13 (that's why it's not an xfail)",+) def test_FILE():@@ -3293,3 +3324,3 @@ BVoidP = new_pointer_type(new_void_type())- class A(object):+ class A: pass@@ -3337,11 +3368,10 @@ raise AssertionError("bad flag")+ elif flag & SF_MSVC_BITFIELDS:+ assert raw == b'A\x00\x00\x00\x00\x00\xC77\x9D\x00\x00\x00'+ elif flag & SF_GCC_LITTLE_ENDIAN:+ assert raw == b'A\xC77\x9D'+ elif flag & SF_GCC_BIG_ENDIAN:+ assert raw == b'A\x9B\xE3\x9D' else:- if flag & SF_MSVC_BITFIELDS:- assert raw == b'A\x00\x00\x00\x00\x00\xC77\x9D\x00\x00\x00'- elif flag & SF_GCC_LITTLE_ENDIAN:- assert raw == b'A\xC77\x9D'- elif flag & SF_GCC_BIG_ENDIAN:- assert raw == b'A\x9B\xE3\x9D'- else:- raise AssertionError("bad flag")+ raise AssertionError("bad flag") #@@ -3820,3 +3850,3 @@ expected = expected_for_memoryview- class X(object):+ class X: pass@@ -4151,4 +4181,4 @@ BArray = new_array_type(new_pointer_type(BWChar), 10) # wchar_t[10]- p = newp(BArray, u"abc\x00def")- assert unpack(p, 10) == u"abc\x00def\x00\x00\x00"+ p = newp(BArray, "abc\x00def")+ assert unpack(p, 10) == "abc\x00def\x00\x00\x00"
--- +++ @@ -7,4 +7,4 @@ -__version__ = "2.0.0"-__version_info__ = (2, 0, 0)+__version__ = "2.1.0"+__version_info__ = (2, 1, 0)
--- +++ @@ -4,9 +4,2 @@ from . import model--try:- callable-except NameError:- # Python 3.1- from collections import Callable- callable = lambda x: isinstance(x, Callable) @@ -22,3 +15,3 @@ -class FFI(object):+class FFI: r'''@@ -416,3 +409,3 @@ replace_with = '(%s)' % replace_with- elif replace_with and not replace_with[0] in '[(':+ elif replace_with and replace_with[0] not in '[(': replace_with = ' ' + replace_with@@ -911,3 +904,3 @@ #- class FFILibrary(object):+ class FFILibrary: def __getattr__(self, name):
--- +++ @@ -14,3 +14,3 @@ -class CTypesData(object):+class CTypesData: __metaclass__ = CTypesType@@ -272,3 +272,3 @@ -class CTypesBackend(object):+class CTypesBackend: @@ -338,3 +338,2 @@ (type(novalue).__name__,))- return None CTypesVoid._fix_class()@@ -389,3 +388,3 @@ - if kind == 'int' or kind == 'byte':+ if kind in {'int', 'byte'}: @classmethod@@ -437,3 +436,3 @@ - if kind == 'int' or kind == 'byte' or kind == 'bool':+ if kind in {'int', 'byte', 'bool'}: @staticmethod@@ -560,3 +559,3 @@ - if kind == 'charp' or kind == 'voidp':+ if kind in {'charp', 'voidp'}: @classmethod@@ -566,5 +565,5 @@ else:- return super(CTypesPtr, cls)._arg_to_ctypes(*value)-- if kind == 'charp' or kind == 'bytep':+ return super()._arg_to_ctypes(*value)++ if kind in {'charp', 'bytep'}: def _to_string(self, maxlen):@@ -583,3 +582,3 @@ ctypes.sizeof(self._as_ctype_ptr.contents),)- return super(CTypesPtr, self)._get_own_repr()+ return super()._get_own_repr() #@@ -665,3 +664,3 @@ - if kind == 'char' or kind == 'byte':+ if kind in {'char', 'byte'}: def _to_string(self, maxlen):@@ -679,3 +678,3 @@ return 'owning %d bytes' % (ctypes.sizeof(self._blob),)- return super(CTypesArray, self)._get_own_repr()+ return super()._get_own_repr() @@ -919,3 +918,3 @@ return 'calling %r' % (self._own_callback,)- return super(CTypesFunctionPtr, self)._get_own_repr()+ return super()._get_own_repr() @@ -1096,3 +1095,3 @@ -class CTypesLibrary(object):+class CTypesLibrary:
click pypi YANKBURST
8.1.7
8.1.8
8.2.0
8.2.1
8.2.2
8.3.0
8.3.1
8.3.2
8.3.3
8.4.0
8.4.1
8.4.2
YANK
8.2.2 marked yanked (still downloadable)
high · registry-verified · 2025-08-02 · 11mo ago
BURST
2 releases in 5m: 0.5, 0.5.1
info · registry-verified · 2014-05-06 · 12y ago
release diff 8.4.1 → 8.4.2
+0 added · -1 removed · ~30 modified
--- +++ @@ -18,3 +18,2 @@ import click.utils-from click._compat import MAC from click._compat import WIN@@ -288,2 +287,7 @@ def _test_gen_func_fails():+ raise RuntimeError("This is a test.")+ yield # unreachable, keeps this a generator function+++def _test_gen_func_yields_then_fails(): yield "test"@@ -317,6 +321,2 @@ @pytest.mark.skipif(WIN, reason="Different behavior on windows.")[email protected](- MAC and sys.version_info >= (3, 13) and not sys._is_gil_enabled(),- reason="Generator exception tests are flaky in Python 3.14t on macOS.",-) @pytest.mark.parametrize(@@ -456,2 +456,71 @@ )++[email protected](WIN, reason="Different behavior on windows.")+def test_echo_via_pager_yields_before_exception(monkeypatch, tmp_path):+ """A generator that yields then raises: click writes the partial output to+ the pager stream before propagating the exception.++ The pager file content is intentionally NOT asserted: pipe-drain timing+ between click and the pager subprocess is outside click's control+ (#2899, #3470). Spying on ``MaybeStripAnsi.write`` records what click sent+ to the pager, which is deterministic regardless of scheduling.+ """+ monkeypatch.setitem(os.environ, "PAGER", "cat")+ monkeypatch.setattr(click._termui_impl, "isatty", lambda x: True)++ writes: list[str] = []+ real_write = click._termui_impl.MaybeStripAnsi.write++ def spy(self, text):+ writes.append(text)+ return real_write(self, text)++ monkeypatch.setattr(click._termui_impl.MaybeStripAnsi, "write", spy)++ pager_out_tmp = tmp_path / "pager_out.txt"+ with (+ pager_out_tmp.open("w") as f,+ patch.object(subprocess, "Popen", partial(subprocess.Popen, stdout=f)),+ pytest.raises(RuntimeError, match="This is a test."),+ ):+ click.echo_via_pager(_test_gen_func_yields_then_fails())++ assert "".join(writes) == "test", (+ f"click should have written the yielded chunk before exception, got {writes!r}"+ )++[email protected][email protected](WIN, reason="Different behavior on windows.")[email protected]("_", range(1000))+def test_stress_echo_via_pager_exception_cleanup(_, monkeypatch, tmp_path):+ """Repeated exceptions during ``echo_via_pager`` must not leak subprocesses.++ Regression coverage for the cleanup path in ``_pipepager``'s exception+ handler (issue #2899, PR #3470). Each iteration spawns a real pager+ subprocess, raises before any data is written and check there is no leak.+ """+ monkeypatch.setitem(os.environ, "PAGER", "cat")+ monkeypatch.setattr(click._termui_impl, "isatty", lambda x: True)++ spawned: list[subprocess.Popen] = []+ real_popen = subprocess.Popen++ def tracking_popen(*args, **kwargs):+ p = real_popen(*args, **kwargs)+ spawned.append(p)+ return p++ pager_out_tmp = tmp_path / "pager_out.txt"+ with (+ pager_out_tmp.open("w") as f,+ patch.object(subprocess, "Popen", partial(tracking_popen, stdout=f)),+ pytest.raises(RuntimeError),+ ):+ click.echo_via_pager(_test_gen_func_fails())++ assert spawned, "pager subprocess was never started"+ for p in spawned:+ assert p.returncode is not None, "pager subprocess not reaped"
--- +++ @@ -33,2 +33,3 @@ }+myst_enable_extensions = ["attrs_block"] myst_heading_anchors = 3
--- +++ @@ -2,3 +2,3 @@ name = "click"-version = "8.4.1"+version = "8.4.2" description = "Composable command line interface toolkit"@@ -187,3 +187,3 @@ [tool.tox.env.stress]-description = "stress tests for stream lifecycle race conditions"+description = "high-iteration stress tests for race conditions" commands = [[@@ -192,3 +192,2 @@ "--override-ini=addopts=",- "tests/test_stream_lifecycle.py", {replace = "posargs", default = [], extend = true},
--- +++ @@ -14,3 +14,2 @@ WIN = sys.platform.startswith("win")-MAC = sys.platform == "darwin" auto_wrap_for_ansi: t.Callable[[t.TextIO], t.TextIO] | None = None
--- +++ @@ -31,2 +31,3 @@ from .utils import echo+from .utils import KeepOpenFile @@ -432,4 +433,7 @@ """Context manager.+ Yields a writable file-like object which can be used as an output pager.- .. versionadded:: 8.4++ .. versionadded:: 8.4.0+ :param color: controls if the pager supports ANSI colors or not. The@@ -440,13 +444,24 @@ # BinaryIO annotations: buffered text streams can be unwrapped to bytes,- # while text-only streams are yielded as-is.+ # while other streams are yielded as-is.+ wrapper: MaybeStripAnsi | None = None if _has_binary_buffer(stream): # Text stream backed by a binary buffer.- stream = MaybeStripAnsi(stream.buffer, color=color, encoding=encoding)- elif isinstance(stream, t.BinaryIO):- # Binary stream- stream = MaybeStripAnsi(stream, color=color, encoding=encoding)+ wrapper = MaybeStripAnsi(stream.buffer, color=color, encoding=encoding)+ stream = wrapper try:- yield stream+ # Narrow the BinaryIO | TextIO union that _pager_contextmanager+ # yields; the caller writes text to the pager.+ yield t.cast(t.TextIO, stream) finally:- stream.flush()+ try:+ stream.flush()+ finally:+ # Hand the binary buffer back to the pager that produced it+ # rather than letting this TextIOWrapper close it on garbage+ # collection. The pager owns the buffer's lifecycle: subprocess+ # pipes and temp files are closed by their own helpers, while a+ # borrowed stdout must stay open for the caller. detach() runs+ # even if flush() raised, so the buffer is never closed here.+ if wrapper is not None:+ wrapper.detach() @@ -470,4 +485,7 @@ if not cmd_parts:+ # No usable pager: fall back to stdout through _nullpager so it gets the+ # same borrowed-stream handling and the caller's stream is not closed. stdout = _default_text_stdout() or StringIO()- yield stdout, "utf-8", False+ with _nullpager(stdout, color) as rv:+ yield rv return@@ -481,4 +499,7 @@ if not cmd_filepath:+ # No usable pager: fall back to stdout through _nullpager so it gets the+ # same borrowed-stream handling and the caller's stream is not closed. stdout = _default_text_stdout() or StringIO()- yield stdout, "utf-8", False+ with _nullpager(stdout, color) as rv:+ yield rv return@@ -570,4 +591,7 @@ if not cmd_parts:+ # No usable pager: fall back to stdout through _nullpager so it gets the+ # same borrowed-stream handling and the caller's stream is not closed. stdout = _default_text_stdout() or StringIO()- yield stdout, "utf-8", False+ with _nullpager(stdout, color) as rv:+ yield rv return@@ -581,4 +605,7 @@ if not cmd_filepath:+ # No usable pager: fall back to stdout through _nullpager so it gets the+ # same borrowed-stream handling and the caller's stream is not closed. stdout = _default_text_stdout() or StringIO()- yield stdout, "utf-8", False+ with _nullpager(stdout, color) as rv:+ yield rv return@@ -608,17 +635,2 @@ -class _SkipClose:- def __init__(self, stream: t.IO[t.Any]) -> None:- self.stream = stream-- def __getattr__(self, name: str) -> t.Any:- return getattr(self.stream, name)-- @property- def buffer(self) -> t.BinaryIO:- return _SkipClose(self.stream.buffer) # type: ignore[attr-defined, return-value]-- def close(self) -> None:- pass-- @contextlib.contextmanager@@ -630,2 +642,6 @@ internal helpers.++ The stream is wrapped in :class:`~click.utils.KeepOpenFile` so that, as a+ borrowed stream, it is not closed by a ``with`` block. The wrapper that+ :func:`get_pager_file` builds around it is detached rather than closed. """@@ -636,3 +652,3 @@ - yield _SkipClose(stream), encoding, color # type: ignore[misc]+ yield KeepOpenFile(stream), encoding, color # type: ignore[misc]
--- +++ @@ -50,2 +50,4 @@ if t.TYPE_CHECKING:+ from typing_extensions import Self+ from .shell_completion import CompletionItem@@ -119,3 +121,3 @@ ctx: Context, param: Parameter | None = None-) -> cabc.Iterator[None]:+) -> cabc.Generator[None]: """Context manager that attaches extra information to exceptions."""@@ -305,2 +307,30 @@ + parent: Context | None+ command: Command+ info_name: str | None+ params: dict[str, t.Any]+ args: list[str]+ _protected_args: list[str]+ _opt_prefixes: set[str]+ obj: t.Any+ _meta: dict[str, t.Any]+ default_map: cabc.MutableMapping[str, t.Any] | None+ invoked_subcommand: str | None+ terminal_width: int | None+ max_content_width: int | None+ allow_extra_args: bool+ allow_interspersed_args: bool+ ignore_unknown_options: bool+ help_option_names: list[str]+ token_normalize_func: t.Callable[[str], str] | None+ resilient_parsing: bool+ auto_envvar_prefix: str | None+ color: bool | None+ show_default: bool | None+ _close_callbacks: list[t.Callable[[], t.Any]]+ _depth: int+ _parameter_source: dict[str, ParameterSource]+ _param_default_explicit: dict[str, bool]+ _exit_stack: ExitStack+ def __init__(@@ -332,5 +362,5 @@ #: with ``expose_value=False`` are not stored.- self.params: dict[str, t.Any] = {}+ self.params = {} #: the leftover arguments.- self.args: list[str] = []+ self.args = [] #: protected arguments. These are arguments that are prepended@@ -339,5 +369,5 @@ #: to implement nested parsing.- self._protected_args: list[str] = []+ self._protected_args = [] #: the collected prefixes of the command's options.- self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set()+ self._opt_prefixes = set(parent._opt_prefixes) if parent else set() @@ -347,4 +377,4 @@ #: the user object stored.- self.obj: t.Any = obj- self._meta: dict[str, t.Any] = getattr(parent, "meta", {})+ self.obj = obj+ self._meta = getattr(parent, "meta", {}) @@ -359,3 +389,3 @@ - self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map+ self.default_map = default_map @@ -371,3 +401,3 @@ #: should use a :func:`result_callback`.- self.invoked_subcommand: str | None = None+ self.invoked_subcommand = None @@ -377,3 +407,3 @@ #: The width of the terminal (None is autodetection).- self.terminal_width: int | None = terminal_width+ self.terminal_width = terminal_width @@ -384,3 +414,3 @@ #: default which is 80 for most things).- self.max_content_width: int | None = max_content_width+ self.max_content_width = max_content_width @@ -402,3 +432,3 @@ #: .. versionadded:: 3.0- self.allow_interspersed_args: bool = allow_interspersed_args+ self.allow_interspersed_args = allow_interspersed_args @@ -415,3 +445,3 @@ #: .. versionadded:: 4.0- self.ignore_unknown_options: bool = ignore_unknown_options+ self.ignore_unknown_options = ignore_unknown_options @@ -424,3 +454,3 @@ #: The names for the help options.- self.help_option_names: list[str] = help_option_names+ self.help_option_names = help_option_names @@ -431,3 +461,3 @@ #: options, choices, commands etc.- self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func+ self.token_normalize_func = token_normalize_func @@ -436,3 +466,3 @@ #: will be ignored. Useful for completion.- self.resilient_parsing: bool = resilient_parsing+ self.resilient_parsing = resilient_parsing @@ -456,3 +486,3 @@ - self.auto_envvar_prefix: str | None = auto_envvar_prefix+ self.auto_envvar_prefix = auto_envvar_prefix @@ -462,3 +492,3 @@ #: Controls if styling output is wanted or not.- self.color: bool | None = color+ self.color = color @@ -468,7 +498,7 @@ #: Show option default values when formatting help text.- self.show_default: bool | None = show_default-- self._close_callbacks: list[t.Callable[[], t.Any]] = []+ self.show_default = show_default++ self._close_callbacks = [] self._depth = 0- self._parameter_source: dict[str, ParameterSource] = {}+ self._parameter_source = {} # Tracks whether the option that currently owns each parameter slot in@@ -478,3 +508,3 @@ # Refs: https://github.com/pallets/click/issues/3403- self._param_default_explicit: dict[str, bool] = {}+ self._param_default_explicit = {} self._exit_stack = ExitStack()@@ -514,3 +544,3 @@ - def __enter__(self) -> Context:+ def __enter__(self) -> Self: self._depth += 1@@ -534,3 +564,3 @@ @contextmanager- def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]:+ def scope(self, cleanup: bool = True) -> cabc.Generator[Context]: """This helper method can be used with the context object to promote@@ -987,2 +1017,16 @@ + name: str | None+ context_settings: cabc.MutableMapping[str, t.Any]+ callback: t.Callable[..., t.Any] | None+ params: list[Parameter]+ help: str | None+ epilog: str | None+ options_metavar: str | None+ short_help: str | None+ add_help_option: bool+ _help_option: Option | None+ no_args_is_help: bool+ hidden: bool+ deprecated: bool | str+ def __init__(@@ -1012,3 +1056,3 @@ #: an optional dictionary with defaults passed to the context.- self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings+ self.context_settings = context_settings @@ -1020,3 +1064,3 @@ #: will automatically be handled before non eager ones.- self.params: list[Parameter] = params or []+ self.params = params or [] self.help = help@@ -1191,3 +1235,4 @@ if self.deprecated:- text = f"{_(text)} {_format_deprecated_label(self.deprecated)}"+ label = _format_deprecated_label(self.deprecated)+ text = f"{_(text)} {label}" if text else label @@ -1594,2 +1639,8 @@ + commands: cabc.MutableMapping[str, Command]+ invoke_without_command: bool+ subcommand_metavar: str+ chain: bool+ _result_callback: t.Callable[..., t.Any] | None+ def __init__(@@ -1615,3 +1666,3 @@ #: The registered subcommands by their exported names.- self.commands: cabc.MutableMapping[str, Command] = commands+ self.commands = commands @@ -1624,4 +1675,11 @@ if subcommand_metavar is None:+ # When the group can run without a subcommand, the leading command+ # token is optional, so wrap it in brackets to reflect that. if chain:- subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..."+ if invoke_without_command:+ subcommand_metavar = "[COMMAND1] [ARGS]... [COMMAND2 [ARGS]...]..."+ else:+ subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..."+ elif invoke_without_command:+ subcommand_metavar = "[COMMAND] [ARGS]..." else:@@ -2014,2 +2072,4 @@ + sources: list[Group]+ def __init__(@@ -2022,3 +2082,3 @@ #: The list of registered groups.- self.sources: list[Group] = sources or []+ self.sources = sources or [] @@ -2054,3 +2114,3 @@ -def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]:+def _check_iter(value: cabc.Iterable[V]) -> cabc.Iterator[V]: """Check if the value is iterable but not a string. Raises a type@@ -2157,2 +2217,21 @@ + name: str+ opts: list[str]+ secondary_opts: list[str]+ # `Parameter.type` is annotated in `__init__` to avoid confusing mypy+ required: bool+ callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None+ nargs: int+ multiple: bool+ expose_value: bool+ default: t.Any | t.Callable[[], t.Any] | None+ _default_explicit: bool+ is_eager: bool+ metavar: str | None+ envvar: str | cabc.Sequence[str] | None+ _custom_shell_complete: (+ t.Callable[[Context, Parameter, str], list[CompletionItem] | list[str]] | None+ )+ deprecated: bool | str+ def __init__(@@ -2186,5 +2265,2 @@ ) -> None:- self.name: str- self.opts: list[str]- self.secondary_opts: list[str]
… 65 more lines (truncated)
--- +++ @@ -436,4 +436,7 @@ If ``package_name`` is not provided, Click will try to detect it by- inspecting the stack frames. This will be used to detect the- version, so it must match the name of the installed package.+ inspecting the stack frames. If the detected (or given) name does+ not match an installed distribution, Click resolves it as an import+ (top-level module) name via+ :func:`importlib.metadata.packages_distributions`, so e.g. ``PIL``+ resolves to the ``Pillow`` distribution. @@ -462,2 +465,6 @@ package name, or be passed with ``package_name=``.++ .. versionchanged:: 8.4.2+ When ``package_name`` does not match an installed distribution,+ Click now resolves it as an import (top-level module). """@@ -489,2 +496,3 @@ nonlocal version+ nonlocal package_name @@ -499,6 +507,22 @@ except importlib.metadata.PackageNotFoundError:- raise RuntimeError(- f"{package_name!r} is not installed. Try passing"- " 'package_name' instead."- ) from None+ # The given name didn't match an installed distribution.+ # Try resolving it as an import (top-level module) name,+ # e.g. ``PIL`` is provided by the ``Pillow`` distribution.+ distributions = importlib.metadata.packages_distributions().get(+ package_name, []+ )+ if len(distributions) == 1:+ package_name = distributions[0]+ version = importlib.metadata.version(package_name)+ elif len(distributions) > 1:+ raise RuntimeError(+ f"{package_name!r} maps to multiple installed"+ f" distributions ({', '.join(distributions)})."+ " Pass 'package_name' to disambiguate."+ ) from None+ else:+ raise RuntimeError(+ f"{package_name!r} is not installed. Try passing"+ " 'package_name' instead."+ ) from None
--- +++ @@ -38,3 +38,6 @@ #: The exit code for this exception.- exit_code = 1+ exit_code: t.ClassVar[int] = 1++ show_color: t.Final[bool | None]+ message: t.Final[str] @@ -44,3 +47,3 @@ # the color settings here to be used later on (in `show`)- self.show_color: bool | None = resolve_color_default()+ self.show_color = resolve_color_default() self.message = message@@ -73,3 +76,6 @@ - exit_code = 2+ exit_code: t.ClassVar[int] = 2++ ctx: Context | None+ cmd: t.Final[Command | None] @@ -78,3 +84,3 @@ self.ctx = ctx- self.cmd: Command | None = self.ctx.command if self.ctx else None+ self.cmd = self.ctx.command if self.ctx else None @@ -125,2 +131,5 @@ + param: Parameter | None+ param_hint: cabc.Sequence[str] | str | None+ def __init__(@@ -160,2 +169,4 @@ """++ param_type: t.Final[str | None] @@ -226,2 +237,5 @@ + option_name: t.Final[str]+ possibilities: t.Final[list[str] | None]+ def __init__(@@ -238,3 +252,3 @@ self.option_name = option_name- self.possibilities: list[str] | None = None+ if possibilities:@@ -242,3 +256,6 @@ - self.possibilities = get_close_matches(option_name, possibilities)+ possibilities_ = get_close_matches(option_name, possibilities)+ else:+ possibilities_ = None+ self.possibilities = possibilities_ @@ -255,2 +272,5 @@ """++ command_name: t.Final[str]+ possibilities: t.Final[list[str] | None] @@ -268,3 +288,3 @@ self.command_name = command_name- self.possibilities: list[str] | None = None+ if possibilities:@@ -272,3 +292,6 @@ - self.possibilities = get_close_matches(command_name, possibilities)+ possibilities_ = get_close_matches(command_name, possibilities)+ else:+ possibilities_ = None+ self.possibilities = possibilities_ @@ -290,2 +313,4 @@ + option_name: t.Final[str]+ def __init__(@@ -307,4 +332,5 @@ class NoArgsIsHelpError(UsageError):+ ctx: Context+ def __init__(self, ctx: Context) -> None:- self.ctx: Context super().__init__(ctx.get_help(), ctx=ctx)@@ -317,2 +343,5 @@ """Raised if a file cannot be opened."""++ ui_filename: t.Final[str]+ filename: t.Final[str] @@ -323,3 +352,3 @@ super().__init__(hint)- self.ui_filename: str = format_filename(filename)+ self.ui_filename = format_filename(filename) self.filename = filename@@ -345,3 +374,5 @@ + exit_code: t.Final[int]+ def __init__(self, code: int = 0) -> None:- self.exit_code: int = code+ self.exit_code = code
--- +++ @@ -121,2 +121,7 @@ + indent_increment: int+ width: int+ current_indent: int+ buffer: list[str]+ def __init__(@@ -137,4 +142,4 @@ self.width = width- self.current_indent: int = 0- self.buffer: list[str] = []+ self.current_indent = 0+ self.buffer = [] @@ -225,3 +230,3 @@ self,- rows: cabc.Sequence[tuple[str, str]],+ rows: cabc.Iterable[tuple[str, str]], col_max: int = 30,@@ -268,3 +273,3 @@ @contextmanager- def section(self, name: str) -> cabc.Iterator[None]:+ def section(self, name: str) -> cabc.Generator[None]: """Helpful context manager that writes a paragraph, a heading,@@ -283,3 +288,3 @@ @contextmanager- def indentation(self) -> cabc.Iterator[None]:+ def indentation(self) -> cabc.Generator[None]: """A context manager that increases the indentation."""@@ -296,3 +301,3 @@ -def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]:+def join_options(options: cabc.Iterable[str]) -> tuple[str, bool]: """Given a list of option strings this joins them in the most appropriate
--- +++ @@ -24,3 +24,3 @@ instruction: str,-) -> int:+) -> t.Literal[0, 1]: """Perform shell completion for the given CLI program.@@ -57,3 +57,12 @@ -class CompletionItem:+if t.TYPE_CHECKING:+ from typing_extensions import TypeVar++ # `Any` is used as default for backwards compatibility (instead of e.g. `str`)+ _ValueT_co = TypeVar("_ValueT_co", covariant=True, default=t.Any)+else:+ _ValueT_co = t.TypeVar("_ValueT_co", covariant=True)+++class CompletionItem(t.Generic[_ValueT_co]): """Represents a completion value and metadata about the value. The@@ -80,3 +89,3 @@ self,- value: t.Any,+ value: _ValueT_co, type: str = "plain",@@ -85,3 +94,3 @@ ) -> None:- self.value: t.Any = value+ self.value: _ValueT_co = value self.type: str = type@@ -183,3 +192,3 @@ for completion in $response;- set -l metadata (string split \n $completion);+ set -l metadata (string split "," $completion); @@ -190,7 +199,3 @@ else if test $metadata[1] = "plain";- if test $metadata[3] != "_";- echo $metadata[2]\t$metadata[3];- else;- echo $metadata[2];- end;+ echo $metadata[2]; end;@@ -202,2 +207,8 @@ """+++class _SourceVarsDict(t.TypedDict):+ complete_func: str+ complete_var: str+ prog_name: str @@ -227,2 +238,7 @@ """++ cli: Command+ ctx_args: cabc.MutableMapping[str, t.Any]+ prog_name: str+ complete_var: str @@ -248,3 +264,3 @@ - def source_vars(self) -> dict[str, t.Any]:+ def source_vars(self) -> _SourceVarsDict: """Vars for formatting :attr:`source_template`.@@ -275,3 +291,5 @@ - def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]:+ def get_completions(+ self, args: list[str], incomplete: str+ ) -> list[CompletionItem[str]]: """Determine the context and last complete command or parameter@@ -287,3 +305,3 @@ - def format_completion(self, item: CompletionItem) -> str:+ def format_completion(self, item: CompletionItem[str]) -> str: """Format a completion item into the form recognized by the@@ -311,4 +329,4 @@ - name = "bash"- source_template = _SOURCE_BASH+ name: t.ClassVar[str] = "bash"+ source_template: t.ClassVar[str] = _SOURCE_BASH @@ -363,3 +381,3 @@ - def format_completion(self, item: CompletionItem) -> str:+ def format_completion(self, item: CompletionItem[t.Any]) -> str: return f"{item.type},{item.value}"@@ -370,4 +388,4 @@ - name = "zsh"- source_template = _SOURCE_ZSH+ name: t.ClassVar[str] = "zsh"+ source_template: t.ClassVar[str] = _SOURCE_ZSH @@ -385,3 +403,3 @@ - def format_completion(self, item: CompletionItem) -> str:+ def format_completion(self, item: CompletionItem[str]) -> str: help_ = item.help or "_"@@ -406,4 +424,4 @@ - name = "fish"- source_template = _SOURCE_FISH+ name: t.ClassVar[str] = "fish"+ source_template: t.ClassVar[str] = _SOURCE_FISH @@ -423,23 +441,20 @@ - def format_completion(self, item: CompletionItem) -> str:- """- .. versionchanged:: 8.4.0- Escape newlines in value and help to fix completion errors with- multi-line help strings.- """- # The fish completion script splits each response line on literal- # newlines, so any newline in the value or help would corrupt the- # frame. Replace them with the two-character escape "\n" so the text- # round-trips through fish without breaking the format. The "_"- # sentinel for missing help mirrors :class:`ZshComplete`.- help_ = item.help or "_"- value = item.value.replace("\n", r"\n")- help_escaped = help_.replace("\n", r"\n")- return f"{item.type}\n{value}\n{help_escaped}"---ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]")---_available_shells: dict[str, type[ShellComplete]] = {+ def format_completion(self, item: CompletionItem[str]) -> str:+ """+ .. versionchanged:: 8.4.2+ Escape newlines and replace tabs with spaces in the help text to+ fix completion errors with multi-line help strings.+ """+ # According to https://fishshell.com/docs/current/cmds/complete.html+ # Command substitutions found in ARGUMENTS should return a newline-+ # separated list of arguments, and each argument may optionally have a tab+ # character followed by the argument description.+ if item.help:+ help_ = item.help.replace("\n", "\\n").replace("\t", " ")+ return f"{item.type},{item.value}\t{help_}"++ return f"{item.type},{item.value}"+++_available_shells: t.Final[dict[str, type[ShellComplete]]] = { "bash": BashComplete,@@ -449,6 +464,8 @@ +_ShellCompleteT = t.TypeVar("_ShellCompleteT", bound="ShellComplete")+ def add_completion_class(- cls: ShellCompleteType, name: str | None = None-) -> ShellCompleteType:+ cls: type[_ShellCompleteT], name: str | None = None+) -> type[_ShellCompleteT]: """Register a :class:`ShellComplete` subclass under the given name.@@ -470,2 +487,10 @@ [email protected]+def get_completion_class(shell: t.Literal["bash"]) -> type[BashComplete]: ...[email protected]+def get_completion_class(shell: t.Literal["fish"]) -> type[FishComplete]: ...[email protected]+def get_completion_class(shell: t.Literal["zsh"]) -> type[ZshComplete]: ...[email protected]+def get_completion_class(shell: str) -> type[ShellComplete] | None: ... def get_completion_class(shell: str) -> type[ShellComplete] | None:
--- +++ @@ -348,2 +348,6 @@ pager.write(text)+ # Flush after each write so a slow generator streams to the pager+ # incrementally rather than staying invisible until the pipe buffer+ # fills (~8 KB).+ pager.flush()
--- +++ @@ -24,3 +24,7 @@ -CaptureMode = t.Literal["sys", "fd"]+if sys.platform == "win32":+ CaptureMode: t.TypeAlias = t.Literal["sys"] # pyright: ignore[reportRedeclaration]+else:+ CaptureMode: t.TypeAlias = t.Literal["sys", "fd"] # pyright: ignore[reportRedeclaration]+ExceptionInfo: t.TypeAlias = tuple[type[BaseException], BaseException, TracebackType] @@ -28,2 +32,6 @@ class EchoingStdin:+ _input: t.BinaryIO+ _output: t.BinaryIO+ _paused: bool+ def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None:@@ -62,3 +70,3 @@ @contextlib.contextmanager-def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]:+def _pause_echo(stream: EchoingStdin | None) -> cabc.Generator[None]: if stream is None:@@ -82,6 +90,10 @@ + _targetfd: int+ saved_fd: int+ _tmpfile: t.BinaryIO | None+ def __init__(self, targetfd: int) -> None: self._targetfd = targetfd- self.saved_fd: int = -1- self._tmpfile: t.BinaryIO | None = None+ self.saved_fd = -1+ self._tmpfile = None @@ -110,2 +122,4 @@ + copy_to: io.BytesIO+ def __init__(self, copy_to: io.BytesIO) -> None:@@ -131,6 +145,10 @@ + output: io.BytesIO+ stdout: BytesIOCopy+ stderr: BytesIOCopy+ def __init__(self) -> None:- self.output: io.BytesIO = io.BytesIO()- self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output)- self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output)+ self.output = io.BytesIO()+ self.stdout = BytesIOCopy(copy_to=self.output)+ self.stderr = BytesIOCopy(copy_to=self.output) @@ -148,2 +166,6 @@ """++ _name: str+ _mode: str+ _original_fd: int @@ -159,3 +181,3 @@ self._mode = mode- self._original_fd: int = -1+ self._original_fd = -1 @@ -230,2 +252,11 @@ + runner: CliRunner+ stdout_bytes: bytes+ stderr_bytes: bytes+ output_bytes: bytes+ return_value: t.Any+ exit_code: int+ exception: BaseException | None+ exc_info: ExceptionInfo | None+ def __init__(@@ -239,5 +270,4 @@ exception: BaseException | None,- exc_info: tuple[type[BaseException], BaseException, TracebackType]- | None = None,- ):+ exc_info: ExceptionInfo | None = None,+ ) -> None: self.runner = runner@@ -322,2 +352,8 @@ """++ charset: str+ env: cabc.Mapping[str, str | None]+ echo_stdin: bool+ catch_exceptions: bool+ capture: CaptureMode @@ -340,6 +376,6 @@ self.charset = charset- self.env: cabc.Mapping[str, str | None] = env or {}+ self.env = env or {} self.echo_stdin = echo_stdin self.catch_exceptions = catch_exceptions- self.capture: CaptureMode = capture+ self.capture = capture @@ -367,3 +403,3 @@ color: bool = False,- ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]:+ ) -> cabc.Generator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: """A context manager that sets up the isolation for invoking of a@@ -707,3 +743,3 @@ self, temp_dir: str | os.PathLike[str] | None = None- ) -> cabc.Iterator[str]:+ ) -> cabc.Generator[str]: """A context manager that creates a temporary directory and
--- +++ @@ -28,3 +28,8 @@ -ParamTypeValue = t.TypeVar("ParamTypeValue")+_ValueT = t.TypeVar("_ValueT")+_ValueT_contra = t.TypeVar("_ValueT_contra", contravariant=True)+_ValueT_co = t.TypeVar("_ValueT_co", covariant=True)++_FloatValueT = t.TypeVar("_FloatValueT", bound=float)+_FloatValueT_co = t.TypeVar("_FloatValueT_co", bound=float, covariant=True) @@ -36,3 +41,3 @@ -class ParamType(t.Generic[ParamTypeValue], abc.ABC):+class ParamType(t.Generic[_ValueT_co], abc.ABC): """Represents the type of a parameter. Validates and converts values@@ -61,3 +66,3 @@ is_composite: t.ClassVar[bool] = False- arity: t.ClassVar[int] = 1+ arity: int = 1 # read-only @@ -100,3 +105,3 @@ ctx: Context | None = None,- ) -> ParamTypeValue | None:+ ) -> _ValueT_co | None: if value is not None:@@ -117,3 +122,3 @@ self, value: t.Any, param: Parameter | None, ctx: Context | None- ) -> ParamTypeValue:+ ) -> _ValueT_co: """Convert the value to the correct type. This is not called if@@ -139,3 +144,3 @@ # metadata are not forced to redeclare ``convert``.- return t.cast("ParamTypeValue", value)+ return t.cast("_ValueT_co", value) @@ -178,4 +183,4 @@ -class CompositeParamType(ParamType[ParamTypeValue]):- is_composite = True+class CompositeParamType(ParamType[_ValueT_co]):+ is_composite: t.ClassVar[bool] = True @@ -186,12 +191,25 @@ -class FuncParamTypeInfoDict(ParamTypeInfoDict):- func: t.Callable[[t.Any], t.Any]---class FuncParamType(ParamType[ParamTypeValue]):- def __init__(self, func: t.Callable[[t.Any], ParamTypeValue]) -> None:- self.name: str = func.__name__+if t.TYPE_CHECKING:+ # on Python 3.10 this will raise a TypeError++ class FuncParamTypeInfoDict(+ ParamTypeInfoDict,+ t.Generic[_ValueT_contra, _ValueT_co],+ ):+ func: t.Callable[[_ValueT_contra], _ValueT_co]+else:++ class FuncParamTypeInfoDict(ParamTypeInfoDict):+ func: t.Callable[[t.Any], t.Any]+++class FuncParamType(ParamType[_ValueT_co], t.Generic[_ValueT_contra, _ValueT_co]):+ name: str+ func: t.Callable[[_ValueT_contra], _ValueT_co]++ def __init__(self, func: t.Callable[[_ValueT_contra], _ValueT_co]) -> None:+ self.name = func.__name__ self.func = func - def to_info_dict(self) -> FuncParamTypeInfoDict:+ def to_info_dict(self) -> FuncParamTypeInfoDict[_ValueT_contra, _ValueT_co]: return {"func": self.func, **super().to_info_dict()}@@ -199,4 +217,4 @@ def convert(- self, value: t.Any, param: Parameter | None, ctx: Context | None- ) -> ParamTypeValue:+ self, value: _ValueT_contra, param: Parameter | None, ctx: Context | None+ ) -> _ValueT_co: try:@@ -210,3 +228,3 @@ except UnicodeError:- message = value.decode("utf-8", "replace")+ message = t.cast("bytes", value).decode("utf-8", "replace") @@ -219,4 +237,4 @@ def convert(- self, value: t.Any, param: Parameter | None, ctx: Context | None- ) -> t.Any:+ self, value: _ValueT, param: Parameter | None, ctx: Context | None+ ) -> _ValueT: return value@@ -236,3 +254,3 @@ try:- value = value.decode(enc)+ return value.decode(enc) except UnicodeError:@@ -241,8 +259,7 @@ try:- value = value.decode(fs_enc)+ return value.decode(fs_enc) except UnicodeError:- value = value.decode("utf-8", "replace")+ return value.decode("utf-8", "replace") else:- value = value.decode("utf-8", "replace")- return value # type: ignore[no-any-return]+ return value.decode("utf-8", "replace") return str(value)@@ -253,8 +270,16 @@ -class ChoiceInfoDict(ParamTypeInfoDict):- choices: cabc.Sequence[t.Any]- case_sensitive: bool---class Choice(ParamType[ParamTypeValue], t.Generic[ParamTypeValue]):+if t.TYPE_CHECKING:+ # on Python 3.10 this will raise a TypeError++ class ChoiceInfoDict(ParamTypeInfoDict, t.Generic[_ValueT_co]):+ choices: tuple[_ValueT_co, ...]+ case_sensitive: bool+else:++ class ChoiceInfoDict(ParamTypeInfoDict):+ choices: tuple[t.Any, ...]+ case_sensitive: bool+++class Choice(ParamType[_ValueT_co], t.Generic[_ValueT_co]): """The choice type allows a value to be checked against a fixed set@@ -286,11 +311,14 @@ - name = "choice"+ name: str = "choice"++ choices: tuple[_ValueT_co, ...]+ case_sensitive: bool def __init__(- self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True+ self, choices: cabc.Iterable[_ValueT_co], case_sensitive: bool = True ) -> None:- self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices)+ self.choices = tuple(choices) self.case_sensitive = case_sensitive - def to_info_dict(self) -> ChoiceInfoDict:+ def to_info_dict(self) -> ChoiceInfoDict[_ValueT_co]: return {@@ -303,3 +331,3 @@ self, ctx: Context | None = None- ) -> cabc.Mapping[ParamTypeValue, str]:+ ) -> cabc.Mapping[_ValueT_co, str]: """@@ -319,3 +347,3 @@ - def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str:+ def normalize_choice(self, choice: object, ctx: Context | None) -> str: """@@ -340,3 +368,3 @@ def get_metavar(self, param: Parameter, ctx: Context) -> str | None:- if param.param_type_name == "option" and not param.show_choices: # type: ignore+ if param.param_type_name == "option" and not param.show_choices: # type: ignore[attr-defined] choice_metavars = [@@ -369,3 +397,3 @@ self, value: t.Any, param: Parameter | None, ctx: Context | None- ) -> ParamTypeValue:+ ) -> _ValueT_co: """@@ -458,4 +486,6 @@ + formats: cabc.Sequence[str]+ def __init__(self, formats: cabc.Sequence[str] | None = None):- self.formats: cabc.Sequence[str] = formats or [+ self.formats = formats or [ "%Y-%m-%d",@@ -468,3 +498,3 @@ - def get_metavar(self, param: Parameter, ctx: Context) -> str | None:+ def get_metavar(self, param: Parameter, ctx: Context) -> str: return f"[{'|'.join(self.formats)}]"@@ -504,8 +534,10 @@ -class _NumberParamTypeBase(ParamType[ParamTypeValue]):- _number_class: t.Callable[[t.Any], ParamTypeValue]+class _NumberParamTypeBase(+ ParamType[_ValueT_co], t.Generic[_ValueT_contra, _ValueT_co]+):+ _number_class: t.Callable[[_ValueT_contra], _ValueT_co] def convert(- self, value: t.Any, param: Parameter | None, ctx: Context | None- ) -> ParamTypeValue:+ self, value: _ValueT_contra, param: Parameter | None, ctx: Context | None+ ) -> _ValueT_co: try:@@ -522,5 +554,27 @@ -class NumberRangeInfoDict(ParamTypeInfoDict):- min: float | None- max: float | None+if t.TYPE_CHECKING:+ # on Python 3.10 this will raise a TypeError++ class NumberRangeInfoDict(ParamTypeInfoDict, t.Generic[_FloatValueT_co]):+ min: _FloatValueT_co | None+ max: _FloatValueT_co | None+ min_open: bool+ max_open: bool+ clamp: bool+else:++ class NumberRangeInfoDict(ParamTypeInfoDict):+ min: t.Any | None+ max: t.Any | None+ min_open: bool+ max_open: bool+ clamp: bool+++class _NumberRangeBase(+ _NumberParamTypeBase[_ValueT_contra, _FloatValueT_co],+ t.Generic[_ValueT_contra, _FloatValueT_co],+):+ min: _FloatValueT_co | None+ max: _FloatValueT_co | None min_open: bool@@ -529,8 +583,6 @@ --class _NumberRangeBase(_NumberParamTypeBase[ParamTypeValue]): def __init__( self,- min: float | None = None,- max: float | None = None,+ min: _FloatValueT_co | None = None,+ max: _FloatValueT_co | None = None, min_open: bool = False,@@ -545,3 +597,3 @@ - def to_info_dict(self) -> NumberRangeInfoDict:+ def to_info_dict(self) -> NumberRangeInfoDict[_FloatValueT_co]:
… 158 more lines (truncated)
--- +++ @@ -207,2 +207,14 @@ class KeepOpenFile:+ """Proxy a file object but keep it open across a ``with`` block.++ Wraps a borrowed file (such as ``sys.stdin`` or ``sys.stdout``) so that+ leaving a ``with`` block does not close it, as used by :func:`open_file`+ for the ``-`` filename. The caller stays responsible for the file: an+ explicit :meth:`close` still passes through to the wrapped object.++ Dunder methods are proxied explicitly: implicit special-method lookups+ bypass :meth:`__getattr__`, because Python resolves them on the type rather+ than the instance.+ """+ _file: t.IO[t.Any]
--- +++ @@ -308,2 +308,28 @@ [email protected](+ ("kwargs", "expected"),+ [+ ({}, "FOO"),+ ({"required": True}, "FOO"),+ ({"required": False}, "[FOO]"),+ ({"default": "x"}, "[FOO]"),+ ({"nargs": -1}, "[FOO]..."),+ ({"nargs": -1, "required": True}, "FOO..."),+ ({"nargs": 2}, "FOO..."),+ ({"nargs": 2, "required": False}, "[FOO]..."),+ ],+)+def test_argument_metavar_marks_optional(runner, kwargs, expected):+ """An argument is bracketed in the usage line only when it is optional."""++ @click.command()+ @click.argument("foo", **kwargs)+ def cli(foo):+ pass++ result = runner.invoke(cli, ["--help"])+ assert result.exit_code == 0+ assert result.output.splitlines()[0] == f"Usage: cli [OPTIONS] {expected}"++ @pytest.mark.parametrize("deprecated", [True, "USE B INSTEAD"])
--- +++ @@ -571,2 +571,42 @@ +def test_choice_argument_optional_metavar(runner):+ """Optional Choice arguments reuse the type's brackets instead of doubling.++ Without this the usage line for a ``Choice`` argument with ``nargs=-1`` or+ ``required=False`` rendered as ``[[a|b|c]]``: one pair from ``Choice`` to+ enumerate values, a second pair from ``Argument`` to mark it optional.+ """++ @click.command()+ @click.argument("method", type=click.Choice(["foo", "bar", "baz"]), nargs=-1)+ def cli_variadic(method):+ pass++ @click.command()+ @click.argument("method", type=click.Choice(["foo", "bar", "baz"]), required=False)+ def cli_optional(method):+ pass++ variadic = runner.invoke(cli_variadic, ["--help"]).output+ assert "Usage: cli-variadic [OPTIONS] [foo|bar|baz]...\n" in variadic+ assert "[[foo|bar|baz]]" not in variadic++ optional = runner.invoke(cli_optional, ["--help"]).output+ assert "Usage: cli-optional [OPTIONS] [foo|bar|baz]\n" in optional+ assert "[[foo|bar|baz]]" not in optional+++def test_datetime_argument_optional_metavar(runner):+ """``DateTime`` arguments behave the same way as ``Choice``."""++ @click.command()+ @click.argument("when", type=click.DateTime(formats=["%Y-%m-%d"]), required=False)+ def cli(when):+ pass++ result = runner.invoke(cli, ["--help"])+ assert "Usage: cli [OPTIONS] [%Y-%m-%d]\n" in result.output+ assert "[[%Y-%m-%d]]" not in result.output++ def test_datetime_option_default(runner):@@ -741 +781,80 @@ assert "default: not found" in result.output+++def test_version_option_resolves_import_name_to_distribution(runner, monkeypatch):+ """When ``package_name`` (detected or passed) is an import name that+ differs from its installed distribution name (``PIL`` vs ``Pillow``),+ ``version_option`` resolves it via ``packages_distributions()`` instead+ of raising ``RuntimeError``.+ """+ import importlib.metadata++ def fake_version(name):+ if name == "pillow":+ return "10.4.0"+ raise importlib.metadata.PackageNotFoundError(name)++ monkeypatch.setattr(importlib.metadata, "version", fake_version)+ monkeypatch.setattr(+ importlib.metadata,+ "packages_distributions",+ lambda: {"PIL": ["pillow"]},+ )++ @click.command()+ @click.version_option(package_name="PIL")+ def cli():+ pass++ result = runner.invoke(cli, ["--version"], prog_name="imageapp")+ assert result.exit_code == 0+ assert "10.4.0" in result.output+++def test_version_option_ambiguous_import_name_errors(runner, monkeypatch):+ """When an import name maps to multiple installed distributions, the+ user must disambiguate. The error names the candidates.+ """+ import importlib.metadata++ def fake_version(name):+ raise importlib.metadata.PackageNotFoundError(name)++ monkeypatch.setattr(importlib.metadata, "version", fake_version)+ monkeypatch.setattr(+ importlib.metadata,+ "packages_distributions",+ lambda: {"plug": ["foo-plug", "bar-plug"]},+ )++ @click.command()+ @click.version_option(package_name="plug")+ def cli():+ pass++ result = runner.invoke(cli, ["--version"])+ assert result.exit_code != 0+ msg = str(result.exception)+ assert "multiple installed distributions" in msg+ assert "foo-plug" in msg+ assert "bar-plug" in msg+++def test_version_option_unknown_package_errors(runner, monkeypatch):+ """When the name resolves to no distribution, keep the existing error."""+ import importlib.metadata++ def fake_version(name):+ raise importlib.metadata.PackageNotFoundError(name)++ monkeypatch.setattr(importlib.metadata, "version", fake_version)+ monkeypatch.setattr(importlib.metadata, "packages_distributions", lambda: {})++ @click.command()+ @click.version_option(package_name="nonexistent")+ def cli():+ pass++ result = runner.invoke(cli, ["--version"])+ assert result.exit_code != 0+ assert "not installed" in str(result.exception)
--- +++ @@ -299,2 +299,29 @@ assert result.output == "no subcommand, use default\nin subcommand\n"++[email protected](+ ("chain", "invoke_without_command", "metavar"),+ [+ (False, False, "COMMAND [ARGS]..."),+ (False, True, "[COMMAND] [ARGS]..."),+ (True, False, "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..."),+ (True, True, "[COMMAND1] [ARGS]... [COMMAND2 [ARGS]...]..."),+ ],+)+def test_subcommand_metavar_marks_optional(+ runner, chain, invoke_without_command, metavar+):+ """The leading subcommand token is bracketed only when it is optional."""++ @click.group(chain=chain, invoke_without_command=invoke_without_command)+ def cli():+ pass++ @cli.command()+ def sub():+ pass++ result = runner.invoke(cli, ["--help"])+ assert result.exit_code == 0+ assert result.output.splitlines()[0] == f"Usage: cli [OPTIONS] {metavar}" @@ -494,2 +521,18 @@ @pytest.mark.parametrize("deprecated", [True, "USE OTHER COMMAND INSTEAD"])[email protected]("doc", ["", None])+def test_deprecated_empty_help_no_leading_space(runner, doc, deprecated):+ """A command with empty or missing help text must render the deprecation+ label at the normal indentation, without a stray leading space.+ """++ @click.command(deprecated=deprecated, help=doc)+ def cli():+ pass++ out = runner.invoke(cli, ["--help"]).output+ assert "\n (DEPRECATED" in out+ assert "\n (DEPRECATED" not in out++[email protected]("deprecated", [True, "USE OTHER COMMAND INSTEAD"]) def test_deprecated_in_invocation(runner, deprecated):
--- +++ @@ -58,2 +58,16 @@ assert deprecated in result.output++[email protected](+ ("deprecated", "expected"),+ [(True, "(DEPRECATED)"), ("USE B INSTEAD", "(DEPRECATED: USE B INSTEAD)")],+)[email protected]("help_text", ["", None])+def test_deprecated_empty_help_no_leading_space(help_text, deprecated, expected):+ """An option with empty or missing help text must not gain a stray leading+ space before the deprecation label.+ """+ opt = click.Option(["--foo"], help=help_text, deprecated=deprecated)+ ctx = click.Context(click.Command("cli"))+ assert opt.get_help_record(ctx)[1] == expected @@ -3308,6 +3322,4 @@ - result = runner.invoke(cli, [])- assert result.exit_code == 1- assert isinstance(result.exception, UserWarning)- assert "used more than once" in str(result.exception)+ with pytest.warns(UserWarning, match="used more than once"):+ runner.invoke(cli, [])
--- +++ @@ -14,2 +14,3 @@ from click.shell_completion import CompletionItem+from click.shell_completion import FishComplete from click.shell_completion import shell_complete@@ -361,5 +362,5 @@ ("zsh", {"COMP_WORDS": "a b", "COMP_CWORD": "1"}, "plain\nb\nbee\n"),- ("fish", {"COMP_WORDS": "", "COMP_CWORD": ""}, "plain\na\n_\nplain\nb\nbee\n"),- ("fish", {"COMP_WORDS": "a b", "COMP_CWORD": "b"}, "plain\nb\nbee\n"),- ("fish", {"COMP_WORDS": 'a "b', "COMP_CWORD": '"b'}, "plain\nb\nbee\n"),+ ("fish", {"COMP_WORDS": "", "COMP_CWORD": ""}, "plain,a\nplain,b\tbee\n"),+ ("fish", {"COMP_WORDS": "a b", "COMP_CWORD": "b"}, "plain,b\tbee\n"),+ ("fish", {"COMP_WORDS": 'a "b', "COMP_CWORD": '"b'}, "plain,b\tbee\n"), ],@@ -580,46 +581,7 @@ [email protected]("_patch_for_completion")-def test_fish_multiline_help_complete(runner):- """Test Fish completion with multi-line help text doesn't cause errors."""- cli = Command(- "cli",- params=[- Option(- ["--at", "--attachment-type"],- type=(str, str),- multiple=True,- help=(- "\b\nAttachment with explicit mimetype,\n--at image.jpg image/jpeg"- ),- ),- Option(["--other"], help="Normal help"),- ],- )-- result = runner.invoke(- cli,- env={- "COMP_WORDS": "cli --",- "COMP_CWORD": "--",- "_CLI_COMPLETE": "fish_complete",- },- )-- # Should not fail- assert result.exit_code == 0-- # Output should contain escaped newlines, not literal newlines- # Fish expects: plain\n--at\n{help_with_\\n}- lines = result.output.split("\n")-- # Find the --at completion block (3 lines: type, value, help)- for i in range(0, len(lines) - 2, 3):- if lines[i] == "plain" and lines[i + 1] in ("--at", "--attachment-type"):- help_line = lines[i + 2]- # Help should have escaped newlines (\\n), not actual newlines- assert "\\n" in help_line- # Should contain the example text- assert "image.jpg" in help_line.replace("\\n", " ")- break- else:- pytest.fail("--at completion not found in output")+def test_fish_format_completion_escapes_help():+ fc = FishComplete(Command("x"), {}, "x", "_X_COMPLETE")+ item = CompletionItem("--at", help="first\nsecond\tthird")+ # The newline is escaped to the literal characters backslash-n and the tab+ # becomes a space, so each completion stays on one line for fish.+ assert fc.format_completion(item) == "plain,--at\tfirst\\nsecond third"
--- +++ @@ -486,3 +486,5 @@ # These are marked with ``pytest.mark.stress`` so they can be included or-# excluded independently. The CI workflow runs them in a separate job.+# excluded independently. The ``tox -e stress`` env collects every+# ``pytest.mark.stress`` test across the suite (not just this file), so+# stress regressions for other components live alongside their unit tests. # ---------------------------------------------------------------------------
--- +++ @@ -1,2 +1,3 @@ import contextlib+import gc import io@@ -728,2 +729,40 @@ +def test_echo_via_pager_streams_each_write(monkeypatch):+ """Each write is flushed so a slow generator streams to the pager+ incrementally instead of buffering until the end (issues #3242, #2542).+ """+ calls = []++ class RecordingStream(io.StringIO):+ def __init__(self):+ super().__init__()+ self.color = None++ def write(self, s):+ calls.append("write")+ return super().write(s)++ def flush(self):+ calls.append("flush")++ stream = RecordingStream()+ monkeypatch.setattr(click._termui_impl, "isatty", lambda _: False)+ monkeypatch.setattr(click._termui_impl, "_default_text_stdout", lambda: stream)++ def generate():+ yield "a\n"+ yield "b\n"+ yield "c\n"++ click.echo_via_pager(generate())++ # No two writes are adjacent: every chunk is flushed before the next one,+ # so the pager sees output as it is produced.+ assert not any(+ calls[i] == "write" and calls[i + 1] == "write" for i in range(len(calls) - 1)+ )+ assert calls.count("write") == 4 # three chunks plus the trailing newline+ assert stream.getvalue() == "a\nb\nc\n\n"++ def test_get_pager_file_pager_missing_binary_falls_back(monkeypatch, tmp_path):@@ -768,2 +807,57 @@ assert pager_out.read_text(encoding="utf-8") == "hello\n"+++def test_get_pager_file_missing_pager_keeps_borrowed_stream_open(monkeypatch):+ """A missing ``PAGER`` must not close the borrowed stdout (issue #3449).++ The ``8.4.0`` regression was only fixed for the no-tty ``_nullpager`` path;+ the ``_pipepager``/``_tempfilepager`` fallbacks (reached in a tty when+ ``PAGER`` resolves to nothing) used to close the borrowed stream too.+ """+ buffer = io.BytesIO()+ stream = io.TextIOWrapper(buffer, encoding="utf-8")++ monkeypatch.setitem(+ click._termui_impl.os.environ,+ "PAGER",+ "click-tests-nonexistent-pager-9b3f2",+ )+ monkeypatch.setattr(click._termui_impl, "isatty", lambda _: True)+ monkeypatch.setattr(click._termui_impl, "_default_text_stdout", lambda: stream)++ with click.get_pager_file() as pager:+ pager.write("hello\n")++ # Drop the wrapper reference and force finalization: the old bug closed the+ # borrowed buffer when the TextIOWrapper built by get_pager_file was+ # garbage-collected.+ del pager+ gc.collect()++ assert not buffer.closed+ assert not stream.closed+ assert buffer.getvalue().replace(b"\r\n", b"\n") == b"hello\n"+++def test_echo_via_pager_tty_pager_missing(runner, monkeypatch):+ """``echo_via_pager`` through the tty fallback keeps ``CliRunner`` working.++ Regression for issue #3449 via the pager fallback: a tty with ``PAGER``+ pointing at a missing binary used to close the runner's stdout, breaking+ ``CliRunner.invoke``.+ """+ monkeypatch.setattr(click._termui_impl, "isatty", lambda _: True)+ monkeypatch.setitem(+ click._termui_impl.os.environ,+ "PAGER",+ "click-tests-nonexistent-pager-9b3f2",+ )++ @click.command()+ def cli():+ click.echo_via_pager("Hello, Click!")++ result = runner.invoke(cli)+ assert not result.exception+ assert result.output == "Hello, Click!\n"
--- +++ @@ -245,9 +245,18 @@ def test_file_surrogates(type, tmp_path):+ """Ensures that the error handling in ``click.File`` is robust.++ ``EILSEQ`` shows up with rootless Podman (FUSE-backed paths) and on filesystems+ that reject non-UTF-8 names, like ZFS with ``utf8only=on``.++ See: https://github.com/pallets/click/issues/2634+ """ path = tmp_path / "\udcff"-- # - common case: �': No such file or directory- # - special case: Illegal byte sequence- # The special case is seen with rootless Podman. The root cause is most- # likely that the path is handled by a user-space program (FUSE).- match = r"(�': No such file or directory|Illegal byte sequence)"+ match = (+ # Common case: �': No such file or directory.+ r"(�': No such file or directory"+ # BSD/macOS libc special case (EILSEQ).+ r"|Illegal byte sequence"+ # glibc special case (EILSEQ).+ r"|Invalid or incomplete multibyte or wide character)"+ ) with pytest.raises(click.BadParameter, match=match):
cryptography pypi critical-tier YANK ×3BURST ×2
46.0.0
46.0.1
46.0.2
46.0.3
46.0.4
46.0.5
46.0.6
46.0.7
47.0.0
48.0.0
48.0.1
49.0.0
YANK
37.0.3 marked yanked (still downloadable)
high · registry-verified · 2022-06-21 · 4y ago
YANK
38.0.2 marked yanked (still downloadable)
high · registry-verified · 2022-10-11 · 3y ago
YANK
45.0.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-17 · 1y ago
BURST
2 releases in 46m: 2.4, 2.4.1
info · registry-verified · 2018-11-12 · 7y ago
BURST
2 releases in 53m: 45.0.0, 45.0.1
info · registry-verified · 2025-05-17 · 1y ago
release diff 48.0.1 → 49.0.0
+117 added · -479 removed · ~0 modified
new files touching dangerous APIs: cryptography/hazmat/primitives/twofactor/hotp.py
+54 more files not shown
--- +++ @@ -0,0 +1,101 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import base64+import typing+from urllib.parse import quote, urlencode++from cryptography.hazmat.primitives import constant_time, hmac+from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512+from cryptography.hazmat.primitives.twofactor import InvalidToken+from cryptography.utils import Buffer++HOTPHashTypes = typing.Union[SHA1, SHA256, SHA512]+++def _generate_uri(+ hotp: HOTP,+ type_name: str,+ account_name: str,+ issuer: str | None,+ extra_parameters: list[tuple[str, int]],+) -> str:+ parameters = [+ ("digits", hotp._length),+ ("secret", base64.b32encode(hotp._key)),+ ("algorithm", hotp._algorithm.name.upper()),+ ]++ if issuer is not None:+ parameters.append(("issuer", issuer))++ parameters.extend(extra_parameters)++ label = (+ f"{quote(issuer)}:{quote(account_name)}"+ if issuer+ else quote(account_name)+ )+ return f"otpauth://{type_name}/{label}?{urlencode(parameters)}"+++class HOTP:+ def __init__(+ self,+ key: Buffer,+ length: int,+ algorithm: HOTPHashTypes,+ backend: typing.Any = None,+ enforce_key_length: bool = True,+ ) -> None:+ if len(key) < 16 and enforce_key_length is True:+ raise ValueError("Key length has to be at least 128 bits.")++ if not isinstance(length, int):+ raise TypeError("Length parameter must be an integer type.")++ if length < 6 or length > 8:+ raise ValueError("Length of HOTP has to be between 6 and 8.")++ if not isinstance(algorithm, (SHA1, SHA256, SHA512)):+ raise TypeError("Algorithm must be SHA1, SHA256 or SHA512.")++ self._key = key+ self._length = length+ self._algorithm = algorithm++ def generate(self, counter: int) -> bytes:+ if not isinstance(counter, int):+ raise TypeError("Counter parameter must be an integer type.")++ truncated_value = self._dynamic_truncate(counter)+ hotp = truncated_value % (10**self._length)+ return "{0:0{1}}".format(hotp, self._length).encode()++ def verify(self, hotp: bytes, counter: int) -> None:+ if not constant_time.bytes_eq(self.generate(counter), hotp):+ raise InvalidToken("Supplied HOTP value does not match.")++ def _dynamic_truncate(self, counter: int) -> int:+ ctx = hmac.HMAC(self._key, self._algorithm)++ try:+ ctx.update(counter.to_bytes(length=8, byteorder="big"))+ except OverflowError:+ raise ValueError(f"Counter must be between 0 and {2**64 - 1}.")++ hmac_value = ctx.finalize()++ offset = hmac_value[len(hmac_value) - 1] & 0b1111+ p = hmac_value[offset : offset + 4]+ return int.from_bytes(p, byteorder="big") & 0x7FFFFFFF++ def get_provisioning_uri(+ self, account_name: str, counter: int, issuer: str | None+ ) -> str:+ return _generate_uri(+ self, "hotp", account_name, issuer, [("counter", int(counter))]+ )
--- +++ @@ -0,0 +1,1365 @@+{+ "bomFormat": "CycloneDX",+ "specVersion": "1.5",+ "version": 1,+ "serialNumber": "urn:uuid:1084bdfc-45ca-417b-b741-2d95f25688a3",+ "metadata": {+ "timestamp": "2026-06-12T19:53:29.923247312Z",+ "tools": [+ {+ "vendor": "CycloneDX",+ "name": "cargo-cyclonedx",+ "version": "0.5.9"+ }+ ],+ "authors": [+ {+ "name": "The cryptography developers",+ "email": "[email protected]"+ }+ ],+ "component": {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust#[email protected]",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-rust",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://.",+ "components": [+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust#[email protected] bin-target-0",+ "name": "cryptography_rust",+ "version": "0.49.0",+ "purl": "pkg:cargo/[email protected]?download_url=file://.#src/lib.rs"+ }+ ]+ },+ "properties": [+ {+ "name": "cdx:rustc:sbom:target:all_targets",+ "value": "true"+ }+ ]+ },+ "components": [+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-cffi#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-cffi",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-cffi"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-crypto#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-crypto",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-crypto"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-keepalive#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-keepalive",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-keepalive"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-key-parsing#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-key-parsing",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-key-parsing"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-openssl#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-openssl",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-openssl"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-x509#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-x509",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-x509"+ },+ {+ "type": "library",+ "bom-ref": "path+file:///__w/cryptography/cryptography/tmpwheelhouse/.tmpG3FeY2/cryptography-49.0.0/src/rust/cryptography-x509-verification#0.49.0",+ "author": "The cryptography developers <[email protected]>",+ "name": "cryptography-x509-verification",+ "version": "0.49.0",+ "scope": "required",+ "licenses": [+ {+ "expression": "Apache-2.0 OR BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]?download_url=file://cryptography-x509-verification"+ },+ {+ "type": "library",+ "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#[email protected]",+ "author": "Alex Gaynor <[email protected]>",+ "name": "asn1",+ "version": "0.24.1",+ "description": "ASN.1 (DER) parser and writer for Rust.",+ "scope": "required",+ "hashes": [+ {+ "alg": "SHA-256",+ "content": "c9795210620c0cb3f9a7ce4f882808c38e1ef7b347c90591dceae0886e031fb1"+ }+ ],+ "licenses": [+ {+ "expression": "BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]",+ "externalReferences": [+ {+ "type": "vcs",+ "url": "https://github.com/alex/rust-asn1"+ }+ ]+ },+ {+ "type": "library",+ "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#[email protected]",+ "author": "Alex Gaynor <[email protected]>",+ "name": "asn1_derive",+ "version": "0.24.1",+ "description": "#[derive] support for asn1",+ "scope": "required",+ "hashes": [+ {+ "alg": "SHA-256",+ "content": "909e307f1cc32bb8bccbd98f446e6d1bf03fa30f7b53a4337da7181ad30fa11a"+ }+ ],+ "licenses": [+ {+ "expression": "BSD-3-Clause"+ }+ ],+ "purl": "pkg:cargo/[email protected]",+ "externalReferences": [+ {+ "type": "vcs",+ "url": "https://github.com/alex/rust-asn1"+ }+ ]+ },+ {+ "type": "library",+ "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#[email protected]",+ "author": "Marshall Pierce <[email protected]>",+ "name": "base64",+ "version": "0.22.1",+ "description": "encodes and decodes base64 as bytes or utf8",+ "scope": "required",+ "hashes": [+ {+ "alg": "SHA-256",+ "content": "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"+ }+ ],+ "licenses": [+ {+ "expression": "MIT OR Apache-2.0"+ }+ ],+ "purl": "pkg:cargo/[email protected]",+ "externalReferences": [+ {+ "type": "documentation",+ "url": "https://docs.rs/base64"+ },+ {+ "type": "vcs",+ "url": "https://github.com/marshallpierce/rust-base64"+ }+ ]+ },+ {+ "type": "library",+ "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#[email protected]",+ "author": "The Rust Project Developers",+ "name": "bitflags",+ "version": "2.13.0",+ "description": "A macro to generate structures which behave like bitflags. ",+ "scope": "required",+ "hashes": [+ {+ "alg": "SHA-256",+ "content": "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"+ }
… 1118 more lines (truncated)
--- +++ @@ -0,0 +1,43 @@+{+ "bomFormat": "CycloneDX",+ "specVersion": "1.5",+ "version": 1,+ "serialNumber": "urn:uuid:3bcd4c72-b01c-4990-8c3d-538bd45ca378",+ "metadata": {+ "timestamp": "2026-06-12T00:57:49Z"+ },+ "components": [+ {+ "type": "library",+ "name": "openssl",+ "version": "4.0.1",+ "purl": "pkg:generic/[email protected]?download_url=https://github.com/openssl/openssl/releases/download/openssl-4.0.1/openssl-4.0.1.tar.gz",+ "hashes": [+ {+ "alg": "SHA-256",+ "content": "2db3f3a0d6ea4b59e1f094ace2c8cd536dffb87cdc39084c5afa1e6f7f37dd09"+ }+ ],+ "externalReferences": [+ {+ "type": "distribution",+ "url": "https://github.com/openssl/openssl/releases/download/openssl-4.0.1/openssl-4.0.1.tar.gz"+ }+ ],+ "properties": [+ {+ "name": "build:operating-system",+ "value": "linux"+ },+ {+ "name": "build:architecture",+ "value": "aarch64"+ },+ {+ "name": "build:flags",+ "value": "no-zlib no-shared no-module no-comp no-apps no-docs no-sm2-precomp no-atexit enable-ec_nistp_64_gcc_128"+ }+ ]+ }+ ]+}
--- +++ @@ -0,0 +1,17 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++__all__ = [+ "__author__",+ "__copyright__",+ "__version__",+]++__version__ = "49.0.0"+++__author__ = "The Python Cryptographic Authority and individual contributors"+__copyright__ = f"Copyright 2013-2026 {__author__}"
--- +++ @@ -0,0 +1,13 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from cryptography.__about__ import __author__, __copyright__, __version__++__all__ = [+ "__author__",+ "__copyright__",+ "__version__",+]
--- +++ @@ -0,0 +1,52 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import typing++from cryptography.hazmat.bindings._rust import exceptions as rust_exceptions++if typing.TYPE_CHECKING:+ from cryptography.hazmat.bindings._rust import openssl as rust_openssl++_Reasons = rust_exceptions._Reasons+++class UnsupportedAlgorithm(Exception):+ def __init__(self, message: str, reason: _Reasons | None = None) -> None:+ super().__init__(message)+ self._reason = reason+++class AlreadyFinalized(Exception):+ pass+++class AlreadyUpdated(Exception):+ pass+++class NotYetFinalized(Exception):+ pass+++class InvalidTag(Exception):+ pass+++class InvalidSignature(Exception):+ pass+++class InternalError(Exception):+ def __init__(+ self, msg: str, err_code: list[rust_openssl.OpenSSLError]+ ) -> None:+ super().__init__(msg)+ self.err_code = err_code+++class InvalidKey(Exception):+ pass
--- +++ @@ -0,0 +1,224 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import base64+import binascii+import os+import time+import typing+from collections.abc import Iterable++from cryptography import utils+from cryptography.exceptions import InvalidSignature+from cryptography.hazmat.primitives import hashes, padding+from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes+from cryptography.hazmat.primitives.hmac import HMAC+++class InvalidToken(Exception):+ pass+++_MAX_CLOCK_SKEW = 60+++class Fernet:+ def __init__(+ self,+ key: bytes | str,+ backend: typing.Any = None,+ ) -> None:+ try:+ key = base64.urlsafe_b64decode(key)+ except binascii.Error as exc:+ raise ValueError(+ "Fernet key must be 32 url-safe base64-encoded bytes."+ ) from exc+ if len(key) != 32:+ raise ValueError(+ "Fernet key must be 32 url-safe base64-encoded bytes."+ )++ self._signing_key = key[:16]+ self._encryption_key = key[16:]++ @classmethod+ def generate_key(cls) -> bytes:+ return base64.urlsafe_b64encode(os.urandom(32))++ def encrypt(self, data: bytes) -> bytes:+ return self.encrypt_at_time(data, int(time.time()))++ def encrypt_at_time(self, data: bytes, current_time: int) -> bytes:+ iv = os.urandom(16)+ return self._encrypt_from_parts(data, current_time, iv)++ def _encrypt_from_parts(+ self, data: bytes, current_time: int, iv: bytes+ ) -> bytes:+ utils._check_bytes("data", data)++ padder = padding.PKCS7(algorithms.AES.block_size).padder()+ padded_data = padder.update(data) + padder.finalize()+ encryptor = Cipher(+ algorithms.AES(self._encryption_key),+ modes.CBC(iv),+ ).encryptor()+ ciphertext = encryptor.update(padded_data) + encryptor.finalize()++ basic_parts = (+ b"\x80"+ + current_time.to_bytes(length=8, byteorder="big")+ + iv+ + ciphertext+ )++ h = HMAC(self._signing_key, hashes.SHA256())+ h.update(basic_parts)+ hmac = h.finalize()+ return base64.urlsafe_b64encode(basic_parts + hmac)++ def decrypt(self, token: bytes | str, ttl: int | None = None) -> bytes:+ timestamp, data = Fernet._get_unverified_token_data(token)+ if ttl is None:+ time_info = None+ else:+ time_info = (ttl, int(time.time()))+ return self._decrypt_data(data, timestamp, time_info)++ def decrypt_at_time(+ self, token: bytes | str, ttl: int, current_time: int+ ) -> bytes:+ if ttl is None:+ raise ValueError(+ "decrypt_at_time() can only be used with a non-None ttl"+ )+ timestamp, data = Fernet._get_unverified_token_data(token)+ return self._decrypt_data(data, timestamp, (ttl, current_time))++ def extract_timestamp(self, token: bytes | str) -> int:+ timestamp, data = Fernet._get_unverified_token_data(token)+ # Verify the token was not tampered with.+ self._verify_signature(data)+ return timestamp++ @staticmethod+ def _get_unverified_token_data(token: bytes | str) -> tuple[int, bytes]:+ if not isinstance(token, (str, bytes)):+ raise TypeError("token must be bytes or str")++ try:+ data = base64.urlsafe_b64decode(token)+ except (TypeError, binascii.Error):+ raise InvalidToken++ if not data or data[0] != 0x80:+ raise InvalidToken++ if len(data) < 9:+ raise InvalidToken++ timestamp = int.from_bytes(data[1:9], byteorder="big")+ return timestamp, data++ def _verify_signature(self, data: bytes) -> None:+ h = HMAC(self._signing_key, hashes.SHA256())+ h.update(data[:-32])+ try:+ h.verify(data[-32:])+ except InvalidSignature:+ raise InvalidToken++ def _decrypt_data(+ self,+ data: bytes,+ timestamp: int,+ time_info: tuple[int, int] | None,+ ) -> bytes:+ if time_info is not None:+ ttl, current_time = time_info+ if timestamp + ttl < current_time:+ raise InvalidToken++ if current_time + _MAX_CLOCK_SKEW < timestamp:+ raise InvalidToken++ self._verify_signature(data)++ iv = data[9:25]+ ciphertext = data[25:-32]+ decryptor = Cipher(+ algorithms.AES(self._encryption_key), modes.CBC(iv)+ ).decryptor()+ plaintext_padded = decryptor.update(ciphertext)+ try:+ plaintext_padded += decryptor.finalize()+ except ValueError:+ raise InvalidToken+ unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()++ unpadded = unpadder.update(plaintext_padded)+ try:+ unpadded += unpadder.finalize()+ except ValueError:+ raise InvalidToken+ return unpadded+++class MultiFernet:+ def __init__(self, fernets: Iterable[Fernet]):+ fernets = list(fernets)+ if not fernets:+ raise ValueError(+ "MultiFernet requires at least one Fernet instance"+ )+ self._fernets = fernets++ def encrypt(self, msg: bytes) -> bytes:+ return self.encrypt_at_time(msg, int(time.time()))++ def encrypt_at_time(self, msg: bytes, current_time: int) -> bytes:+ return self._fernets[0].encrypt_at_time(msg, current_time)++ def rotate(self, msg: bytes | str) -> bytes:+ timestamp, data = Fernet._get_unverified_token_data(msg)+ for f in self._fernets:+ try:+ p = f._decrypt_data(data, timestamp, None)+ break+ except InvalidToken:+ pass+ else:+ raise InvalidToken++ iv = os.urandom(16)+ return self._fernets[0]._encrypt_from_parts(p, timestamp, iv)++ def decrypt(self, msg: bytes | str, ttl: int | None = None) -> bytes:+ for f in self._fernets:+ try:+ return f.decrypt(msg, ttl)+ except InvalidToken:+ pass+ raise InvalidToken++ def decrypt_at_time(+ self, msg: bytes | str, ttl: int, current_time: int+ ) -> bytes:+ for f in self._fernets:+ try:+ return f.decrypt_at_time(msg, ttl, current_time)+ except InvalidToken:+ pass+ raise InvalidToken++ def extract_timestamp(self, msg: bytes | str) -> int:+ for f in self._fernets:+ try:+ return f.extract_timestamp(msg)+ except InvalidToken:+ pass+ raise InvalidToken
--- +++ @@ -0,0 +1,13 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++"""+Hazardous Materials++This is a "Hazardous Materials" module. You should ONLY use it if you're+100% absolutely sure that you know what you're doing because this module+is full of land mines, dragons, and dinosaurs with laser guns.+"""
--- +++ @@ -0,0 +1,368 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from cryptography.hazmat.bindings._rust import (+ ObjectIdentifier as ObjectIdentifier,+)+from cryptography.hazmat.primitives import hashes+++class ExtensionOID:+ SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9")+ SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14")+ KEY_USAGE = ObjectIdentifier("2.5.29.15")+ PRIVATE_KEY_USAGE_PERIOD = ObjectIdentifier("2.5.29.16")+ SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17")+ ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18")+ BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19")+ NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30")+ CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31")+ CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32")+ POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33")+ AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35")+ POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36")+ EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37")+ FRESHEST_CRL = ObjectIdentifier("2.5.29.46")+ INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54")+ ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28")+ AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1")+ SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11")+ OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5")+ TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24")+ CRL_NUMBER = ObjectIdentifier("2.5.29.20")+ DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27")+ PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier(+ "1.3.6.1.4.1.11129.2.4.2"+ )+ PRECERT_POISON = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3")+ SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.5")+ MS_CERTIFICATE_TEMPLATE = ObjectIdentifier("1.3.6.1.4.1.311.21.7")+ ADMISSIONS = ObjectIdentifier("1.3.36.8.3.3")+++class OCSPExtensionOID:+ NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2")+ ACCEPTABLE_RESPONSES = ObjectIdentifier("1.3.6.1.5.5.7.48.1.4")+++class CRLEntryExtensionOID:+ CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29")+ CRL_REASON = ObjectIdentifier("2.5.29.21")+ INVALIDITY_DATE = ObjectIdentifier("2.5.29.24")+++class NameOID:+ COMMON_NAME = ObjectIdentifier("2.5.4.3")+ COUNTRY_NAME = ObjectIdentifier("2.5.4.6")+ LOCALITY_NAME = ObjectIdentifier("2.5.4.7")+ STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8")+ STREET_ADDRESS = ObjectIdentifier("2.5.4.9")+ ORGANIZATION_IDENTIFIER = ObjectIdentifier("2.5.4.97")+ ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10")+ ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11")+ SERIAL_NUMBER = ObjectIdentifier("2.5.4.5")+ SURNAME = ObjectIdentifier("2.5.4.4")+ GIVEN_NAME = ObjectIdentifier("2.5.4.42")+ TITLE = ObjectIdentifier("2.5.4.12")+ INITIALS = ObjectIdentifier("2.5.4.43")+ GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44")+ X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45")+ DN_QUALIFIER = ObjectIdentifier("2.5.4.46")+ PSEUDONYM = ObjectIdentifier("2.5.4.65")+ USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1")+ DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25")+ EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1")+ JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3")+ JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1")+ JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier(+ "1.3.6.1.4.1.311.60.2.1.2"+ )+ BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15")+ POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16")+ POSTAL_CODE = ObjectIdentifier("2.5.4.17")+ INN = ObjectIdentifier("1.2.643.3.131.1.1")+ OGRN = ObjectIdentifier("1.2.643.100.1")+ SNILS = ObjectIdentifier("1.2.643.100.3")+ UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")+++class SignatureAlgorithmOID:+ RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4")+ RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5")+ # This is an alternate OID for RSA with SHA1 that is occasionally seen+ _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29")+ RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14")+ RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11")+ RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12")+ RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13")+ RSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.13")+ RSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.14")+ RSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.15")+ RSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.16")+ RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")+ ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1")+ ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1")+ ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2")+ ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3")+ ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4")+ ECDSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.9")+ ECDSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.10")+ ECDSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.11")+ ECDSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.12")+ DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3")+ DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1")+ DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2")+ DSA_WITH_SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.3.3")+ DSA_WITH_SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.3.4")+ ED25519 = ObjectIdentifier("1.3.101.112")+ ED448 = ObjectIdentifier("1.3.101.113")+ ML_DSA_44 = ObjectIdentifier("2.16.840.1.101.3.4.3.17")+ ML_DSA_65 = ObjectIdentifier("2.16.840.1.101.3.4.3.18")+ ML_DSA_87 = ObjectIdentifier("2.16.840.1.101.3.4.3.19")+ GOSTR3411_94_WITH_3410_2001 = ObjectIdentifier("1.2.643.2.2.3")+ GOSTR3410_2012_WITH_3411_2012_256 = ObjectIdentifier("1.2.643.7.1.1.3.2")+ GOSTR3410_2012_WITH_3411_2012_512 = ObjectIdentifier("1.2.643.7.1.1.3.3")+++_SIG_OIDS_TO_HASH: dict[ObjectIdentifier, hashes.HashAlgorithm | None] = {+ SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(),+ SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(),+ SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(),+ SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(),+ SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(),+ SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(),+ SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(),+ SignatureAlgorithmOID.RSA_WITH_SHA3_224: hashes.SHA3_224(),+ SignatureAlgorithmOID.RSA_WITH_SHA3_256: hashes.SHA3_256(),+ SignatureAlgorithmOID.RSA_WITH_SHA3_384: hashes.SHA3_384(),+ SignatureAlgorithmOID.RSA_WITH_SHA3_512: hashes.SHA3_512(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA3_224: hashes.SHA3_224(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA3_256: hashes.SHA3_256(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA3_384: hashes.SHA3_384(),+ SignatureAlgorithmOID.ECDSA_WITH_SHA3_512: hashes.SHA3_512(),+ SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(),+ SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(),+ SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256(),+ SignatureAlgorithmOID.ED25519: None,+ SignatureAlgorithmOID.ED448: None,+ SignatureAlgorithmOID.ML_DSA_44: None,+ SignatureAlgorithmOID.ML_DSA_65: None,+ SignatureAlgorithmOID.ML_DSA_87: None,+ SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: None,+ SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: None,+ SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: None,+}+++class HashAlgorithmOID:+ SHA1 = ObjectIdentifier("1.3.14.3.2.26")+ SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.2.4")+ SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.2.1")+ SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.2.2")+ SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.2.3")+ SHA3_224 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.224")+ SHA3_256 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.256")+ SHA3_384 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.384")+ SHA3_512 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.512")+ SHA3_224_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.7")+ SHA3_256_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.8")+ SHA3_384_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.9")+ SHA3_512_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.10")+++class PublicKeyAlgorithmOID:+ DSA = ObjectIdentifier("1.2.840.10040.4.1")+ EC_PUBLIC_KEY = ObjectIdentifier("1.2.840.10045.2.1")+ RSAES_PKCS1_v1_5 = ObjectIdentifier("1.2.840.113549.1.1.1")+ RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")+ X25519 = ObjectIdentifier("1.3.101.110")+ X448 = ObjectIdentifier("1.3.101.111")+ ED25519 = ObjectIdentifier("1.3.101.112")+ ED448 = ObjectIdentifier("1.3.101.113")+ ML_DSA_44 = ObjectIdentifier("2.16.840.1.101.3.4.3.17")+ ML_DSA_65 = ObjectIdentifier("2.16.840.1.101.3.4.3.18")+ ML_DSA_87 = ObjectIdentifier("2.16.840.1.101.3.4.3.19")+++class ExtendedKeyUsageOID:+ SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1")+ CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2")+ CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3")+ EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4")+ TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8")+ OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9")+ ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0")+ SMARTCARD_LOGON = ObjectIdentifier("1.3.6.1.4.1.311.20.2.2")+ KERBEROS_PKINIT_KDC = ObjectIdentifier("1.3.6.1.5.2.3.5")+ IPSEC_IKE = ObjectIdentifier("1.3.6.1.5.5.7.3.17")+ BUNDLE_SECURITY = ObjectIdentifier("1.3.6.1.5.5.7.3.35")+ CERTIFICATE_TRANSPARENCY = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.4")+++class OtherNameFormOID:+ PERMANENT_IDENTIFIER = ObjectIdentifier("1.3.6.1.5.5.7.8.3")+ HW_MODULE_NAME = ObjectIdentifier("1.3.6.1.5.5.7.8.4")+ DNS_SRV = ObjectIdentifier("1.3.6.1.5.5.7.8.7")+ NAI_REALM = ObjectIdentifier("1.3.6.1.5.5.7.8.8")+ SMTP_UTF8_MAILBOX = ObjectIdentifier("1.3.6.1.5.5.7.8.9")+ ACP_NODE_NAME = ObjectIdentifier("1.3.6.1.5.5.7.8.10")+ BUNDLE_EID = ObjectIdentifier("1.3.6.1.5.5.7.8.11")+++class AuthorityInformationAccessOID:+ CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2")+ OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1")+++class SubjectInformationAccessOID:+ CA_REPOSITORY = ObjectIdentifier("1.3.6.1.5.5.7.48.5")+++class CertificatePoliciesOID:+ CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1")+ CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2")+ ANY_POLICY = ObjectIdentifier("2.5.29.32.0")+++class AttributeOID:+ CHALLENGE_PASSWORD = ObjectIdentifier("1.2.840.113549.1.9.7")+ UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")+++_OID_NAMES = {+ NameOID.COMMON_NAME: "commonName",+ NameOID.COUNTRY_NAME: "countryName",+ NameOID.LOCALITY_NAME: "localityName",+ NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName",+ NameOID.STREET_ADDRESS: "streetAddress",+ NameOID.ORGANIZATION_NAME: "organizationName",+ NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName",
… 121 more lines (truncated)
--- +++ @@ -0,0 +1,45 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from cryptography.hazmat.asn1.asn1 import (+ TLV,+ BitString,+ Default,+ Explicit,+ GeneralizedTime,+ IA5String,+ Implicit,+ Null,+ PrintableString,+ SetOf,+ Size,+ UTCTime,+ Variant,+ decode_der,+ encode_der,+ sequence,+ set,+ value_set,+)++__all__ = [+ "TLV",+ "BitString",+ "Default",+ "Explicit",+ "GeneralizedTime",+ "IA5String",+ "Implicit",+ "Null",+ "PrintableString",+ "SetOf",+ "Size",+ "UTCTime",+ "Variant",+ "decode_der",+ "encode_der",+ "sequence",+ "set",+ "value_set",+]
--- +++ @@ -0,0 +1,533 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import builtins+import dataclasses+import enum+import sys+import types+import typing++if sys.version_info < (3, 11):+ import typing_extensions++ LiteralString = typing_extensions.LiteralString+else:+ LiteralString = typing.LiteralString++from cryptography.hazmat.bindings._rust import declarative_asn1+from cryptography.hazmat.bindings._rust import x509 as rust_x509++if sys.version_info < (3, 10):+ NoneType = type(None)+else:+ NoneType = types.NoneType # type: ignore[nonetype-type]++T = typing.TypeVar("T", covariant=True)+U = typing.TypeVar("U")+Tag = typing.TypeVar("Tag", bound=LiteralString)++[email protected](frozen=True)+class Variant(typing.Generic[U, Tag]):+ """+ A tagged variant for CHOICE fields with the same underlying type.++ Use this when you have multiple CHOICE alternatives with the same type+ and need to distinguish between them:++ foo: (+ Annotated[Variant[int, typing.Literal["IntA"]], Implicit(0)]+ | Annotated[Variant[int, typing.Literal["IntB"]], Implicit(1)]+ )++ Usage:+ example = Example(foo=Variant(5, "IntA"))+ decoded.foo.value # The int value+ decoded.foo.tag # "IntA" or "IntB"+ """++ value: U+ tag: str+++decode_der = declarative_asn1.decode_der+encode_der = declarative_asn1.encode_der+++_X509_TYPES = (+ rust_x509.Certificate,+ rust_x509.CertificateSigningRequest,+ rust_x509.CertificateRevocationList,+)+++def _check_x509_field_annotations(+ field_type: typing.Any,+ annotation: declarative_asn1.Annotation,+ field_name: str,+) -> None:+ if field_type in _X509_TYPES and isinstance(annotation.encoding, Implicit):+ raise TypeError(+ f"field '{field_name}' has an IMPLICIT annotation, but "+ "IMPLICIT annotations are not supported for X.509 types."+ )+++def _is_union(field_type: type) -> bool:+ # NOTE: types.UnionType for `T | U`, typing.Union for `Union[T, U]`.+ # TODO: Drop the `hasattr()` once the minimum supported Python version+ # is >= 3.10.+ union_types = (+ (types.UnionType, typing.Union)+ if hasattr(types, "UnionType")+ else (typing.Union,)+ )+ return typing.get_origin(field_type) in union_types+++def _resolve_type_aliases(field_type: typing.Any) -> typing.Any:+ # Recursively resolve PEP 695 (`type X = ...`) type aliases (Python+ # 3.12+) to their underlying value, so that the rest of the+ # normalization logic never encounters an alias. Aliases can refer+ # to other aliases and can appear at any level of nesting (e.g.+ # inside `Annotated[...]`, unions, or `list[...]`).+ if sys.version_info < (3, 12):+ return field_type++ while isinstance(field_type, typing.TypeAliasType):+ field_type = field_type.__value__++ args = typing.get_args(field_type)+ resolved_args = tuple(_resolve_type_aliases(arg) for arg in args)+ if resolved_args == args:+ # No aliases anywhere inside: return the type unchanged.+ return field_type++ if _is_union(field_type):+ # `X | Y` unions can't be rebuilt through their origin like+ # other generics below: `typing.get_origin` returns+ # `types.UnionType` for them, which is only subscriptable on+ # Python 3.14+. Rebuilding through `typing.Union` also+ # flattens any nested union introduced by an alias of a union+ # (e.g. `Time | int` where `type Time = UTCTime |+ # GeneralizedTime`), just like `typing.Union` would have done+ # if the alias had been written inline.+ return typing.Union[resolved_args]++ # An alias appeared inside a generic (e.g. `Annotated[Time, ...]`,+ # `list[MyInt]`, or `SetOf[MyInt]`): re-parameterize the generic+ # with the resolved arguments. Subscripting with a tuple is+ # equivalent to subscripting with multiple arguments.+ return typing.get_origin(field_type)[resolved_args]+++def _extract_annotation(+ metadata: tuple, field_name: str+) -> declarative_asn1.Annotation:+ default = None+ encoding = None+ size = None+ for raw_annotation in metadata:+ if isinstance(raw_annotation, Default):+ if default is not None:+ raise TypeError(+ f"multiple DEFAULT annotations found in field "+ f"'{field_name}'"+ )+ default = raw_annotation.value+ elif isinstance(raw_annotation, declarative_asn1.Encoding):+ if encoding is not None:+ raise TypeError(+ f"multiple IMPLICIT/EXPLICIT annotations found in field "+ f"'{field_name}'"+ )+ encoding = raw_annotation+ elif isinstance(raw_annotation, declarative_asn1.Size):+ if size is not None:+ raise TypeError(+ f"multiple SIZE annotations found in field '{field_name}'"+ )+ size = raw_annotation+ else:+ raise TypeError(f"unsupported annotation: {raw_annotation}")++ return declarative_asn1.Annotation(+ default=default, encoding=encoding, size=size+ )+++def _normalize_field_type(+ field_type: typing.Any, field_name: str+) -> declarative_asn1.AnnotatedType:+ field_type = _resolve_type_aliases(field_type)++ # Strip the `Annotated[...]` off, and populate the annotation+ # from it if it exists.+ if typing.get_origin(field_type) is typing.Annotated:+ annotation = _extract_annotation(field_type.__metadata__, field_name)+ field_type, *_ = typing.get_args(field_type)+ else:+ annotation = declarative_asn1.Annotation()++ if annotation.size is not None and (+ typing.get_origin(field_type) not in (builtins.list, SetOf)+ and field_type+ not in (+ builtins.bytes,+ builtins.str,+ BitString,+ IA5String,+ PrintableString,+ )+ ):+ raise TypeError(+ f"field '{field_name}' has a SIZE annotation, but SIZE "+ "annotations are only supported for fields of types: "+ "[SEQUENCE OF, SET OF, BIT STRING, OCTET STRING, UTF8String, "+ "PrintableString, IA5String]"+ )++ if field_type is TLV:+ if isinstance(annotation.encoding, Implicit):+ raise TypeError(+ f"field '{field_name}' has an IMPLICIT annotation, but "+ "IMPLICIT annotations are not supported for TLV types."+ )+ elif annotation.default is not None:+ raise TypeError(+ f"field '{field_name}' has a DEFAULT annotation, but "+ "DEFAULT annotations are not supported for TLV types."+ )++ _check_x509_field_annotations(field_type, annotation, field_name)++ if hasattr(field_type, "__asn1_root__"):+ root_type = field_type.__asn1_root__+ if not isinstance(+ root_type,+ (+ declarative_asn1.Type.Sequence,+ declarative_asn1.Type.Set,+ declarative_asn1.Type.ValueSet,+ ),+ ):+ raise TypeError(f"unsupported root type: {root_type}")+ return declarative_asn1.AnnotatedType(+ typing.cast(declarative_asn1.Type, root_type), annotation+ )+ elif _is_union(field_type):+ union_args = typing.get_args(field_type)+ if len(union_args) == 2 and NoneType in union_args:+ # A Union between a type and None is an OPTIONAL+ optional_type = (+ union_args[0] if union_args[1] is type(None) else union_args[1]+ )+ if optional_type is TLV:+ raise TypeError(+ "optional TLV types (`TLV | None`) are not "+ "currently supported"+ )+ # For optional types, the annotation is associated with the+ # union, so we check it against the inner type here.+ _check_x509_field_annotations(+ optional_type, annotation, field_name+ )+ annotated_type = _normalize_field_type(optional_type, field_name)++ if not annotated_type.annotation.is_empty():+ raise TypeError(+ "optional (`X | None`) types cannot have `X` "+ "annotated: annotations must apply to the union "+ "(i.e: `Annotated[X | None, annotation]`)"+ )+
… 286 more lines (truncated)
--- +++ @@ -0,0 +1,13 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from typing import Any+++def default_backend() -> Any:+ from cryptography.hazmat.backends.openssl.backend import backend++ return backend
--- +++ @@ -0,0 +1,9 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from cryptography.hazmat.backends.openssl.backend import backend++__all__ = ["backend"]
--- +++ @@ -0,0 +1,314 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from cryptography.hazmat.bindings._rust import openssl as rust_openssl+from cryptography.hazmat.bindings.openssl import binding+from cryptography.hazmat.primitives import hashes+from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding+from cryptography.hazmat.primitives.asymmetric import ec+from cryptography.hazmat.primitives.asymmetric import utils as asym_utils+from cryptography.hazmat.primitives.asymmetric.padding import (+ MGF1,+ OAEP,+ PSS,+ PKCS1v15,+)+from cryptography.hazmat.primitives.ciphers import (+ CipherAlgorithm,+)+from cryptography.hazmat.primitives.ciphers.algorithms import (+ AES,+)+from cryptography.hazmat.primitives.ciphers.modes import (+ CBC,+ Mode,+)+++class Backend:+ """+ OpenSSL API binding interfaces.+ """++ name = "openssl"++ # TripleDES encryption is disallowed/deprecated throughout 2023 in+ # FIPS 140-3. To keep it simple we denylist any use of TripleDES (TDEA).+ _fips_ciphers = (AES,)+ # Sometimes SHA1 is still permissible. That logic is contained+ # within the various *_supported methods.+ _fips_hashes = (+ hashes.SHA224,+ hashes.SHA256,+ hashes.SHA384,+ hashes.SHA512,+ hashes.SHA512_224,+ hashes.SHA512_256,+ hashes.SHA3_224,+ hashes.SHA3_256,+ hashes.SHA3_384,+ hashes.SHA3_512,+ hashes.SHAKE128,+ hashes.SHAKE256,+ )+ _fips_ecdh_curves = (+ ec.SECP224R1,+ ec.SECP256R1,+ ec.SECP384R1,+ ec.SECP521R1,+ )+ _fips_rsa_min_key_size = 2048+ _fips_rsa_min_public_exponent = 65537+ _fips_dsa_min_modulus = 1 << 2048+ _fips_dh_min_key_size = 2048+ _fips_dh_min_modulus = 1 << _fips_dh_min_key_size++ def __init__(self) -> None:+ self._binding = binding.Binding()+ self._ffi = self._binding.ffi+ self._lib = self._binding.lib+ self._fips_enabled = rust_openssl.is_fips_enabled()++ def __repr__(self) -> str:+ return (+ f"<OpenSSLBackend(version: {self.openssl_version_text()}, "+ f"FIPS: {self._fips_enabled}, "+ f"Legacy: {rust_openssl._legacy_provider_loaded})>"+ )++ def openssl_assert(self, ok: bool) -> None:+ return binding._openssl_assert(ok)++ def _enable_fips(self) -> None:+ # This function enables FIPS mode for OpenSSL 3.0.0 on installs that+ # have the FIPS provider installed properly.+ rust_openssl.enable_fips(rust_openssl._providers)+ assert rust_openssl.is_fips_enabled()+ self._fips_enabled = rust_openssl.is_fips_enabled()++ def openssl_version_text(self) -> str:+ """+ Friendly string name of the loaded OpenSSL library. This is not+ necessarily the same version as it was compiled against.++ Example: OpenSSL 3.2.1 30 Jan 2024+ """+ return rust_openssl.openssl_version_text()++ def openssl_version_number(self) -> int:+ return rust_openssl.openssl_version()++ def hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:+ if self._fips_enabled and not isinstance(algorithm, self._fips_hashes):+ return False++ return rust_openssl.hashes.hash_supported(algorithm)++ def signature_hash_supported(+ self, algorithm: hashes.HashAlgorithm+ ) -> bool:+ # Dedicated check for hashing algorithm use in message digest for+ # signatures, e.g. RSA PKCS#1 v1.5 SHA1 (sha1WithRSAEncryption).+ if self._fips_enabled and isinstance(algorithm, hashes.SHA1):+ return False+ return self.hash_supported(algorithm)++ def scrypt_supported(self) -> bool:+ if self._fips_enabled:+ return False+ else:+ return hasattr(rust_openssl.kdf.Scrypt, "derive")++ def argon2_supported(self) -> bool:+ if self._fips_enabled:+ return False+ else:+ return hasattr(rust_openssl.kdf.Argon2id, "derive")++ def hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:+ # FIPS mode still allows SHA1 for HMAC+ if self._fips_enabled and isinstance(algorithm, hashes.SHA1):+ return True+ if rust_openssl.CRYPTOGRAPHY_IS_AWSLC:+ return isinstance(+ algorithm,+ (+ hashes.MD5,+ hashes.SHA1,+ hashes.SHA224,+ hashes.SHA256,+ hashes.SHA384,+ hashes.SHA512,+ hashes.SHA512_224,+ hashes.SHA512_256,+ ),+ )+ return self.hash_supported(algorithm)++ def cipher_supported(self, cipher: CipherAlgorithm, mode: Mode) -> bool:+ if self._fips_enabled:+ # FIPS mode requires AES. TripleDES is disallowed/deprecated in+ # FIPS 140-3.+ if not isinstance(cipher, self._fips_ciphers):+ return False++ return rust_openssl.ciphers.cipher_supported(cipher, mode)++ def pbkdf2_hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:+ return self.hmac_supported(algorithm)++ def _consume_errors(self) -> list[rust_openssl.OpenSSLError]:+ return rust_openssl.capture_error_stack()++ def _oaep_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:+ if self._fips_enabled and isinstance(algorithm, hashes.SHA1):+ return False++ return isinstance(+ algorithm,+ (+ hashes.SHA1,+ hashes.SHA224,+ hashes.SHA256,+ hashes.SHA384,+ hashes.SHA512,+ ),+ )++ def rsa_padding_supported(self, padding: AsymmetricPadding) -> bool:+ if isinstance(padding, PKCS1v15):+ return True+ elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1):+ # FIPS 186-4 only allows salt length == digest length for PSS+ # It is technically acceptable to set an explicit salt length+ # equal to the digest length and this will incorrectly fail, but+ # since we don't do that in the tests and this method is+ # private, we'll ignore that until we need to do otherwise.+ if (+ self._fips_enabled+ and padding._salt_length != PSS.DIGEST_LENGTH+ ):+ return False+ return self.hash_supported(padding._mgf._algorithm)+ elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1):+ return self._oaep_hash_supported(+ padding._mgf._algorithm+ ) and self._oaep_hash_supported(padding._algorithm)+ else:+ return False++ def rsa_encryption_supported(self, padding: AsymmetricPadding) -> bool:+ if self._fips_enabled and isinstance(padding, PKCS1v15):+ return False+ else:+ return self.rsa_padding_supported(padding)++ def dsa_supported(self) -> bool:+ return (+ not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL+ and not self._fips_enabled+ )++ def dsa_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:+ if not self.dsa_supported():+ return False+ return self.signature_hash_supported(algorithm)++ def cmac_algorithm_supported(self, algorithm) -> bool:+ return self.cipher_supported(+ algorithm, CBC(b"\x00" * algorithm.block_size)+ )++ def elliptic_curve_supported(self, curve: ec.EllipticCurve) -> bool:+ if self._fips_enabled and not isinstance(+ curve, self._fips_ecdh_curves+ ):+ return False++ return rust_openssl.ec.curve_supported(curve)++ def elliptic_curve_signature_algorithm_supported(+ self,+ signature_algorithm: ec.EllipticCurveSignatureAlgorithm,+ curve: ec.EllipticCurve,+ ) -> bool:+ # We only support ECDSA right now.+ if not isinstance(signature_algorithm, ec.ECDSA):+ return False++ return self.elliptic_curve_supported(curve) and (+ isinstance(signature_algorithm.algorithm, asym_utils.Prehashed)+ or self.hash_supported(signature_algorithm.algorithm)+ )++ def elliptic_curve_exchange_algorithm_supported(
… 67 more lines (truncated)
--- +++ @@ -0,0 +1,3 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.
--- +++ @@ -0,0 +1,3 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.
--- +++ @@ -0,0 +1,199 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations+++def cryptography_has_set_cert_cb() -> list[str]:+ return [+ "SSL_CTX_set_cert_cb",+ "SSL_set_cert_cb",+ ]+++def cryptography_has_ssl_st() -> list[str]:+ return [+ "SSL_ST_BEFORE",+ "SSL_ST_OK",+ "SSL_ST_INIT",+ "SSL_ST_RENEGOTIATE",+ ]+++def cryptography_has_tls_st() -> list[str]:+ return [+ "TLS_ST_BEFORE",+ "TLS_ST_OK",+ ]+++def cryptography_has_ssl_sigalgs() -> list[str]:+ return [+ "SSL_CTX_set1_sigalgs_list",+ ]+++def cryptography_has_psk() -> list[str]:+ return [+ "SSL_CTX_use_psk_identity_hint",+ "SSL_CTX_set_psk_server_callback",+ "SSL_CTX_set_psk_client_callback",+ ]+++def cryptography_has_psk_tlsv13() -> list[str]:+ return [+ "SSL_CTX_set_psk_find_session_callback",+ "SSL_CTX_set_psk_use_session_callback",+ "Cryptography_SSL_SESSION_new",+ "SSL_CIPHER_find",+ "SSL_SESSION_set1_master_key",+ "SSL_SESSION_set_cipher",+ "SSL_SESSION_set_protocol_version",+ ]+++def cryptography_has_custom_ext() -> list[str]:+ return [+ "SSL_CTX_add_client_custom_ext",+ "SSL_CTX_add_server_custom_ext",+ "SSL_extension_supported",+ ]+++def cryptography_has_tlsv13_functions() -> list[str]:+ return [+ "SSL_CTX_set_ciphersuites",+ ]+++def cryptography_has_tlsv13_hs_functions() -> list[str]:+ return [+ "SSL_VERIFY_POST_HANDSHAKE",+ "SSL_verify_client_post_handshake",+ "SSL_CTX_set_post_handshake_auth",+ "SSL_set_post_handshake_auth",+ "SSL_SESSION_get_max_early_data",+ "SSL_write_early_data",+ "SSL_read_early_data",+ "SSL_CTX_set_max_early_data",+ ]+++def cryptography_has_ssl_verify_client_post_handshake() -> list[str]:+ return [+ "SSL_verify_client_post_handshake",+ ]+++def cryptography_has_engine() -> list[str]:+ return [+ "ENGINE_by_id",+ "ENGINE_init",+ "ENGINE_finish",+ "ENGINE_get_default_RAND",+ "ENGINE_set_default_RAND",+ "ENGINE_unregister_RAND",+ "ENGINE_ctrl_cmd",+ "ENGINE_free",+ "ENGINE_get_name",+ "ENGINE_ctrl_cmd_string",+ "ENGINE_load_builtin_engines",+ "ENGINE_load_private_key",+ "ENGINE_load_public_key",+ "SSL_CTX_set_client_cert_engine",+ ]+++def cryptography_has_verified_chain() -> list[str]:+ return [+ "SSL_get0_verified_chain",+ ]+++def cryptography_has_srtp() -> list[str]:+ return [+ "SSL_CTX_set_tlsext_use_srtp",+ "SSL_set_tlsext_use_srtp",+ "SSL_get_selected_srtp_profile",+ ]+++def cryptography_has_dtls_get_data_mtu() -> list[str]:+ return [+ "DTLS_get_data_mtu",+ ]+++def cryptography_has_ssl_cookie() -> list[str]:+ return [+ "SSL_OP_COOKIE_EXCHANGE",+ "DTLS1_COOKIE_LENGTH",+ "DTLSv1_listen",+ "SSL_CTX_set_cookie_generate_cb",+ "SSL_CTX_set_cookie_verify_cb",+ ]+++def cryptography_has_prime_checks() -> list[str]:+ return [+ "BN_prime_checks_for_size",+ ]+++def cryptography_has_unexpected_eof_while_reading() -> list[str]:+ return ["SSL_R_UNEXPECTED_EOF_WHILE_READING"]+++def cryptography_has_ssl_op_ignore_unexpected_eof() -> list[str]:+ return [+ "SSL_OP_IGNORE_UNEXPECTED_EOF",+ ]+++def cryptography_has_get_extms_support() -> list[str]:+ return ["SSL_get_extms_support"]+++def cryptography_has_ssl_get0_group_name() -> list[str]:+ return ["SSL_get0_group_name"]+++# This is a mapping of+# {condition: function-returning-names-dependent-on-that-condition} so we can+# loop over them and delete unsupported names at runtime. It will be removed+# when cffi supports #if in cdef. We use functions instead of just a dict of+# lists so we can use coverage to measure which are used.+CONDITIONAL_NAMES = {+ "Cryptography_HAS_SET_CERT_CB": cryptography_has_set_cert_cb,+ "Cryptography_HAS_SSL_ST": cryptography_has_ssl_st,+ "Cryptography_HAS_TLS_ST": cryptography_has_tls_st,+ "Cryptography_HAS_SIGALGS": cryptography_has_ssl_sigalgs,+ "Cryptography_HAS_PSK": cryptography_has_psk,+ "Cryptography_HAS_PSK_TLSv1_3": cryptography_has_psk_tlsv13,+ "Cryptography_HAS_CUSTOM_EXT": cryptography_has_custom_ext,+ "Cryptography_HAS_TLSv1_3_FUNCTIONS": cryptography_has_tlsv13_functions,+ "Cryptography_HAS_TLSv1_3_HS_FUNCTIONS": (+ cryptography_has_tlsv13_hs_functions+ ),+ "Cryptography_HAS_SSL_VERIFY_CLIENT_POST_HANDSHAKE": (+ cryptography_has_ssl_verify_client_post_handshake+ ),+ "Cryptography_HAS_ENGINE": cryptography_has_engine,+ "Cryptography_HAS_VERIFIED_CHAIN": cryptography_has_verified_chain,+ "Cryptography_HAS_SRTP": cryptography_has_srtp,+ "Cryptography_HAS_DTLS_GET_DATA_MTU": cryptography_has_dtls_get_data_mtu,+ "Cryptography_HAS_SSL_COOKIE": cryptography_has_ssl_cookie,+ "Cryptography_HAS_PRIME_CHECKS": cryptography_has_prime_checks,+ "Cryptography_HAS_UNEXPECTED_EOF_WHILE_READING": (+ cryptography_has_unexpected_eof_while_reading+ ),+ "Cryptography_HAS_SSL_OP_IGNORE_UNEXPECTED_EOF": (+ cryptography_has_ssl_op_ignore_unexpected_eof+ ),+ "Cryptography_HAS_GET_EXTMS_SUPPORT": cryptography_has_get_extms_support,+ "Cryptography_HAS_SSL_GET0_GROUP_NAME": (+ cryptography_has_ssl_get0_group_name+ ),+}
--- +++ @@ -0,0 +1,107 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import threading+import types+import typing+from collections.abc import Callable, Mapping++import cryptography+from cryptography.exceptions import InternalError+from cryptography.hazmat.bindings._rust import _openssl, openssl+from cryptography.hazmat.bindings.openssl._conditional import CONDITIONAL_NAMES+++def _openssl_assert(ok: bool) -> None:+ if not ok:+ errors = openssl.capture_error_stack()++ raise InternalError(+ "Unknown OpenSSL error. This error is commonly encountered when "+ "another library is not cleaning up the OpenSSL error stack. If "+ "you are using cryptography with another library that uses "+ "OpenSSL try disabling it before reporting a bug. Otherwise "+ "please file an issue at https://github.com/pyca/cryptography/"+ "issues with information on how to reproduce "+ f"this. ({errors!r})",+ errors,+ )+++def build_conditional_library(+ lib: typing.Any,+ conditional_names: Mapping[str, Callable[[], list[str]]],+) -> typing.Any:+ conditional_lib = types.ModuleType("lib")+ conditional_lib._original_lib = lib # type: ignore[attr-defined]+ excluded_names = set()+ for condition, names_cb in conditional_names.items():+ if not getattr(lib, condition):+ excluded_names.update(names_cb())++ for attr in dir(lib):+ if attr not in excluded_names:+ setattr(conditional_lib, attr, getattr(lib, attr))++ return conditional_lib+++class Binding:+ """+ OpenSSL API wrapper.+ """++ lib: typing.ClassVar[typing.Any] = None+ ffi: typing.Any = _openssl.ffi+ _lib_loaded = False+ _init_lock = threading.Lock()++ def __init__(self) -> None:+ self._ensure_ffi_initialized()++ @classmethod+ def _ensure_ffi_initialized(cls) -> None:+ with cls._init_lock:+ if not cls._lib_loaded:+ cls.lib = build_conditional_library(+ _openssl.lib, CONDITIONAL_NAMES+ )+ cls._lib_loaded = True++ @classmethod+ def init_static_locks(cls) -> None:+ cls._ensure_ffi_initialized()+++def _verify_package_version(version: str) -> None:+ # Occasionally we run into situations where the version of the Python+ # package does not match the version of the shared object that is loaded.+ # This may occur in environments where multiple versions of cryptography+ # are installed and available in the python path. To avoid errors cropping+ # up later this code checks that the currently imported package and the+ # shared object that were loaded have the same version and raise an+ # ImportError if they do not+ so_package_version = _openssl.ffi.string(+ _openssl.lib.CRYPTOGRAPHY_PACKAGE_VERSION+ )+ if version.encode("ascii") != so_package_version:+ raise ImportError(+ "The version of cryptography does not match the loaded "+ "shared object. This can happen if you have multiple copies of "+ "cryptography installed in your Python path. Please try creating "+ "a new virtual environment to resolve this issue. "+ f"Loaded python version: {version}, "+ f"shared object version: {so_package_version}"+ )++ _openssl_assert(+ _openssl.lib.OpenSSL_version_num() == openssl.openssl_version(),+ )+++_verify_package_version(cryptography.__version__)++Binding.init_static_locks()
--- +++ @@ -0,0 +1,5 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations
--- +++ @@ -0,0 +1,5 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations
--- +++ @@ -0,0 +1,142 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import warnings++from cryptography import utils+from cryptography.hazmat.primitives._cipheralgorithm import (+ BlockCipherAlgorithm,+ CipherAlgorithm,+ _verify_key_size,+)+++class ARC4(CipherAlgorithm):+ name = "RC4"+ key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++class TripleDES(BlockCipherAlgorithm):+ name = "3DES"+ block_size = 64+ key_sizes = frozenset([64, 128, 192])++ def __init__(self, key: bytes):+ if len(key) == 8:+ warnings.warn(+ "Single-key TripleDES (8-byte keys) is deprecated and "+ "support will be removed in a future release. Use 24-byte "+ "keys instead (e.g., key + key + key).",+ utils.DeprecatedIn47,+ stacklevel=2,+ )+ key = key + key + key+ elif len(key) == 16:+ warnings.warn(+ "Two-key TripleDES (16-byte keys) is deprecated and "+ "support will be removed in a future release. Use 24-byte "+ "keys instead (e.g., key + key[:8]).",+ utils.DeprecatedIn47,+ stacklevel=2,+ )+ key = key + key[:8]+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++# Not actually supported, marker for tests+class _DES:+ key_size = 64+++class Blowfish(BlockCipherAlgorithm):+ name = "Blowfish"+ block_size = 64+ key_sizes = frozenset(range(32, 449, 8))++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++class CAST5(BlockCipherAlgorithm):+ name = "CAST5"+ block_size = 64+ key_sizes = frozenset(range(40, 129, 8))++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++class SEED(BlockCipherAlgorithm):+ name = "SEED"+ block_size = 128+ key_sizes = frozenset([128])++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++class IDEA(BlockCipherAlgorithm):+ name = "IDEA"+ block_size = 64+ key_sizes = frozenset([128])++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++class Camellia(BlockCipherAlgorithm):+ name = "camellia"+ block_size = 128+ key_sizes = frozenset([128, 192, 256])++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8+++# This class only allows RC2 with a 128-bit key. No support for+# effective key bits or other key sizes is provided.+class RC2(BlockCipherAlgorithm):+ name = "RC2"+ block_size = 64+ key_sizes = frozenset([128])++ def __init__(self, key: bytes):+ self.key = _verify_key_size(self, key)++ @property+ def key_size(self) -> int:+ return len(self.key) * 8
--- +++ @@ -0,0 +1,53 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++from cryptography import utils+from cryptography.hazmat.primitives._modes import (+ ModeWithInitializationVector,+ _check_iv_and_key_length,+)+++class OFB(ModeWithInitializationVector):+ name = "OFB"++ def __init__(self, initialization_vector: utils.Buffer):+ utils._check_byteslike("initialization_vector", initialization_vector)+ self._initialization_vector = initialization_vector++ @property+ def initialization_vector(self) -> utils.Buffer:+ return self._initialization_vector++ validate_for_algorithm = _check_iv_and_key_length+++class CFB(ModeWithInitializationVector):+ name = "CFB"++ def __init__(self, initialization_vector: utils.Buffer):+ utils._check_byteslike("initialization_vector", initialization_vector)+ self._initialization_vector = initialization_vector++ @property+ def initialization_vector(self) -> utils.Buffer:+ return self._initialization_vector++ validate_for_algorithm = _check_iv_and_key_length+++class CFB8(ModeWithInitializationVector):+ name = "CFB8"++ def __init__(self, initialization_vector: utils.Buffer):+ utils._check_byteslike("initialization_vector", initialization_vector)+ self._initialization_vector = initialization_vector++ @property+ def initialization_vector(self) -> utils.Buffer:+ return self._initialization_vector++ validate_for_algorithm = _check_iv_and_key_length
--- +++ @@ -0,0 +1,3 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.
--- +++ @@ -0,0 +1,19 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import abc++# This exists to break an import cycle. It is normally accessible from the+# asymmetric padding module.+++class AsymmetricPadding(metaclass=abc.ABCMeta):+ @property+ @abc.abstractmethod+ def name(self) -> str:+ """+ A string naming this padding (e.g. "PSS", "PKCS1").+ """
--- +++ @@ -0,0 +1,60 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++from __future__ import annotations++import abc++from cryptography import utils++# This exists to break an import cycle. It is normally accessible from the+# ciphers module.+++class CipherAlgorithm(metaclass=abc.ABCMeta):+ @property+ @abc.abstractmethod+ def name(self) -> str:+ """+ A string naming this mode (e.g. "AES", "Camellia").+ """++ @property+ @abc.abstractmethod+ def key_sizes(self) -> frozenset[int]:+ """+ Valid key sizes for this algorithm in bits+ """++ @property+ @abc.abstractmethod+ def key_size(self) -> int:+ """+ The size of the key being used as an integer in bits (e.g. 128, 256).+ """+++class BlockCipherAlgorithm(CipherAlgorithm):+ key: utils.Buffer++ @property+ @abc.abstractmethod+ def block_size(self) -> int:+ """+ The size of a block as an integer in bits (e.g. 64, 128).+ """+++def _verify_key_size(+ algorithm: CipherAlgorithm, key: utils.Buffer+) -> utils.Buffer:+ # Verify that the key is instance of bytes+ utils._check_byteslike("key", key)++ # Verify that the key size matches the expected key size+ if len(key) * 8 not in algorithm.key_sizes:+ raise ValueError(+ f"Invalid key size ({len(key) * 8}) for {algorithm.name}."+ )+ return key
numpy pypi YANKBURST ×2
2.3.3
2.3.4
2.3.5
2.4.0
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
2.4.6
2.5.0
2.5.1
YANK
2.4.0 marked yanked (still downloadable)
high · registry-verified · 2025-12-20 · 6mo ago
BURST
3 releases in 22m: 1.10.4, 1.9.3, 1.8.2
info · registry-verified · 2016-04-20 · 10y ago
BURST
15 releases in 40m: 1.7.2, 1.6.2, 1.10.3, 1.10.2, 1.10.1, 1.10.0, 1.9.2, 1.9.1, 1.9.0, 1.8.1, 1.8.0, 1.7.1, 1.7.0, 1.6.1, 1.6.0
info · registry-verified · 2016-04-20 · 10y ago
release diff 2.5.0 → 2.5.1
artifact too large or unavailable
packaging pypi critical-tier YANKBURST ×3
21.3
22.0
23.0
23.1
23.2
24.0
24.1
24.2
25.0
26.0
26.1
26.2
YANK
20.6 marked yanked (still downloadable)
high · registry-verified · 2020-11-28 · 5y ago
BURST
2 releases in 9m: 20.2, 20.3
info · registry-verified · 2020-03-05 · 6y ago
BURST
2 releases in 3m: 20.6, 20.7
info · registry-verified · 2020-11-28 · 5y ago
BURST
2 releases in 5m: 21.1, 21.2
info · registry-verified · 2021-10-29 · 4y ago
release diff 26.1 → 26.2
+2 added · -0 removed · ~23 modified
--- +++ @@ -160,4 +160,5 @@ "tests/test_*.py" = ["PYI024", "PLR", "SIM201", "T20", "S301"]-"tasks/check.py" = ["UP032", "T20"]-"tasks/check_frozen_revs.py" = ["T20", "ANN401"]+"tasks/*.py" = ["T20"]+"tasks/check.py" = ["UP032"]+"tasks/check_frozen_revs.py" = ["ANN401"] "tests/test_requirements.py" = ["UP032"]
--- +++ @@ -8,3 +8,3 @@ -__version__ = "26.1"+__version__ = "26.2"
--- +++ @@ -28,2 +28,30 @@ raise NotImplementedError++ def __getstate__(self) -> str:+ # Return just the value string for compactness and stability.+ return self.value++ def _restore_value(self, value: object) -> None:+ if not isinstance(value, str):+ raise TypeError(+ f"Cannot restore {self.__class__.__name__} value from {value!r}"+ )+ self.value = value++ def __setstate__(self, state: object) -> None:+ if isinstance(state, str):+ # New format (26.2+): just the value string.+ self._restore_value(state)+ return+ if isinstance(state, tuple) and len(state) == 2:+ # Old format (packaging <= 26.0, __slots__): (None, {slot: value}).+ _, slot_dict = state+ if isinstance(slot_dict, dict) and "value" in slot_dict:+ self._restore_value(slot_dict["value"])+ return+ if isinstance(state, dict) and "value" in state:+ # Old format (packaging <= 25.0, no __slots__): plain __dict__.+ self._restore_value(state["value"])+ return+ raise TypeError(f"Cannot restore {self.__class__.__name__} from {state!r}")
--- +++ @@ -0,0 +1,33 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++"""Backward-compatibility shim for unpickling Version objects serialized before+packaging 26.1.++Old pickles reference ``packaging._structures.InfinityType`` and+``packaging._structures.NegativeInfinityType``. This module provides minimal+stand-in classes so that ``pickle.loads()`` can resolve those references.+The deserialized objects are not used for comparisons — ``Version.__setstate__``+discards the stale ``_key`` cache and recomputes it from the core version fields.+"""++from __future__ import annotations+++class InfinityType:+ """Stand-in for the removed ``InfinityType`` used in old comparison keys."""++ def __repr__(self) -> str:+ return "Infinity"+++class NegativeInfinityType:+ """Stand-in for the removed ``NegativeInfinityType`` used in old comparison keys."""++ def __repr__(self) -> str:+ return "-Infinity"+++Infinity = InfinityType()+NegativeInfinity = NegativeInfinityType()
--- +++ @@ -324,2 +324,12 @@ :raises InvalidMarker: If ``marker`` cannot be parsed.++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with packaging 26.2+ can+ be unpickled with future releases. Backward compatibility with pickles+ from packaging < 26.2 is supported but may be removed in a future+ release. """@@ -383,2 +393,31 @@ + def __getstate__(self) -> str:+ # Return the marker expression string for compactness and stability.+ # Internal Node objects are excluded; the string is re-parsed on load.+ return str(self)++ def __setstate__(self, state: object) -> None:+ if isinstance(state, str):+ # New format (26.2+): just the marker expression string.+ try:+ self._markers = _normalize_extra_values(_parse_marker(state))+ except ParserSyntaxError as exc:+ raise TypeError(f"Cannot restore Marker from {state!r}") from exc+ return+ if isinstance(state, dict) and "_markers" in state:+ # Old format (packaging <= 26.1, no __slots__): plain __dict__.+ markers = state["_markers"]+ if isinstance(markers, list):+ self._markers = markers+ return+ if isinstance(state, tuple) and len(state) == 2:+ # Old format (packaging <= 26.1, __slots__): (None, {slot: value}).+ _, slot_dict = state+ if isinstance(slot_dict, dict) and "_markers" in slot_dict:+ markers = slot_dict["_markers"]+ if isinstance(markers, list):+ self._markers = markers+ return+ raise TypeError(f"Cannot restore Marker from {state!r}")+ def __and__(self, other: Marker) -> Marker:
--- +++ @@ -29,2 +29,3 @@ __all__ = [+ "ExceptionGroup", # Keep this for a bit (makes mypy happy w/ 26.0 compat) "InvalidMetadata",
--- +++ @@ -35,2 +35,12 @@ string.++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with packaging 26.2+ can+ be unpickled with future releases. Backward compatibility with pickles+ from packaging < 26.2 is supported but may be removed in a future+ release. """@@ -75,2 +85,26 @@ + def __getstate__(self) -> str:+ # Return the requirement string for compactness and stability.+ # Re-parsed on load to reconstruct all fields.+ return str(self)++ def __setstate__(self, state: object) -> None:+ if isinstance(state, str):+ # New format (26.2+): just the requirement string.+ try:+ tmp = Requirement(state)+ except InvalidRequirement as exc:+ raise TypeError(f"Cannot restore Requirement from {state!r}") from exc+ self.name = tmp.name+ self.url = tmp.url+ self.extras = tmp.extras+ self.specifier = tmp.specifier+ self.marker = tmp.marker+ return+ if isinstance(state, dict):+ # Old format (packaging <= 26.1, no __slots__): plain __dict__.+ self.__dict__.update(state)+ return+ raise TypeError(f"Cannot restore Requirement from {state!r}")+ def __str__(self) -> str:
--- +++ @@ -17,4 +17,15 @@ import re+import sys import typing-from typing import Any, Callable, Final, Iterable, Iterator, Sequence, TypeVar, Union+from typing import (+ TYPE_CHECKING,+ Any,+ Callable,+ Final,+ Iterable,+ Iterator,+ Sequence,+ TypeVar,+ Union,+) @@ -22,2 +33,7 @@ from .version import InvalidVersion, Version++if sys.version_info >= (3, 10):+ from typing import TypeGuard # pragma: no cover+elif TYPE_CHECKING:+ from typing_extensions import TypeGuard @@ -33,2 +49,15 @@ return __all__+++def _validate_spec(spec: object, /) -> TypeGuard[tuple[str, str]]:+ return (+ isinstance(spec, tuple)+ and len(spec) == 2+ and isinstance(spec[0], str)+ and isinstance(spec[1], str)+ )+++def _validate_pre(pre: object, /) -> TypeGuard[bool | None]:+ return pre is None or isinstance(pre, bool) @@ -416,2 +445,12 @@ comma-separated version specifiers (which is what package metadata contains).++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with packaging 26.2+ can+ be unpickled with future releases. Backward compatibility with pickles+ from packaging < 26.2 is supported but may be removed in a future+ release. """@@ -724,2 +763,42 @@ + def __getstate__(self) -> tuple[tuple[str, str], bool | None]:+ # Return state as a 2-item tuple for compactness:+ # ((operator, version), prereleases)+ # Cache members are excluded and will be recomputed on demand.+ return (self._spec, self._prereleases)++ def __setstate__(self, state: object) -> None:+ # Always discard cached values - they will be recomputed on demand.+ self._spec_version = None+ self._wildcard_split = None+ self._ranges = None++ if isinstance(state, tuple):+ if len(state) == 2:+ # New format (26.2+): ((operator, version), prereleases)+ spec, prereleases = state+ if _validate_spec(spec) and _validate_pre(prereleases):+ self._spec = spec+ self._prereleases = prereleases+ return+ if len(state) == 2 and isinstance(state[1], dict):+ # Format (packaging 26.0-26.1): (None, {slot: value}).+ _, slot_dict = state+ spec = slot_dict.get("_spec")+ prereleases = slot_dict.get("_prereleases", "invalid")+ if _validate_spec(spec) and _validate_pre(prereleases):+ self._spec = spec+ self._prereleases = prereleases+ return+ if isinstance(state, dict):+ # Old format (packaging <= 25.x, no __slots__): state is a plain dict.+ spec = state.get("_spec")+ prereleases = state.get("_prereleases", "invalid")+ if _validate_spec(spec) and _validate_pre(prereleases):+ self._spec = spec+ self._prereleases = prereleases+ return++ raise TypeError(f"Cannot restore Specifier from {state!r}")+ @property@@ -1259,2 +1338,14 @@ specifiers (``>=3.0,!=3.1``), or no specifier at all.++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging+ releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with+ packaging 26.2+ can be unpickled with future releases.+ Backward compatibility with pickles from+ packaging < 26.2 is supported but may be removed in a future+ release. """@@ -1348,2 +1439,65 @@ self._is_unsatisfiable = None++ def __getstate__(self) -> tuple[tuple[Specifier, ...], bool | None]:+ # Return state as a 2-item tuple for compactness:+ # (specs, prereleases)+ # Cache members are excluded and will be recomputed on demand.+ return (self._specs, self._prereleases)++ def __setstate__(self, state: object) -> None:+ # Always discard cached values - they will be recomputed on demand.+ self._resolved_ops = None+ self._is_unsatisfiable = None++ if isinstance(state, tuple):+ if len(state) == 2:+ # New format (26.2+): (specs, prereleases)+ specs, prereleases = state+ if (+ isinstance(specs, tuple)+ and all(isinstance(s, Specifier) for s in specs)+ and _validate_pre(prereleases)+ ):+ self._specs = specs+ self._prereleases = prereleases+ self._canonicalized = len(specs) <= 1+ self._has_arbitrary = any("===" in str(s) for s in specs)+ return+ if len(state) == 2 and isinstance(state[1], dict):+ # Format (packaging 26.0-26.1): (None, {slot: value}).+ _, slot_dict = state+ specs = slot_dict.get("_specs", ())+ prereleases = slot_dict.get("_prereleases")+ # Convert frozenset to tuple (26.0 stored as frozenset)+ if isinstance(specs, frozenset):+ specs = tuple(sorted(specs, key=str))+ if (+ isinstance(specs, tuple)+ and all(isinstance(s, Specifier) for s in specs)+ and _validate_pre(prereleases)+ ):+ self._specs = specs+ self._prereleases = prereleases+ self._canonicalized = len(self._specs) <= 1+ self._has_arbitrary = any("===" in str(s) for s in self._specs)+ return+ if isinstance(state, dict):+ # Old format (packaging <= 25.x, no __slots__): state is a plain dict.+ specs = state.get("_specs", ())+ prereleases = state.get("_prereleases")+ # Convert frozenset to tuple (26.0 stored as frozenset)+ if isinstance(specs, frozenset):+ specs = tuple(sorted(specs, key=str))+ if (+ isinstance(specs, tuple)+ and all(isinstance(s, Specifier) for s in specs)+ and _validate_pre(prereleases)+ ):+ self._specs = specs+ self._prereleases = prereleases+ self._canonicalized = len(self._specs) <= 1+ self._has_arbitrary = any("===" in str(s) for s in self._specs)+ return++ raise TypeError(f"Cannot restore SpecifierSet from {state!r}")
--- +++ @@ -17,3 +17,2 @@ TYPE_CHECKING,- Any, Iterable,@@ -94,2 +93,12 @@ is also supported.++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with packaging 26.2+ can+ be unpickled with future releases. Backward compatibility with pickles+ from packaging < 26.2 is supported but may be removed in a future+ release. """@@ -160,8 +169,33 @@ - def __setstate__(self, state: tuple[None, dict[str, Any]]) -> None:- # The cached _hash is wrong when unpickling.- _, slots = state- for k, v in slots.items():- setattr(self, k, v)- self._hash = hash((self._interpreter, self._abi, self._platform))+ def __getstate__(self) -> tuple[str, str, str]:+ # Return state as a 3-item tuple: (interpreter, abi, platform).+ # Cache member _hash is excluded and will be recomputed.+ return (self._interpreter, self._abi, self._platform)++ def __setstate__(self, state: object) -> None:+ if isinstance(state, tuple):+ if len(state) == 3 and all(isinstance(s, str) for s in state):+ # New format (26.2+): (interpreter, abi, platform)+ self._interpreter, self._abi, self._platform = state+ self._hash = hash((self._interpreter, self._abi, self._platform))+ return+ if len(state) == 2 and isinstance(state[1], dict):+ # Old format (packaging <= 26.1, __slots__): (None, {slot: value}).+ _, slots = state+ try:+ interpreter = slots["_interpreter"]+ abi = slots["_abi"]+ platform = slots["_platform"]+ except KeyError:+ raise TypeError(f"Cannot restore Tag from {state!r}") from None+ if not all(+ isinstance(value, str) for value in (interpreter, abi, platform)+ ):+ raise TypeError(f"Cannot restore Tag from {state!r}")+ self._interpreter = interpreter.lower()+ self._abi = abi.lower()+ self._platform = platform.lower()+ self._hash = hash((self._interpreter, self._abi, self._platform))+ return+ raise TypeError(f"Cannot restore Tag from {state!r}") @@ -751,5 +785,7 @@ def _emscripten_platforms() -> Iterator[str]:- pyemscripten_abi_version = sysconfig.get_config_var("PYEMSCRIPTEN_ABI_VERSION")- if pyemscripten_abi_version:- yield f"pyemscripten_{pyemscripten_abi_version}_wasm32"+ pyemscripten_platform_version = sysconfig.get_config_var(+ "PYEMSCRIPTEN_PLATFORM_VERSION"+ )+ if pyemscripten_platform_version:+ yield f"pyemscripten_{pyemscripten_platform_version}_wasm32" yield from _generic_platforms()
--- +++ @@ -360,2 +360,12 @@ part of a version.++ Instances are safe to serialize with :mod:`pickle`. They use a stable+ format so the same pickle can be loaded in future packaging releases.++ .. versionchanged:: 26.2++ Added a stable pickle format. Pickles created with packaging 26.2+ can+ be unpickled with future releases. Backward compatibility with pickles+ from packaging < 26.2 is supported but may be removed in a future+ release. """@@ -743,2 +753,69 @@ + def __getstate__(+ self,+ ) -> tuple[+ int,+ tuple[int, ...],+ tuple[str, int] | None,+ tuple[str, int] | None,+ tuple[str, int] | None,+ LocalType | None,+ ]:+ # Return state as a 6-item tuple for compactness:+ # (epoch, release, pre, post, dev, local)+ # Cache members are excluded and will be recomputed on demand+ return (+ self._epoch,+ self._release,+ self._pre,+ self._post,+ self._dev,+ self._local,+ )++ def __setstate__(self, state: object) -> None:+ # Always discard cached values — they may contain stale references+ # (e.g. packaging._structures.InfinityType from pre-26.1 pickles)+ # and will be recomputed on demand from the core fields above.+ self._key_cache = None+ self._hash_cache = None++ if isinstance(state, tuple):+ if len(state) == 6:+ # New format (26.2+): (epoch, release, pre, post, dev, local)+ (+ self._epoch,+ self._release,+ self._pre,+ self._post,+ self._dev,+ self._local,+ ) = state+ return+ if len(state) == 2:+ # Format (packaging 26.0-26.1): (None, {slot: value}).+ _, slot_dict = state+ if isinstance(slot_dict, dict):+ self._epoch = slot_dict["_epoch"]+ self._release = slot_dict["_release"]+ self._pre = slot_dict.get("_pre")+ self._post = slot_dict.get("_post")+ self._dev = slot_dict.get("_dev")+ self._local = slot_dict.get("_local")+ return+ if isinstance(state, dict):+ # Old format (packaging <= 25.x, no __slots__): state is a plain+ # dict with "_version" (_Version NamedTuple) and "_key" entries.+ version_nt = state.get("_version")+ if version_nt is not None:+ self._epoch = version_nt.epoch+ self._release = version_nt.release+ self._pre = version_nt.pre+ self._post = version_nt.post+ self._dev = version_nt.dev+ self._local = version_nt.local+ return++ raise TypeError(f"Cannot restore Version from {state!r}")+ @property
--- +++ @@ -8,2 +8,3 @@ import os+import pickle import platform@@ -15,3 +16,3 @@ -from packaging._parser import Node+from packaging._parser import Node, Op, Value, Variable from packaging.markers import (@@ -566 +567,155 @@ assert m.evaluate(env) is True++[email protected](+ "marker_str",+ [+ 'python_version >= "3.8"',+ 'python_version >= "3.8" and os_name == "posix"',+ 'python_version >= "3.8" or platform_system == "Windows"',+ 'extra == "security"',+ ],+)+def test_pickle_marker_roundtrip(marker_str: str) -> None:+ # Make sure equality and str() work between a pickle/unpickle round trip.+ m = Marker(marker_str)+ loaded = pickle.loads(pickle.dumps(m))+ assert loaded == m+ assert str(loaded) == str(m)+++def test_pickle_marker_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branches in __setstate__ for invalid input.+ m = Marker.__new__(Marker)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m.__setstate__(12345)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m.__setstate__((1, 2, 3)) # Wrong tuple length+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}).+_PACKAGING_26_1_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+ b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01N}q\x02X\x08\x00"+ b"\x00\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81"+ b"q\x06N}q\x07X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_vers"+ b"ionq\ts\x86q\nbcpackaging._parser\nOp\nq\x0b)\x81q\x0cN}q\rh\x08X\x02"+ b"\x00\x00\x00>=q\x0es\x86q\x0fbcpackaging._parser\nValue\nq\x10)\x81q"+ b"\x11N}q\x12h\x08X\x03\x00\x00\x003.8q\x13s\x86q\x14b\x87q\x15as\x86"+ b"q\x16b."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is plain __dict__.+_PACKAGING_26_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+ b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01}q\x02X\x08\x00\x00"+ b"\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81q\x06N}"+ b"q\x07X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_versionq\ts\x86"+ b"q\nbcpackaging._parser\nOp\nq\x0b)\x81q\x0cN}q\rh\x08X\x02\x00\x00"+ b"\x00>=q\x0es\x86q\x0fbcpackaging._parser\nValue\nq\x10)\x81q\x11N}q\x12"+ b"h\x08X\x03\x00\x00\x003.8q\x13s\x86q\x14b\x87q\x15asb."+)++# Format: __slots__ with Node objects using __dict__ format (packaging <= 25.0).+# Now loadable because Node classes have __getstate__/__setstate__.+_PACKAGING_25_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+ b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01}q\x02X\x08\x00\x00"+ b"\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81q\x06}q\x07"+ b"X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_versionq\tsbcpackaging"+ b"._parser\nOp\nq\n)\x81q\x0b}q\x0ch\x08X\x02\x00\x00\x00>=q\rsbcpackaging"+ b"._parser\nValue\nq\x0e)\x81q\x0f}q\x10h\x08X\x03\x00\x00\x003.8q\x11sb\x87"+ b"q\x12asb."+)+++def test_pickle_marker_old_format_loads() -> None:+ # Verify that Marker pickles created with packaging <= 26.1 (__slots__,+ # no __getstate__) can be loaded and produce correct Marker objects.+ m = pickle.loads(_PACKAGING_26_1_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+ assert isinstance(m, Marker)+ assert str(m) == 'python_version >= "3.8"'+ assert m == Marker('python_version >= "3.8"')+++def test_pickle_marker_26_0_format_loads() -> None:+ # Verify that Marker pickles created with packaging 26.0 (plain __dict__)+ # can be loaded and produce correct Marker objects.+ m = pickle.loads(_PACKAGING_26_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+ assert isinstance(m, Marker)+ assert str(m) == 'python_version >= "3.8"'+ assert m == Marker('python_version >= "3.8"')+++def test_pickle_marker_25_0_format_loads() -> None:+ # Verify that Marker pickles created with packaging 25.0 (with Node __dict__)+ # can now be loaded thanks to __getstate__/__setstate__ in Node classes.+ m = pickle.loads(_PACKAGING_25_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+ assert isinstance(m, Marker)+ assert str(m) == 'python_version >= "3.8"'+ assert m == Marker('python_version >= "3.8"')+++def test_pickle_node_roundtrip() -> None:+ # Cover Node.__getstate__ and Node.__setstate__ with the new string format.+ for node in (Variable("python_version"), Value("3.8"), Op(">=")):+ loaded = pickle.loads(pickle.dumps(node))+ assert loaded.value == node.value+ assert str(loaded) == str(node)+++def test_pickle_node_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branch in Node.__setstate__ for invalid input.+ node = Variable.__new__(Variable)+ with pytest.raises(TypeError, match="Cannot restore Variable"):+ node.__setstate__(12345)++ node2 = Variable.__new__(Variable)+ with pytest.raises(TypeError, match="Cannot restore Variable"):+ node2.__setstate__((1, 2, 3)) # Wrong tuple length++ # Cover the legacy tuple branch where slot_dict doesn't have "value".+ node3 = Variable.__new__(Variable)+ with pytest.raises(TypeError, match="Cannot restore Variable"):+ node3.__setstate__((None, {"wrong_key": "foo"}))++ # Cover the legacy tuple branch where slot_dict has "value" but it's not a str.+ node4 = Variable.__new__(Variable)+ with pytest.raises(TypeError, match="Cannot restore Variable value from 123"):+ node4.__setstate__((None, {"value": 123}))++ # Cover the legacy dict branch where "value" exists but it's not a str.+ node5 = Value.__new__(Value)+ with pytest.raises(TypeError, match="Cannot restore Value value from 456"):+ node5.__setstate__({"value": 456})++ # Cover the legacy dict branch on Op (different subclass to ensure coverage).+ node6 = Op.__new__(Op)+ with pytest.raises(TypeError, match="Cannot restore Op value from 789"):+ node6.__setstate__({"value": 789})+++def test_pickle_marker_setstate_legacy_slot_dict_without_markers_key() -> None:+ # Cover Marker.__setstate__ legacy tuple branch where slot_dict has no "_markers".+ m = Marker.__new__(Marker)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m.__setstate__((None, {"other_key": "value"}))+++def test_pickle_marker_setstate_rejects_invalid_markers_type() -> None:+ # Cover the dict branch where "_markers" exists but is not a list.+ m1 = Marker.__new__(Marker)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m1.__setstate__({"_markers": "not a list"})++ # Cover the tuple branch where "_markers" exists but is not a list.+ m2 = Marker.__new__(Marker)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m2.__setstate__((None, {"_markers": "not a list"}))+++def test_pickle_marker_setstate_rejects_invalid_marker_string() -> None:+ # Cover the string branch where parsing raises ParserSyntaxError.+ m = Marker.__new__(Marker)+ with pytest.raises(TypeError, match="Cannot restore Marker"):+ m.__setstate__("this is not a valid marker")
--- +++ @@ -5,2 +5,4 @@ from __future__ import annotations++import pickle @@ -707 +709,133 @@ assert Requirement("packaging>=21.3") != "packaging>=21.3"++[email protected](+ "req_str",+ [+ "requests",+ "requests>=2.0",+ "requests>=2.0,<3.0",+ 'requests>=2.0; python_version >= "3.8"',+ "requests[security,socks]>=2.0",+ "my-pkg @ https://example.com",+ 'Django>=1.4.2,!=1.5.0,!=1.5.1; python_version < "3"',+ ],+)+def test_pickle_requirement_roundtrip(req_str: str) -> None:+ # Make sure equality and str() work between a pickle/unpickle round trip.+ r = Requirement(req_str)+ loaded = pickle.loads(pickle.dumps(r))+ assert loaded == r+ assert str(loaded) == str(r)+++def test_pickle_requirement_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branches in __setstate__ for invalid input.+ r = Requirement.__new__(Requirement)+ with pytest.raises(TypeError, match="Cannot restore Requirement"):+ r.__setstate__(12345)+ with pytest.raises(TypeError, match="Cannot restore Requirement"):+ r.__setstate__((1, 2, 3))+++def test_pickle_requirement_setstate_rejects_invalid_string() -> None:+ # Cover the string branch where Requirement() raises InvalidRequirement.+ r = Requirement.__new__(Requirement)+ with pytest.raises(TypeError, match="Cannot restore Requirement"):+ r.__setstate__("this is not a valid requirement")+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__). Contains nested SpecifierSet and+# Marker objects also pickled in their old format.+_PACKAGING_26_1_PICKLE_REQUESTS_GE_2_0_WITH_MARKER = (+ b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+ b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+ b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+ b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+ b"SpecifierSet\nq\x0c)\x81q\rcpackaging.specifiers\nSpecifier\nq\x0e)\x81"+ b"q\x0fX\x02\x00\x00\x00>=q\x10X\x03\x00\x00\x002.0q\x11\x86q\x12N\x86"+ b"q\x13b\x85q\x14N\x86q\x15bX\x06\x00\x00\x00markerq\x16cpackaging."+ b"markers\nMarker\nq\x17)\x81q\x18N}q\x19X\x08\x00\x00\x00_markersq\x1a"+ b"]q\x1bcpackaging._parser\nVariable\nq\x1c)\x81q\x1dN}q\x1eX\x05\x00"+ b"\x00\x00valueq\x1fX\x0e\x00\x00\x00python_versionq s\x86q!b"+ b'cpackaging._parser\nOp\nq")\x81q#N}q$h\x1fX\x02\x00\x00\x00>=q%s'+ b"\x86q&bcpackaging._parser\nValue\nq')\x81q(N}q)h\x1fX\x03\x00\x00"+ b"\x003.8q*s\x86q+b\x87q,as\x86q-bub."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__).+_PACKAGING_26_0_PICKLE_REQUESTS_GE_2_0 = (+ b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+ b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+ b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+ b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+ b"SpecifierSet\nq\x0c)\x81q\rN}q\x0e(X\x0c\x00\x00\x00_prereleasesq\x0f"+ b"NX\x06\x00\x00\x00_specsq\x10c__builtin__\nfrozenset\nq\x11]q\x12cpackag"+ b"ing.specifiers\nSpecifier\nq\x13)\x81q\x14N}q\x15(h\x0fNX\x05\x00\x00"+ b"\x00_specq\x16X\x02\x00\x00\x00>=q\x17X\x03\x00\x00\x002.0q\x18\x86q"+ b"\x19X\r\x00\x00\x00_spec_versionq\x1ah\x18cpackaging.version\nVersion\n"+ b"q\x1b)\x81q\x1cN}q\x1d(X\x04\x00\x00\x00_devq\x1eNX\x06\x00\x00\x00_epo"+ b"chq\x1fK\x00X\n\x00\x00\x00_key_cacheq NX\x06\x00\x00\x00_localq!NX\x05"+ b'\x00\x00\x00_postq"NX\x04\x00\x00\x00_preq#NX\x08\x00\x00\x00_releaseq$'+ b"K\x02K\x00\x86q%u\x86q&b\x86q'u\x86q(b"+ b"a\x85q)Rq*u\x86q+bX\x06\x00\x00"+ b"\x00markerq,Nub."+)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__).+_PACKAGING_25_0_PICKLE_REQUESTS_GE_2_0 = (+ b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+ b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+ b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+ b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+ b"SpecifierSet\nq\x0c)\x81q\r}q\x0e(X\x06\x00\x00\x00_specsq\x0fc__bui"+ b"ltin__\nfrozenset\nq\x10]q\x11cpackaging.specifiers\nSpecifier\nq\x12)\x81"+ b"q\x13}q\x14(X\x05\x00\x00\x00_specq\x15X\x02\x00\x00\x00>=q\x16X\x03\x00"+ b"\x00\x002.0q\x17\x86q\x18X\x0c\x00\x00\x00_prereleasesq\x19Nuba\x85q\x1a"+ b"Rq\x1bh\x19NubX\x06\x00\x00\x00markerq\x1cNub."+)+++def test_pickle_requirement_old_format_loads() -> None:+ # Verify that Requirement pickles created with packaging <= 26.1 (plain+ # __dict__, no __getstate__) can be loaded and produce correct objects.+ r = pickle.loads(_PACKAGING_26_1_PICKLE_REQUESTS_GE_2_0_WITH_MARKER)+ assert isinstance(r, Requirement)+ assert r.name == "requests"+ assert r.url is None+ assert r.extras == set()+ assert str(r.specifier) == ">=2.0"+ assert r.marker is not None+ assert str(r.marker) == 'python_version >= "3.8"'+ assert r == Requirement('requests>=2.0; python_version >= "3.8"')+++def test_pickle_requirement_26_0_format_loads() -> None:+ # Verify that Requirement pickles created with packaging 26.0 (plain __dict__)+ # can be loaded and produce correct objects.+ r = pickle.loads(_PACKAGING_26_0_PICKLE_REQUESTS_GE_2_0)+ assert isinstance(r, Requirement)+ assert r.name == "requests"+ assert r.url is None+ assert r.extras == set()+ assert str(r.specifier) == ">=2.0"+ assert r.marker is None+ assert r == Requirement("requests>=2.0")+++def test_pickle_requirement_25_0_format_loads() -> None:+ # Verify that Requirement pickles created with packaging 25.0 (plain __dict__)+ # can be loaded and produce correct objects.+ r = pickle.loads(_PACKAGING_25_0_PICKLE_REQUESTS_GE_2_0)+ assert isinstance(r, Requirement)+ assert r.name == "requests"+ assert r.url is None+ assert r.extras == set()+ assert str(r.specifier) == ">=2.0"+ assert r.marker is None+ assert r == Requirement("requests>=2.0")
--- +++ @@ -8,2 +8,3 @@ import operator+import pickle import re@@ -2847 +2848,340 @@ assert repr(upper2) == "<_UpperBound None)>"++[email protected](+ ("specifier", "spec_prereleases"),+ [+ (">=1.0", None),+ ("==2.1.*", None),+ ("!=2.2.*", None),+ ("~=2.0", None),+ (">=1.0.dev1", None),+ ("<1.0.post1", None),+ (">2.0.post1", None),+ ("<=5", None),+ (">=7.9a1", None),+ ("<1.0.dev1", None),+ ("===foobar", None),+ # With prereleases override+ (">=1.0", True),+ (">=1.0", False),+ ],+)+def test_pickle_specifier_roundtrip(+ specifier: str, spec_prereleases: bool | None+) -> None:+ # Make sure equality and str() work between a pickle/unpickle round trip.+ s = Specifier(specifier, prereleases=spec_prereleases)+ # Warm up caches before pickling to ensure they are excluded from state.+ _ = s.prereleases+ _ = s._to_ranges()+ loaded = pickle.loads(pickle.dumps(s))+ assert loaded == s+ assert str(loaded) == str(s)+ assert loaded.prereleases == s.prereleases++[email protected](+ ("specifiers", "ss_prereleases"),+ [+ (">=1.0,<2.0", None),+ ("~=1.0,!=1.1", None),+ (">=1.0.dev1,<2.0", None),+ ("", None), # Empty+ (">=1.0,<2.0,!=1.5", None),+ # With prereleases override+ (">=1.0,<2.0", True),+ (">=1.0,<2.0", False),+ ],+)+def test_pickle_specifierset_roundtrip(+ specifiers: str, ss_prereleases: bool | None+) -> None:+ # Make sure equality and str() work between a pickle/unpickle round trip.+ ss = SpecifierSet(specifiers, prereleases=ss_prereleases)+ # Warm up caches before pickling to ensure they are excluded from state.+ _ = ss.prereleases+ _ = ss.is_unsatisfiable()+ list(ss.filter(["1.5"]))+ loaded = pickle.loads(pickle.dumps(ss))+ assert loaded == ss+ assert str(loaded) == str(ss)+ assert loaded.prereleases == ss.prereleases+++def test_pickle_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branches in __setstate__ for invalid input.+ s = Specifier.__new__(Specifier)+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__((1, 2, 3)) # Wrong tuple length+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__(12345) # Not a tuple or dict++ ss = SpecifierSet.__new__(SpecifierSet)+ with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+ ss.__setstate__((1, 2, 3)) # Wrong tuple length+ with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+ ss.__setstate__(12345) # Not a tuple or dict+++def test_pickle_specifier_setstate_rejects_malformed_legacy_state() -> None:+ # Verify validation catches malformed legacy slot-dict and dict formats.+ s = Specifier.__new__(Specifier)+ # Missing _spec key (legacy slot-dict format).+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__((None, {"_prereleases": None}))+ # Missing _spec key (legacy dict format).+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__({"_prereleases": None})+ # _spec is not a 2-tuple of strings.+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__((("bad",), None))+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__((None, {"_spec": 123}))+ # _prereleases is not bool|None.+ with pytest.raises(TypeError, match="Cannot restore Specifier"):+ s.__setstate__((("==", "1.0"), "yes"))+++def test_pickle_specifierset_setstate_rejects_malformed_legacy_state() -> None:+ # Verify validation catches malformed legacy slot-dict and dict formats.+ ss = SpecifierSet.__new__(SpecifierSet)+ # _specs contains non-Specifier items (legacy slot-dict format).+ with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+ ss.__setstate__((None, {"_specs": {1, 2}, "_prereleases": None}))+ # _specs contains non-Specifier items (legacy dict format).+ with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+ ss.__setstate__({"_specs": {1, 2}, "_prereleases": None})+++def test_pickle_specifierset_setstate_on_initialized_instance() -> None:+ # Cover the branch where hasattr(self, "_specs") is True in __setstate__.+ # This happens when __setstate__ is called on an already-initialized instance.+ ss = SpecifierSet(">=1.0")+ ss.__setstate__(((Specifier(">=2.0"),), None))+ assert ss == SpecifierSet(">=2.0")+++def test_pickle_specifier_setstate_clears_cache() -> None:+ # Verify that __setstate__ resets all three cached slots to None,+ # regardless of what was cached before the call.+ s = Specifier("==1.*")+ # Warm up every cache slot.+ _ = s.prereleases # populates _spec_version+ _ = s._get_wildcard_split("1.*") # populates _wildcard_split+ _ = s._to_ranges() # populates _ranges+ assert s._spec_version is not None+ assert s._wildcard_split is not None+ assert s._ranges is not None++ s.__setstate__((("==", "1.*"), None))++ assert s._spec_version is None+ assert s._wildcard_split is None+ assert s._ranges is None+++def test_pickle_specifierset_setstate_clears_cache() -> None:+ # Verify that __setstate__ resets all cached slots to None,+ # regardless of what was cached before the call.+ ss = SpecifierSet(">=1.0,<2.0")+ # Warm up every cache slot.+ ss.is_unsatisfiable() # populates _is_unsatisfiable+ list(ss.filter(["1.5"])) # populates _resolved_ops+ assert ss._is_unsatisfiable is not None+ assert ss._resolved_ops is not None++ ss.__setstate__(((Specifier(">=3.0"), Specifier("<4.0")), None))++ assert ss._is_unsatisfiable is None+ assert ss._resolved_ops is None+++# Pickle bytes generated with packaging==25.0, Python 3.13.13, pickle protocol 2.+# Format: plain __dict__ (no __slots__). _spec is stored as a (operator, version) tuple+# and _prereleases as a separate key.+_PACKAGING_25_0_PICKLE_GE_3_10 = (+ b"\x80\x02cpackaging.specifiers\nSpecifier\nq\x00)\x81q\x01}q\x02"+ b"(X\x05\x00\x00\x00_specq\x03X\x02\x00\x00\x00>=q\x04X\x04\x00\x00"+ b"\x003.10q\x05\x86q\x06X\x0c\x00\x00\x00_prereleasesq\x07Nub."+)++_PACKAGING_25_0_PICKLE_SS_GE_3_10_LT_4_0 = (+ b"\x80\x02cpackaging.specifiers\nSpecifierSet\nq\x00)\x81q\x01}q\x02"+ b"(X\x06\x00\x00\x00_specsq\x03c__builtin__\nfrozenset\nq\x04]q\x05"+ b"(cpackaging.specifiers\nSpecifier\nq\x06)\x81q\x07}q\x08(X\x05\x00"+ b"\x00\x00_specq\tX\x02\x00\x00\x00>=q\nX\x04\x00\x00\x003.10q\x0b"+ b"\x86q\x0cX\x0c\x00\x00\x00_prereleasesq\rNubh\x06)\x81q\x0e}q\x0f"+ b"(h\tX\x01\x00\x00\x00<q\x10X\x03\x00\x00\x004.0q\x11\x86q\x12h\r"+ b"Nube\x85q\x13Rq\x14h\rNub."+)+++def test_pickle_specifier_25_0_format_loads() -> None:+ # Verify that Specifier pickles created with packaging <= 25.x (plain __dict__)+ # can be loaded and produce correct Specifier objects.+ s = pickle.loads(_PACKAGING_25_0_PICKLE_GE_3_10)+ assert isinstance(s, Specifier)+ assert str(s) == ">=3.10"+ assert s == Specifier(">=3.10")+ assert s.operator == ">="+ assert s.version == "3.10"+ assert s.prereleases == Specifier(">=3.10").prereleases+++def test_pickle_specifierset_25_0_format_loads() -> None:+ # Verify that SpecifierSet pickles created with packaging <= 25.x (plain __dict__,+ # _specs stored as a frozenset) can be loaded and produce correct objects.+ ss = pickle.loads(_PACKAGING_25_0_PICKLE_SS_GE_3_10_LT_4_0)+ assert isinstance(ss, SpecifierSet)+ assert ss == SpecifierSet(">=3.10,<4.0")+ assert "3.10" in ss+ assert "3.12" in ss+ assert "4.0" not in ss+ assert ss.prereleases is None+++# Pickle bytes generated with packaging==26.0, Python 3.13.13, pickle protocol 2.+# Format: __slots__ (no __dict__), state is (None, {slot: value}). Includes+# _spec_version slot (a cached Version object, may be present or None).+_PACKAGING_26_0_PICKLE_GE_3_10 = (+ b"\x80\x02cpackaging.specifiers\nSpecifier\nq\x00)\x81q\x01N}q\x02"+ b"(X\x0c\x00\x00\x00_prereleasesq\x03NX\x05\x00\x00\x00_specq\x04"+ b"X\x02\x00\x00\x00>=q\x05X\x04\x00\x00\x003.10q\x06\x86q\x07X\r"+ b"\x00\x00\x00_spec_versionq\x08Nu\x86q\tb."+)++_PACKAGING_26_0_PICKLE_SS_GE_3_10_LT_4_0 = (+ b"\x80\x02cpackaging.specifiers\nSpecifierSet\nq\x00)\x81q\x01N}q\x02"+ b"(X\x0c\x00\x00\x00_prereleasesq\x03NX\x06\x00\x00\x00_specsq\x04"+ b"c__builtin__\nfrozenset\nq\x05]q\x06(cpackaging.specifiers\nSpecifier"+ b"\nq\x07)\x81q\x08N}q\t(h\x03NX\x05\x00\x00\x00_specq\nX\x02\x00"+ b"\x00\x00>=q\x0bX\x04\x00\x00\x003.10q\x0c\x86q\rX\r\x00\x00\x00"+ b"_spec_versionq\x0eh\x0ccpackaging.version\nVersion\nq\x0f)\x81q\x10"+ b"N}q\x11(X\x04\x00\x00\x00_devq\x12NX\x06\x00\x00\x00_epochq\x13K"+ b"\x00X\n\x00\x00\x00_key_cacheq\x14NX\x06\x00\x00\x00_localq\x15N"+ b"X\x05\x00\x00\x00_postq\x16NX\x04\x00\x00\x00_preq\x17NX\x08\x00"+ b"\x00\x00_releaseq\x18K\x03K\n\x86q\x19u\x86q\x1ab\x86q\x1bu\x86"+ b"q\x1cbh\x07)\x81q\x1dN}q\x1e(h\x03Nh\nX\x01\x00\x00\x00<q\x1fX"+ b'\x03\x00\x00\x004.0q \x86q!h\x0eh h\x0f)\x81q"N}q#(h\x12Nh\x13'+ b"K\x00h\x14Nh\x15Nh\x16Nh\x17Nh\x18K\x04K\x00\x86q$u\x86q%b\x86"+ b"q&u\x86q'be\x85q(Rq)u\x86q*b."+)+++def test_pickle_specifier_26_0_slots_format_loads() -> None:+ # Verify that Specifier pickles created with packaging 26.0 (__slots__,+ # state is (None, {slot_dict})) can be loaded and produce correct objects.+ s = pickle.loads(_PACKAGING_26_0_PICKLE_GE_3_10)+ assert isinstance(s, Specifier)+ assert str(s) == ">=3.10"+ assert s == Specifier(">=3.10")+ assert s.operator == ">="+ assert s.version == "3.10"+ assert s.prereleases == Specifier(">=3.10").prereleases+++def test_pickle_specifierset_26_0_slots_format_loads() -> None:+ # Verify that SpecifierSet pickles created with packaging 26.0 (__slots__,+ # state is (None, {slot_dict}), _specs stored as frozenset) can be loaded.+ ss = pickle.loads(_PACKAGING_26_0_PICKLE_SS_GE_3_10_LT_4_0)+ assert isinstance(ss, SpecifierSet)+ assert ss == SpecifierSet(">=3.10,<4.0")+ assert "3.10" in ss
… 97 more lines (truncated)
--- +++ @@ -1813,3 +1813,3 @@ config = {- "PYEMSCRIPTEN_ABI_VERSION": "2026_0",+ "PYEMSCRIPTEN_PLATFORM_VERSION": "2026_0", }@@ -1870,2 +1870,106 @@ @pytest.mark.parametrize(+ ("interpreter", "abi", "platform"),+ [+ ("py3", "none", "any"),+ ("cp39", "cp39", "linux_x86_64"),+ ("cp312", "cp312", "win_amd64"),+ ("pp310", "pypy310_pp73", "manylinux_2_17_x86_64"),+ ],+)+def test_pickle_tag_roundtrip(interpreter: str, abi: str, platform: str) -> None:+ # Make sure equality, str(), and hash() work between a pickle/unpickle round trip.+ t = tags.Tag(interpreter, abi, platform)+ loaded = pickle.loads(pickle.dumps(t))+ assert loaded == t+ assert str(loaded) == str(t)+ assert hash(loaded) == hash(t)+++def test_pickle_tag_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branches in __setstate__ for invalid input.+ t = tags.Tag.__new__(tags.Tag)+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__(12345)+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__((1, 2, 3)) # Wrong types, not all strings+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__((None, {"_interpreter": "cp39", "_abi": "cp39"}))+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__(+ (None, {"_interpreter": 123, "_abi": "cp39", "_platform": "linux_x86_64"})+ )+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__((1, 2)) # len==2 but second element not a dict+ with pytest.raises(TypeError, match="Cannot restore Tag"):+ t.__setstate__((1, 2, 3, 4)) # tuple length not 2 or 3+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}). The+# _hash slot contains a pre-computed integer that must be discarded on load.+_PACKAGING_26_1_PICKLE_TAG_CP39 = (+ b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00"+ b"\x00_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05"+ b"\x8a\x08)\xb1\xe8\x9d\x90\xf8tFX\x0c\x00\x00\x00_interpreterq\x06X"+ b"\x04\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00"+ b"\x00linux_x86_64q\tu\x86q\nb."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}).+_PACKAGING_26_0_PICKLE_TAG_CP39 = (+ b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00"+ b"\x00_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05"+ b"\x8a\x08\xc1\xdb\xa0\xe5]7z\x87X\x0c\x00\x00\x00_interpreterq\x06X"+ b"\x04\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00"+ b"\x00linux_x86_64q\tu\x86q\nb."+)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __slots__).+_PACKAGING_25_0_PICKLE_TAG_CP39 = (+ b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00\x00"+ b"_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05\x8a\x08"+ b"\xea\xa5X\x92\xa5\xc9\x11\x0cX\x0c\x00\x00\x00_interpreterq\x06X\x04"+ b"\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00\x00"+ b"linux_x86_64q\tu\x86q\nb."+)+++def test_pickle_tag_old_format_loads() -> None:+ # Verify that Tag pickles created with packaging <= 26.1 (__slots__,+ # no __getstate__) can be loaded and produce correct Tag objects.+ t = pickle.loads(_PACKAGING_26_1_PICKLE_TAG_CP39)+ assert isinstance(t, tags.Tag)+ assert str(t) == "cp39-cp39-linux_x86_64"+ assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+ assert t.interpreter == "cp39"+ assert t.abi == "cp39"+ assert t.platform == "linux_x86_64"+ assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))+++def test_pickle_tag_26_0_format_loads() -> None:+ # Verify that Tag pickles created with packaging 26.0 (__slots__,+ # no __getstate__) can be loaded and produce correct Tag objects.+ t = pickle.loads(_PACKAGING_26_0_PICKLE_TAG_CP39)+ assert isinstance(t, tags.Tag)+ assert str(t) == "cp39-cp39-linux_x86_64"+ assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+ assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))+++def test_pickle_tag_25_0_format_loads() -> None:+ # Verify that Tag pickles created with packaging 25.0 (plain __dict__)+ # can be loaded and produce correct Tag objects.+ t = pickle.loads(_PACKAGING_25_0_PICKLE_TAG_CP39)+ assert isinstance(t, tags.Tag)+ assert str(t) == "cp39-cp39-linux_x86_64"+ assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+ assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))++[email protected]( ("supported", "things", "expected"),
--- +++ @@ -8,2 +8,3 @@ import operator+import pickle import sys@@ -14,2 +15,3 @@ +from packaging._structures import Infinity, NegativeInfinity from packaging.version import (@@ -1259 +1261,147 @@ assert v == Version(string)++[email protected](+ "version",+ [+ "1.2.3",+ "0.1.0",+ "2.0a1",+ "1.0b2",+ "3.0rc1",+ "1.0.post1",+ "1.0.dev3",+ "1!2.3.4a5.post6.dev7+zzz",+ ],+)+def test_pickle_roundtrip(version: str) -> None:+ # Make sure equality and str() work between a pickle/unpickle round trip.+ v = Version(version)+ loaded = pickle.loads(pickle.dumps(v))+ assert loaded == v+ assert str(loaded) == str(v)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# These contain references to packaging._structures.InfinityType and+# NegativeInfinityType in the _key cache, which were removed in packaging 26.1.+_PACKAGING_25_0_PICKLE_V1_2_3 = (+ b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01}q\x02"+ b"(X\x08\x00\x00\x00_versionq\x03cpackaging.version\n_Version\n"+ b"q\x04(K\x00K\x01K\x02K\x03\x87q\x05NNNNtq\x06\x81q\x07X\x04"+ b"\x00\x00\x00_keyq\x08(K\x00K\x01K\x02K\x03\x87q\tcpackaging._structures\n"+ b"InfinityType\nq\n)\x81q\x0bcpackaging._structures\nNegativeInfinityType\n"+ b"q\x0c)\x81q\rh\x0bh\rtq\x0eub."+)++_PACKAGING_25_0_PICKLE_V2_0A1 = (+ b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01}q\x02"+ b"(X\x08\x00\x00\x00_versionq\x03cpackaging.version\n_Version\n"+ b"q\x04(K\x00K\x02K\x00\x86q\x05NX\x01\x00\x00\x00aq\x06K\x01"+ b"\x86q\x07NNtq\x08\x81q\tX\x04\x00\x00\x00_keyq\n(K\x00K\x02"+ b"\x85q\x0bh\x07cpackaging._structures\nNegativeInfinityType\n"+ b"q\x0c)\x81q\rcpackaging._structures\nInfinityType\nq\x0e)\x81"+ b"q\x0fh\rtq\x10ub."+)+++def test_pickle_old_format_loads() -> None:+ # Verify that pickles created with packaging <= 25.x can be loaded+ # and produce correct Version objects.+ v = pickle.loads(_PACKAGING_25_0_PICKLE_V1_2_3)+ assert isinstance(v, Version)+ assert str(v) == "1.2.3"+ assert v == Version("1.2.3")+ assert v < Version("2.0")+ assert v > Version("1.2.2")++ v2 = pickle.loads(_PACKAGING_25_0_PICKLE_V2_0A1)+ assert isinstance(v2, Version)+ assert str(v2) == "2.0a1"+ assert v2 == Version("2.0a1")+ assert v2 < Version("2.0")+++def test_pickle_old_format_re_pickled_is_clean() -> None:+ # Verify that loading an old pickle and re-pickling it produces+ # a clean payload that no longer references packaging._structures.+ v = pickle.loads(_PACKAGING_25_0_PICKLE_V1_2_3)+ new_data = pickle.dumps(v)+ assert b"_structures" not in new_data+ # And the re-pickled version still works.+ v2 = pickle.loads(new_data)+ assert v2 == Version("1.2.3")+ assert str(v2) == "1.2.3"+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# 26.0 used __slots__ (no __dict__), so the pickle state is (None, {slot: value}).+# The _key_cache slot still contains packaging._structures.InfinityType references.+_PACKAGING_26_0_PICKLE_V1_2_3 = (+ b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01N}q\x02"+ b"(X\x04\x00\x00\x00_devq\x03NX\x06\x00\x00\x00_epochq\x04K\x00"+ b"X\n\x00\x00\x00_key_cacheq\x05(K\x00K\x01K\x02K\x03\x87q\x06"+ b"cpackaging._structures\nInfinityType\nq\x07)\x81q\x08cpackaging._structures\n"+ b"NegativeInfinityType\nq\t)\x81q\nh\x08h\ntq\x0bX\x06\x00\x00\x00"+ b"_localq\x0cNX\x05\x00\x00\x00_postq\rNX\x04\x00\x00\x00_preq\x0e"+ b"NX\x08\x00\x00\x00_releaseq\x0fh\x06u\x86q\x10b."+)+++def test_pickle_26_0_slots_format_loads() -> None:+ # Verify that pickles created with packaging 26.0 (__slots__, no __reduce__)+ # can be loaded and produce correct Version objects.+ v = pickle.loads(_PACKAGING_26_0_PICKLE_V1_2_3)+ assert isinstance(v, Version)+ assert str(v) == "1.2.3"+ assert v == Version("1.2.3")+ assert v < Version("2.0")+ assert v > Version("1.2.2")+++# Pickle bytes generated with packaging 26.2+ (6-tuple __getstate__ format),+# Python 3.13.1, pickle protocol 2.+_PACKAGING_26_2_TUPLE_PICKLE_V1E2_3_4A5_POST6_DEV7_ZZZ = (+ b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01(K\x01K\x02K\x03"+ b"K\x04\x87q\x02X\x01\x00\x00\x00aq\x03K\x05\x86q\x04X\x04\x00\x00"+ b"\x00postq\x05K\x06\x86q\x06X\x03\x00\x00\x00devq\x07K\x07\x86q\x08"+ b"X\x03\x00\x00\x00zzzq\t\x85q\ntq\x0bb."+)+++def test_pickle_26_2_tuple_getstate_loads() -> None:+ # Verify that pickles created with packaging 26.2+ (6-tuple __getstate__)+ # can be loaded and produce correct Version objects.+ v = pickle.loads(_PACKAGING_26_2_TUPLE_PICKLE_V1E2_3_4A5_POST6_DEV7_ZZZ)+ assert isinstance(v, Version)+ assert str(v) == "1!2.3.4a5.post6.dev7+zzz"+ assert v == Version("1!2.3.4a5.post6.dev7+zzz")+ assert v.epoch == 1+ assert v.release == (2, 3, 4)+ assert v.pre == ("a", 5)+ assert v.post == 6+ assert v.dev == 7+ assert v.local == "zzz"+++def test_pickle_setstate_rejects_invalid_state() -> None:+ # Cover the TypeError branches in __setstate__ for invalid input.+ v = Version.__new__(Version)+ # dict without "_version" key+ with pytest.raises(TypeError, match="Cannot restore Version"):+ v.__setstate__({"bad_key": 123})+ # tuple with non-dict second element+ with pytest.raises(TypeError, match="Cannot restore Version"):+ v.__setstate__((None, "not_a_dict"))+ # tuple with unexpected length (not 2 or 6)+ with pytest.raises(TypeError, match="Cannot restore Version"):+ v.__setstate__((1, 2, 3))+ # completely wrong type+ with pytest.raises(TypeError, match="Cannot restore Version"):+ v.__setstate__(12345)+++def test_structures_shim_repr() -> None:+ # Cover the __repr__ methods on the backward-compatibility shim classes.+ assert repr(Infinity) == "Infinity"+ assert repr(NegativeInfinity) == "-Infinity"
pluggy pypi YANKBURST
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
YANK
1.1.0 marked yanked (still downloadable)
high · registry-verified · 2023-06-19 · 3y ago
BURST
2 releases in 0m: 0.5.1, 0.5.2
info · registry-verified · 2018-04-15 · 8y ago
release diff 1.5.0 → 1.6.0
+2 added · -1 removed · ~30 modified
--- +++ @@ -3,4 +3,4 @@ # sync with setup.py until we discard non-pep-517/518- "setuptools>=45.0",- "setuptools-scm[toml]>=6.2.3",+ "setuptools>=65.0",+ "setuptools-scm[toml]>=8.0", ]@@ -8,7 +8,52 @@ +[project]+name = "pluggy"+license = {text = "MIT"}+authors = [{name = "Holger Krekel", email = "[email protected]"}]+classifiers = [+ "Development Status :: 6 - Mature",+ "Intended Audience :: Developers",+ "License :: OSI Approved :: MIT License",+ "Operating System :: POSIX",+ "Operating System :: Microsoft :: Windows",+ "Operating System :: MacOS :: MacOS X",+ "Topic :: Software Development :: Testing",+ "Topic :: Software Development :: Libraries",+ "Topic :: Utilities",+ "Programming Language :: Python :: Implementation :: CPython",+ "Programming Language :: Python :: Implementation :: PyPy",+ "Programming Language :: Python :: 3",+ "Programming Language :: Python :: 3 :: Only",+ "Programming Language :: Python :: 3.9",+ "Programming Language :: Python :: 3.10",+ "Programming Language :: Python :: 3.11",+ "Programming Language :: Python :: 3.12",+ "Programming Language :: Python :: 3.13",+]+description = "plugin and hook calling mechanisms for python"+readme = {file = "README.rst", content-type = "text/x-rst"}+requires-python = ">=3.9"++dynamic = ["version"]+[project.optional-dependencies]+dev = ["pre-commit", "tox"]+testing = ["pytest", "pytest-benchmark", "coverage"]++[tool.setuptools]+packages = ["pluggy"]+package-dir = {""="src"}+package-data = {"pluggy" = ["py.typed"]}+ [tool.ruff.lint]-select = [- "I", # isort+extend-select = [+ "I", # isort+ "F","E", "W",+ "UP", "ANN", ]+extend-ignore = ["ANN401"]++[tool.ruff.lint.extend-per-file-ignores]+"testing/*.py" = ["ANN001", "ANN002", "ANN003", "ANN201", "ANN202","ANN204" ,]+"docs/*.py" = ["ANN001", "ANN002", "ANN003", "ANN201", "ANN202","ANN204" ,] @@ -23,3 +68,3 @@ [tool.setuptools_scm]-write_to = "src/pluggy/_version.py"+version_file = "src/pluggy/_version.py"
--- +++ @@ -14,3 +14,3 @@ -def create_branch(version):+def create_branch(version: str) -> Repo: """Create a fresh branch from upstream/main"""@@ -38,3 +38,3 @@ -def pre_release(version):+def pre_release(version: str) -> None: """Generates new docs, release announcements and creates a local tag."""@@ -49,3 +49,3 @@ -def changelog(version, write_out=False):+def changelog(version: str, write_out: bool = False) -> None: if write_out:@@ -58,3 +58,3 @@ -def main():+def main() -> int: init(autoreset=True)@@ -68,2 +68,4 @@ return 1+ else:+ return 0
--- +++ @@ -4,3 +4,3 @@ -def main():+def main() -> int: """
--- +++ @@ -1,53 +1 @@-[metadata]-name = pluggy-description = plugin and hook calling mechanisms for python-long_description = file: README.rst-long_description_content_type = text/x-rst-license = MIT-platforms = unix, linux, osx, win32-author = Holger Krekel-author_email = [email protected]-url = https://github.com/pytest-dev/pluggy-classifiers = - Development Status :: 6 - Mature- Intended Audience :: Developers- License :: OSI Approved :: MIT License- Operating System :: POSIX- Operating System :: Microsoft :: Windows- Operating System :: MacOS :: MacOS X- Topic :: Software Development :: Testing- Topic :: Software Development :: Libraries- Topic :: Utilities- Programming Language :: Python :: Implementation :: CPython- Programming Language :: Python :: Implementation :: PyPy- Programming Language :: Python :: 3- Programming Language :: Python :: 3 :: Only- Programming Language :: Python :: 3.8- Programming Language :: Python :: 3.9- Programming Language :: Python :: 3.10- Programming Language :: Python :: 3.11--[options]-packages = - pluggy-python_requires = >=3.8-package_dir = - =src-setup_requires = - setuptools-scm--[options.extras_require]-dev = - pre-commit- tox-testing = - pytest- pytest-benchmark--[options.package_data]-pluggy = py.typed--[devpi:upload]-formats = sdist.tgz,bdist_wheel- [egg_info]
--- +++ @@ -1,8 +1 @@-try:- from ._version import version as __version__-except ImportError:- # broken installation, we don't even try- # unknown only works because we do poor mans version compare- __version__ = "unknown"- __all__ = [@@ -23,3 +16,2 @@ ]- from ._hooks import HookCaller@@ -35,2 +27,3 @@ from ._result import Result+from ._version import version as __version__ from ._warnings import PluggyTeardownRaisedWarning
--- +++ @@ -6,9 +6,7 @@ +from collections.abc import Generator+from collections.abc import Mapping+from collections.abc import Sequence from typing import cast-from typing import Generator-from typing import Mapping from typing import NoReturn-from typing import Sequence-from typing import Tuple-from typing import Union import warnings@@ -23,6 +21,34 @@ # Wrapping with a tuple is the fastest type-safe way I found to do it.-Teardown = Union[- Tuple[Generator[None, Result[object], None], HookImpl],- Generator[None, object, object],-]+Teardown = Generator[None, object, object]+++def run_old_style_hookwrapper(+ hook_impl: HookImpl, hook_name: str, args: Sequence[object]+) -> Teardown:+ """+ backward compatibility wrapper to run a old style hookwrapper as a wrapper+ """++ teardown: Teardown = cast(Teardown, hook_impl.function(*args))+ try:+ next(teardown)+ except StopIteration:+ _raise_wrapfail(teardown, "did not yield")+ try:+ res = yield+ result = Result(res, None)+ except BaseException as exc:+ result = Result(None, exc)+ try:+ teardown.send(result)+ except StopIteration:+ pass+ except BaseException as e:+ _warn_teardown_exception(hook_name, hook_impl, e)+ raise+ else:+ _raise_wrapfail(teardown, "has second yield")+ finally:+ teardown.close()+ return result.get_result() @@ -30,11 +56,8 @@ def _raise_wrapfail(- wrap_controller: (- Generator[None, Result[object], None] | Generator[None, object, object]- ),+ wrap_controller: Generator[None, object, object], msg: str, ) -> NoReturn:- co = wrap_controller.gi_code+ co = wrap_controller.gi_code # type: ignore[attr-defined] raise RuntimeError(- "wrap_controller at %r %s:%d %s"- % (co.co_name, co.co_filename, co.co_firstlineno, msg)+ f"wrap_controller at {co.co_name!r} {co.co_filename}:{co.co_firstlineno} {msg}" )@@ -49,3 +72,3 @@ msg += "For more information see https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluggyTeardownRaisedWarning" # noqa: E501- warnings.warn(PluggyTeardownRaisedWarning(msg), stacklevel=5)+ warnings.warn(PluggyTeardownRaisedWarning(msg), stacklevel=6) @@ -66,3 +89,2 @@ exception = None- only_new_style_wrappers = True try: # run impl and wrapper setup functions in a loop@@ -73,4 +95,5 @@ args = [caller_kwargs[argname] for argname in hook_impl.argnames]- except KeyError:- for argname in hook_impl.argnames:+ except KeyError as e:+ # coverage bug - this is tested+ for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs:@@ -78,15 +101,10 @@ f"hook call must provide argument {argname!r}"- )+ ) from e if hook_impl.hookwrapper:- only_new_style_wrappers = False- try:- # If this cast is not valid, a type error is raised below,- # which is the desired response.- res = hook_impl.function(*args)- wrapper_gen = cast(Generator[None, Result[object], None], res)- next(wrapper_gen) # first yield- teardowns.append((wrapper_gen, hook_impl))- except StopIteration:- _raise_wrapfail(wrapper_gen, "did not yield")+ function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)++ next(function_gen) # first yield+ teardowns.append(function_gen)+ elif hook_impl.wrapper:@@ -110,73 +128,42 @@ finally:- # Fast path - only new-style wrappers, no Result.- if only_new_style_wrappers:- if firstresult: # first result hooks return a single value- result = results[0] if results else None- else:- result = results+ if firstresult: # first result hooks return a single value+ result = results[0] if results else None+ else:+ result = results - # run all wrapper post-yield blocks- for teardown in reversed(teardowns):- try:- if exception is not None:- teardown.throw(exception) # type: ignore[union-attr]- else:- teardown.send(result) # type: ignore[union-attr]- # Following is unreachable for a well behaved hook wrapper.- # Try to force finalizers otherwise postponed till GC action.- # Note: close() may raise if generator handles GeneratorExit.- teardown.close() # type: ignore[union-attr]- except StopIteration as si:- result = si.value- exception = None- continue- except BaseException as e:- exception = e- continue- _raise_wrapfail(teardown, "has second yield") # type: ignore[arg-type]+ # run all wrapper post-yield blocks+ for teardown in reversed(teardowns):+ try:+ if exception is not None:+ try:+ teardown.throw(exception)+ except RuntimeError as re:+ # StopIteration from generator causes RuntimeError+ # even for coroutine usage - see #544+ if (+ isinstance(exception, StopIteration)+ and re.__cause__ is exception+ ):+ teardown.close()+ continue+ else:+ raise+ else:+ teardown.send(result)+ # Following is unreachable for a well behaved hook wrapper.+ # Try to force finalizers otherwise postponed till GC action.+ # Note: close() may raise if generator handles GeneratorExit.+ teardown.close()+ except StopIteration as si:+ result = si.value+ exception = None+ continue+ except BaseException as e:+ exception = e+ continue+ _raise_wrapfail(teardown, "has second yield") - if exception is not None:- raise exception.with_traceback(exception.__traceback__)- else:- return result-- # Slow path - need to support old-style wrappers.- else:- if firstresult: # first result hooks return a single value- outcome: Result[object | list[object]] = Result(- results[0] if results else None, exception- )- else:- outcome = Result(results, exception)-- # run all wrapper post-yield blocks- for teardown in reversed(teardowns):- if isinstance(teardown, tuple):- try:- teardown[0].send(outcome)- except StopIteration:- pass- except BaseException as e:- _warn_teardown_exception(hook_name, teardown[1], e)- raise- else:- _raise_wrapfail(teardown[0], "has second yield")- else:- try:- if outcome._exception is not None:- teardown.throw(outcome._exception)- else:- teardown.send(outcome._result)- # Following is unreachable for a well behaved hook wrapper.- # Try to force finalizers otherwise postponed till GC action.- # Note: close() may raise if generator handles GeneratorExit.- teardown.close()- except StopIteration as si:- outcome.force_result(si.value)- continue- except BaseException as e:- outcome.force_exception(e)- continue- _raise_wrapfail(teardown, "has second yield")-- return outcome.get_result()+ if exception is not None:+ raise exception+ else:+ return result
--- +++ @@ -6,2 +6,6 @@ +from collections.abc import Generator+from collections.abc import Mapping+from collections.abc import Sequence+from collections.abc import Set import inspect@@ -9,3 +13,2 @@ from types import ModuleType-from typing import AbstractSet from typing import Any@@ -14,9 +17,4 @@ from typing import final-from typing import Generator-from typing import List-from typing import Mapping from typing import Optional from typing import overload-from typing import Sequence-from typing import Tuple from typing import TYPE_CHECKING@@ -36,3 +34,3 @@ [str, Sequence["HookImpl"], Mapping[str, object], bool],- Union[object, List[object]],+ Union[object, list[object]], ]@@ -304,3 +302,3 @@ func = func.__init__- except AttributeError:+ except AttributeError: # pragma: no cover - pypy special case return (), ()@@ -309,3 +307,3 @@ func = getattr(func, "__call__", func)- except Exception:+ except Exception: # pragma: no cover - pypy special case return (), ()@@ -317,3 +315,3 @@ )- except TypeError:+ except TypeError: # pragma: no cover return (), ()@@ -349,3 +347,3 @@ implicit_names: tuple[str, ...] = ("self",)- else:+ else: # pragma: no cover implicit_names = ("self", "obj")@@ -378,3 +376,3 @@ -_CallHistory = List[Tuple[Mapping[str, object], Optional[Callable[[Any], None]]]]+_CallHistory = list[tuple[Mapping[str, object], Optional[Callable[[Any], None]]]] @@ -487,3 +485,4 @@ for argname in self.spec.argnames- # Avoid self.spec.argnames - kwargs.keys() - doesn't preserve order.+ # Avoid self.spec.argnames - kwargs.keys()+ # it doesn't preserve order. if argname not in kwargs.keys()@@ -491,4 +490,4 @@ warnings.warn(- "Argument(s) {} which are declared in the hookspec "- "cannot be found in this hook call".format(notincall),+ f"Argument(s) {notincall} which are declared in the hookspec "+ "cannot be found in this hook call", stacklevel=2,@@ -506,5 +505,5 @@ """- assert (- not self.is_historic()- ), "Cannot directly call a historic hook - use call_historic instead."+ assert not self.is_historic(), (+ "Cannot directly call a historic hook - use call_historic instead."+ ) self._verify_all_args_are_provided(kwargs)@@ -547,5 +546,5 @@ :ref:`call_extra`."""- assert (- not self.is_historic()- ), "Cannot directly call a historic hook - use call_historic instead."+ assert not self.is_historic(), (+ "Cannot directly call a historic hook - use call_historic instead."+ ) self._verify_all_args_are_provided(kwargs)@@ -610,3 +609,3 @@ - def __init__(self, orig: HookCaller, remove_plugins: AbstractSet[_Plugin]) -> None:+ def __init__(self, orig: HookCaller, remove_plugins: Set[_Plugin]) -> None: self._orig = orig
--- +++ @@ -2,2 +2,5 @@ +from collections.abc import Iterable+from collections.abc import Mapping+from collections.abc import Sequence import inspect@@ -8,5 +11,2 @@ from typing import Final-from typing import Iterable-from typing import Mapping-from typing import Sequence from typing import TYPE_CHECKING@@ -72,3 +72,3 @@ - def __getattr__(self, attr: str, default=None):+ def __getattr__(self, attr: str, default: Any | None = None) -> Any: return getattr(self._dist, attr, default)@@ -140,4 +140,4 @@ raise ValueError(- "Plugin name already registered: %s=%s\n%s"- % (plugin_name, plugin, self._name2plugin)+ "Plugin name already registered: "+ f"{plugin_name}={plugin}\n{self._name2plugin}" )@@ -146,4 +146,4 @@ raise ValueError(- "Plugin already registered under a different name: %s=%s\n%s"- % (plugin_name, plugin, self._name2plugin)+ "Plugin already registered under a different name: "+ f"{plugin_name}={plugin}\n{self._name2plugin}" )@@ -190,7 +190,7 @@ )- except Exception:- res = {} # type: ignore[assignment]+ except Exception: # pragma: no cover+ res = {} # type: ignore[assignment] #pragma: no cover if res is not None and not isinstance(res, dict): # false positive- res = None # type:ignore[unreachable]+ res = None # type:ignore[unreachable] #pragma: no cover return res@@ -331,4 +331,4 @@ hookimpl.plugin,- "Plugin %r\nhook %r\nhistoric incompatible with yield/wrapper/hookwrapper"- % (hookimpl.plugin_name, hook.name),+ f"Plugin {hookimpl.plugin_name!r}\nhook {hook.name!r}\n"+ "historic incompatible with yield/wrapper/hookwrapper", )@@ -344,11 +344,6 @@ hookimpl.plugin,- "Plugin %r for hook %r\nhookimpl definition: %s\n"- "Argument(s) %s are declared in the hookimpl but "- "can not be found in the hookspec"- % (- hookimpl.plugin_name,- hook.name,- _formatdef(hookimpl.function),- notinspec,- ),+ f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+ f"hookimpl definition: {_formatdef(hookimpl.function)}\n"+ f"Argument(s) {notinspec} are declared in the hookimpl but "+ "can not be found in the hookspec", )@@ -366,6 +361,6 @@ hookimpl.plugin,- "Plugin %r for hook %r\nhookimpl definition: %s\n"+ f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+ f"hookimpl definition: {_formatdef(hookimpl.function)}\n" "Declared as wrapper=True or hookwrapper=True "- "but function is not a generator function"- % (hookimpl.plugin_name, hook.name, _formatdef(hookimpl.function)),+ "but function is not a generator function", )@@ -375,5 +370,5 @@ hookimpl.plugin,- "Plugin %r for hook %r\nhookimpl definition: %s\n"- "The wrapper=True and hookwrapper=True options are mutually exclusive"- % (hookimpl.plugin_name, hook.name, _formatdef(hookimpl.function)),+ f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+ f"hookimpl definition: {_formatdef(hookimpl.function)}\n"+ "The wrapper=True and hookwrapper=True options are mutually exclusive", )@@ -385,12 +380,12 @@ for name in self.hook.__dict__:- if name[0] != "_":- hook: HookCaller = getattr(self.hook, name)- if not hook.has_spec():- for hookimpl in hook.get_hookimpls():- if not hookimpl.optionalhook:- raise PluginValidationError(- hookimpl.plugin,- "unknown hook %r in plugin %r"- % (name, hookimpl.plugin),- )+ if name[0] == "_":+ continue+ hook: HookCaller = getattr(self.hook, name)+ if not hook.has_spec():+ for hookimpl in hook.get_hookimpls():+ if not hookimpl.optionalhook:+ raise PluginValidationError(+ hookimpl.plugin,+ f"unknown hook {name!r} in plugin {hookimpl.plugin!r}",+ )
--- +++ @@ -12,4 +12,2 @@ from typing import Optional-from typing import Tuple-from typing import Type from typing import TypeVar@@ -17,3 +15,3 @@ -_ExcInfo = Tuple[Type[BaseException], BaseException, Optional[TracebackType]]+_ExcInfo = tuple[type[BaseException], BaseException, Optional[TracebackType]] ResultType = TypeVar("ResultType")@@ -30,3 +28,3 @@ - __slots__ = ("_result", "_exception")+ __slots__ = ("_result", "_exception", "_traceback") @@ -40,2 +38,4 @@ self._exception = exception+ # Exception __traceback__ is mutable, this keeps the original.+ self._traceback = exception.__traceback__ if exception is not None else None @@ -48,3 +48,3 @@ else:- return (type(exc), exc, exc.__traceback__)+ return (type(exc), exc, self._traceback) @@ -77,2 +77,3 @@ self._exception = None+ self._traceback = None @@ -87,2 +88,3 @@ self._exception = exception+ self._traceback = exception.__traceback__ if exception is not None else None @@ -96,2 +98,3 @@ exc = self._exception+ tb = self._traceback if exc is None:@@ -99,3 +102,3 @@ else:- raise exc.with_traceback(exc.__traceback__)+ raise exc.with_traceback(tb)
--- +++ @@ -6,6 +6,5 @@ +from collections.abc import Sequence from typing import Any from typing import Callable-from typing import Sequence-from typing import Tuple @@ -13,3 +12,3 @@ _Writer = Callable[[str], object]-_Processor = Callable[[Tuple[str, ...], Tuple[Any, ...]], object]+_Processor = Callable[[tuple[str, ...], tuple[Any, ...]], object]
--- +++ @@ -1,6 +1,11 @@-# file generated by setuptools_scm+# file generated by setuptools-scm # don't change, don't track in version control++__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]+ TYPE_CHECKING = False if TYPE_CHECKING:- from typing import Tuple, Union+ from typing import Tuple+ from typing import Union+ VERSION_TUPLE = Tuple[Union[int, str], ...]@@ -14,3 +19,3 @@ -__version__ = version = '1.5.0'-__version_tuple__ = version_tuple = (1, 5, 0)+__version__ = version = '1.6.0'+__version_tuple__ = version_tuple = (1, 6, 0)
--- +++ @@ -3,2 +3,4 @@ """++from typing import Any @@ -28,3 +30,3 @@ @pytest.fixture(params=[10, 100], ids="hooks={}".format)-def hooks(request):+def hooks(request: Any) -> list[object]: return [hook for i in range(request.param)]@@ -33,3 +35,3 @@ @pytest.fixture(params=[10, 100], ids="wrappers={}".format)-def wrappers(request):+def wrappers(request: Any) -> list[object]: return [wrapper for i in range(request.param)]@@ -37,3 +39,3 @@ -def test_hook_and_wrappers_speed(benchmark, hooks, wrappers):+def test_hook_and_wrappers_speed(benchmark, hooks, wrappers) -> None: def setup():@@ -67,3 +69,3 @@ )-def test_call_hook(benchmark, plugins, wrappers, nesting):+def test_call_hook(benchmark, plugins, wrappers, nesting) -> None: pm = PluginManager("example")
--- +++ @@ -16,3 +16,3 @@ def he_method1(self, arg: int) -> int:- return arg + 1+ return arg + 1 # pragma: no cover
--- +++ @@ -1,3 +1,6 @@+from importlib.metadata import distribution+ import pytest +import pluggy from pluggy import HookimplMarker@@ -22,3 +25,3 @@ def x1meth(self):- pass+ pass # pragma: no cover @@ -35,3 +38,3 @@ def x1meth(self):- pass+ pass # pragma: no cover @@ -39,3 +42,3 @@ def x1meth2(self):- pass+ pass # pragma: no cover @@ -43,3 +46,3 @@ def x1meth3(self):- pass+ pass # pragma: no cover @@ -77,3 +80,3 @@ def foo(self):- pass+ pass # pragma: no cover @@ -82,3 +85,3 @@ def foo(self):- pass+ pass # pragma: no cover @@ -138,6 +141,8 @@ class Module:- pass+ x: DontTouchMe module = Module()- module.x = DontTouchMe() # type: ignore[attr-defined]+ module.x = DontTouchMe()+ with pytest.raises(Exception, match="touch me"):+ module.x.broken @@ -156,3 +161,3 @@ def hello(self, arg1, arg2):- pass+ pass # pragma: no cover @@ -160,3 +165,3 @@ def herstory(self, arg1, arg2):- pass+ pass # pragma: no cover @@ -191 +196,51 @@ )+++def test_dist_facade_list_attributes() -> None:+ from pluggy._manager import DistFacade++ fc = DistFacade(distribution("pluggy"))+ res = dir(fc)+ assert res == sorted(res)+ assert set(res) - set(dir(fc._dist)) == {"_dist", "project_name"}+++def test_hookimpl_disallow_invalid_combination() -> None:+ decorator = hookspec(historic=True, firstresult=True)+ with pytest.raises(ValueError, match="cannot have a historic firstresult hook"):+ decorator(any)+++def test_hook_nonspec_call(pm: PluginManager) -> None:+ class Plugin:+ @hookimpl+ def a_hook(self, passed: str, missing: int) -> None:+ pass++ pm.register(Plugin())+ with pytest.raises(+ pluggy.HookCallError, match="hook call must provide argument 'missing'"+ ):+ pm.hook.a_hook(passed="a")+ pm.hook.a_hook(passed="a", missing="ok")+++def test_wrapper_runtimeerror_passtrough(pm: PluginManager) -> None:+ """+ ensure runtime-error passes trough a wrapper in case of exceptions+ """++ class Fail:+ @hookimpl+ def fail_late(self):+ raise RuntimeError("this is personal")++ class Plugin:+ @hookimpl(wrapper=True)+ def fail_late(self):+ yield++ pm.register(Plugin())+ pm.register(Fail())+ with pytest.raises(RuntimeError, match="this is personal"):+ pm.hook.fail_late()
--- +++ @@ -12,3 +12,3 @@ def f(x) -> None:- i = 3 # noqa+ i = 3 # noqa #pragma: no cover @@ -16,3 +16,3 @@ def f(self, y) -> None:- pass+ pass # pragma: no cover @@ -20,3 +20,3 @@ def __call__(self, z) -> None:- pass+ pass # pragma: no cover @@ -98,3 +98,3 @@ def wrapper(*args, **kwargs):- return func(*args, **kwargs)+ return func(*args, **kwargs) # pragma: no cover
--- +++ @@ -1,5 +1,4 @@+from collections.abc import Generator+from collections.abc import Sequence from typing import Callable-from typing import Generator-from typing import List-from typing import Sequence from typing import TypeVar@@ -65,3 +64,3 @@ -def funcs(hookmethods: Sequence[HookImpl]) -> List[Callable[..., object]]:+def funcs(hookmethods: Sequence[HookImpl]) -> list[Callable[..., object]]: return [hookmethod.function for hookmethod in hookmethods]@@ -161,3 +160,3 @@ def he_method1():- yield+ yield # pragma: no cover @@ -165,3 +164,3 @@ def he_method1_fun():- yield+ yield # pragma: no cover @@ -169,3 +168,3 @@ def he_method1_middle():- return+ return # pragma: no cover @@ -173,3 +172,3 @@ def he_method3_fun():- yield+ yield # pragma: no cover @@ -177,3 +176,3 @@ def he_method3():- yield+ yield # pragma: no cover @@ -191,3 +190,3 @@ def he_method1():- yield+ yield # pragma: no cover @@ -195,3 +194,3 @@ def he_method2():- yield+ yield # pragma: no cover @@ -199,3 +198,3 @@ def he_method3():- yield+ yield # pragma: no cover @@ -209,3 +208,3 @@ def m1():- yield+ yield # pragma: no cover @@ -230,3 +229,3 @@ def m5():- yield+ yield # pragma: no cover @@ -246,3 +245,3 @@ def m8():- yield+ yield # pragma: no cover @@ -267,3 +266,3 @@ def m12():- yield+ yield # pragma: no cover @@ -408,3 +407,3 @@ def foo(self, arg: int, too, many, args) -> int:- return arg + 1+ return arg + 1 # pragma: no cover @@ -418,3 +417,3 @@ def hello(self, arg: int) -> int:- return arg + 1+ return arg + 1 # pragma: no cover
--- +++ @@ -1,2 +1,3 @@-from typing import Iterator+from collections.abc import Iterator+from typing import Any @@ -135,3 +136,3 @@ def hello(self, arg):- return arg + 1+ return arg + 1 # pragma: no cover @@ -328 +329,41 @@ assert [y for x in res for y in x] == [2, 3, 1]++[email protected](+ "kind",+ [+ pytest.param(hookimpl(wrapper=True), id="wrapper"),+ pytest.param(hookimpl(hookwrapper=True), id="legacy-wrapper"),+ ],+)+def test_wrappers_yield_twice_fails(pm: PluginManager, kind: Any) -> None:+ class Plugin:+ @kind+ def wrap(self):+ yield+ yield++ pm.register(Plugin())+ with pytest.raises(+ RuntimeError, match="wrap_controller at 'wrap'.* has second yield"+ ):+ pm.hook.wrap()++[email protected](+ "kind",+ [+ pytest.param(hookimpl(wrapper=True), id="wrapper"),+ pytest.param(hookimpl(hookwrapper=True), id="legacy-wrapper"),+ ],+)+def test_wrappers_yield_never_fails(pm: PluginManager, kind: Any) -> None:+ class Plugin:+ @kind+ def wrap(self):+ if False:+ yield # type: ignore[unreachable]++ pm.register(Plugin())+ with pytest.raises(RuntimeError, match="wrap_controller at 'wrap'.* did not yield"):+ pm.hook.wrap()
--- +++ @@ -1,6 +1,4 @@+from collections.abc import Mapping+from collections.abc import Sequence from typing import Callable-from typing import List-from typing import Mapping-from typing import Sequence-from typing import Type from typing import Union@@ -24,3 +22,3 @@ firstresult: bool = False,-) -> Union[object, List[object]]:+) -> Union[object, list[object]]: caller = _multicall@@ -59,3 +57,3 @@ def f(x):- return x+ return x # pragma: no cover @@ -252,3 +250,3 @@ @pytest.mark.parametrize("exc", [ValueError, SystemExit])-def test_hookwrapper_exception(exc: "Type[BaseException]") -> None:+def test_hookwrapper_exception(exc: type[BaseException]) -> None: out = []@@ -322,3 +320,3 @@ @pytest.mark.parametrize("exc", [ValueError, SystemExit])-def test_wrapper_exception(exc: "Type[BaseException]") -> None:+def test_wrapper_exception(exc: type[BaseException]) -> None: out = []@@ -335,3 +333,3 @@ out.append("m1 finish")- return result+ return result # pragma: no cover @@ -362,3 +360,3 @@ yield- return 10+ return 10 # pragma: no cover @@ -388,3 +386,3 @@ yield- out.append("m1 unreachable")+ out.append("m1 unreachable") # pragma: no cover except BaseException:@@ -418,2 +416,32 @@ [email protected]("has_hookwrapper", [True, False])+def test_wrapper_stopiteration_passtrough(has_hookwrapper: bool) -> None:+ out = []++ @hookimpl(wrapper=True)+ def wrap():+ out.append("wrap")+ try:+ yield+ finally:+ out.append("wrap done")++ @hookimpl(wrapper=not has_hookwrapper, hookwrapper=has_hookwrapper)+ def wrap_path2():+ yield++ @hookimpl+ def stop():+ out.append("stop")+ raise StopIteration++ with pytest.raises(StopIteration):+ try:+ MC([stop, wrap, wrap_path2], {})+ finally:+ out.append("finally")++ assert out == ["wrap", "stop", "wrap done", "finally"]++ def test_suppress_inner_wrapper_teardown_exc() -> None:@@ -433,3 +461,3 @@ yield- out.append("m2 unreachable")+ out.append("m2 unreachable") # pragma: no cover except ValueError:
--- +++ @@ -6,3 +6,2 @@ from typing import Any-from typing import List @@ -68,5 +67,7 @@ return 42- raise AttributeError()+ raise AttributeError(name) a = A()+ a.test+ he_pm.register(a)@@ -129,3 +130,3 @@ def he_method_notexists(self):- pass+ pass # pragma: no cover @@ -143,3 +144,3 @@ def he_method1(self, qlwkje):- pass+ pass # pragma: no cover @@ -183,3 +184,3 @@ @hookimpl- def he_method1(self): ...+ def he_method1(self): ... # pragma: no cover @@ -202,2 +203,14 @@ +def test_unregister_blocked(pm: PluginManager) -> None:+ class Plugin:+ pass++ p = Plugin()+ pm.set_blocked("error")+ pm.register(p, "error")+ # bloked plugins can be unregistred many times atm+ pm.unregister(p, "error")+ pm.unregister(p, "error")++ def test_register_unknown_hooks(pm: PluginManager) -> None:@@ -213,4 +226,3 @@ @hookspec- def he_method1(self, arg):- pass+ def he_method1(self, arg): ... @@ -227,4 +239,3 @@ @hookspec(historic=True)- def he_method1(self, arg):- pass+ def he_method1(self, arg): ... @@ -376,3 +387,3 @@ def he_method1(self, arg):- out.append(arg)+ out.append(arg) # pragma: no cover @@ -393,3 +404,3 @@ def he_method1(self, arg):- yield+ yield # pragma: no cover @@ -428,2 +439,5 @@ pm.register(Plugin1())+ with pytest.raises(ZeroDivisionError):+ pm.hook.he_method1(arg="works")+ with pytest.raises(HookCallError):@@ -608,3 +622,3 @@ def test_add_tracefuncs(he_pm: PluginManager) -> None:- out: List[Any] = []+ out: list[Any] = [] @@ -661,3 +675,3 @@ he_pm.register(api1())- out: List[Any] = []+ out: list[Any] = [] he_pm.trace.root.setwriter(out.append)@@ -757 +771,46 @@ assert result == [4, 5, 3, 2, 1, 6]+++def test_check_pending_skips_underscore(pm: PluginManager) -> None:+ # todo: determine what we want to do with the namespace+ class Plugin:+ @hookimpl+ def _problem(self):+ pass++ pm.register(Plugin())+ pm.hook._problem()+ pm.check_pending()+++def test_check_pending_optionalhook(+ pm: PluginManager,+) -> None:+ class Plugin:+ @hookimpl(optionalhook=True)+ def a_hook(self, param):+ pass++ pm.register(Plugin())+ pm.hook.a_hook(param=1)+ pm.check_pending()+++def test_check_pending_nonspec_hook(+ pm: PluginManager,+) -> None:+ hookimpl = HookimplMarker("example")++ class Plugin:+ @hookimpl+ def a_hook(self, param):+ pass++ pm.register(Plugin())+ with pytest.raises(HookCallError, match="hook call must provide argument 'param'"):+ pm.hook.a_hook()++ with pytest.raises(+ PluginValidationError, match="unknown hook 'a_hook' in plugin .*"+ ):+ pm.check_pending()
--- +++ @@ -0,0 +1,27 @@+import traceback++from pluggy import Result+++def test_exceptions_traceback_doesnt_get_longer_and_longer() -> None:+ def bad() -> None:+ 1 / 0++ result = Result.from_call(bad)++ try:+ result.get_result()+ except Exception as exc:+ tb1 = traceback.extract_tb(exc.__traceback__)++ try:+ result.get_result()+ except Exception as exc:+ tb2 = traceback.extract_tb(exc.__traceback__)++ try:+ result.get_result()+ except Exception as exc:+ tb3 = traceback.extract_tb(exc.__traceback__)++ assert len(tb1) == len(tb2) == len(tb3)
--- +++ @@ -1,3 +1 @@-from typing import List- import pytest@@ -15,3 +13,3 @@ log("hello")- out: List[str] = []+ out: list[str] = [] rootlogger.setwriter(out.append)
protobuf pypi YANK ×3BURST ×3INSTALL-EXEC
6.33.2
6.33.3
6.33.4
6.33.5
5.29.6
7.34.0
6.33.6
7.34.1
4.25.9
7.35.0
7.34.2
7.35.1
YANK
3.18.0 marked yanked (still downloadable)
high · registry-verified · 2021-09-15 · 4y ago
YANK
4.21.0 marked yanked (still downloadable)
high · registry-verified · 2022-05-26 · 4y ago
YANK
5.29.0 marked yanked (still downloadable)
high · registry-verified · 2024-11-27 · 1y ago
BURST
3 releases in 59m: 3.18.3, 3.19.5, 3.20.2
info · registry-verified · 2022-09-14 · 3y ago
BURST
2 releases in 53m: 3.19.6, 3.20.3
info · registry-verified · 2022-09-29 · 3y ago
BURST
2 releases in 56m: 5.28.2, 4.25.5
info · registry-verified · 2024-09-18 · 1y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 7.34.2 → 7.35.1
+1 added · -0 removed · ~76 modified
--- +++ @@ -9,2 +9,2 @@ -__version__ = '7.34.2'+__version__ = '7.35.1'
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/any.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/api.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/compiler/plugin.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -11,2 +11,3 @@ +from typing import Dict, Iterator, Optional import warnings@@ -25,7 +26,11 @@ - def __init__(self):- self._file_desc_protos_by_file = {}- self._file_desc_protos_by_symbol = {}+ def __init__(self) -> None:+ self._file_desc_protos_by_file: Dict[+ str, 'descriptor_pb2.FileDescriptorProto'+ ] = {}+ self._file_desc_protos_by_symbol: Dict[+ str, 'descriptor_pb2.FileDescriptorProto'+ ] = {} - def Add(self, file_desc_proto):+ def Add(self, file_desc_proto: 'descriptor_pb2.FileDescriptorProto') -> None: """Adds the FileDescriptorProto and its types to this database.@@ -73,3 +78,3 @@ - def FindFileByName(self, name):+ def FindFileByName(self, name: str) -> 'descriptor_pb2.FileDescriptorProto': """Finds the file descriptor proto by file name.@@ -92,3 +97,5 @@ - def FindFileContainingSymbol(self, symbol):+ def FindFileContainingSymbol(+ self, symbol: str+ ) -> 'descriptor_pb2.FileDescriptorProto': """Finds the file descriptor proto containing the specified symbol.@@ -137,3 +144,5 @@ - def FindFileContainingExtension(self, extendee_name, extension_number):+ def FindFileContainingExtension(+ self, extendee_name: str, extension_number: int # pylint: disable=unused-argument+ ) -> Optional['descriptor_pb2.FileDescriptorProto']: # TODO: implement this API.@@ -141,3 +150,3 @@ - def FindAllExtensionNumbers(self, extendee_name):+ def FindAllExtensionNumbers(self, extendee_name: str) -> list[int]: # pylint: disable=unused-argument # TODO: implement this API.@@ -145,3 +154,5 @@ - def _AddSymbol(self, name, file_desc_proto):+ def _AddSymbol(+ self, name: str, file_desc_proto: 'descriptor_pb2.FileDescriptorProto'+ ) -> None: if name in self._file_desc_protos_by_symbol:@@ -155,3 +166,5 @@ -def _ExtractSymbols(desc_proto, package):+def _ExtractSymbols(+ desc_proto: 'descriptor_pb2.DescriptorProto', package: str+) -> Iterator[str]: """Pulls out all the symbols from a descriptor proto.
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/descriptor.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',@@ -34,6 +34,6 @@ create_key=_descriptor._internal_create_key,- serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xcc\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xf2\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xc6\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xd8\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\x8e\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xab\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBI\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"W\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xbe\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection'+ serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xd4\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xfa\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xfc\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xce\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xb4\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd9\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xe0\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xdd\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xa1\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xae\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xbc\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBZ\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xa2\x01\x0e\x12\tSTYLE2026\x18\x8fN\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"f\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02\x12\r\n\tSTYLE2026\x10\x03*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xd1\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x11\n\x0c\x45\x44ITION_2026\x10\xea\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection' ) else:- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xcc\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xf2\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xc6\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xd8\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\x8e\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xab\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBI\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"W\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xbe\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection')+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xd4\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xfa\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xfc\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xce\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xb4\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd9\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xe0\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xdd\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xa1\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xae\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xbc\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBZ\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xa2\x01\x0e\x12\tSTYLE2026\x18\x8fN\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"f\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02\x12\r\n\tSTYLE2026\x10\x03*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xd1\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x11\n\x0c\x45\x44ITION_2026\x10\xea\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection') @@ -79,33 +79,38 @@ _descriptor.EnumValueDescriptor(- name='EDITION_UNSTABLE', index=6, number=9999,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_1_TEST_ONLY', index=7, number=1,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_2_TEST_ONLY', index=8, number=2,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_99997_TEST_ONLY', index=9, number=99997,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_99998_TEST_ONLY', index=10, number=99998,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_99999_TEST_ONLY', index=11, number=99999,- serialized_options=None,- type=None,- create_key=_descriptor._internal_create_key),- _descriptor.EnumValueDescriptor(- name='EDITION_MAX', index=12, number=2147483647,+ name='EDITION_2026', index=6, number=1002,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_UNSTABLE', index=7, number=9999,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_1_TEST_ONLY', index=8, number=1,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_2_TEST_ONLY', index=9, number=2,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_99997_TEST_ONLY', index=10, number=99997,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_99998_TEST_ONLY', index=11, number=99998,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_99999_TEST_ONLY', index=12, number=99999,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='EDITION_MAX', index=13, number=2147483647, serialized_options=None,@@ -737,2 +742,7 @@ create_key=_descriptor._internal_create_key),+ _descriptor.EnumValueDescriptor(+ name='STYLE2026', index=3, number=3,+ serialized_options=None,+ type=None,+ create_key=_descriptor._internal_create_key), ],@@ -1198,3 +1208,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -1754,3 +1764,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -1825,3 +1835,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2040,3 +2050,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2076,3 +2086,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2133,3 +2143,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2190,3 +2200,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2233,3 +2243,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2284,3 +2294,3 @@ is_extendable=True,- extension_ranges=[(1000, 536870912), ],+ extension_ranges=[(990, 999), (1000, 536870912), ], oneofs=[@@ -2474,3 +2484,3 @@ is_extension=False, extension_scope=None,- serialized_options=b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\262\001\003\010\351\007', json_name='enforceNamingStyle', file=DESCRIPTOR, create_key=_descriptor._internal_create_key),+ serialized_options=b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\242\001\016\022\tSTYLE2026\030\217N\262\001\003\010\351\007', json_name='enforceNamingStyle', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(@@ -3200,2 +3210,3 @@ _FEATURESET_ENFORCENAMINGSTYLE.values[2]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)+ _FEATURESET_ENFORCENAMINGSTYLE.values[3]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number) _FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)@@ -3224,2 +3235,3 @@ _EDITION.values[12]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)+ _EDITION.values[13]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number) _SYMBOLVISIBILITY._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)@@ -3261,3 +3273,3 @@ _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._loaded_options = None- _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._serialized_options = b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\262\001\003\010\351\007'+ _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._serialized_options = b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\242\001\016\022\tSTYLE2026\030\217N\262\001\003\010\351\007' _globals['_FEATURESET'].fields_by_name['default_symbol_visibility']._loaded_options = None@@ -3270,6 +3282,6 @@ _globals['_GENERATEDCODEINFO_ANNOTATION'].fields_by_name['path']._serialized_options = b'\020\001'- _globals['_EDITION']._serialized_start=12919- _globals['_EDITION']._serialized_end=13237- _globals['_SYMBOLVISIBILITY']._serialized_start=13239- _globals['_SYMBOLVISIBILITY']._serialized_end=13324+ _globals['_EDITION']._serialized_start=13023+ _globals['_EDITION']._serialized_end=13360+ _globals['_SYMBOLVISIBILITY']._serialized_start=13362+ _globals['_SYMBOLVISIBILITY']._serialized_end=13447 _globals['_FILEDESCRIPTORSET']._serialized_start=53@@ -3285,3 +3297,3 @@ _globals['_EXTENSIONRANGEOPTIONS']._serialized_start=1754- _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2342+ _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2350 _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_start=2129@@ -3290,90 +3302,90 @@ _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_end=2331- _globals['_FIELDDESCRIPTORPROTO']._serialized_start=2345- _globals['_FIELDDESCRIPTORPROTO']._serialized_end=3178- _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=2799- _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=3109- _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=3111- _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=3178- _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=3180- _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=3279- _globals['_ENUMDESCRIPTORPROTO']._serialized_start=3282- _globals['_ENUMDESCRIPTORPROTO']._serialized_end=3704- _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_start=3645- _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_end=3704- _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=3707- _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=3838- _globals['_SERVICEDESCRIPTORPROTO']._serialized_start=3841- _globals['_SERVICEDESCRIPTORPROTO']._serialized_end=4022- _globals['_METHODDESCRIPTORPROTO']._serialized_start=4025- _globals['_METHODDESCRIPTORPROTO']._serialized_end=4290- _globals['_FILEOPTIONS']._serialized_start=4293- _globals['_FILEOPTIONS']._serialized_end=5687- _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_start=5584- _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_end=5642- _globals['_MESSAGEOPTIONS']._serialized_start=5690- _globals['_MESSAGEOPTIONS']._serialized_end=6190- _globals['_FIELDOPTIONS']._serialized_start=6193- _globals['_FIELDOPTIONS']._serialized_end=7927- _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_start=7034- _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_end=7124- _globals['_FIELDOPTIONS_FEATURESUPPORT']._serialized_start=7127- _globals['_FIELDOPTIONS_FEATURESUPPORT']._serialized_end=7442- _globals['_FIELDOPTIONS_CTYPE']._serialized_start=7444- _globals['_FIELDOPTIONS_CTYPE']._serialized_end=7491- _globals['_FIELDOPTIONS_JSTYPE']._serialized_start=7493- _globals['_FIELDOPTIONS_JSTYPE']._serialized_end=7546- _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_start=7548- _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_end=7633- _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_start=7636- _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_end=7904- _globals['_ONEOFOPTIONS']._serialized_start=7930- _globals['_ONEOFOPTIONS']._serialized_end=8102- _globals['_ENUMOPTIONS']._serialized_start=8105- _globals['_ENUMOPTIONS']._serialized_end=8442- _globals['_ENUMVALUEOPTIONS']._serialized_start=8445- _globals['_ENUMVALUEOPTIONS']._serialized_end=8789- _globals['_SERVICEOPTIONS']._serialized_start=8792- _globals['_SERVICEOPTIONS']._serialized_end=9005- _globals['_METHODOPTIONS']._serialized_start=9008- _globals['_METHODOPTIONS']._serialized_end=9417- _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_start=9326- _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_end=9406- _globals['_UNINTERPRETEDOPTION']._serialized_start=9420- _globals['_UNINTERPRETEDOPTION']._serialized_end=9830- _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=9756- _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=9830- _globals['_FEATURESET']._serialized_start=9833- _globals['_FEATURESET']._serialized_end=11767- _globals['_FEATURESET_VISIBILITYFEATURE']._serialized_start=11012- _globals['_FEATURESET_VISIBILITYFEATURE']._serialized_end=11173- _globals['_FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY']._serialized_start=11034- _globals['_FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY']._serialized_end=11163- _globals['_FEATURESET_FIELDPRESENCE']._serialized_start=11175- _globals['_FEATURESET_FIELDPRESENCE']._serialized_end=11267- _globals['_FEATURESET_ENUMTYPE']._serialized_start=11269- _globals['_FEATURESET_ENUMTYPE']._serialized_end=11324- _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_start=11326- _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_end=11412- _globals['_FEATURESET_UTF8VALIDATION']._serialized_start=11414- _globals['_FEATURESET_UTF8VALIDATION']._serialized_end=11487
… 109 more lines (truncated)
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/duration.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/empty.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/field_mask.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -239,5 +239,12 @@ self.AddPath(prefix)- for name in node:- child_path = prefix + '.' + name- self.AddLeafNodes(child_path, node[name])+ return+ stack = [(prefix, node)]+ while stack:+ current_prefix, current_node = stack.pop()+ if not current_node:+ self.AddPath(current_prefix)+ continue+ for name in current_node:+ child_path = current_prefix + '.' + name+ stack.append((child_path, current_node[name])) @@ -264,37 +271,41 @@ """Merge all fields specified by a sub-tree from source to destination."""- source_descriptor = source.DESCRIPTOR- for name in node:- child = node[name]- field = source_descriptor.fields_by_name[name]- if field is None:- raise ValueError('Error: Can\'t find field {0} in message {1}.'.format(- name, source_descriptor.full_name))- if child:- # Sub-paths are only allowed for singular message fields.- if (field.is_repeated or- field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE):- raise ValueError('Error: Field {0} in message {1} is not a singular '- 'message field and cannot have sub-fields.'.format(- name, source_descriptor.full_name))- if source.HasField(name):- _MergeMessage(- child, getattr(source, name), getattr(destination, name),- replace_message, replace_repeated)- continue- if field.is_repeated:- if replace_repeated:- destination.ClearField(_StrConvert(name))- repeated_source = getattr(source, name)- repeated_destination = getattr(destination, name)- repeated_destination.MergeFrom(repeated_source)- else:- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:- if replace_message:- destination.ClearField(_StrConvert(name))- if source.HasField(name):- getattr(destination, name).MergeFrom(getattr(source, name))- elif not field.has_presence or source.HasField(name):- setattr(destination, name, getattr(source, name))+ stack = [(node, source, destination)]+ while stack:+ current_node, current_source, current_destination = stack.pop()+ source_descriptor = current_source.DESCRIPTOR+ for name in current_node:+ child = current_node[name]+ field = source_descriptor.fields_by_name[name]+ if field is None:+ raise ValueError('Error: Can\'t find field {0} in message {1}.'.format(+ name, source_descriptor.full_name))+ if child:+ # Sub-paths are only allowed for singular message fields.+ if (field.is_repeated or+ field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE):+ raise ValueError('Error: Field {0} in message {1} is not a singular '+ 'message field and cannot have sub-fields.'.format(+ name, source_descriptor.full_name))+ if current_source.HasField(name):+ stack.append(+ (child, getattr(current_source, name),+ getattr(current_destination, name)))+ continue+ if field.is_repeated:+ if replace_repeated:+ current_destination.ClearField(_StrConvert(name))+ repeated_source = getattr(current_source, name)+ repeated_destination = getattr(current_destination, name)+ repeated_destination.MergeFrom(repeated_source) else:- destination.ClearField(_StrConvert(name))+ if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:+ if replace_message:+ current_destination.ClearField(_StrConvert(name))+ if current_source.HasField(name):+ getattr(current_destination, name).MergeFrom(+ getattr(current_source, name))+ elif not field.has_presence or current_source.HasField(name):+ setattr(current_destination, name, getattr(current_source, name))+ else:+ current_destination.ClearField(_StrConvert(name)) @@ -303,10 +314,13 @@ """Adds the field paths descended from node to field_mask."""- if not node and prefix:- field_mask.paths.append(prefix)- return- for name in sorted(node):- if prefix:- child_path = prefix + '.' + name- else:- child_path = name- _AddFieldPaths(node[name], child_path, field_mask)+ stack = [(node, prefix)]+ while stack:+ current_node, current_prefix = stack.pop()+ if not current_node and current_prefix:+ field_mask.paths.append(current_prefix)+ continue+ for name in sorted(current_node, reverse=True):+ if current_prefix:+ child_path = current_prefix + '.' + name+ else:+ child_path = name+ stack.append((current_node[name], child_path))
--- +++ @@ -4,2 +4,2 @@ """-_PROTOBUF_INTERNAL_PYTHON_EDITION_DEFAULTS = b"\n\027\030\204\007\"\000*\020\010\001\020\002\030\002 \003(\0010\0028\002@\001\n\027\030\347\007\"\000*\020\010\002\020\001\030\001 \002(\0010\0018\002@\001\n\027\030\350\007\"\014\010\001\020\001\030\001 \002(\0010\001*\0048\002@\001\n\027\030\351\007\"\020\010\001\020\001\030\001 \002(\0010\0018\001@\002*\000 \346\007(\351\007"+_PROTOBUF_INTERNAL_PYTHON_EDITION_DEFAULTS = b"\n\027\030\204\007\"\000*\020\010\001\020\002\030\002 \003(\0010\0028\002@\001\n\027\030\347\007\"\000*\020\010\002\020\001\030\001 \002(\0010\0018\002@\001\n\027\030\350\007\"\014\010\001\020\001\030\001 \002(\0010\001*\0048\002@\001\n\027\030\351\007\"\020\010\001\020\001\030\001 \002(\0010\0018\001@\002*\000\n\027\030\217N\"\020\010\001\020\001\030\001 \002(\0010\0018\003@\002*\000 \346\007(\351\007"
--- +++ @@ -88,2 +88,4 @@ always_print_fields_with_no_presence=False,+ *,+ unquote_int64_if_possible=False, ):@@ -109,2 +111,5 @@ False, Unicode strings are returned unchanged.+ unquote_int64_if_possible: If True, unquote int64 fields for values that+ are safe to emit as numbers (all values smaller than 2^53 and a sparse+ set of values that are larger). @@ -118,2 +123,3 @@ always_print_fields_with_no_presence,+ unquote_int64_if_possible=unquote_int64_if_possible, )@@ -128,2 +134,4 @@ descriptor_pool=None,+ *,+ unquote_int64_if_possible=False, ):@@ -145,2 +153,5 @@ default.+ unquote_int64_if_possible: If True, unquote int64 fields for values that+ are safe to emit as numbers (all values smaller than 2^53 and a sparse+ set of values that are larger). @@ -154,2 +165,3 @@ always_print_fields_with_no_presence,+ unquote_int64_if_possible=unquote_int64_if_possible, )@@ -176,2 +188,4 @@ always_print_fields_with_no_presence=False,+ *,+ unquote_int64_if_possible=False, ):@@ -183,2 +197,3 @@ self.descriptor_pool = descriptor_pool+ self.unquote_int64_if_possible = unquote_int64_if_possible @@ -296,3 +311,6 @@ elif field.cpp_type in _INT64_TYPES:- return str(value)+ if self.unquote_int64_if_possible and float(value) == value:+ return value+ else:+ return str(value) elif field.cpp_type in _FLOAT_TYPES:@@ -508,2 +526,6 @@ """+ # Increment recursion depth at message entry. The max_recursion_depth limit+ # is exclusive: a depth value equal to max_recursion_depth will trigger an+ # error. For example, with max_recursion_depth=5, nesting up to depth 4 is+ # allowed, but attempting depth 5 raises ParseError. self.recursion_depth += 1@@ -728,8 +750,7 @@ elif full_name in _WKTJSONMETHODS:- methodcaller(- _WKTJSONMETHODS[full_name][1],- value['value'],- sub_message,- '{0}.value'.format(path),- )(self)+ # For well-known types (including nested Any), use ConvertMessage+ # to ensure recursion depth is properly tracked+ self.ConvertMessage(+ value['value'], sub_message, '{0}.value'.format(path)+ ) else:
--- +++ @@ -30,4 +30,4 @@ OSS_MAJOR = 7-OSS_MINOR = 34-OSS_PATCH = 2+OSS_MINOR = 35+OSS_PATCH = 1 OSS_SUFFIX = ''
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/source_context.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/struct.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -635,3 +635,4 @@ descriptor_pool=None,- allow_unknown_field=False):+ allow_unknown_field=False,+ max_recursion_depth=None): """Parses a text representation of a protocol message into a message.@@ -673,2 +674,5 @@ errors (e.g. spelling error on field name)+ max_recursion_depth: Optional maximum recursion depth of a text proto+ message to be deserialized. Text proto messages over this depth will+ fail to parse. ``None`` keeps the historical unbounded behavior. @@ -685,3 +689,4 @@ descriptor_pool=descriptor_pool,- allow_unknown_field=allow_unknown_field)+ allow_unknown_field=allow_unknown_field,+ max_recursion_depth=max_recursion_depth) @@ -693,3 +698,4 @@ descriptor_pool=None,- allow_unknown_field=False):+ allow_unknown_field=False,+ max_recursion_depth=None): """Parses a text representation of a protocol message into a message.@@ -710,2 +716,5 @@ errors (e.g. spelling error on field name)+ max_recursion_depth: Optional maximum recursion depth of a text proto+ message to be deserialized. Text proto messages over this depth will+ fail to parse. ``None`` keeps the historical unbounded behavior. @@ -723,3 +732,4 @@ descriptor_pool=descriptor_pool,- allow_unknown_field=allow_unknown_field)+ allow_unknown_field=allow_unknown_field,+ max_recursion_depth=max_recursion_depth) @@ -731,3 +741,4 @@ descriptor_pool=None,- allow_unknown_field=False):+ allow_unknown_field=False,+ max_recursion_depth=None): """Parses a text representation of a protocol message into a message.@@ -746,2 +757,5 @@ errors (e.g. spelling error on field name)+ max_recursion_depth: Optional maximum recursion depth of a text proto+ message to be deserialized. Text proto messages over this depth will+ fail to parse. ``None`` keeps the historical unbounded behavior. @@ -756,3 +770,4 @@ descriptor_pool=descriptor_pool,- allow_unknown_field=allow_unknown_field)+ allow_unknown_field=allow_unknown_field,+ max_recursion_depth=max_recursion_depth) return parser.ParseLines(lines, message)@@ -765,3 +780,4 @@ descriptor_pool=None,- allow_unknown_field=False):+ allow_unknown_field=False,+ max_recursion_depth=None): """Parses a text representation of a protocol message into a message.@@ -780,2 +796,5 @@ errors (e.g. spelling error on field name)+ max_recursion_depth: Optional maximum recursion depth of a text proto+ message to be deserialized. Text proto messages over this depth will+ fail to parse. ``None`` keeps the historical unbounded behavior. @@ -790,3 +809,4 @@ descriptor_pool=descriptor_pool,- allow_unknown_field=allow_unknown_field)+ allow_unknown_field=allow_unknown_field,+ max_recursion_depth=max_recursion_depth) return parser.MergeLines(lines, message)@@ -801,3 +821,4 @@ descriptor_pool=None,- allow_unknown_field=False):+ allow_unknown_field=False,+ max_recursion_depth=None): self.allow_unknown_extension = allow_unknown_extension@@ -806,2 +827,4 @@ self.allow_unknown_field = allow_unknown_field+ self.max_recursion_depth = max_recursion_depth+ self.recursion_depth = 0 @@ -839,4 +862,34 @@ self.root_type = message.DESCRIPTOR.full_name+ self.recursion_depth += 1+ if (+ self.max_recursion_depth is not None+ and self.recursion_depth > self.max_recursion_depth+ ):+ raise ParseError(+ 'Message too deep. Max recursion depth is {0}'.format(+ self.max_recursion_depth+ )+ ) while not tokenizer.AtEnd(): self._MergeField(tokenizer, message)+ self.recursion_depth -= 1++ def _MergeMessage(self, tokenizer, message, end_token):+ self.recursion_depth += 1+ if (+ self.max_recursion_depth is not None+ and self.recursion_depth > self.max_recursion_depth+ ):+ raise ParseError(+ 'Message too deep. Max recursion depth is {0}'.format(+ self.max_recursion_depth+ )+ )+ while not tokenizer.TryConsume(end_token):+ if tokenizer.AtEnd():+ raise tokenizer.ParseErrorPreviousToken(+ 'Expected "%s".' % (end_token,)+ )+ self._MergeField(tokenizer, message)+ self.recursion_depth -= 1 @@ -875,7 +928,5 @@ packed_type_name)- while not tokenizer.TryConsume(expanded_any_end_token):- if tokenizer.AtEnd():- raise tokenizer.ParseErrorPreviousToken('Expected "%s".' %- (expanded_any_end_token,))- self._MergeField(tokenizer, expanded_any_sub_message)+ self._MergeMessage(+ tokenizer, expanded_any_sub_message, expanded_any_end_token+ ) deterministic = False@@ -1097,6 +1148,3 @@ - while not tokenizer.TryConsume(end_token):- if tokenizer.AtEnd():- raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token,))- self._MergeField(tokenizer, sub_message)+ self._MergeMessage(tokenizer, sub_message, end_token)
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/timestamp.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/type.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/wrappers.proto-# Protobuf Python Version: 7.34.2+# Protobuf Python Version: 7.35.1 """Generated protocol buffer code."""@@ -14,4 +14,4 @@ 7,- 34,- 2,+ 35,+ 1, '',
pydantic pypi YANK ×2BURST ×4
2.12.1
2.12.2
2.12.3
2.12.4
2.12.5
1.10.25
1.10.26
2.13.0
2.13.1
2.13.2
2.13.3
2.13.4
YANK
1.10.3 marked yanked (still downloadable)
high · registry-verified · 2022-12-29 · 3y ago
YANK
2.12.1 marked yanked (still downloadable)
high · registry-verified · 2025-10-13 · 9mo ago
BURST
2 releases in 50m: 0.2, 0.2.1
info · registry-verified · 2017-06-07 · 9y ago
BURST
3 releases in 56m: 1.6.2, 1.7.4, 1.8.2
info · registry-verified · 2021-05-11 · 5y ago
BURST
2 releases in 4m: 1.10.11, 2.0.1
info · registry-verified · 2023-07-04 · 3y ago
BURST
2 releases in 59m: 2.11.8, 1.10.23
info · registry-verified · 2025-09-13 · 10mo ago
release diff 2.13.3 → 2.13.4
+0 added · -0 removed · ~10 modified
--- +++ @@ -842,4 +842,13 @@ if cls.__pydantic_root_model__:- # FIXME: should the common field metadata be used here?- inner_schema, _ = self._common_field_schema('root', fields['root'], decorators)+ inner_schema, metadata = self._common_field_schema('root', fields['root'], decorators)+ if cls.__doc__ and metadata.get('pydantic_js_updates', {}).get('description'):+ # This is a bit of a leaky abstraction, but as the model docstring takes priority+ # over the root field's description, we need to override it here. This can't be done+ # in the JSON Schema generation logic because the metadata's `pydantic_js_updates` are+ # applied last, and overrides any value previously set (so the description set from the+ # docstring in `GenerateJsonSchema._update_class_schema()` is overridden):+ update_core_metadata(+ metadata, pydantic_js_updates={'description': inspect.cleandoc(cls.__doc__)}+ )+ inner_schema = apply_model_validators(inner_schema, model_validators, 'inner')@@ -854,2 +863,3 @@ ref=model_ref,+ metadata=metadata, )
--- +++ @@ -1638,3 +1638,2 @@ from .main import BaseModel- from .root_model import RootModel @@ -1666,4 +1665,2 @@ json_schema.setdefault('description', inspect.cleandoc(docstring))- elif issubclass(cls, RootModel) and (root_description := cls.__pydantic_fields__['root'].description):- json_schema.setdefault('description', root_description)
--- +++ @@ -10,3 +10,3 @@ -VERSION = '2.13.3'+VERSION = '2.13.4' """The version of Pydantic.@@ -21,3 +21,3 @@ # Keep this in sync with the version constraint in the `pyproject.toml` dependencies:-_COMPATIBLE_PYDANTIC_CORE_VERSION = '2.46.3'+_COMPATIBLE_PYDANTIC_CORE_VERSION = '2.46.4'
--- +++ @@ -49,3 +49,3 @@ # Keep this in sync with the version in the `check_pydantic_core_version()` function:- 'pydantic-core==2.46.3',+ 'pydantic-core==2.46.4', 'typing-inspection>=0.4.2',
--- +++ @@ -5393,2 +5393,34 @@ +def test_root_model_annotated_root_type_parameterized() -> None:+ """https://github.com/pydantic/pydantic/issues/13123"""++ MyType = Annotated[str, Field(examples=['hello'], description='desc', deprecated=True)]++ class MyModel(RootModel[MyType]):+ pass++ assert MyModel.model_json_schema() == {+ 'deprecated': True,+ 'description': 'desc',+ 'examples': ['hello'],+ 'title': 'MyModel',+ 'type': 'string',+ }+++def test_root_model_annotated_root_type() -> None:+ """https://github.com/pydantic/pydantic/issues/13123"""++ class MyModel(RootModel):+ root: Annotated[str, Field(examples=['hello'], description='desc', deprecated=True)]++ assert MyModel.model_json_schema() == {+ 'deprecated': True,+ 'description': 'desc',+ 'examples': ['hello'],+ 'title': 'MyModel',+ 'type': 'string',+ }++ def test_type_adapter_json_schemas_title_description():
--- +++ @@ -2012,7 +2012,3 @@ def test_class_kwargs_custom_config():- if platform.python_implementation() == 'PyPy':- msg = r"__init_subclass__\(\) got an unexpected keyword argument 'some_config'"- else:- msg = r'__init_subclass__\(\) takes no keyword arguments'- with pytest.raises(TypeError, match=msg):+ with pytest.raises(TypeError, match=r'__init_subclass__\(\) takes no keyword arguments'):
--- +++ @@ -4,2 +4,3 @@ import pytest+import typing_extensions from annotated_types import Ge@@ -55,3 +56,7 @@ [email protected](reason="PEP 661 sentinels aren't picklable yet in the experimental typing-extensions implementation")[email protected](+ # Unreleased typing-extensions has the final sentinel implementation with pickle support:+ condition=not hasattr(typing_extensions, 'sentinel'),+ reason="PEP 661 sentinels aren't picklable yet in the experimental typing-extensions implementation",+) def test_missing_sentinel_pickle() -> None:
--- +++ @@ -8,3 +8,3 @@ from textwrap import dedent-from typing import Optional+from typing import TYPE_CHECKING, Optional @@ -17,6 +17,14 @@ -try:+IS_PYPY = sys.implementation.name == 'pypy' and sys.version_info >= (3, 11)++if TYPE_CHECKING: import cloudpickle-except ImportError:- cloudpickle = None+else:+ if not IS_PYPY:+ try:+ import cloudpickle+ except ImportError:+ cloudpickle = None+ else:+ cloudpickle = None @@ -24,6 +32,12 @@ -pytestmark = pytest.mark.skipif(cloudpickle is None, reason='cloudpickle is not installed')-+pytestmark = pytest.mark.skipif(+ cloudpickle is None,+ reason='cloudpickle is not installed, or tests are running with PyPy (https://github.com/cloudpipe/cloudpickle/issues/592).',+)++# Note: this xfail marker was used when cloudpickle was partially compatible with PyPy. Since PyPy 7.3.22, it isn't compatible+# at all (importing it fails), so all tests are skipped as per the module's `pytestmark`. We keep the xfail marker if this ever+# changes: cloudpickle_pypy_xfail = pytest.mark.xfail(- condition=sys.implementation.name == 'pypy' and sys.version_info >= (3, 11),+ condition=IS_PYPY, reason='Cloudpickle issue: - possibly https://github.com/cloudpipe/cloudpickle/issues/557',@@ -101,3 +115,6 @@ (ImportableModel, True),- # Locally-defined model can only be pickled with cloudpickle.+ # Locally-defined model can only be pickle+ # # Note: this xfail marker was used when cloudpickle was partially compatible with PyPy. Since PyPy 7.3.22, it is completelyisn't compatible+ # # at all (importing it fails), so all tests are skipped as per the module's `pytestmark`. We keep the xfail marker if this ever+ # # changes:d with cloudpickle. pytest.param(model_factory(), True, marks=cloudpickle_pypy_xfail),
pydantic-core pypi YANK ×3BURST
2.41.4
2.41.5
2.42.0
2.43.0
2.44.0
2.45.0
2.46.0
2.46.1
2.46.2
2.46.3
2.46.4
2.47.0
YANK
2.41.3 marked yanked (still downloadable)
high · registry-verified · 2025-10-13 · 9mo ago
YANK
2.43.0 marked yanked (still downloadable)
high · registry-verified · 2026-03-27 · 3mo ago
YANK
2.44.0 marked yanked (still downloadable)
high · registry-verified · 2026-03-27 · 3mo ago
BURST
2 releases in 44m: 2.6.2, 2.6.3
info · registry-verified · 2023-08-23 · 2y ago
release diff 2.46.4 → 2.47.0
+0 added · -1 removed · ~59 modified
+16 more files not shown
--- +++ @@ -2,3 +2,3 @@ name = "pydantic-core"-version = "2.46.4"+version = "2.47.0" edition = "2024"
--- +++ @@ -1,3 +1,3 @@ [build-system]-requires = ['maturin>=1.10,<2']+requires = ['maturin>=1.13.3,<2'] build-backend = 'maturin'@@ -7,3 +7,3 @@ description = "Core functionality for Pydantic validation and serialization"-requires-python = '>=3.9'+requires-python = '>=3.10' license = 'MIT'@@ -23,3 +23,2 @@ 'Programming Language :: Python :: 3 :: Only',- 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10',@@ -98,3 +97,3 @@ line-length = 120-target-version = 'py39'+target-version = 'py310' @@ -118,8 +117,3 @@ log_format = '%(name)s %(levelname)s: %(message)s'-filterwarnings = [- 'error',- # Python 3.9 and below allowed truncation of float to integers in some- # cases, by not making this an error we can test for this behaviour- 'ignore:(.+)Implicit conversion to integers using __int__ is deprecated',-]+filterwarnings = ['error'] timeout = 30
--- +++ @@ -9,3 +9,3 @@ import warnings-from collections.abc import Generator, Hashable, Mapping+from collections.abc import Callable, Generator, Hashable, Mapping from datetime import date, datetime, time, timedelta@@ -13,3 +13,3 @@ from re import Pattern-from typing import TYPE_CHECKING, Any, Callable, Literal, Union+from typing import TYPE_CHECKING, Any, Literal @@ -23,3 +23,5 @@ if sys.version_info < (3, 11):- from typing_extensions import Protocol, Required, TypeAlias+ from typing import TypeAlias++ from typing_extensions import Protocol, Required else:@@ -39,3 +41,3 @@ -ExtraBehavior = Literal['allow', 'forbid', 'ignore']+ExtraBehavior: TypeAlias = Literal['allow', 'forbid', 'ignore'] @@ -119,3 +121,3 @@ regex_engine: Literal['rust-regex', 'python-re'] # default: 'rust-regex'- cache_strings: Union[bool, Literal['all', 'keys', 'none']] # default: 'True'+ cache_strings: bool | Literal['all', 'keys', 'none'] # default: 'True' validate_by_alias: bool # default: True@@ -243,3 +245,3 @@ -ExpectedSerializationTypes = Literal[+ExpectedSerializationTypes: TypeAlias = Literal[ 'none',@@ -284,17 +286,17 @@ # (input_value: Any, /) -> Any-GeneralPlainNoInfoSerializerFunction = Callable[[Any], Any]+GeneralPlainNoInfoSerializerFunction: TypeAlias = Callable[[Any], Any] # (input_value: Any, info: FieldSerializationInfo, /) -> Any-GeneralPlainInfoSerializerFunction = Callable[[Any, SerializationInfo[Any]], Any]+GeneralPlainInfoSerializerFunction: TypeAlias = Callable[[Any, SerializationInfo[Any]], Any] # (model: Any, input_value: Any, /) -> Any-FieldPlainNoInfoSerializerFunction = Callable[[Any, Any], Any]+FieldPlainNoInfoSerializerFunction: TypeAlias = Callable[[Any, Any], Any] # (model: Any, input_value: Any, info: FieldSerializationInfo, /) -> Any-FieldPlainInfoSerializerFunction = Callable[[Any, Any, FieldSerializationInfo[Any]], Any]-SerializerFunction = Union[- GeneralPlainNoInfoSerializerFunction,- GeneralPlainInfoSerializerFunction,- FieldPlainNoInfoSerializerFunction,- FieldPlainInfoSerializerFunction,-]--WhenUsed = Literal['always', 'unless-none', 'json', 'json-unless-none']+FieldPlainInfoSerializerFunction: TypeAlias = Callable[[Any, Any, FieldSerializationInfo[Any]], Any]+SerializerFunction: TypeAlias = (+ GeneralPlainNoInfoSerializerFunction+ | GeneralPlainInfoSerializerFunction+ | FieldPlainNoInfoSerializerFunction+ | FieldPlainInfoSerializerFunction+)++WhenUsed: TypeAlias = Literal['always', 'unless-none', 'json', 'json-unless-none'] """@@ -355,15 +357,19 @@ # (input_value: Any, serializer: SerializerFunctionWrapHandler, /) -> Any-GeneralWrapNoInfoSerializerFunction = Callable[[Any, SerializerFunctionWrapHandler], Any]+GeneralWrapNoInfoSerializerFunction: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler], Any] # (input_value: Any, serializer: SerializerFunctionWrapHandler, info: SerializationInfo, /) -> Any-GeneralWrapInfoSerializerFunction = Callable[[Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any]+GeneralWrapInfoSerializerFunction: TypeAlias = Callable[+ [Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any+] # (model: Any, input_value: Any, serializer: SerializerFunctionWrapHandler, /) -> Any-FieldWrapNoInfoSerializerFunction = Callable[[Any, Any, SerializerFunctionWrapHandler], Any]+FieldWrapNoInfoSerializerFunction: TypeAlias = Callable[[Any, Any, SerializerFunctionWrapHandler], Any] # (model: Any, input_value: Any, serializer: SerializerFunctionWrapHandler, info: FieldSerializationInfo, /) -> Any-FieldWrapInfoSerializerFunction = Callable[[Any, Any, SerializerFunctionWrapHandler, FieldSerializationInfo[Any]], Any]-WrapSerializerFunction = Union[- GeneralWrapNoInfoSerializerFunction,- GeneralWrapInfoSerializerFunction,- FieldWrapNoInfoSerializerFunction,- FieldWrapInfoSerializerFunction,+FieldWrapInfoSerializerFunction: TypeAlias = Callable[+ [Any, Any, SerializerFunctionWrapHandler, FieldSerializationInfo[Any]], Any ]+WrapSerializerFunction: TypeAlias = (+ GeneralWrapNoInfoSerializerFunction+ | GeneralWrapInfoSerializerFunction+ | FieldWrapNoInfoSerializerFunction+ | FieldWrapInfoSerializerFunction+) @@ -471,10 +477,10 @@ -SerSchema = Union[- SimpleSerSchema,- PlainSerializerFunctionSerSchema,- WrapSerializerFunctionSerSchema,- FormatSerSchema,- ToStringSerSchema,- ModelSerSchema,-]+SerSchema: TypeAlias = (+ SimpleSerSchema+ | PlainSerializerFunctionSerSchema+ | WrapSerializerFunctionSerSchema+ | FormatSerSchema+ | ToStringSerSchema+ | ModelSerSchema+) @@ -874,3 +880,3 @@ type: Required[Literal['str']]- pattern: Union[str, Pattern[str]]+ pattern: str | Pattern[str] max_length: int@@ -1074,3 +1080,3 @@ gt: time- tz_constraint: Union[Literal['aware', 'naive'], int]+ tz_constraint: Literal['aware', 'naive'] | int microseconds_precision: Literal['truncate', 'error']@@ -1141,3 +1147,3 @@ now_op: Literal['past', 'future']- tz_constraint: Union[Literal['aware', 'naive'], int]+ tz_constraint: Literal['aware', 'naive'] | int # defaults to current local utc offset from `time.localtime().tm_gmtoff`@@ -1544,3 +1550,3 @@ -IncExSeqOrElseSerSchema = Union[IncExSeqSerSchema, SerSchema]+IncExSeqOrElseSerSchema: TypeAlias = IncExSeqSerSchema | SerSchema @@ -1937,3 +1943,3 @@ -IncExDict = set[Union[int, str]]+IncExDict: TypeAlias = set[int | str] @@ -1950,3 +1956,3 @@ -IncExDictOrElseSerSchema = Union[IncExDictSerSchema, SerSchema]+IncExDictOrElseSerSchema: TypeAlias = IncExDictSerSchema | SerSchema @@ -2017,3 +2023,3 @@ # (input_value: Any, /) -> Any-NoInfoValidatorFunction = Callable[[Any], Any]+NoInfoValidatorFunction: TypeAlias = Callable[[Any], Any] @@ -2026,3 +2032,3 @@ # (input_value: Any, info: ValidationInfo, /) -> Any-WithInfoValidatorFunction = Callable[[Any, ValidationInfo[Any]], Any]+WithInfoValidatorFunction: TypeAlias = Callable[[Any, ValidationInfo[Any]], Any] @@ -2035,3 +2041,3 @@ -ValidationFunction = Union[NoInfoValidatorFunctionSchema, WithInfoValidatorFunctionSchema]+ValidationFunction: TypeAlias = NoInfoValidatorFunctionSchema | WithInfoValidatorFunctionSchema @@ -2264,3 +2270,3 @@ # (input_value: Any, validator: ValidatorFunctionWrapHandler, /) -> Any-NoInfoWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler], Any]+NoInfoWrapValidatorFunction: TypeAlias = Callable[[Any, ValidatorFunctionWrapHandler], Any] @@ -2273,3 +2279,3 @@ # (input_value: Any, validator: ValidatorFunctionWrapHandler, info: ValidationInfo, /) -> Any-WithInfoWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler, ValidationInfo[Any]], Any]+WithInfoWrapValidatorFunction: TypeAlias = Callable[[Any, ValidatorFunctionWrapHandler, ValidationInfo[Any]], Any] @@ -2282,3 +2288,3 @@ -WrapValidatorFunction = Union[NoInfoWrapValidatorFunctionSchema, WithInfoWrapValidatorFunctionSchema]+WrapValidatorFunction: TypeAlias = NoInfoWrapValidatorFunctionSchema | WithInfoWrapValidatorFunctionSchema @@ -2505,3 +2511,3 @@ default: Any- default_factory: Union[Callable[[], Any], Callable[[dict[str, Any]], Any]]+ default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] default_factory_takes_data: bool@@ -2519,3 +2525,3 @@ default: Any = PydanticUndefined,- default_factory: Union[Callable[[], Any], Callable[[dict[str, Any]], Any], None] = None,+ default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None = None, default_factory_takes_data: bool | None = None,@@ -2613,3 +2619,3 @@ type: Required[Literal['union']]- choices: Required[list[Union[CoreSchema, tuple[CoreSchema, str]]]]+ choices: Required[list[CoreSchema | tuple[CoreSchema, str]]] # default true, whether to automatically collapse unions with one element to the inner validator@@ -2618,3 +2624,3 @@ custom_error_message: str- custom_error_context: dict[str, Union[str, int, float]]+ custom_error_context: dict[str, str | int | float] mode: Literal['smart', 'left_to_right'] # default: 'smart'@@ -2680,6 +2686,6 @@ choices: Required[dict[Hashable, CoreSchema]]- discriminator: Required[Union[str, list[Union[str, int]], list[list[Union[str, int]]], Callable[[Any], Hashable]]]+ discriminator: Required[str | list[str | int] | list[list[str | int]] | Callable[[Any], Hashable]] custom_error_type: str custom_error_message: str- custom_error_context: dict[str, Union[str, int, float]]+ custom_error_context: dict[str, str | int | float] strict: bool@@ -2941,3 +2947,3 @@ required: bool- validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+ validation_alias: str | list[str | int] | list[list[str | int]] serialization_alias: str@@ -3072,3 +3078,3 @@ schema: Required[CoreSchema]- validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+ validation_alias: str | list[str | int] | list[list[str | int]] serialization_alias: str@@ -3303,3 +3309,3 @@ frozen: bool # default: False- validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+ validation_alias: str | list[str | int] | list[list[str | int]] serialization_alias: str@@ -3511,3 +3517,3 @@ mode: Literal['positional_only', 'positional_or_keyword', 'keyword_only'] # default positional_or_keyword- alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+ alias: str | list[str | int] | list[list[str | int]] @@ -3627,3 +3633,3 @@ ] # default positional_or_keyword- alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+ alias: str | list[str | int] | list[list[str | int]] @@ -3800,3 +3806,3 @@ custom_error_message: str- custom_error_context: dict[str, Union[str, int, float]]+ custom_error_context: dict[str, str | int | float] ref: str@@ -4121,56 +4127,56 @@ if not MYPY:- CoreSchema = Union[- InvalidSchema,- AnySchema,- NoneSchema,- BoolSchema,- IntSchema,- FloatSchema,- DecimalSchema,- StringSchema,- BytesSchema,- DateSchema,- TimeSchema,- DatetimeSchema,- TimedeltaSchema,- LiteralSchema,- MissingSentinelSchema,- EnumSchema,
… 107 more lines (truncated)
--- +++ @@ -1,2 +1,6853 @@ # this file is auto-generated by generate_self_schema.py, DO NOT edit manually-self_schema = {'type': 'definitions', 'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'definitions': [{'type': 'tagged-union', 'choices': {'invalid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['invalid']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['any']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['bool']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['int']}, 'required': True}, 'multiple_of': {'schema': {'type': 'int'}, 'required': False}, 'le': {'schema': {'type': 'int'}, 'required': False}, 'ge': {'schema': {'type': 'int'}, 'required': False}, 'lt': {'schema': {'type': 'int'}, 'required': False}, 'gt': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['float']}, 'required': True}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'multiple_of': {'schema': {'type': 'float'}, 'required': False}, 'le': {'schema': {'type': 'float'}, 'required': False}, 'ge': {'schema': {'type': 'float'}, 'required': False}, 'lt': {'schema': {'type': 'float'}, 'required': False}, 'gt': {'schema': {'type': 'float'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'decimal': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['decimal']}, 'required': True}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'multiple_of': {'schema': {'type': 'decimal'}, 'required': False}, 'le': {'schema': {'type': 'decimal'}, 'required': False}, 'ge': {'schema': {'type': 'decimal'}, 'required': False}, 'lt': {'schema': {'type': 'decimal'}, 'required': False}, 'gt': {'schema': {'type': 'decimal'}, 'required': False}, 'max_digits': {'schema': {'type': 'int'}, 'required': False}, 'decimal_places': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['str']}, 'required': True}, 'pattern': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'any'}]}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['bytes']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['date']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'date'}, 'required': False}, 'ge': {'schema': {'type': 'date'}, 'required': False}, 'lt': {'schema': {'type': 'date'}, 'required': False}, 'gt': {'schema': {'type': 'date'}, 'required': False}, 'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False}, 'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['time']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'time'}, 'required': False}, 'ge': {'schema': {'type': 'time'}, 'required': False}, 'lt': {'schema': {'type': 'time'}, 'required': False}, 'gt': {'schema': {'type': 'time'}, 'required': False}, 'tz_constraint': {'schema': {'type': 'union', 'choices': [{'type': 'literal', 'expected': ['aware', 'naive']}, {'type': 'int'}]}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['datetime']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'datetime'}, 'required': False}, 'ge': {'schema': {'type': 'datetime'}, 'required': False}, 'lt': {'schema': {'type': 'datetime'}, 'required': False}, 'gt': {'schema': {'type': 'datetime'}, 'required': False}, 'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False}, 'tz_constraint': {'schema': {'type': 'union', 'choices': [{'type': 'literal', 'expected': ['aware', 'naive']}, {'type': 'int'}]}, 'required': False}, 'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['timedelta']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'timedelta'}, 'required': False}, 'ge': {'schema': {'type': 'timedelta'}, 'required': False}, 'lt': {'schema': {'type': 'timedelta'}, 'required': False}, 'gt': {'schema': {'type': 'timedelta'}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'literal': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['literal']}, 'required': True}, 'expected': {'schema': {'type': 'list', 'items_schema': {'type': 'any'}}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'enum': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['enum']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'members': {'schema': {'type': 'list', 'items_schema': {'type': 'any'}}, 'required': True}, 'sub_type': {'schema': {'type': 'literal', 'expected': ['str', 'int', 'float']}, 'required': False}, 'missing': {'schema': {'type': 'callable'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'is-instance': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['is-instance']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'cls_repr': {'schema': {'type': 'str'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'is-subclass': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['is-subclass']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'cls_repr': {'schema': {'type': 'str'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'callable': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['callable']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['list']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['tuple']}, 'required': True}, 'items_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'variadic_item_index': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['set']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['frozenset']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['generator']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dict']}, 'required': True}, 'keys_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'values_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-dict']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'union', 'choices': [{'type': 'int'}, {'type': 'str'}]}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'union', 'choices': [{'type': 'int'}, {'type': 'str'}]}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-after': {'type': 'typed-dict', 'fields': {'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'type': {'schema': {'type': 'literal', 'expected': ['function-after']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-before': {'type': 'typed-dict', 'fields': {'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'type': {'schema': {'type': 'literal', 'expected': ['function-before']}, 'required': True}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'default': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['default']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'default': {'schema': {'type': 'any'}, 'required': False}, 'default_factory': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}]}, 'required': False}, 'default_factory_takes_data': {'schema': {'type': 'bool'}, 'required': False}, 'on_error': {'schema': {'type': 'literal', 'expected': ['raise', 'omit', 'default']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'nullable': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['nullable']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'union': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['union']}, 'required': True}, 'choices': {'schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'definition-ref', 'schema_ref': 'root-schema'}, {'type': 'tuple', 'items_schema': [{'type': 'definition-ref', 'schema_ref': 'root-schema'}, {'type': 'str'}]}]}}, 'required': True}, 'auto_collapse': {'schema': {'type': 'bool'}, 'required': False}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'mode': {'schema': {'type': 'literal', 'expected': ['smart', 'left_to_right']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'tagged-union': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['tagged-union']}, 'required': True}, 'choices': {'schema': {'type': 'dict', 'keys_schema': {'type': 'any'}, 'values_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'discriminator': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}, {'type': 'callable'}]}, 'required': True}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'chain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['chain']}, 'required': True}, 'steps': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'lax-or-strict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['lax-or-strict']}, 'required': True}, 'lax_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'json-or-python': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['json-or-python']}, 'required': True}, 'json_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'python_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'typed-dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['typed-dict']}, 'required': True}, 'fields': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['typed-dict-field']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'required': {'schema': {'type': 'bool'}, 'required': False}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': False}, 'cls_name': {'schema': {'type': 'str'}, 'required': False}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extras_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'total': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model-fields': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model-fields']}, 'required': True}, 'fields': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model-field']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'model_name': {'schema': {'type': 'str'}, 'required': False}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extras_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extras_keys_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'generic_origin': {'schema': {'type': 'any'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'custom_init': {'schema': {'type': 'bool'}, 'required': False}, 'root_model': {'schema': {'type': 'bool'}, 'required': False}, 'post_init': {'schema': {'type': 'str'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dataclass-args': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass-args']}, 'required': True}, 'dataclass_name': {'schema': {'type': 'str'}, 'required': True}, 'fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass-field']}, 'required': True}, 'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'kw_only': {'schema': {'type': 'bool'}, 'required': False}, 'init': {'schema': {'type': 'bool'}, 'required': False}, 'init_only': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'collect_init_only': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dataclass': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'generic_origin': {'schema': {'type': 'any'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'fields': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': True}, 'cls_name': {'schema': {'type': 'str'}, 'required': False}, 'post_init': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'slots': {'schema': {'type': 'bool'}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'arguments': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['arguments']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'mode': {'schema': {'type': 'literal', 'expected': ['positional_only', 'positional_or_keyword', 'keyword_only']}, 'required': False}, 'alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'var_args_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'var_kwargs_mode': {'schema': {'type': 'literal', 'expected': ['uniform', 'unpacked-typed-dict']}, 'required': False}, 'var_kwargs_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'arguments-v3': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['arguments-v3']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'mode': {'schema': {'type': 'literal', 'expected': ['positional_only', 'positional_or_keyword', 'keyword_only', 'var_args', 'var_kwargs_uniform', 'var_kwargs_unpacked_typed_dict']}, 'required': False}, 'alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['forbid', 'ignore']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'call': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['call']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'function_name': {'schema': {'type': 'str'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'custom-error': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['custom-error']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': True}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['json']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['url']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'allowed_schemes': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': False}, 'host_required': {'schema': {'type': 'bool'}, 'required': False}, 'default_host': {'schema': {'type': 'str'}, 'required': False}, 'default_port': {'schema': {'type': 'int'}, 'required': False}, 'default_path': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['multi-host-url']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'allowed_schemes': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': False}, 'host_required': {'schema': {'type': 'bool'}, 'required': False}, 'default_host': {'schema': {'type': 'str'}, 'required': False}, 'default_port': {'schema': {'type': 'int'}, 'required': False}, 'default_path': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'definitions': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['definitions']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'definitions': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'definition-ref': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['definition-ref']}, 'required': True}, 'schema_ref': {'schema': {'type': 'str'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['uuid']}, 'required': True}, 'version': {'schema': {'type': 'literal', 'expected': [1, 3, 4, 5, 7]}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'complex': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['complex']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'discriminator': 'type', 'ref': 'root-schema'}, {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}, 'ref': 'ser-schema'}]}+self_schema = {+ 'type': 'definitions',+ 'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'},+ 'definitions': [+ {+ 'type': 'tagged-union',+ 'choices': {+ 'invalid': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['invalid']}, 'required': True},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'any': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['any']}, 'required': True},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'none': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['none']}, 'required': True},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'bool': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['bool']}, 'required': True},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'int': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['int']}, 'required': True},+ 'multiple_of': {'schema': {'type': 'int'}, 'required': False},+ 'le': {'schema': {'type': 'int'}, 'required': False},+ 'ge': {'schema': {'type': 'int'}, 'required': False},+ 'lt': {'schema': {'type': 'int'}, 'required': False},+ 'gt': {'schema': {'type': 'int'}, 'required': False},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'float': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['float']}, 'required': True},+ 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False},+ 'multiple_of': {'schema': {'type': 'float'}, 'required': False},+ 'le': {'schema': {'type': 'float'}, 'required': False},+ 'ge': {'schema': {'type': 'float'}, 'required': False},+ 'lt': {'schema': {'type': 'float'}, 'required': False},+ 'gt': {'schema': {'type': 'float'}, 'required': False},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'decimal': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['decimal']}, 'required': True},+ 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False},+ 'multiple_of': {'schema': {'type': 'decimal'}, 'required': False},+ 'le': {'schema': {'type': 'decimal'}, 'required': False},+ 'ge': {'schema': {'type': 'decimal'}, 'required': False},+ 'lt': {'schema': {'type': 'decimal'}, 'required': False},+ 'gt': {'schema': {'type': 'decimal'}, 'required': False},+ 'max_digits': {'schema': {'type': 'int'}, 'required': False},+ 'decimal_places': {'schema': {'type': 'int'}, 'required': False},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'str': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['str']}, 'required': True},+ 'pattern': {+ 'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'any'}]},+ 'required': False,+ },+ 'max_length': {'schema': {'type': 'int'}, 'required': False},+ 'min_length': {'schema': {'type': 'int'}, 'required': False},+ 'strip_whitespace': {'schema': {'type': 'bool'}, 'required': False},+ 'to_lower': {'schema': {'type': 'bool'}, 'required': False},+ 'to_upper': {'schema': {'type': 'bool'}, 'required': False},+ 'regex_engine': {+ 'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']},+ 'required': False,+ },+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'bytes': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['bytes']}, 'required': True},+ 'max_length': {'schema': {'type': 'int'}, 'required': False},+ 'min_length': {'schema': {'type': 'int'}, 'required': False},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},+ },+ 'required': False,+ },+ 'serialization': {+ 'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+ 'required': False,+ },+ },+ 'extra_behavior': 'forbid',+ },+ 'date': {+ 'type': 'typed-dict',+ 'fields': {+ 'type': {'schema': {'type': 'literal', 'expected': ['date']}, 'required': True},+ 'strict': {'schema': {'type': 'bool'}, 'required': False},+ 'le': {'schema': {'type': 'date'}, 'required': False},+ 'ge': {'schema': {'type': 'date'}, 'required': False},+ 'lt': {'schema': {'type': 'date'}, 'required': False},+ 'gt': {'schema': {'type': 'date'}, 'required': False},+ 'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False},+ 'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False},+ 'ref': {'schema': {'type': 'str'}, 'required': False},+ 'metadata': {+ 'schema': {+ 'type': 'dict',+ 'keys_schema': {'type': 'str'},+ 'values_schema': {'type': 'any'},
… 6607 more lines (truncated)
--- +++ @@ -4,3 +4,3 @@ -from typing import Callable+from collections.abc import Callable
--- +++ @@ -9,2 +9,3 @@ import sys+from collections.abc import Callable from dataclasses import dataclass@@ -12,3 +13,3 @@ from time import sleep, time-from typing import Any, Callable, Literal+from typing import Any, Literal
--- +++ @@ -546,3 +546,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python >= 3.10') def test_dataclass_slots(any_serializer):@@ -566,3 +565,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python >= 3.10') def test_dataclass_slots_init_vars(any_serializer):@@ -580,3 +578,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python > 3.10') def test_slots_mixed(any_serializer):
--- +++ @@ -90,3 +90,7 @@ 'input_value,expected_json',- [(BytesSubclass(b'foo'), 'foo'), (BytesMixin(b'foo'), 'foo'), (BytesEnum.foo, 'foo-value')],+ [+ pytest.param(BytesSubclass(b'foo'), 'foo', id='BytesSubclass'),+ pytest.param(BytesMixin(b'foo'), 'foo', id='BytesMixin'),+ pytest.param(BytesEnum.foo, 'foo-value', id='BytesEnum'),+ ], )
--- +++ @@ -21,3 +21,2 @@ (complex(2, float('nan')), '2+NaNj'),- (complex(2, float('-nan')), '2+NaNj'), ],
--- +++ @@ -3,3 +3,2 @@ import platform-import sys from typing import ClassVar@@ -140,3 +139,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python > 3.10') def test_slots_mixed():
--- +++ @@ -2,3 +2,3 @@ from enum import Enum-from typing import Literal, Union+from typing import Literal @@ -96,3 +96,3 @@ class Yard:- pet: Union[Dog, Cat]+ pet: Dog | Cat
--- +++ @@ -4,3 +4,3 @@ from pathlib import Path-from typing import Any, Union+from typing import Any @@ -156,3 +156,3 @@ class Model(RootModel):- root: list[Union[BModel, RModel]]+ root: list[BModel | RModel] @@ -163,3 +163,3 @@ class Model(RootModel):- root: list[Union[RModel, BModel]]+ root: list[RModel | BModel]
--- +++ @@ -1,3 +1,4 @@+from collections.abc import Callable from dataclasses import dataclass-from typing import Callable, Optional+from typing import Optional
--- +++ @@ -34,3 +34,3 @@ [- ('int', 1, 1, b'1'),+ pytest.param('int', 1, 1, b'1', id='int-1_int-1_int-1_bytes'), ('int', int(_BIG_NUMBER_BYTES), int(_BIG_NUMBER_BYTES), _BIG_NUMBER_BYTES),@@ -42,3 +42,3 @@ ('int', IntSubClass(42), IntSubClass(42), b'42'),- ('int', MyIntEnum.one, MyIntEnum.one, b'1'),+ pytest.param('int', MyIntEnum.one, MyIntEnum.one, b'1', id='int-MyIntEnum.one_int-MyIntEnum.one_int-1_bytes'), ('float', FloatSubClass(42), FloatSubClass(42), b'42.0'),
--- +++ @@ -44,8 +44,9 @@ ('\U0001d120', '"\\ud834\\udd20"'),- ('\u03b1\u03a9', '"\\u03b1\\u03a9"'),+ pytest.param('\u03b1\u03a9', '"\\u03b1\\u03a9"', id='\\u03b1\\u03a9'), ("`1~!@#$%^&*()_+-={':[,]}|;.</>?", '"`1~!@#$%^&*()_+-={\':[,]}|;.</>?"'),- ('\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'),- ('\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'),- ('\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}', '"\\u03b1\\u03a9"'),- ('\U0001d120', '"\\ud834\\udd20"'),+ pytest.param(+ '\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}',+ '"\\u03b1\\u03a9"',+ id='\\N{GREEK SMALL LETTER ALPHA}\\N{GREEK CAPITAL LETTER OMEGA}',+ ), ],@@ -169,3 +170,8 @@ @pytest.mark.parametrize(- 'input_value,expected', [(StrSubclass('foo'), 'foo'), (StrMixin('foo'), 'foo'), (StrEnum.foo, 'foo-value')]+ 'input_value,expected',+ [+ pytest.param(StrSubclass('foo'), 'foo', id='StrSubclass'),+ pytest.param(StrMixin('foo'), 'foo', id='StrMixin'),+ pytest.param(StrEnum.foo, 'foo-value', id='StrEnum'),+ ], )
--- +++ @@ -7,3 +7,3 @@ from decimal import Decimal-from typing import Any, ClassVar, Literal, Union+from typing import Any, ClassVar, Literal @@ -380,4 +380,4 @@ class Model(BaseModel):- value: Union[Literal[False], str]- value_types_reversed: Union[str, Literal[False]]+ value: Literal[False] | str+ value_types_reversed: str | Literal[False]
--- +++ @@ -1,2 +1,2 @@-from typing import Any, Optional+from typing import Any from unittest import TestCase@@ -133,3 +133,3 @@ def __new__(- cls, error_type: LiteralString, my_custom_setting: str, context: Optional[dict[str, Any]] = None+ cls, error_type: LiteralString, my_custom_setting: str, context: dict[str, Any] | None = None ) -> Self:
--- +++ @@ -5,5 +5,5 @@ -try:+if sys.platform != 'emscripten': from pytest_examples import CodeExample, EvalExample, find_examples-except ImportError:+else: # pytest_examples is not installed on emscripten@@ -11,3 +11,3 @@ - def find_examples(*_directories):+ def find_examples(*args, **kwargs): return []
--- +++ @@ -7,3 +7,3 @@ from decimal import Decimal-from typing import Any, Optional+from typing import Any @@ -203,3 +203,3 @@ @pytest.mark.parametrize('ctx', [None, {}])-def test_pydantic_error_type_raise_custom_no_ctx(ctx: Optional[dict]):+def test_pydantic_error_type_raise_custom_no_ctx(ctx: dict | None): def f(input_value, info):@@ -239,3 +239,3 @@ @pytest.mark.parametrize('ctx', [None, {}])-def test_pydantic_custom_error_type_raise_custom_no_ctx(ctx: Optional[dict]):+def test_pydantic_custom_error_type_raise_custom_no_ctx(ctx: dict | None): def f(input_value, info):@@ -542,3 +542,5 @@ literal = ''.join(f'\n {e!r},' for e in error_types)- print(f'python code (end of python/pydantic_core/core_schema.py):\n\nErrorType = Literal[{literal}\n]')+ print(+ f'python code (end of python/pydantic_core/core_schema.py):\n\nErrorType: TypeAlias = Literal[{literal}\n]'+ ) pytest.fail('core_schema.ErrorType needs to be updated')@@ -1127,6 +1129,2 @@ [email protected](- sys.version_info < (3, 9) and sys.implementation.name == 'pypy',- reason='PyPy before 3.9 cannot pickle this correctly',-) def test_validation_error_pickle() -> None:
--- +++ @@ -32,3 +32,10 @@ [email protected]('input_value', ['[1, 2, 3]', b'[1, 2, 3]', bytearray(b'[1, 2, 3]')])[email protected](+ 'input_value',+ [+ pytest.param('[1, 2, 3]', id='[1, 2, 3]_list'),+ pytest.param(b'[1, 2, 3]', id='[1, 2, 3]_bytes'),+ pytest.param(bytearray(b'[1, 2, 3]'), id='[1, 2, 3]_bytearray'),+ ],+) def test_input_types(input_value):
--- +++ @@ -5,3 +5,3 @@ import pytest-from typing_extensions import (+from typing_extensions import ( # noqa: UP035 (for `get_args` and `get_origin`) get_args,@@ -202,3 +202,3 @@ print(- f'python code (near end of python/pydantic_core/core_schema.py):\n\nCoreSchemaType = Literal[{literal}\n]'+ f'python code (near end of python/pydantic_core/core_schema.py):\n\nCoreSchemaType: TypeAlias = Literal[{literal}\n]' )
--- +++ @@ -1,3 +1 @@-from typing import Union- from pydantic_core import SchemaSerializer, SchemaValidator, core_schema@@ -59,3 +57,3 @@ - def serialize_inner(v: InnerModel, serializer) -> Union[dict[str, str], str]:+ def serialize_inner(v: InnerModel, serializer) -> dict[str, str] | str: v.x = v.x + ' modified'
--- +++ @@ -6,3 +6,3 @@ import pytest-from typing_extensions import get_args, get_type_hints+from typing_extensions import get_args, get_type_hints # noqa: UP035 from typing_inspection.introspection import UNKNOWN, AnnotationSource, inspect_annotation
--- +++ @@ -15,10 +15,10 @@ [- (False, False, 123, 123),- (False, False, '123', 123),- (None, False, 123, 123),- (None, False, '123', 123),+ pytest.param(False, False, 123, 123, id='False-False-123_int-123_int'),+ pytest.param(False, False, '123', 123, id='False-False-123_str-123_int'),+ pytest.param(None, False, 123, 123, id='None-False-123_int-123_int'),+ pytest.param(None, False, '123', 123, id='None-False-123_str-123_int'), (True, False, 123, 123), (True, False, '123', Err('Input should be a valid integer [type=int_type')),- (False, True, 123, 123),- (False, True, '123', 123),+ pytest.param(False, True, 123, 123, id='False-True-123_int-123_int'),+ pytest.param(False, True, '123', 123, id='False-True-123_str-123_int'), (None, True, 123, 123),@@ -27,6 +27,6 @@ (True, True, '123', Err('Input should be a valid integer [type=int_type')),- (False, None, 123, 123),- (False, None, '123', 123),- (None, None, 123, 123),- (None, None, '123', 123),+ pytest.param(False, None, 123, 123, id='False-None-123_int-123_int'),+ pytest.param(False, None, '123', 123, id='False-None-123_str-123_int'),+ pytest.param(None, None, 123, 123, id='None-None-123_int-123_int'),+ pytest.param(None, None, '123', 123, id='None-None-123_str-123_int'), (True, None, 123, 123),
--- +++ @@ -2,4 +2,5 @@ +from collections.abc import Callable from datetime import date, datetime, time-from typing import Any, Callable+from typing import Any
pytest pypi YANKBURST ×3
8.3.3
8.3.4
8.3.5
8.4.0
8.4.1
8.4.2
9.0.0
9.0.1
9.0.2
9.0.3
9.1.0
9.1.1
YANK
8.1.0 marked yanked (still downloadable)
high · registry-verified · 2024-03-03 · 2y ago
BURST
2 releases in 9m: 2.2.2, 2.2.3
info · registry-verified · 2012-02-06 · 14y ago
BURST
2 releases in 58m: 5.0.0, 4.6.4
info · registry-verified · 2019-06-29 · 7y ago
BURST
2 releases in 53m: 8.3.0, 8.3.1
info · registry-verified · 2024-07-20 · 1y ago
release diff 9.1.0 → 9.1.1
+1 added · -0 removed · ~24 modified
--- +++ @@ -20,4 +20,4 @@ -__version__ = version = '9.1.0'-__version_tuple__ = version_tuple = (9, 1, 0)+__version__ = version = '9.1.1'+__version_tuple__ = version_tuple = (9, 1, 1)
--- +++ @@ -647,14 +647,14 @@ anchor = absolutepath(invocation_dir / path)- # Ensure we do not break if what appears to be an anchor # is in fact a very long option (#10169, #11394).- if safe_exists(anchor):- anchors.append(anchor)- # Let's also consider test* subdirs.- if anchor.is_dir():- for x in anchor.glob("test*"):- if x.is_dir():- anchors.append(x)+ if not safe_exists(anchor):+ continue++ anchors.append(anchor)+ # Let's also consider test* subdirs.+ if anchor.is_dir():+ anchors.extend(x for x in anchor.glob("test*") if x.is_dir()) if not anchors:- anchors = [invocation_dir]+ anchors.append(invocation_dir)+ anchors.extend(x for x in invocation_dir.glob("test*") if x.is_dir())
--- +++ @@ -66,2 +66,3 @@ from _pytest.main import Session+from _pytest.mark import Mark from _pytest.mark import ParameterSet@@ -1900,2 +1901,7 @@ """Generate new tests based on parametrized fixtures used by the given metafunc"""++ def get_parametrize_mark_argnames(mark: Mark) -> Sequence[str]:+ args, _ = ParameterSet._parse_parametrize_args(*mark.args, **mark.kwargs)+ return args+ for argname in metafunc.fixturenames:@@ -1903,2 +1909,10 @@ fixture_defs = metafunc._arg2fixturedefs.get(argname, ())++ # If the test itself parametrizes using this argname, give it+ # precedence.+ if any(+ argname in get_parametrize_mark_argnames(mark)+ for mark in metafunc.definition.iter_markers("parametrize")+ ):+ continue
--- +++ @@ -23,3 +23,2 @@ from .._code import getfslineno-from ..compat import deprecated from ..compat import NOTSET@@ -539,7 +538,9 @@ class _ParametrizeMarkDecorator(MarkDecorator):- @overload # type: ignore[override,no-overload-impl]- def __call__(+ def __call__( # type: ignore[override] self, argnames: str | Sequence[str],- argvalues: Collection[ParameterSet | Sequence[object] | object],+ argvalues: Iterable[ParameterSet | Sequence[object] | object],+ # TODO(pytest10): Change to below after PARAMETRIZE_NON_COLLECTION_ITERABLE deprecation.+ # Overload doesn't work, see #14606.+ # argvalues: Collection[ParameterSet | Sequence[object] | object], *,@@ -547,19 +548,2 @@ ids: Iterable[None | str | float | int | bool | _HiddenParam]- | Callable[[Any], object | None]- | None = ...,- scope: ScopeName | None = ...,- ) -> MarkDecorator: ...-- @overload- @deprecated(- "Passing a non-Collection iterable to the 'argvalues' parameter of @pytest.mark.parametrize is deprecated. "- "Convert argvalues to a list or tuple.",- )- def __call__(- self,- argnames: str | Sequence[str],- argvalues: Iterable[ParameterSet | Sequence[object] | object],- *,- indirect: bool | Sequence[str] = ...,- ids: Iterable[None | str | float | int | bool] | Callable[[Any], object | None]
--- +++ @@ -1356,3 +1356,3 @@ for i_actual, actual in enumerate(actual_exceptions):- if results.get_result(i_exp, i_actual) is None:+ if results.get_result(i_failed, i_actual) is None: # we print full repr of match target
--- +++ @@ -1187,3 +1187,5 @@ import pytest+ values = []+ @pytest.fixture(scope='module', autouse=True)@@ -1191,2 +1193,3 @@ values.append("module")+ @pytest.fixture(autouse=True)@@ -1198,6 +1201,8 @@ - class TestClass(object):+ class TestClass: @pytest.fixture(scope="class", autouse=True)- def setup_class(self):+ @classmethod+ def setup_class(cls): values.append("class")+ @pytest.fixture(autouse=True)@@ -1205,7 +1210,15 @@ values.append("method")+ def test_method(self): pass+ def test_all():- assert values == ["module", "function", "class",- "function", "method", "function"]+ assert values == [+ "module",+ "function",+ "class",+ "function",+ "method",+ "function",+ ] """@@ -2469,3 +2482,4 @@ @pytest.fixture(scope="class", autouse=True)- def setup_teardown(self, item):+ @classmethod+ def setup_teardown(cls, item): values.append("setup-%d" % item)@@ -2622,2 +2636,28 @@ """+ )+ reprec = pytester.inline_run()+ reprec.assertoutcome(passed=2)++ def test_override_parametrized_fixture_with_indirect(+ self, pytester: Pytester+ ) -> None:+ """Make sure a parametrized argument can override a parametrized fixture.++ This was a regression introduced in the fix for #736.+ """+ pytester.makepyfile(+ """+ import pytest++ @pytest.fixture(params=["a"])+ def fixt(request):+ return request.param * 2++ def test_fixt(fixt):+ assert fixt == "aa"++ @pytest.mark.parametrize("fixt", ['b'], indirect=True)+ def test_indirect(fixt):+ assert fixt == "bb"+ """ )@@ -3248,7 +3288,8 @@ class TestClass(object):+ @pytest.fixture(scope="class", autouse=True) @classmethod- @pytest.fixture(scope="class", autouse=True)- def setup1(self, request, param1):+ def setup1(cls, request, param1): values.append(1)- request.addfinalizer(self.teardown1)+ request.addfinalizer(cls.teardown1)+ @classmethod@@ -3256,9 +3297,13 @@ assert values.pop() == 1+ @pytest.fixture(scope="class", autouse=True)- def setup2(self, request, param1):+ @classmethod+ def setup2(cls, request, param1): values.append(2)- request.addfinalizer(self.teardown2)+ request.addfinalizer(cls.teardown2)+ @classmethod- def teardown2(self):+ def teardown2(cls): assert values.pop() == 2+ def test(self):
--- +++ @@ -1745,3 +1745,4 @@ @pytest.fixture(scope="class")- def fixture(self, fixture):+ @classmethod+ def fixture(cls, fixture): pass
--- +++ @@ -1352 +1352,19 @@ RaisesGroup((ValueError, IndexError)) # type: ignore[call-overload]+++def test_expected_matching_only_on_matching() -> None:+ """Regression test for #14220, logic error which caused the "which was+ paired with" message to appear for wrong pairs."""+ with (+ fails_raises_group(+ "\n"+ "1 matched exception. \n"+ "Too few exceptions raised!\n"+ "The following expected exceptions did not find a match:\n"+ " ValueError\n"+ " TypeError\n"+ " It matches `TypeError()` which was paired with `TypeError`",+ ),+ RaisesGroup(TypeError, ValueError, TypeError),+ ):+ raise ExceptionGroup("", [TypeError()])
--- +++ @@ -440,2 +440,24 @@ result.stdout.fnmatch_lines(["*--xyz*"])+++def test_conftests_in_invocation_dir_tests_is_initial(pytester: Pytester) -> None:+ """An option registered in a conftest under ``test*`` subdir of the+ invocation dir is loaded as initial when no command-line arguments+ or `testpaths` are given (#14608).+ """+ pytester.makepyfile(+ **{+ "tests/conftest.py": """+ def pytest_addoption(parser):+ parser.addoption("--db-url")+ """,+ "test_it.py": """+ def test_it(request):+ assert request.config.getoption("--db-url") == "scheme://host/db"+ """,+ }+ )+ result = pytester.runpytest("--db-url", "scheme://host/db")+ assert result.ret == ExitCode.OK+ result.assert_outcomes(passed=1)
--- +++ @@ -869,5 +869,7 @@ @pytest.fixture(scope="class", autouse=True)- def perclass(self, request):+ @classmethod+ def perclass(cls, request): request.cls.hello = "world" {stmt}+ @pytest.fixture(scope="function", autouse=True)
--- +++ @@ -69,9 +69,2 @@ -# Test @pytest.mark.parametrize iterator argvalues deprecation.-# Will be complain about unused type ignore if doesn't work.[email protected]("x", iter(range(10))) # type: ignore[deprecated]-def test_it(x: int) -> None:- pass-- # Issue #14137.@@ -81 +74,7 @@ assert_type(custom_scope, ScopeName)+++# Issue #14606.[email protected]("x", [ImportError, AttributeError])+def check_mypy_bug_with_argvalues(x) -> None:+ pass
requests pypi critical-tier YANK ×2BURST ×8
2.31.0
2.32.0
2.32.1
2.32.2
2.32.3
2.32.4
2.32.5
2.33.0
2.33.1
2.34.0
2.34.1
2.34.2
YANK
2.32.0 marked yanked (still downloadable)
high · registry-verified · 2024-05-20 · 2y ago
YANK
2.32.1 marked yanked (still downloadable)
high · registry-verified · 2024-05-20 · 2y ago
BURST
2 releases in 48m: 0.6.3, 0.6.4
info · registry-verified · 2011-10-14 · 14y ago
BURST
2 releases in 21m: 0.7.1, 0.7.2
info · registry-verified · 2011-10-23 · 14y ago
BURST
3 releases in 56m: 0.8.8, 0.8.9, 0.9.0
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 11m: 1.0.1, 1.0.2
info · registry-verified · 2012-12-17 · 13y ago
BURST
2 releases in 2m: 2.0.0, 2.0.1
info · registry-verified · 2013-11-15 · 12y ago
BURST
2 releases in 15m: 2.9.2, 2.10.0
info · registry-verified · 2016-04-29 · 10y ago
BURST
2 releases in 20m: 2.17.2, 2.17.3
info · registry-verified · 2017-05-29 · 9y ago
BURST
2 releases in 0m: 2.24.0, 2.23.0
info · registry-verified · 2020-06-17 · 6y ago
release diff 2.34.1 → 2.34.2
+0 added · -0 removed · ~6 modified
--- +++ @@ -7,4 +7,4 @@ __url__ = "https://requests.readthedocs.io"-__version__ = "2.34.1"-__build__ = 0x023401+__version__ = "2.34.2"+__build__ = 0x023402 __author__ = "Kenneth Reitz"
--- +++ @@ -111,3 +111,3 @@ - HeadersType: TypeAlias = MutableMapping[str, str | bytes] | None+ HeadersType: TypeAlias = Mapping[str, str | bytes] | None
--- +++ @@ -85,3 +85,2 @@ if TYPE_CHECKING:- from collections.abc import MutableMapping from http.cookiejar import CookieJar@@ -313,3 +312,3 @@ url: _t.UriType | None- headers: MutableMapping[str, str | bytes]+ headers: Mapping[str, str | bytes] files: _t.FilesType
s3transfer pypi YANKINSTALL-EXEC
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.16.1
0.17.0
0.17.1
0.18.0
0.19.0
0.19.1
YANK
0.8.1 marked yanked (still downloadable)
high · registry-verified · 2023-11-28 · 2y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 0.19.0 → 0.19.1
+0 added · -0 removed · ~7 modified
--- +++ @@ -147,3 +147,3 @@ __author__ = 'Amazon Web Services'-__version__ = '0.19.0'+__version__ = '0.19.1'
--- +++ @@ -132,4 +132,6 @@ preserved_metadata = {}+ call_args = transfer_future.meta.call_args source_version_id = None- call_args = transfer_future.meta.call_args+ if isinstance(call_args.copy_source, dict):+ source_version_id = call_args.copy_source.get('VersionId') if (@@ -168,5 +170,2 @@ preserved_metadata = self._extract_preserved_metadata(response)- # Pin the source version so all subsequent reads (tags, annotations)- # are consistent with the object from the head call- source_version_id = response.get('VersionId') @@ -354,3 +353,4 @@ result = {- k: v for k, v in extra_args.items()+ k: v+ for k, v in extra_args.items() if k not in self.PRESERVED_METADATA_FIELDS@@ -420,3 +420,5 @@ - def _apply_tags(self, client, call_args, source_version_id, dest_version_id):+ def _apply_tags(+ self, client, call_args, source_version_id, dest_version_id+ ): extra_args = call_args.extra_args@@ -508,3 +510,5 @@ 'AnnotationName': name,- 'AnnotationPayload': payload_response['AnnotationPayload'].read(),+ 'AnnotationPayload': payload_response[+ 'AnnotationPayload'+ ].read(), **put_passthrough,
--- +++ @@ -464,3 +464,6 @@ # input has no effect.- if extra_args.get('Metadata') and extra_args.get('MetadataDirective') is None:+ if (+ extra_args.get('Metadata')+ and extra_args.get('MetadataDirective') is None+ ): logger.warning(@@ -471,3 +474,6 @@ )- if extra_args.get('Tagging') and extra_args.get('TaggingDirective') is None:+ if (+ extra_args.get('Tagging')+ and extra_args.get('TaggingDirective') is None+ ): logger.warning(
--- +++ @@ -766,3 +766,3 @@ - def test_mp_copy_tagging_copy_pins_source_version_id(self):+ def test_mp_copy_tagging_copy_does_not_pin_discovered_version_id(self): source_version_id = 'abc123version'@@ -783,5 +783,24 @@ self.add_successful_copy_responses(**add_copy_kwargs)- self.stubber.add_response(- 'get_object_tagging',- service_response={'TagSet': source_tags},+ self.add_get_object_tagging_response(source_tags)+ self.add_put_object_tagging_response(source_tags)+ future = self.manager.copy(+ self.copy_source,+ self.bucket,+ self.key,+ {'TaggingDirective': 'COPY'},+ )+ future.result()+ self.stubber.assert_no_pending_responses()++ def test_mp_copy_tagging_copy_pins_user_supplied_source_version_id(self):+ source_version_id = 'abc123version'+ source_tags = [{'Key': 'env', 'Value': 'prod'}]+ self.copy_source['VersionId'] = source_version_id+ self.stubber.add_response(+ 'head_object',+ service_response={+ 'ContentLength': len(self.content),+ 'ETag': self.etag,+ 'VersionId': source_version_id,+ }, expected_params={@@ -792,5 +811,18 @@ )+ _, add_copy_kwargs = self._get_expected_params()+ self.add_successful_copy_responses(**add_copy_kwargs)+ self.stubber.add_response(+ 'get_object_tagging',+ service_response={'TagSet': source_tags},+ expected_params={+ 'Bucket': 'mysourcebucket',+ 'Key': 'mysourcekey',+ 'VersionId': source_version_id,+ },+ ) self.add_put_object_tagging_response(source_tags) future = self.manager.copy(- self.copy_source, self.bucket, self.key,+ self.copy_source,+ self.bucket,+ self.key, {'TaggingDirective': 'COPY'},@@ -825,3 +857,5 @@ future = self.manager.copy(- self.copy_source, self.bucket, self.key,+ self.copy_source,+ self.bucket,+ self.key, {'Tagging': 'env=prod', 'TaggingDirective': 'REPLACE'},@@ -831,3 +865,5 @@ - def test_mp_copy_forwards_passthrough_args_to_tag_and_annotation_calls(self):+ def test_mp_copy_forwards_passthrough_args_to_tag_and_annotation_calls(+ self,+ ): # RequestPayer/ExpectedBucketOwner go to all five tag/annotation ops;@@ -884,9 +920,11 @@ service_response={- 'Annotations': [{- 'AnnotationName': 'note',- 'LastModified': datetime.datetime(- 2026, 1, 1, tzinfo=datetime.timezone.utc- ),- 'Size': len(annotation_payload),- }],+ 'Annotations': [+ {+ 'AnnotationName': 'note',+ 'LastModified': datetime.datetime(+ 2026, 1, 1, tzinfo=datetime.timezone.utc+ ),+ 'Size': len(annotation_payload),+ }+ ], },@@ -922,3 +960,5 @@ future = self.manager.copy(- self.copy_source, self.bucket, self.key,+ self.copy_source,+ self.bucket,+ self.key, {@@ -940,3 +980,5 @@ - def test_mp_copy_metadata_supplied_without_directive_preserves_source(self):+ def test_mp_copy_metadata_supplied_without_directive_preserves_source(+ self,+ ): head_metadata = {
--- +++ @@ -52,3 +52,5 @@ class FakeCallArgs:- def __init__(self, copy_source, bucket, key, extra_args=None, source_client=None):+ def __init__(+ self, copy_source, bucket, key, extra_args=None, source_client=None+ ): self.copy_source = copy_source@@ -71,3 +73,6 @@ return FakeCallArgs(- self.copy_source, self.bucket, self.key, extra_args,+ self.copy_source,+ self.bucket,+ self.key,+ extra_args, source_client=source_client,@@ -75,3 +80,5 @@ - def _apply(self, client, call_args, source_version_id=None, dest_version_id=None):+ def _apply(+ self, client, call_args, source_version_id=None, dest_version_id=None+ ): # Default source_client to the same client unless test overrode it@@ -94,12 +101,20 @@ self._apply(client, call_args)- self.assertEqual(client.calls, [- ('put_object_tagging', {- 'Bucket': self.bucket,- 'Key': self.key,- 'Tagging': {'TagSet': [- {'Key': 'env', 'Value': 'prod'},- {'Key': 'team', 'Value': 'sdk'},- ]},- })- ])+ self.assertEqual(+ client.calls,+ [+ (+ 'put_object_tagging',+ {+ 'Bucket': self.bucket,+ 'Key': self.key,+ 'Tagging': {+ 'TagSet': [+ {'Key': 'env', 'Value': 'prod'},+ {'Key': 'team', 'Value': 'sdk'},+ ]+ },+ },+ )+ ],+ ) @@ -107,5 +122,7 @@ source_tags = [{'Key': 'env', 'Value': 'prod'}]- client = RecordingClient(responses={- 'get_object_tagging': {'TagSet': source_tags},- })+ client = RecordingClient(+ responses={+ 'get_object_tagging': {'TagSet': source_tags},+ }+ ) call_args = self._make_call_args({'TaggingDirective': 'COPY'})@@ -114,9 +131,13 @@ self.assertEqual(methods, ['get_object_tagging', 'put_object_tagging'])- self.assertEqual(client.calls[1], (- 'put_object_tagging', {- 'Bucket': self.bucket,- 'Key': self.key,- 'Tagging': {'TagSet': source_tags},- }- ))+ self.assertEqual(+ client.calls[1],+ (+ 'put_object_tagging',+ {+ 'Bucket': self.bucket,+ 'Key': self.key,+ 'Tagging': {'TagSet': source_tags},+ },+ ),+ ) @@ -124,5 +145,7 @@ source_tags = [{'Key': 'env', 'Value': 'prod'}]- client = RecordingClient(responses={- 'get_object_tagging': {'TagSet': source_tags},- })+ client = RecordingClient(+ responses={+ 'get_object_tagging': {'TagSet': source_tags},+ }+ ) call_args = self._make_call_args({'TaggingDirective': 'COPY'})@@ -134,3 +157,5 @@ client = RecordingClient()- call_args = self._make_call_args({'TaggingDirective': 'REPLACE', 'Tagging': 'k=v'})+ call_args = self._make_call_args(+ {'TaggingDirective': 'REPLACE', 'Tagging': 'k=v'}+ ) self._apply(client, call_args, dest_version_id='dest-v1')@@ -141,3 +166,5 @@ client = RecordingClient()- call_args = self._make_call_args({'TaggingDirective': 'REPLACE', 'Tagging': 'k=v'})+ call_args = self._make_call_args(+ {'TaggingDirective': 'REPLACE', 'Tagging': 'k=v'}+ ) self._apply(client, call_args, dest_version_id=None)@@ -147,5 +174,7 @@ def test_copy_directive_omits_version_id_when_none(self):- client = RecordingClient(responses={- 'get_object_tagging': {'TagSet': []},- })+ client = RecordingClient(+ responses={+ 'get_object_tagging': {'TagSet': []},+ }+ ) call_args = self._make_call_args({'TaggingDirective': 'COPY'})@@ -174,2 +203,3 @@ """RecordingClient whose list_object_annotations returns a single 'note' annotation."""+ def list_object_annotations(self, **kwargs):@@ -182,3 +212,6 @@ return FakeCallArgs(- self.copy_source, self.bucket, self.key, extra_args,+ self.copy_source,+ self.bucket,+ self.key,+ extra_args, source_client=source_client,@@ -207,3 +240,5 @@ client = RecordingClient()- self._apply(client, self._make_call_args({'AnnotationDirective': 'EXCLUDE'}))+ self._apply(+ client, self._make_call_args({'AnnotationDirective': 'EXCLUDE'})+ ) self.assertEqual(client.calls, [])@@ -212,10 +247,12 @@ annotation_payload = b'hello annotation'- client = RecordingClient(responses={- 'list_object_annotations': {- 'Annotations': [{'AnnotationName': 'my-note'}]- },- 'get_object_annotation': {- 'AnnotationPayload': io.BytesIO(annotation_payload)- },- })+ client = RecordingClient(+ responses={+ 'list_object_annotations': {+ 'Annotations': [{'AnnotationName': 'my-note'}]+ },+ 'get_object_annotation': {+ 'AnnotationPayload': io.BytesIO(annotation_payload)+ },+ }+ ) call_args = self._make_call_args({'AnnotationDirective': 'COPY'})@@ -225,3 +262,7 @@ methods,- ['list_object_annotations', 'get_object_annotation', 'put_object_annotation'],+ [+ 'list_object_annotations',+ 'get_object_annotation',+ 'put_object_annotation',+ ], )@@ -234,5 +275,7 @@ def test_copy_directive_with_no_source_annotations_skips_put(self):- client = RecordingClient(responses={- 'list_object_annotations': {'Annotations': []},- })+ client = RecordingClient(+ responses={+ 'list_object_annotations': {'Annotations': []},+ }+ ) call_args = self._make_call_args({'AnnotationDirective': 'COPY'})@@ -244,10 +287,19 @@ def test_copy_directive_pins_dest_version_and_etag_on_put(self):- client = self.AnnotationListClient(responses={- 'get_object_annotation': {'AnnotationPayload': io.BytesIO(b'data')},- })+ client = self.AnnotationListClient(+ responses={+ 'get_object_annotation': {+ 'AnnotationPayload': io.BytesIO(b'data')+ },+ }+ ) call_args = self._make_call_args({'AnnotationDirective': 'COPY'}) self._apply(- client, call_args, dest_version_id='dest-v1', dest_etag='"destetag"'- )- _, put_kwargs = next((m, k) for m, k in client.calls if m == 'put_object_annotation')+ client,+ call_args,+ dest_version_id='dest-v1',+ dest_etag='"destetag"',+ )+ _, put_kwargs = next(+ (m, k) for m, k in client.calls if m == 'put_object_annotation'+ ) self.assertEqual(put_kwargs.get('VersionId'), 'dest-v1')@@ -256,8 +308,14 @@ def test_copy_directive_omits_dest_pins_when_not_in_result(self):- client = self.AnnotationListClient(responses={- 'get_object_annotation': {'AnnotationPayload': io.BytesIO(b'data')},- })+ client = self.AnnotationListClient(+ responses={+ 'get_object_annotation': {+ 'AnnotationPayload': io.BytesIO(b'data')+ },+ }+ ) call_args = self._make_call_args({'AnnotationDirective': 'COPY'}) self._apply(client, call_args)- _, put_kwargs = next((m, k) for m, k in client.calls if m == 'put_object_annotation')+ _, put_kwargs = next(+ (m, k) for m, k in client.calls if m == 'put_object_annotation'+ ) self.assertNotIn('VersionId', put_kwargs)@@ -267,11 +325,17 @@ annotation_payload = b'data'- client = self.AnnotationListClient(responses={- 'get_object_annotation': {- 'AnnotationPayload': io.BytesIO(annotation_payload)- },- })+ client = self.AnnotationListClient(+ responses={+ 'get_object_annotation': {+ 'AnnotationPayload': io.BytesIO(annotation_payload)+ },+ }+ ) call_args = self._make_call_args({'AnnotationDirective': 'COPY'}) self._apply(client, call_args, source_version_id='v456')- list_kwargs = next(k for m, k in client.calls if m == 'list_object_annotations')- get_kwargs = next(k for m, k in client.calls if m == 'get_object_annotation')+ list_kwargs = next(+ k for m, k in client.calls if m == 'list_object_annotations'+ )+ get_kwargs = next(
… 99 more lines (truncated)
setuptools pypi critical-tier YANK ×9BURST ×35INSTALL-EXEC
80.7.0
80.7.1
80.8.0
80.9.0
75.3.3
80.10.1
80.10.2
81.0.0
75.3.4
82.0.0
82.0.1
83.0.0
YANK
59.1.0 marked yanked (still downloadable)
high · registry-verified · 2021-11-15 · 4y ago
YANK
60.3.0 marked yanked (still downloadable)
high · registry-verified · 2022-01-06 · 4y ago
YANK
69.3.0 marked yanked (still downloadable)
high · registry-verified · 2024-04-12 · 2y ago
YANK
69.4.0 marked yanked (still downloadable)
high · registry-verified · 2024-04-12 · 2y ago
YANK
71.0.1 marked yanked (still downloadable)
high · registry-verified · 2024-07-18 · 1y ago
YANK
72.0.0 marked yanked (still downloadable)
high · registry-verified · 2024-07-29 · 1y ago
YANK
75.9.0 marked yanked (still downloadable)
high · registry-verified · 2025-03-09 · 1y ago
YANK
80.3.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-03 · 1y ago
YANK
80.7.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-14 · 1y ago
BURST
2 releases in 21m: 0.9.2, 0.9.3
info · registry-verified · 2013-07-15 · 13y ago
BURST
2 releases in 3m: 1.1.2, 1.1.3
info · registry-verified · 2013-09-06 · 12y ago
BURST
4 releases in 3m: 3.1, 3.0, 3.0.1, 3.0.2
info · registry-verified · 2014-03-08 · 12y ago
BURST
2 releases in 15m: 3.5.2, 3.6
info · registry-verified · 2014-05-07 · 12y ago
BURST
2 releases in 17m: 3.7, 3.8
info · registry-verified · 2014-06-01 · 12y ago
BURST
2 releases in 0m: 4.0, 4.0.1
info · registry-verified · 2014-06-15 · 12y ago
BURST
2 releases in 28m: 8.1, 8.2
info · registry-verified · 2014-12-18 · 11y ago
BURST
2 releases in 59m: 12.0, 12.0.1
info · registry-verified · 2015-01-16 · 11y ago
BURST
2 releases in 14m: 12.0.2, 12.0.3
info · registry-verified · 2015-01-19 · 11y ago
BURST
2 releases in 26m: 20.8.0, 20.8.1
info · registry-verified · 2016-04-15 · 10y ago
BURST
2 releases in 8m: 22.0.1, 22.0.2
info · registry-verified · 2016-06-03 · 10y ago
BURST
2 releases in 25m: 22.0.4, 22.0.5
info · registry-verified · 2016-06-03 · 10y ago
BURST
2 releases in 9m: 24.1.1, 24.2.0
info · registry-verified · 2016-07-20 · 9y ago
BURST
2 releases in 2m: 25.0.0, 24.3.1
info · registry-verified · 2016-07-23 · 9y ago
BURST
2 releases in 52m: 25.1.5, 25.1.6
info · registry-verified · 2016-08-05 · 9y ago
BURST
2 releases in 11m: 25.3.0, 25.4.0
info · registry-verified · 2016-08-19 · 9y ago
BURST
2 releases in 41m: 27.0.0, 27.1.0
info · registry-verified · 2016-09-09 · 9y ago
BURST
2 releases in 10m: 28.8.1, 29.0.1
info · registry-verified · 2016-11-27 · 9y ago
BURST
2 releases in 23m: 30.2.1, 30.3.0
info · registry-verified · 2016-12-08 · 9y ago
BURST
2 releases in 19m: 36.6.1, 36.7.0
info · registry-verified · 2017-11-10 · 8y ago
BURST
2 releases in 48m: 38.0.0, 38.1.0
info · registry-verified · 2017-11-25 · 8y ago
BURST
2 releases in 7m: 38.6.1, 38.7.0
info · registry-verified · 2018-03-17 · 8y ago
BURST
2 releases in 16m: 40.1.1, 40.2.0
info · registry-verified · 2018-08-21 · 7y ago
BURST
2 releases in 5m: 41.3.0, 41.4.0
info · registry-verified · 2019-10-07 · 6y ago
BURST
3 releases in 19m: 44.1.0, 46.1.0, 46.1.1
info · registry-verified · 2020-03-21 · 6y ago
BURST
2 releases in 27m: 47.0.0, 47.1.0
info · registry-verified · 2020-05-28 · 6y ago
BURST
2 releases in 16m: 44.1.1, 47.1.1
info · registry-verified · 2020-05-29 · 6y ago
BURST
2 releases in 44m: 54.1.3, 54.2.0
info · registry-verified · 2021-03-22 · 5y ago
BURST
2 releases in 12m: 58.5.0, 58.5.1
info · registry-verified · 2021-11-03 · 4y ago
BURST
2 releases in 1m: 60.4.0, 60.5.0
info · registry-verified · 2022-01-08 · 4y ago
BURST
3 releases in 4m: 69.3.1, 69.4.1, 69.5.0
info · registry-verified · 2024-04-13 · 2y ago
BURST
2 releases in 51m: 74.1.3, 75.0.0
info · registry-verified · 2024-09-15 · 1y ago
BURST
2 releases in 8m: 75.3.1, 75.3.2
info · registry-verified · 2025-03-11 · 1y ago
BURST
2 releases in 19m: 80.6.0, 80.7.0
info · registry-verified · 2025-05-14 · 1y ago
BURST
2 releases in 56m: 75.3.4, 82.0.0
info · registry-verified · 2026-02-08 · 5mo ago
INSTALL-EXEC
setup.py in sdist uses install-hook, obfuscation (runs at pip install)
warn · snapshot-derived
release diff 82.0.1 → 83.0.0
+2 added · -0 removed · ~47 modified
+13 more files not shown
--- +++ @@ -12,3 +12,3 @@ name = "setuptools"-version = "82.0.1"+version = "83.0.0" authors = [@@ -28,3 +28,3 @@ ]-requires-python = ">=3.9"+requires-python = ">=3.10" license = "MIT"@@ -111,3 +111,3 @@ # upstream- "pytest-checkdocs >= 2.4",+ "pytest-checkdocs >= 2.14", "pytest-ruff >= 0.2.1; sys_platform != 'cygwin'",@@ -125,3 +125,3 @@ enabler = [- "pytest-enabler >= 2.2",+ "pytest-enabler >= 3.4", ]@@ -130,3 +130,5 @@ # upstream- "pytest-mypy",+ + # Exclude PyPy from type checks (python/mypy#20454 jaraco/skeleton#187)+ "pytest-mypy >= 1.0.1; platform_python_implementation != 'PyPy'",
--- +++ @@ -60,3 +60,3 @@ newer_pairs = filter(splat(newer), zip_strict(sources, targets))- return tuple(map(list, zip(*newer_pairs))) or ([], [])+ return tuple(map(list, zip(*newer_pairs, strict=False))) or ([], [])
--- +++ @@ -138,12 +138,12 @@ - def has_pure_modules(self):+ def has_pure_modules(self) -> bool: return self.distribution.has_pure_modules() - def has_c_libraries(self):+ def has_c_libraries(self) -> bool: return self.distribution.has_c_libraries() - def has_ext_modules(self):+ def has_ext_modules(self) -> bool: return self.distribution.has_ext_modules() - def has_scripts(self):+ def has_scripts(self) -> bool: return self.distribution.has_scripts()
--- +++ @@ -501,3 +501,3 @@ ]- for ext, fut in zip(self.extensions, futures):+ for ext, fut in zip(self.extensions, futures, strict=False): with self._filter_build_errors(ext):
--- +++ @@ -266,8 +266,8 @@ # that installation scheme.- self.install_purelib = None # for pure module distributions- self.install_platlib = None # non-pure (dists w/ extensions)- self.install_headers = None # for C/C++ headers+ self.install_purelib: str | None = None # for pure module distributions+ self.install_platlib: str | None = None # non-pure (dists w/ extensions)+ self.install_headers: str | None = None # for C/C++ headers self.install_lib: str | None = None # set to either purelib or platlib- self.install_scripts = None- self.install_data = None+ self.install_scripts: str | None = None+ self.install_data: str | None = None self.install_userbase = USER_BASE@@ -774,3 +774,3 @@ - def has_lib(self):+ def has_lib(self) -> bool: """Returns true if the current distribution has any Python@@ -781,3 +781,3 @@ - def has_headers(self):+ def has_headers(self) -> bool: """Returns true if the current distribution has any headers to@@ -786,3 +786,3 @@ - def has_scripts(self):+ def has_scripts(self) -> bool: """Returns true if the current distribution has any scripts to.@@ -791,3 +791,3 @@ - def has_data(self):+ def has_data(self) -> bool: """Returns true if the current distribution has any data to.
--- +++ @@ -61,5 +61,5 @@ -# The following routines are taken from setuptools' pkg_resources module and-# can be replaced by importing them from pkg_resources once it is included-# in the stdlib.+# The following routines were originally copied from setuptools' pkg_resources+# module and intended to be replaced by stdlib versions. They're now just legacy+# cruft.
--- +++ @@ -56,3 +56,3 @@ # All sizes are equal, we can use the built-in zip.- return zip(*iterables)+ return zip(*iterables, strict=False) # If any one of the iterables didn't have a length, start reading
--- +++ @@ -18,3 +18,2 @@ TypeVar,- Union, overload,@@ -41,3 +40,5 @@ if TYPE_CHECKING:- from typing_extensions import TypeAlias, TypeVarTuple, Unpack+ from typing import TypeAlias++ from typing_extensions import TypeVarTuple, Unpack @@ -45,3 +46,3 @@ -_Macro: TypeAlias = Union[tuple[str], tuple[str, Union[str, None]]]+_Macro: TypeAlias = tuple[str] | tuple[str, str | None] _StrPathT = TypeVar("_StrPathT", bound="str | os.PathLike[str]")@@ -72,3 +73,3 @@ # responsible for updating 'compiler_class'!- compiler_type: ClassVar[str] = None # type: ignore[assignment]+ compiler_type: ClassVar[str] = None @@ -860,3 +861,3 @@ - def runtime_library_dir_option(self, dir: str) -> str:+ def runtime_library_dir_option(self, dir: str) -> str | list[str]: """Return the compiler option to add 'dir' to the list of
--- +++ @@ -7,2 +7,4 @@ """++from __future__ import annotations @@ -329,3 +331,3 @@ -def is_cygwincc(cc):+def is_cygwincc(cc: str | shlex._ShlexInstream) -> bool: """Try to determine if the compiler that would be used is from cygwin."""
--- +++ @@ -97,3 +97,4 @@ path = (- subprocess.check_output([+ subprocess+ .check_output([ os.path.join(
--- +++ @@ -20,3 +20,4 @@ payload = (- textwrap.dedent(+ textwrap+ .dedent( """
--- +++ @@ -324,3 +324,3 @@ - def runtime_library_dir_option(self, dir: str) -> str | list[str]: # type: ignore[override] # Fixed in pypa/distutils#339+ def runtime_library_dir_option(self, dir: str) -> str | list[str]: # XXX Hackish, at the very least. See Python bug #445902:
--- +++ @@ -24,3 +24,2 @@ TypeVar,- Union, overload,@@ -42,4 +41,5 @@ if TYPE_CHECKING:+ from typing import TypeAlias+ from _typeshed import SupportsWrite- from typing_extensions import TypeAlias @@ -47,2 +47,3 @@ from .cmd import Command+ from .extension import Extension @@ -50,3 +51,3 @@ _OptionsList: TypeAlias = list[- Union[tuple[str, Union[str, None], str, int], tuple[str, Union[str, None], str]]+ tuple[str, str | None, str, int] | tuple[str, str | None, str] ]@@ -220,9 +221,9 @@ # Distribution as a convenience to the developer.- self.packages = None+ self.packages: list[str] | None = None self.package_data: dict[str, list[str]] = {}- self.package_dir = None- self.py_modules = None+ self.package_dir: dict[str, str] | None = None+ self.py_modules: list[str] | None = None self.libraries = None self.headers = None- self.ext_modules = None+ self.ext_modules: list[Extension] | None = None self.ext_package = None@@ -231,3 +232,3 @@ self.scripts = None- self.data_files = None+ self.data_files: list[str | tuple] | None = None self.password = ''@@ -1024,9 +1025,9 @@ def has_pure_modules(self) -> bool:- return len(self.packages or self.py_modules or []) > 0+ return bool(self.packages or self.py_modules) def has_ext_modules(self) -> bool:- return self.ext_modules and len(self.ext_modules) > 0+ return bool(self.ext_modules) def has_c_libraries(self) -> bool:- return self.libraries and len(self.libraries) > 0+ return bool(self.libraries) @@ -1036,9 +1037,9 @@ def has_headers(self) -> bool:- return self.headers and len(self.headers) > 0+ return bool(self.headers) def has_scripts(self) -> bool:- return self.scripts and len(self.scripts) > 0+ return bool(self.scripts) def has_data_files(self) -> bool:- return self.data_files and len(self.data_files) > 0+ return bool(self.data_files)
--- +++ @@ -107,3 +107,3 @@ - def has_option(self, long_option):+ def has_option(self, long_option: str) -> bool: """Return true if the option table for this parser has an
--- +++ @@ -1,40 +1,18 @@-import sys--if sys.version_info >= (3, 10):- from test.support.import_helper import (- CleanImport as CleanImport,- )- from test.support.import_helper import (- DirsOnSysPath as DirsOnSysPath,- )- from test.support.os_helper import (- EnvironmentVarGuard as EnvironmentVarGuard,- )- from test.support.os_helper import (- rmtree as rmtree,- )- from test.support.os_helper import (- skip_unless_symlink as skip_unless_symlink,- )- from test.support.os_helper import (- unlink as unlink,- )-else:- from test.support import (- CleanImport as CleanImport,- )- from test.support import (- DirsOnSysPath as DirsOnSysPath,- )- from test.support import (- EnvironmentVarGuard as EnvironmentVarGuard,- )- from test.support import (- rmtree as rmtree,- )- from test.support import (- skip_unless_symlink as skip_unless_symlink,- )- from test.support import (- unlink as unlink,- )+from test.support.import_helper import (+ CleanImport as CleanImport,+)+from test.support.import_helper import (+ DirsOnSysPath as DirsOnSysPath,+)+from test.support.os_helper import (+ EnvironmentVarGuard as EnvironmentVarGuard,+)+from test.support.os_helper import (+ rmtree as rmtree,+)+from test.support.os_helper import (+ skip_unless_symlink as skip_unless_symlink,+)+from test.support.os_helper import (+ unlink as unlink,+)
--- +++ @@ -2,5 +2,7 @@ +import distutils.command.check as _check+import importlib import os+import sys import textwrap-from distutils.command.check import check from distutils.errors import DistutilsSetupError@@ -10,9 +12,30 @@ -try:- import pygments-except ImportError:- pygments = None-- HERE = os.path.dirname(__file__)++[email protected]+def hide_pygments(monkeypatch, request):+ """+ Clear docutils and hide the presence of pygments.+ """+ clear_docutils(monkeypatch)+ monkeypatch.setitem(sys.modules, 'pygments', None)+ reload_check()+ # restore 'check' to its normal state after monkeypatch is undone+ request.addfinalizer(reload_check)+++def clear_docutils(monkeypatch):+ docutils_names = [+ name for name in sys.modules if name.partition('.')[0] == 'docutils'+ ]+ for name in docutils_names:+ monkeypatch.delitem(sys.modules, name)+++def reload_check():+ """+ Reload the 'check' command module to reflect the import state.+ """+ importlib.reload(_check) @@ -28,3 +51,3 @@ pkg_info, dist = self.create_dist(**metadata)- cmd = check(dist)+ cmd = _check.check(dist) cmd.initialize_options()@@ -105,5 +128,4 @@ def test_check_document(self):- pytest.importorskip('docutils') pkg_info, dist = self.create_dist()- cmd = check(dist)+ cmd = _check.check(dist) @@ -120,3 +142,2 @@ def test_check_restructuredtext(self):- pytest.importorskip('docutils') # let's see if it detects broken rest in long_description@@ -124,3 +145,3 @@ pkg_info, dist = self.create_dist(long_description=broken_rest)- cmd = check(dist)+ cmd = _check.check(dist) cmd.check_restructuredtext()@@ -150,12 +171,8 @@ - def test_check_restructuredtext_with_syntax_highlight(self):- pytest.importorskip('docutils')- # Don't fail if there is a `code` or `code-block` directive-- example_rst_docs = [- textwrap.dedent(- """\+ code_examples = [+ textwrap.dedent(+ f""" Here's some code: - .. code:: python+ .. {directive}:: python @@ -164,28 +181,21 @@ """- ),- textwrap.dedent(- """\- Here's some code:-- .. code-block:: python-- def foo():- pass- """- ),- ]-- for rest_with_code in example_rst_docs:- pkg_info, dist = self.create_dist(long_description=rest_with_code)- cmd = check(dist)- cmd.check_restructuredtext()- msgs = cmd._check_rst_data(rest_with_code)- if pygments is not None:- assert len(msgs) == 0- else:- assert len(msgs) == 1- assert (- str(msgs[0][1])- == 'Cannot analyze code. Pygments package not found.'- )+ ).lstrip()+ for directive in ['code', 'code-block']+ ]++ def check_rst_data(self, descr):+ pkg_info, dist = self.create_dist(long_description=descr)+ cmd = _check.check(dist)+ cmd.check_restructuredtext()+ return cmd._check_rst_data(descr)++ @pytest.mark.parametrize('descr', code_examples)+ def test_check_rst_with_syntax_highlight_pygments(self, descr):+ assert self.check_rst_data(descr) == []++ @pytest.mark.parametrize('descr', code_examples)+ def test_check_rst_with_syntax_highlight_no_pygments(self, descr, hide_pygments):+ (msg,) = self.check_rst_data(descr)+ _, exc, _, _ = msg+ assert str(exc) == 'Cannot analyze code. Pygments package not found.'
--- +++ @@ -5,2 +5,3 @@ import re+import sys from distutils import debug, filelist@@ -47,5 +48,5 @@ def test_glob_to_re(self):- sep = os.sep- if os.sep == '\\':- sep = re.escape(os.sep)+ sep = re.escape(os.sep)+ # https://docs.python.org/3/whatsnew/3.14.html#re+ end_of_str_metachar = r"\z" if sys.version_info >= (3, 14) else r"\Z" @@ -53,12 +54,12 @@ # simple cases- ('foo*', r'(?s:foo[^%(sep)s]*)\Z'),- ('foo?', r'(?s:foo[^%(sep)s])\Z'),- ('foo??', r'(?s:foo[^%(sep)s][^%(sep)s])\Z'),+ ('foo*', r'(?s:foo[^%(sep)s]*)%(eos)s'),+ ('foo?', r'(?s:foo[^%(sep)s])%(eos)s'),+ ('foo??', r'(?s:foo[^%(sep)s][^%(sep)s])%(eos)s'), # special cases- (r'foo\\*', r'(?s:foo\\\\[^%(sep)s]*)\Z'),- (r'foo\\\*', r'(?s:foo\\\\\\[^%(sep)s]*)\Z'),- ('foo????', r'(?s:foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s])\Z'),- (r'foo\\??', r'(?s:foo\\\\[^%(sep)s][^%(sep)s])\Z'),+ (r'foo\\*', r'(?s:foo\\\\[^%(sep)s]*)%(eos)s'),+ (r'foo\\\*', r'(?s:foo\\\\\\[^%(sep)s]*)%(eos)s'),+ ('foo????', r'(?s:foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s])%(eos)s'),+ (r'foo\\??', r'(?s:foo\\\\[^%(sep)s][^%(sep)s])%(eos)s'), ):- regex = regex % {'sep': sep}+ regex = regex % {'sep': sep, 'eos': end_of_str_metachar} assert glob_to_re(glob) == regex
--- +++ @@ -45,10 +45,3 @@ def test_get_host_platform(self):- with mock.patch('os.name', 'nt'):- with mock.patch('sys.version', '... [... (ARM64)]'):- assert get_host_platform() == 'win-arm64'- with mock.patch('sys.version', '... [... (ARM)]'):- assert get_host_platform() == 'win-arm32'-- with mock.patch('sys.version_info', (3, 9, 0, 'final', 0)):- assert get_host_platform() == stdlib_sysconfig.get_platform()+ assert get_host_platform() == stdlib_sysconfig.get_platform()
--- +++ @@ -503,3 +503,3 @@ -def is_freethreaded():+def is_freethreaded() -> bool: """Return True if the Python interpreter is built with free threading support."""
--- +++ @@ -1,9 +1,2 @@-import sys--if sys.version_info < (3, 10):- import importlib_metadata as metadata # pragma: no cover-else:- import importlib.metadata as metadata # noqa: F401--+import importlib.metadata as metadata # noqa: F401 import importlib.resources as resources # noqa: F401
--- +++ @@ -5,3 +5,3 @@ import sys-from typing import TYPE_CHECKING, TypeVar, Union+from typing import TYPE_CHECKING, TypeVar @@ -10,6 +10,6 @@ if TYPE_CHECKING:- from typing_extensions import TypeAlias+ from typing import TypeAlias -StrPath: TypeAlias = Union[str, os.PathLike[str]] # Same as _typeshed.StrPath-StrPathT = TypeVar("StrPathT", bound=Union[str, os.PathLike[str]])+StrPath: TypeAlias = str | os.PathLike[str] # Same as _typeshed.StrPath+StrPathT = TypeVar("StrPathT", bound=str | os.PathLike[str])
--- +++ @@ -2,5 +2,5 @@ -from collections.abc import Iterable, Iterator+from collections.abc import Callable, Iterable, Iterator from functools import lru_cache-from typing import TYPE_CHECKING, Callable, TypeVar, Union, overload+from typing import TYPE_CHECKING, TypeVar, overload @@ -10,6 +10,6 @@ if TYPE_CHECKING:- from typing_extensions import TypeAlias+ from typing import TypeAlias _T = TypeVar("_T")-_StrOrIter: TypeAlias = Union[str, Iterable[str]]+_StrOrIter: TypeAlias = str | Iterable[str]
--- +++ @@ -4,3 +4,4 @@ import stat-from typing import Callable, TypeVar+from collections.abc import Callable+from typing import TypeVar
--- +++ @@ -41,3 +41,3 @@ from pathlib import Path-from typing import TYPE_CHECKING, NoReturn, Union+from typing import TYPE_CHECKING, NoReturn @@ -54,3 +54,3 @@ if TYPE_CHECKING:- from typing_extensions import TypeAlias+ from typing import TypeAlias @@ -146,3 +146,3 @@ -_ConfigSettings: TypeAlias = Union[Mapping[str, Union[str, list[str], None]], None]+_ConfigSettings: TypeAlias = Mapping[str, str | list[str] | None] | None """
--- +++ @@ -25,4 +25,5 @@ if TYPE_CHECKING:+ from typing import TypeAlias+ from _typeshed import GenericPath- from typing_extensions import TypeAlias
urllib3 pypi critical-tier YANK ×4BURST ×3
2.2.2
1.26.19
1.26.20
2.2.3
2.3.0
2.4.0
2.5.0
2.6.0
2.6.1
2.6.2
2.6.3
2.7.0
YANK
1.25 marked yanked (still downloadable)
high · registry-verified · 2019-04-22 · 7y ago
YANK
1.25.1 marked yanked (still downloadable)
high · registry-verified · 2019-04-24 · 7y ago
YANK
2.0.0 marked yanked (still downloadable)
high · registry-verified · 2023-04-26 · 3y ago
YANK
2.0.1 marked yanked (still downloadable)
high · registry-verified · 2023-04-30 · 3y ago
BURST
2 releases in 2m: 1.9.1, 1.10
info · registry-verified · 2014-12-14 · 11y ago
BURST
2 releases in 0m: 1.26.17, 2.0.6
info · registry-verified · 2023-10-02 · 2y ago
BURST
2 releases in 0m: 2.0.7, 1.26.18
info · registry-verified · 2023-10-17 · 2y ago
release diff 2.6.3 → 2.7.0
+0 added · -0 removed · ~40 modified
+9 more files not shown
--- +++ @@ -533,4 +533,4 @@ "HTTPConnection.request_chunked() is deprecated and will be removed "- "in urllib3 v2.1.0. Instead use HTTPConnection.request(..., chunked=True).",- category=DeprecationWarning,+ "in urllib3 v3.0. Instead use HTTPConnection.request(..., chunked=True).",+ category=FutureWarning, stacklevel=2,@@ -699,5 +699,5 @@ "HTTPSConnection.set_cert() is deprecated and will be removed "- "in urllib3 v2.1.0. Instead provide the parameters to the "+ "in urllib3 v3.0. Instead provide the parameters to the " "HTTPSConnection constructor.",- category=DeprecationWarning,+ category=FutureWarning, stacklevel=2,
--- +++ @@ -218,4 +218,4 @@ # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.- # We cannot know if the user has added default socket options, so we cannot replace the- # list.+ # Defaulting `socket_options` to an empty list avoids it defaulting to+ # ``HTTPConnection.default_socket_options``. self.conn_kw.setdefault("socket_options", [])@@ -704,4 +704,11 @@ """- parsed_url = parse_url(url)- destination_scheme = parsed_url.scheme+ # Ensure that the URL we're connecting to is properly encoded+ if url.startswith("/"):+ # URLs starting with / are inherently schemeless.+ url = to_str(_encode_target(url))+ destination_scheme = None+ else:+ parsed_url = parse_url(url)+ destination_scheme = parsed_url.scheme+ url = to_str(parsed_url.url) @@ -719,8 +726,2 @@ raise HostChangedError(self, url, retries)-- # Ensure that the URL we're connecting to is properly encoded- if url.startswith("/"):- url = to_str(_encode_target(url))- else:- url = to_str(parsed_url.url) @@ -897,2 +898,14 @@ headers = HTTPHeaderDict(headers)._prepare_for_method_change()++ # Strip headers marked as unsafe to forward to the redirected location.+ # Check remove_headers_on_redirect to avoid a potential network call within+ # self.is_same_host() which may use socket.gethostbyname() in the future.+ if retries.remove_headers_on_redirect and not self.is_same_host(+ redirect_location+ ):+ new_headers = headers.copy() # type: ignore[union-attr]+ for header in headers:+ if header.lower() in retries.remove_headers_on_redirect:+ new_headers.pop(header, None)+ headers = new_headers
--- +++ @@ -143,3 +143,3 @@ )- else:+ else: # Defensive: see https://github.com/urllib3/urllib3/pull/3728#pullrequestreview-3816302703 raise NewConnectionError(
--- +++ @@ -157,4 +157,4 @@ "The 'pool' property is deprecated and will be removed "- "in urllib3 v2.1.0. Use 'conn' instead.",- DeprecationWarning,+ "in urllib3 v3.0. Use 'conn' instead.",+ FutureWarning, stacklevel=2,
--- +++ @@ -47,3 +47,3 @@ .. deprecated:: 2.0.0- Will be removed in urllib3 v2.1.0. This is not valid for+ Will be removed in urllib3 v3.0. This is not valid for ``multipart/form-data`` header parameters.@@ -53,6 +53,6 @@ warnings.warn(- "'format_header_param_rfc2231' is deprecated and will be "- "removed in urllib3 v2.1.0. This is not valid for "+ "'format_header_param_rfc2231' is insecure, deprecated and will be "+ "removed in urllib3 v3.0. This is not valid for " "multipart/form-data header parameters.",- DeprecationWarning,+ FutureWarning, stacklevel=2,@@ -106,3 +106,3 @@ ``format_header_param``. The old names will be removed in- urllib3 v2.1.0.+ urllib3 v3.0. """@@ -120,3 +120,3 @@ Renamed to :func:`format_multipart_header_param`. Will be- removed in urllib3 v2.1.0.+ removed in urllib3 v3.0. """@@ -127,4 +127,4 @@ "'format_multipart_header_param'. The old name will be "- "removed in urllib3 v2.1.0.",- DeprecationWarning,+ "removed in urllib3 v3.0.",+ FutureWarning, stacklevel=2,@@ -138,3 +138,3 @@ Renamed to :func:`format_multipart_header_param`. Will be- removed in urllib3 v2.1.0.+ removed in urllib3 v3.0. """@@ -145,4 +145,4 @@ "'format_multipart_header_param'. The old name will be "- "removed in urllib3 v2.1.0.",- DeprecationWarning,+ "removed in urllib3 v3.0.",+ FutureWarning, stacklevel=2,@@ -167,3 +167,3 @@ The ``header_formatter`` parameter is deprecated and will- be removed in urllib3 v2.1.0.+ be removed in urllib3 v3.0. """@@ -190,4 +190,4 @@ "The 'header_formatter' parameter is deprecated and "- "will be removed in urllib3 v2.1.0.",- DeprecationWarning,+ "will be removed in urllib3 v3.0.",+ FutureWarning, stacklevel=2,
--- +++ @@ -330,4 +330,4 @@ "The 'strict' parameter is no longer needed on Python 3+. "- "This will raise an error in urllib3 v2.1.0.",- DeprecationWarning,+ "This will raise an error in urllib3 v3.0.",+ FutureWarning, )@@ -438,6 +438,6 @@ "URLs without a scheme (ie 'https://') are deprecated and will raise an error "- "in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs "+ "in urllib3 v3.0. To avoid this FutureWarning ensure all URLs " "start with 'https://' or 'http://'. Read more in this issue: " "https://github.com/urllib3/urllib3/issues/2920",- category=DeprecationWarning,+ category=FutureWarning, stacklevel=2,@@ -546,5 +546,6 @@ - resp1 = proxy.request("GET", "https://google.com/")- resp2 = proxy.request("GET", "https://httpbin.org/")-+ resp1 = proxy.request("GET", "http://google.com/")+ resp2 = proxy.request("GET", "http://httpbin.org/")++ # One pool was shared by both plain HTTP requests. print(len(proxy.pools))@@ -555,2 +556,3 @@ + # A separate pool was added for each HTTPS target. print(len(proxy.pools))
--- +++ @@ -665,3 +665,3 @@ # Compatibility methods for `io` module- def readinto(self, b: bytearray) -> int:+ def readinto(self, b: bytearray | memoryview[int]) -> int: temp = self.read(len(b))@@ -757,2 +757,3 @@ self._body = None+ self._uncached_read_occurred = False self._fp: _HttplibHTTPResponse | None = None@@ -799,9 +800,10 @@ try:- self.read(- # Do not spend resources decoding the content unless- # decoding has already been initiated.- decode_content=self._has_decoded_content,- )+ self._raw_read() except (HTTPError, OSError, BaseSSLError, HTTPException): pass+ if self._has_decoded_content:+ # `_raw_read` skips decompression, so we should clean up the+ # decoder to avoid keeping unnecessary data in memory.+ self._decoded_buffer = BytesQueueBuffer()+ self._decoder = None @@ -828,3 +830,3 @@ Obtain the number of bytes pulled over the wire so far. May differ from- the amount of content returned by :meth:``urllib3.response.HTTPResponse.read``+ the amount of content returned by :meth:`HTTPResponse.read` if bytes are encoded on the wire (e.g, compressed).@@ -910,8 +912,4 @@ except BaseSSLError as e:- # FIXME: Is there a better way to differentiate between SSLErrors?- if "read operation timed out" not in str(e):- # SSL errors related to framing/MAC get wrapped and reraised here- raise SSLError(e) from e-- raise ReadTimeoutError(self._pool, None, "Read timed out.") from e # type: ignore[arg-type]+ # SSL errors related to framing/MAC get wrapped and reraised here+ raise SSLError(e) from e @@ -968,7 +966,3 @@ - The known cases:- * CPython < 3.9.7 because of a bug- https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.- * urllib3 injected with pyOpenSSL-backed SSL-support.- * CPython < 3.10 only when `amt` does not fit 32-bit int.+ This happens to urllib3 injected with pyOpenSSL-backed SSL-support. """@@ -983,3 +977,3 @@ )- ) and (util.IS_PYOPENSSL or sys.version_info < (3, 10)):+ ) and util.IS_PYOPENSSL: if read1:@@ -1100,3 +1094,7 @@ - if self._decoder and self._decoder.has_unconsumed_tail:+ if (+ self._decoder+ and self._decoder.has_unconsumed_tail+ and len(self._decoded_buffer) < amt+ ): decoded_data = self._decode(@@ -1112,2 +1110,4 @@ data = self._raw_read(amt)+ if not cache_content:+ self._uncached_read_occurred = True @@ -1124,3 +1124,9 @@ data = self._decode(data, decode_content, flush_decoder)- if cache_content:+ # It's possible that there is buffered decoded data after a+ # partial read.+ if decode_content and len(self._decoded_buffer) > 0:+ self._decoded_buffer.put(data)+ data = self._decoded_buffer.get_all()++ if cache_content and not self._uncached_read_occurred: self._body = data@@ -1212,2 +1218,3 @@ data = self._raw_read(amt, read1=True)+ self._uncached_read_occurred = True if not decode_content or data is None:@@ -1248,2 +1255,5 @@ """+ if amt == 0:+ return+ if self.chunked and self.supports_chunked_reads():@@ -1407,3 +1417,5 @@ - if amt and amt < 0:+ if amt == 0:+ return+ elif amt and amt < 0: # Negative numbers and `None` should be treated the same,@@ -1418,2 +1430,3 @@ self._update_chunk_length()+ self._uncached_read_occurred = True if self.chunk_left == 0:
--- +++ @@ -29,34 +29,4 @@ -def _is_bpo_43522_fixed(- implementation_name: str,- version_info: _TYPE_VERSION_INFO,- pypy_version_info: _TYPE_VERSION_INFO | None,-) -> bool:- """Return True for CPython 3.9.3+ or 3.10+ and PyPy 7.3.8+ where- setting SSLContext.hostname_checks_common_name to False works.-- Outside of CPython and PyPy we don't know which implementations work- or not so we conservatively use our hostname matching as we know that works- on all implementations.-- https://github.com/urllib3/urllib3/issues/2192#issuecomment-821832963- https://foss.heptapod.net/pypy/pypy/-/issues/3539- """- if implementation_name == "pypy":- # https://foss.heptapod.net/pypy/pypy/-/issues/3129- return pypy_version_info >= (7, 3, 8) # type: ignore[operator]- elif implementation_name == "cpython":- major_minor = version_info[:2]- micro = version_info[2]- return (major_minor == (3, 9) and micro >= 3) or major_minor >= (3, 10)- else: # Defensive:- return False-- def _is_has_never_check_common_name_reliable( openssl_version: str,- openssl_version_number: int,- implementation_name: str,- version_info: _TYPE_VERSION_INFO,- pypy_version_info: _TYPE_VERSION_INFO | None, ) -> bool:@@ -65,12 +35,4 @@ is_openssl = openssl_version.startswith("OpenSSL ")- # Before fixing OpenSSL issue #14579, the SSL_new() API was not copying hostflags- # like X509_CHECK_FLAG_NEVER_CHECK_SUBJECT, which tripped up CPython.- # https://github.com/openssl/openssl/issues/14579- # This was released in OpenSSL 1.1.1l+ (>=0x101010cf)- is_openssl_issue_14579_fixed = openssl_version_number >= 0x101010CF-- return is_openssl and (- is_openssl_issue_14579_fixed- or _is_bpo_43522_fixed(implementation_name, version_info, pypy_version_info)- )++ return is_openssl @@ -100,5 +62,5 @@ OPENSSL_VERSION,- OPENSSL_VERSION_NUMBER, PROTOCOL_TLS, PROTOCOL_TLS_CLIENT,+ VERIFY_X509_PARTIAL_CHAIN, VERIFY_X509_STRICT,@@ -112,14 +74,7 @@ - # Needed for Python 3.9 which does not define this- VERIFY_X509_PARTIAL_CHAIN = getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0x80000)-- # Setting SSLContext.hostname_checks_common_name = False didn't work before CPython- # 3.9.3, and 3.10 (but OK on PyPy) or OpenSSL 1.1.1l++ # Setting SSLContext.hostname_checks_common_name = False didn't work with+ # LibreSSL, check details in the used function. if HAS_NEVER_CHECK_COMMON_NAME and not _is_has_never_check_common_name_reliable( OPENSSL_VERSION,- OPENSSL_VERSION_NUMBER,- sys.implementation.name,- sys.version_info,- sys.pypy_version_info if sys.implementation.name == "pypy" else None, # type: ignore[attr-defined]- ): # Defensive: for Python < 3.9.3+ ): # Defensive: HAS_NEVER_CHECK_COMMON_NAME = False@@ -144,3 +99,3 @@ PROTOCOL_TLS_CLIENT = 16 # type: ignore[assignment, misc]- VERIFY_X509_PARTIAL_CHAIN = 0x80000+ VERIFY_X509_PARTIAL_CHAIN = 0x80000 # type: ignore[assignment,misc] VERIFY_X509_STRICT = 0x20 # type: ignore[assignment, misc]@@ -291,4 +246,4 @@ "'ssl_version' option is deprecated and will be "- "removed in urllib3 v2.6.0. Instead use 'ssl_minimum_version'",- category=DeprecationWarning,+ "removed in urllib3 v3.0. Instead use 'ssl_minimum_version'",+ category=FutureWarning, stacklevel=2,@@ -296,8 +251,6 @@ - # PROTOCOL_TLS is deprecated in Python 3.10 so we always use PROTOCOL_TLS_CLIENT context = SSLContext(PROTOCOL_TLS_CLIENT)- if ssl_minimum_version is not None: context.minimum_version = ssl_minimum_version- else: # Python <3.10 defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here+ else: # pyOpenSSL defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here context.minimum_version = TLSVersion.TLSv1_2@@ -361,6 +314,3 @@ - try:- context.hostname_checks_common_name = False- except AttributeError: # Defensive: for CPython < 3.9.3; for PyPy < 7.3.8- pass+ context.hostname_checks_common_name = False
--- +++ @@ -33,3 +33,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int, prefer_jspi: bool) -> None: # type: ignore[no-untyped-def]@@ -68,3 +68,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int, https_port: int, prefer_jspi: bool) -> None: # type: ignore[no-untyped-def]@@ -78,3 +78,5 @@ resp = http.request("GET", f"http://{host}:{port}/")- assert resp.data.decode("utf-8") == "Dummy server!"+ # ensure that the response is cached and can be read multiple times+ for _ in range(2):+ assert resp.data.decode("utf-8") == "Dummy server!" @@ -137,3 +139,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -158,3 +160,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -179,3 +181,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -196,3 +198,3 @@ def test_404(selenium_coverage: typing.Any, testserver_http: PyodideServerInfo) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -220,3 +222,3 @@ ) -> None:- @run_in_pyodide() # type: ignore[misc]+ @run_in_pyodide() # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -312,3 +314,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int, connection_cls: str) -> None: # type: ignore[no-untyped-def]@@ -336,3 +338,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -376,3 +378,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -420,3 +422,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -604,3 +606,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -635,3 +637,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -676,3 +678,3 @@ ) -> None:- @run_in_pyodide(packages=["micropip"]) # type: ignore[misc]+ @run_in_pyodide(packages=["micropip"]) # type: ignore[untyped-decorator] async def test_fn(@@ -704,3 +706,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -820,3 +822,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -864,3 +866,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -884,3 +886,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -905,3 +907,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -940,3 +942,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage: typing.Any, host: str, port: int) -> None:@@ -961,3 +963,3 @@ - @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage: typing.Any, host: str, port: int) -> None:@@ -1002,3 +1004,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int, https_port: int) -> None: # type: ignore[no-untyped-def]@@ -1102,2 +1104,5 @@ assert len(all_data.decode("utf-8")) == 17825792+ # ensure that the content is not cached+ assert response._body is None+ assert response.data == b"" @@ -1149,2 +1154,30 @@ +def test_cache_content_ignored_during_and_after_partial_read(+ selenium_coverage: typing.Any, testserver_http: PyodideServerInfo+) -> None:+ @run_in_pyodide+ def pyodide_test(selenium, host, port): # type: ignore[no-untyped-def]+ from urllib3.connection import HTTPConnection+ from urllib3.response import BaseHTTPResponse++ conn = HTTPConnection(host, port)+ conn.request("GET", f"http://{host}:{port}/dripfeed", preload_content=False)+ response = conn.getresponse()+ assert isinstance(response, BaseHTTPResponse)+ # read some of the data but not all of it+ data = response.read(32768, cache_content=True)+ assert len(data) == 32768+ # check that the cached content is empty+ assert response._body is None+ # ensure the rest of the data is not cached either+ data += response.read(cache_content=True)+ assert len(data) == 17825792+ assert response._body is None+ assert response.data == b""++ pyodide_test(+ selenium_coverage, testserver_http.http_host, testserver_http.http_port+ )++ @pytest.mark.node_without_jspi@@ -1156,3 +1189,3 @@ - @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -1183,3 +1216,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -1206,3 +1239,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -1250,3 +1283,3 @@ ) -> None:- @run_in_pyodide # type: ignore[misc]+ @run_in_pyodide # type: ignore[untyped-decorator] def pyodide_test(selenium_coverage, host: str, port: int) -> None: # type: ignore[no-untyped-def]@@ -1282,3 +1315,3 @@ -@run_in_pyodide # type: ignore[misc]+@run_in_pyodide # type: ignore[untyped-decorator] def test_pool_no_port(selenium_coverage: typing.Any) -> None:
--- +++ @@ -302,10 +302,10 @@ - # When dropping support for Python 3.9, this can be rewritten to parenthesized- # context managers- with mock.patch("urllib3.util.connection.create_connection"):- with mock.patch(+ with (+ mock.patch("urllib3.util.connection.create_connection"),+ mock.patch( "urllib3.connection._HTTPConnection.putheader"- ) as http_client_putheader:- conn = HTTPConnection("")- conn.request("GET", "/headers", headers=headers, chunked=chunked)+ ) as http_client_putheader,+ ):+ conn = HTTPConnection("")+ conn.request("GET", "/headers", headers=headers, chunked=chunked)
--- +++ @@ -594 +594,23 @@ pool._make_request(conn, "", "", timeout=timeout)++ @pytest.mark.parametrize(+ "path",+ [+ "//v:h",+ "//host:8080/path",+ "//host/path",+ "//v:h?key=val",+ "/",+ ],+ )+ def test_paths_arent_parsed_as_urls(self, path: str) -> None:+ """See https://github.com/urllib3/urllib3/issues/3352."""+ with HTTPConnectionPool(host="localhost", port=80) as pool:+ with patch.object(+ pool, "_make_request", return_value=HTTPResponse(status=200)+ ) as mock_request:+ pool.urlopen("GET", path)++ # Verify the URL isn't mangled+ actual_url = mock_request.call_args[0][2]+ assert actual_url == path
--- +++ @@ -79,3 +79,3 @@ err = NewConnectionError(HTTPConnection("localhost"), "test")- with pytest.warns(DeprecationWarning) as records:+ with pytest.warns(FutureWarning) as records: err_pool = err.pool@@ -85,3 +85,3 @@ "The 'pool' property is deprecated and will be removed "- "in urllib3 v2.1.0. Use 'conn' instead."+ "in urllib3 v3.0. Use 'conn' instead." )
--- +++ @@ -74,3 +74,3 @@ ) -> None:- with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+ with pytest.deprecated_call(match=r"urllib3 v3\.0"): param = format_header_param_rfc2231("filename", value)@@ -80,6 +80,6 @@ def test_format_header_param_html5_deprecated(self) -> None:- with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+ with pytest.deprecated_call(match=r"urllib3 v3\.0"): param2 = format_header_param_html5("filename", "name") - with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+ with pytest.deprecated_call(match=r"urllib3 v3\.0"): param1 = format_header_param("filename", "name")@@ -113,3 +113,3 @@ def test_from_tuples_rfc2231(self) -> None:- with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+ with pytest.deprecated_call(match=r"urllib3 v3\.0"): field = RequestField.from_tuples(
--- +++ @@ -263,3 +263,3 @@ def test_deprecated_no_scheme(self, connection_from_host: mock.MagicMock) -> None:- # Don't actually make a network connection, just verify the DeprecationWarning+ # Don't actually make a network connection, just verify the FutureWarning connection_from_host.side_effect = ConnectionError("Not attempting connection")@@ -267,3 +267,3 @@ - with pytest.warns(DeprecationWarning) as records:+ with pytest.warns(FutureWarning) as records: with pytest.raises(ConnectionError):@@ -273,3 +273,3 @@ "URLs without a scheme (ie 'https://') are deprecated and will raise an error "- "in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs "+ "in urllib3 v3.0. To avoid this FutureWarning ensure all URLs " "start with 'https://' or 'http://'. Read more in this issue: "@@ -279,3 +279,3 @@ assert len(records) == 1- assert isinstance(records[0].message, DeprecationWarning)+ assert isinstance(records[0].message, FutureWarning) assert records[0].message.args[0] == msg@@ -293,3 +293,3 @@ }- with pytest.warns(DeprecationWarning) as records:+ with pytest.warns(FutureWarning) as records: p.connection_from_context(context)@@ -298,3 +298,3 @@ "The 'strict' parameter is no longer needed on Python 3+. "- "This will raise an error in urllib3 v2.1.0."+ "This will raise an error in urllib3 v3.0." )
--- +++ @@ -72,7 +72,3 @@ else:- # Needed for Python 3.9 which does not define this- assert not (- context.verify_flags- & getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0x80000)- )+ assert not (context.verify_flags & ssl.VERIFY_X509_PARTIAL_CHAIN) assert not (context.verify_flags & ssl.VERIFY_X509_STRICT)@@ -241,5 +237,5 @@ with pytest.warns(- DeprecationWarning,+ FutureWarning, match=r"'ssl_version' option is deprecated and will be removed in "- r"urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+ r"urllib3 v3\.0\. Instead use 'ssl_minimum_version'", ):
--- +++ @@ -498,3 +498,3 @@ with warnings.catch_warnings():- warnings.simplefilter("error", DeprecationWarning)+ warnings.simplefilter("error", FutureWarning) pool.request("GET", "/redirect", fields={"target": "/"})@@ -1100,6 +1100,6 @@ - with pytest.warns(DeprecationWarning) as w:+ with pytest.warns(FutureWarning) as w: conn.request_chunked("GET", "/headers") # type: ignore[attr-defined] assert len(w) == 1 and str(w[0].message) == (- "HTTPConnection.request_chunked() is deprecated and will be removed in urllib3 v2.1.0. "+ "HTTPConnection.request_chunked() is deprecated and will be removed in urllib3 v3.0. " "Instead use HTTPConnection.request(..., chunked=True)."
--- +++ @@ -763,5 +763,5 @@ cmgr = pytest.warns(- DeprecationWarning,+ FutureWarning, match=r"'ssl_version' option is deprecated and will be removed "- r"in urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+ r"in urllib3 v3\.0\. Instead use 'ssl_minimum_version'", )@@ -773,3 +773,3 @@ conn = VerifiedHTTPSConnection(self.host, self.port)- with pytest.warns(DeprecationWarning) as w:+ with pytest.warns(FutureWarning) as w: conn.set_cert()@@ -777,3 +777,3 @@ assert len(w) == 1 and str(w[0].message) == (- "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v2.1.0. "+ "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v3.0. " "Instead provide the parameters to the HTTPSConnection constructor."@@ -789,3 +789,3 @@ conn = HTTPSConnection(self.host, self.port, ssl_context=ssl_context)- with pytest.warns(DeprecationWarning) as w:+ with pytest.warns(FutureWarning) as w: conn.set_cert()@@ -797,3 +797,3 @@ assert len(w) == 1 and str(w[0].message) == (- "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v2.1.0. "+ "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v3.0. " "Instead provide the parameters to the HTTPSConnection constructor."@@ -830,3 +830,3 @@ with contextlib.closing(https_pool._get_conn()) as conn:- with pytest.warns(DeprecationWarning) as w:+ with pytest.warns(FutureWarning) as w: conn.connect()@@ -834,3 +834,3 @@ assert len(w) >= 1- assert any(x.category == DeprecationWarning for x in w)+ assert any(x.category == FutureWarning for x in w) assert any(@@ -839,3 +839,3 @@ "'ssl_version' option is deprecated and will be removed in "- "urllib3 v2.6.0. Instead use 'ssl_minimum_version'"+ "urllib3 v3.0. Instead use 'ssl_minimum_version'" )@@ -1144,5 +1144,5 @@ with pytest.warns(- DeprecationWarning,+ FutureWarning, match=r"'ssl_version' option is deprecated and will be removed in "- r"urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+ r"urllib3 v3\.0\. Instead use 'ssl_minimum_version'", ):
--- +++ @@ -39,2 +39,3 @@ from urllib3.poolmanager import ProxyManager, proxy_from_url+from urllib3.util.retry import RequestHistory from urllib3.util.ssl_ import create_urllib3_context@@ -301,2 +302,73 @@ assert r._pool.host != self.http_host_alt++ _sensitive_headers = {+ "Authorization": "foo",+ "Proxy-Authorization": "bar",+ "Cookie": "foo=bar",+ }++ @pytest.mark.parametrize(+ "sensitive_headers",+ (_sensitive_headers, {k.lower(): v for k, v in _sensitive_headers.items()}),+ ids=("capitalized", "lowercase"),+ )+ def test_cross_host_redirect_remove_headers_via_proxy_manager(+ self, sensitive_headers: dict[str, str]+ ) -> None:+ headers_url = f"{self.http_url_alt}/headers"+ initial_url = f"{self.http_url}/redirect?target={headers_url}"+ with proxy_from_url(self.proxy_url) as proxy_mgr:+ r = proxy_mgr.request(+ "GET", initial_url, headers=sensitive_headers, retries=1+ )+ assert r.status == 200+ assert r.retries is not None+ assert r.retries.history == (+ RequestHistory(+ method="GET",+ url=initial_url,+ error=None,+ status=303,+ redirect_location=headers_url,+ ),+ )+ data = r.json()+ for header in sensitive_headers:+ assert header not in data++ @pytest.mark.parametrize(+ "sensitive_headers",+ (_sensitive_headers, {k.lower(): v for k, v in _sensitive_headers.items()}),+ ids=("capitalized", "lowercase"),+ )+ def test_cross_host_redirect_remove_headers_via_pool(+ self, sensitive_headers: dict[str, str]+ ) -> None:+ headers_url = f"{self.http_url_alt}/headers"+ initial_url = f"{self.http_url}/redirect?target={headers_url}"+ with proxy_from_url(self.proxy_url) as proxy_mgr:+ pool = proxy_mgr.connection_from_url(self.http_url)+ r = pool.urlopen(+ "GET",+ initial_url,+ headers=sensitive_headers,+ retries=1,+ redirect=True,+ assert_same_host=False,+ preload_content=True,+ )+ assert r.status == 200+ assert r.retries is not None+ assert r.retries.history == (+ RequestHistory(+ method="GET",+ url=initial_url,+ error=None,+ status=303,+ redirect_location=headers_url,+ ),+ )+ data = r.json()+ for header in sensitive_headers:+ assert header not in data
--- +++ @@ -58,2 +58,3 @@ url=scope["path"],+ params=scope["query_string"].decode(), headers=list(scope["headers"]),
--- +++ @@ -31,3 +31,3 @@ b = sock.recv(chunks)- except (TimeoutError, socket.timeout):+ except TimeoutError: continue@@ -104,3 +104,3 @@ break- except (TimeoutError, socket.timeout):+ except TimeoutError: continue
--- +++ @@ -3,3 +3,3 @@ [build-system]-requires = ["hatchling>=1.27.0,<2", "hatch-vcs>=0.4.0,<0.6.0", "setuptools-scm>=8,<10"]+requires = ["hatchling>=1.27.0,<2", "hatch-vcs>=0.4.0,<0.6.0", "setuptools-scm>=8,<11"] build-backend = "hatchling.build"@@ -27,3 +27,2 @@ "Programming Language :: Python :: 3",- "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10",@@ -40,3 +39,3 @@ ]-requires-python = ">=3.9"+requires-python = ">=3.10" dynamic = ["version"]@@ -59,3 +58,3 @@ [dependency-groups]-dev = [+dev-base = [ "anyio[trio]>=4.8.0",@@ -63,3 +62,2 @@ "coverage>=7.8.0",- "cryptography>=44.0.2", "h2>=4.1.0",@@ -67,4 +65,2 @@ "hypercorn",- "idna>=3.10",- "pyopenssl>=25.0.0", "pysocks>=1.7.1",@@ -77,4 +73,23 @@ "towncrier>=24.8.0",+ "trio>=0.27.0",+]+dev = [+ {include-group = "dev-base"},+ "cryptography>=44.0.2",+ "idna>=3.10",+ "pyopenssl>=25.0.0", "trustme>=1.2.1",- "trio>=0.27.0",+]+dev-min-pyopenssl = [+ {include-group = "dev-base"},+ # 19.0.0 (2019-01-21) was the first version to support OpenSSL 1.1.1.+ # The following versions of pyOpenSSL and cryptography are documented+ # as the minimum supported ones in our docs.+ "pyopenssl==19.0.0",+ "cryptography==2.3",+ # We document 2.1 as the minimum supported version of idna from+ # cryptography, but 2.8 is the minimum needed for tests because of anyio.+ "idna==2.8",+ # The last version of trustme to support cryptography < 3.1.+ "trustme==0.9.0", ]@@ -98,3 +113,3 @@ "build>=1.2.2.post1",- "pytest-pyodide>=0.58.4 ; python_full_version >= '3.10'",+ "pytest-pyodide>=0.58.4", "selenium>=4.27.1",@@ -164,3 +179,3 @@ # https://github.com/SeleniumHQ/selenium/issues/14686- '''default:setting remote_server_addr in RemoteConnection\(\) is deprecated, set in ClientConfig instance instead:DeprecationWarning'''+ '''default:setting remote_server_addr in RemoteConnection\(\) is deprecated, set in ClientConfig instance instead:FutureWarning''' ]@@ -194,2 +209,12 @@ package = true+conflicts = [+ [+ {group = "dev"},+ {group = "dev-min-pyopenssl"},+ ],+ [+ {group = "dev-min-pyopenssl"},+ {group = "mypy"},+ ],+]
--- +++ @@ -8,3 +8,5 @@ -_TYPE_BODY = typing.Union[bytes, typing.IO[typing.Any], typing.Iterable[bytes], str]+_TYPE_BODY = typing.Union[+ bytes, typing.IO[typing.Any], typing.Iterable[bytes | str], str+]
--- +++ @@ -358,3 +358,2 @@ elif isinstance(other, typing.Iterable):- other = typing.cast(typing.Iterable[tuple[str, str]], other) for key, value in other:
--- +++ @@ -1,3 +1,4 @@-# file generated by setuptools-scm+# file generated by vcs-versioning # don't change, don't track in version control+from __future__ import annotations @@ -12,22 +13,11 @@ -TYPE_CHECKING = False-if TYPE_CHECKING:- from typing import Tuple- from typing import Union-- VERSION_TUPLE = Tuple[Union[int, str], ...]- COMMIT_ID = Union[str, None]-else:- VERSION_TUPLE = object- COMMIT_ID = object- version: str __version__: str-__version_tuple__: VERSION_TUPLE-version_tuple: VERSION_TUPLE-commit_id: COMMIT_ID-__commit_id__: COMMIT_ID+__version_tuple__: tuple[int | str, ...]+version_tuple: tuple[int | str, ...]+commit_id: str | None+__commit_id__: str | None -__version__ = version = '2.6.3'-__version_tuple__ = version_tuple = (2, 6, 3)+__version__ = version = '2.7.0'+__version_tuple__ = version_tuple = (2, 7, 0)
--- +++ @@ -38,2 +38,3 @@ self._body = None+ self._uncached_read_occurred = False self._response = internal_response@@ -162,6 +163,9 @@ data = self._response.body.read(amt)+ self._uncached_read_occurred = True else: # read all we can (and cache it) data = self._response.body.read()- if cache_content:+ if cache_content and not self._uncached_read_occurred: self._body = data+ else:+ self._uncached_read_occurred = True if self.length_remaining is not None:
aiobotocore pypi critical-tier BURST ×2
3.0.0
3.1.0
3.1.1
3.1.2
3.1.3
3.2.0
3.2.1
3.3.0
3.4.0
3.5.0
3.6.0
3.7.0
BURST
2 releases in 29m: 2.1.2, 2.5.2
info · registry-verified · 2023-07-07 · 3y ago
BURST
2 releases in 27m: 2.10.0, 2.11.0
info · registry-verified · 2024-01-19 · 2y ago
release diff 3.6.0 → 3.7.0
+1 added · -0 removed · ~12 modified
--- +++ @@ -554,2 +554,9 @@ +def _run_credential_process_sync(process_list):+ # Synchronous fallback for event loops that don't implement+ # subprocess transports. Caller runs this via ``asyncio.to_thread``.+ p = subprocess.run(process_list, capture_output=True, check=False)+ return p.stdout, p.stderr, p.returncode++ class AioProcessProvider(ProcessProvider):@@ -585,7 +592,19 @@ process_list = compat_shell_split(credential_process)- p = await self._popen(- *process_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE- )- stdout, stderr = await p.communicate()- if p.returncode != 0:+ try:+ p = await self._popen(+ *process_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE+ )+ stdout, stderr = await p.communicate()+ returncode = p.returncode+ except NotImplementedError:+ # Some event loops don't implement subprocess transports —+ # notably ``asyncio.SelectorEventLoop`` on Windows, which+ # users select when integrating with libraries that don't+ # support the Proactor loop (e.g. ``psycopg``). Fall back+ # to running the credential process synchronously in a+ # worker thread so the loop stays unblocked. (#1415)+ stdout, stderr, returncode = await asyncio.to_thread(+ _run_credential_process_sync, process_list+ )+ if returncode != 0: raise CredentialRetrievalError(@@ -777,2 +796,6 @@ async def load(self):+ # Reset visited profiles on each load() call to avoid false positives+ # when multiple async tasks concurrently call load() on the same provider+ # instance and one task's _visited_profiles state leaks into another.+ self._visited_profiles = [self._profile_name] self._loaded_config = self._load_config()
--- +++ @@ -2,2 +2,2 @@ -__version__ = '3.6.0'+__version__ = '3.7.0'
--- +++ @@ -46,2 +46,3 @@ http_session_cls: type[_HttpSessionType] = DEFAULT_HTTP_SESSION_CLS,+ warm_up_loader_caches: bool = False, **kwargs,@@ -54,2 +55,3 @@ self.http_session_cls: type[_HttpSessionType] = http_session_cls+ self.warm_up_loader_caches: bool = warm_up_loader_caches self._validate_connector_args(
--- +++ @@ -1 +1,4 @@+import asyncio+import contextlib+ from botocore import UNSIGNED, translate@@ -127,2 +130,45 @@ return service_data++ def warm_up_loader_caches(+ self,+ service_name: str | None = None,+ api_version: str | None = None,+ ):+ loader = self.get_component('data_loader')++ # load generic data+ loader.load_data_with_path('_retry')+ loader.load_data_with_path('endpoints')+ loader.load_data_with_path('partitions')+ loader.load_data_with_path('sdk-default-configuration')+ services = loader.list_available_services(type_name='service-2')++ # load service-specific data+ for service_name in (service_name,) if service_name else services:+ # from session.py+ loader.load_service_model(+ service_name, type_name='service-2', api_version=api_version+ )+ with contextlib.suppress(UnknownServiceError):+ loader.load_service_model(+ service_name, 'paginators-1', api_version+ )+ with contextlib.suppress(UnknownServiceError):+ loader.load_service_model(+ service_name, 'waiters-2', api_version+ )++ # from client.py+ loader.load_service_model(+ service_name, 'service-2', api_version=api_version+ )+ loader.load_service_model(+ service_name, 'endpoint-rule-set-1', api_version=api_version+ )++ # from docs/service.py+ with contextlib.suppress(UnknownServiceError):+ loader.load_service_model(+ service_name, 'examples-1', api_version+ ) @@ -169,2 +215,8 @@ loader = self.get_component('data_loader')++ if getattr(config, 'warm_up_loader_caches', False):+ await asyncio.to_thread(+ self.warm_up_loader_caches, service_name, api_version+ )+ event_emitter = self.get_component('event_emitter')
--- +++ @@ -75,2 +75,3 @@ "pre-commit >= 3.5.0, < 5",+ "pytest-mock >= 3.14.1, < 4", # Used in test_session.py "pytest-rerunfailures >= 16.0.1, < 17", # Used in test_lambda.py@@ -99,2 +100,5 @@ anyio_mode = "auto"+# So tests can ``from scripts.changelog import ...`` (the centralized+# CHANGES.rst parser shared with .github/workflows/auto-release-on-merge.yml).+pythonpath = ["."] markers = [
--- +++ @@ -187 +187,18 @@ await s3_client.get_object(Bucket='foo', Key='bar')++[email protected](+ "warm_up_loader_caches, expected",+ [+ (None, False),+ (False, False),+ (True, True),+ ],+)+def test_config_warm_up_loader_caches(warm_up_loader_caches, expected):+ if warm_up_loader_caches is None:+ config = AioConfig()+ else:+ config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)++ assert config.warm_up_loader_caches is expected
--- +++ @@ -0,0 +1,57 @@+import asyncio+from unittest import mock++from aiobotocore import credentials+++async def test_assumerolecredprovider_concurrent_load_no_race_condition():+ """Regression test for https://github.com/aio-libs/aiobotocore/issues/1455.++ When multiple async tasks share the same AioAssumeRoleProvider and call+ load() concurrently, _visited_profiles must not leak between tasks.+ Without the fix, a second task entering load() while the first task is+ awaiting inside _resolve_credentials_from_profile would see the first+ task's _visited_profiles entries and raise InfiniteLoopConfigError.+ """+ fake_config = {+ 'profiles': {+ 'a': {+ 'role_arn': 'arn:aws:iam::123456789012:role/RoleA',+ 'source_profile': 'b',+ },+ 'b': {+ 'aws_access_key_id': 'akid',+ 'aws_secret_access_key': 'skid',+ },+ }+ }++ # A mock provider whose load() yields control via asyncio.sleep(0),+ # allowing another task to interleave and expose the race condition.+ static_creds = credentials.AioCredentials('akid', 'skid')++ class _YieldingProvider:+ METHOD = 'mock-static'+ CANONICAL_NAME = None++ async def load(self):+ await asyncio.sleep(0)+ return static_creds++ mock_builder = mock.Mock()+ mock_builder.providers.return_value = [_YieldingProvider()]++ # client_creator is never invoked: load() returns AioDeferredRefreshableCredentials+ # without calling STS, so a bare Mock() is sufficient.+ provider = credentials.AioAssumeRoleProvider(+ lambda: fake_config,+ mock.Mock(),+ cache={},+ profile_name='a',+ profile_provider_builder=mock_builder,+ )++ # Both tasks must succeed; without the fix the second task raises+ # InfiniteLoopConfigError because it sees 'b' already in _visited_profiles.+ results = await asyncio.gather(provider.load(), provider.load())+ assert all(r is not None for r in results)
--- +++ @@ -1 +1,2 @@+import itertools import logging@@ -56 +57,193 @@ assert session.user_agent_extra.startswith("botocore/")++[email protected](+ "service_name, api_version",+ [+ (None, None),+ ("iot", None),+ ("s3", None),+ ("s3", "2006-03-01"),+ ("ec2", "2016-11-16"),+ ],+)+def test_warm_up_loader_caches(+ session: AioSession, service_name, api_version, mocker+):+ if service_name is None:+ services = [+ "ec2",+ "iot",+ "s3",+ ]+ else:+ services = [service_name]++ loader = mocker.Mock()+ get_component = mocker.patch.object(+ session, "get_component", return_value=loader+ )+ loader.list_available_services.return_value = services++ session.warm_up_loader_caches(service_name, api_version)++ get_component.assert_called_once_with("data_loader")+ assert loader.mock_calls == [+ # generic calls+ mocker.call.load_data_with_path("_retry"),+ mocker.call.load_data_with_path("endpoints"),+ mocker.call.load_data_with_path("partitions"),+ mocker.call.load_data_with_path("sdk-default-configuration"),+ mocker.call.list_available_services(type_name="service-2"),+ # service-specific calls+ *itertools.chain.from_iterable(+ (+ mocker.call.load_service_model(+ service_name,+ type_name="service-2",+ api_version=api_version,+ ),+ mocker.call.load_service_model(+ service_name, "paginators-1", api_version+ ),+ mocker.call.load_service_model(+ service_name, "waiters-2", api_version+ ),+ mocker.call.load_service_model(+ service_name, "service-2", api_version=api_version+ ),+ mocker.call.load_service_model(+ service_name,+ "endpoint-rule-set-1",+ api_version=api_version,+ ),+ mocker.call.load_service_model(+ service_name, "examples-1", api_version+ ),+ )+ for service_name in services+ ),+ ]++[email protected](+ "service_name",+ # services without a ``waiters-2``, ``paginators-1``, or ``examples-1``+ # data file exercise the ``UnknownServiceError`` suppression in+ # ``warm_up_loader_caches``. ``iot`` lacks ``waiters-2``;+ # ``accessanalyzer`` lacks ``waiters-2`` and ``examples-1``.+ ["iot", "accessanalyzer"],+)+def test_warm_up_loader_caches_optional_models(+ session: AioSession, service_name: str+):+ # uses the real loader; must not raise for services missing optional models+ session.warm_up_loader_caches(service_name)++[email protected](+ "warm_up_loader_caches",+ [False, True],+)+async def test_warm_up_loader_caches_config(+ session: AioSession,+ warm_up_loader_caches: bool,+ mocker,+):+ config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)+ mocker.patch.object(+ session, "warm_up_loader_caches", wraps=session.warm_up_loader_caches+ )++ async with session.create_client(+ "s3",+ config=config,+ aws_secret_access_key="xxx",+ aws_access_key_id="xxx",+ ):+ pass++ if warm_up_loader_caches:+ session.warm_up_loader_caches.assert_called_once_with("s3", None)+ else:+ session.warm_up_loader_caches.assert_not_called()++[email protected](+ "warm_up_loader_caches",+ [False, True],+)+async def test_non_blocking_create_client(+ session: AioSession,+ warm_up_loader_caches: bool,+ mocker,+):+ config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)+ loader = session.get_component("data_loader")+ file_loader = mocker.patch.object(+ loader, "file_loader", wraps=loader.file_loader+ )+ # perform implicit warm-up, while avoiding any other file I/O by stubbing relevant codepathes+ session._internal_components.lazy_register_component(+ 'endpoint_resolver', lambda: None+ )+ mocker.patch.object(+ session, "_resolve_defaults_mode", return_value="legacy"+ )+ client_creator_cls_mock = mocker.patch(+ "aiobotocore.session.AioClientCreator", autospec=True+ )++ async with session.create_client(+ "s3",+ config=config,+ aws_secret_access_key="xxx",+ aws_access_key_id="xxx",+ ):+ pass++ if warm_up_loader_caches:+ # warm-up triggered file I/O (non-blocking)+ file_loader.exists.assert_called()+ file_loader.load_file.assert_called()+ else:+ # no file I/O+ file_loader.exists.assert_not_called()+ file_loader.load_file.assert_not_called()++ mocker.stop(client_creator_cls_mock)+ session._register_endpoint_resolver()+ file_loader.reset_mock()++ # regular client creation #1+ async with session.create_client(+ "s3",+ config=config,+ aws_secret_access_key="xxx",+ aws_access_key_id="xxx",+ ):+ pass++ if warm_up_loader_caches:+ # no file I/O+ file_loader.exists.assert_not_called()+ file_loader.load_file.assert_not_called()+ else:+ # file I/O (blocking)+ file_loader.exists.assert_called()+ file_loader.load_file.assert_called()++ file_loader.reset_mock()++ # regular client creation #2+ async with session.create_client(+ "s3",+ config=config,+ aws_secret_access_key="xxx",+ aws_access_key_id="xxx",+ ):+ pass++ # no file I/O+ file_loader.exists.assert_not_called()+ file_loader.load_file.assert_not_called()
--- +++ @@ -1,9 +1,3 @@-import re-from datetime import datetime from pathlib import Path -import docutils.frontend-import docutils.nodes-import docutils.parsers.rst-import docutils.utils from packaging import version@@ -11,2 +5,3 @@ import aiobotocore+from scripts.changelog import parse, validate @@ -15,59 +10,27 @@ -# date can be YYYY-MM-DD or "TBD"-_rst_ver_date_str_re = re.compile(- r'(?P<version>\d+\.\d+\.\d+(\.dev\d+)?) \((?P<date>\d{4}-\d{2}-\d{2}|TBD)\)'-)---# from: https://stackoverflow.com/a/75996218-def _parse_rst(text: str) -> docutils.nodes.document:- parser = docutils.parsers.rst.Parser()- settings = docutils.frontend.get_default_settings(- docutils.parsers.rst.Parser- )- document = docutils.utils.new_document('<rst-doc>', settings=settings)- parser.parse(text, document)- return document-- def test_release_versions():- # ensures versions in CHANGES.rst + __init__.py match+ # Cross-checks the top entry of CHANGES.rst against+ # aiobotocore/__init__.py and the entry below it. The CHANGES.rst+ # parser + format invariants live in scripts/changelog.py so the+ # auto-release workflow can use the same logic without installing+ # the project's dev deps. init_version = version.parse(aiobotocore.__version__)-- # the init version should be in canonical from+ # init version should be in canonical form assert str(init_version) == aiobotocore.__version__ - changes_path = _root_path / 'CHANGES.rst'- changes_doc = _parse_rst(changes_path.read_text())+ changes_text = (_root_path / 'CHANGES.rst').read_text(encoding='utf-8') - rst_ver_str = changes_doc[0][1][0][0] # ex: 0.11.1 (2020-01-03)- rst_prev_ver_str = changes_doc[0][2][0][0]+ # Format invariants: top entry version matches __init__.py, top+ # entry's version > previous entry's version, dates are non-+ # increasing (or TBD).+ validate(changes_text, expected_top_version=aiobotocore.__version__) - rst_ver_groups = _rst_ver_date_str_re.match(rst_ver_str)- rst_prev_ver_groups = _rst_ver_date_str_re.match(rst_prev_ver_str)-- rst_ver = version.parse(rst_ver_groups['version'])- rst_prev_ver = version.parse(rst_prev_ver_groups['version'])-- # first the init version should match the rst version- assert init_version == rst_ver-- # the current version must be greater than the previous version- assert rst_ver > rst_prev_ver-- rst_date = rst_ver_groups['date']- rst_prev_date = rst_prev_ver_groups['date']-- if rst_date == 'TBD':- # TODO: we can now lock if we're a prerelease version- pass- # assert (- # rst_ver.is_prerelease- # ), 'Version must be prerelease if final release date not set'- else:- rst_date = datetime.strptime(rst_date, '%Y-%m-%d').date()- rst_prev_date = datetime.strptime(rst_prev_date, '%Y-%m-%d').date()-- assert rst_date >= rst_prev_date, (- 'Current release must be after last release'- )+ # Stronger version-ordering check using packaging's PEP 440 parser+ # (catches edge cases like 1.2.3rc1 vs 1.2.3 that the simple tuple+ # comparison in scripts/changelog.py treats differently).+ entries = parse(changes_text)+ assert len(entries) >= 2, 'CHANGES.rst should have at least two entries'+ top, prev = entries[0], entries[1]+ assert version.parse(top.version) > version.parse(prev.version), (+ f'top entry {top.version} should be > previous {prev.version}'+ )
boto3 pypi critical-tier BURSTINSTALL-EXEC
1.43.35
1.43.36
1.43.37
1.43.38
1.43.39
1.43.40
1.43.41
1.43.42
1.43.43
1.43.44
1.43.45
1.43.46
BURST
2 releases in 36m: 1.2.0, 1.2.1
info · registry-verified · 2015-10-23 · 10y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 1.43.45 → 1.43.46
+0 added · -0 removed · ~6 modified
--- +++ @@ -20,3 +20,3 @@ __author__ = 'Amazon Web Services'-__version__ = '1.43.45'+__version__ = '1.43.46'
--- +++ @@ -5,3 +5,3 @@ requires_dist = - botocore>=1.43.45,<1.44.0+ botocore>=1.43.46,<1.44.0 jmespath>=0.7.1,<2.0.0
--- +++ @@ -16,3 +16,3 @@ requires = [- 'botocore>=1.43.45,<1.44.0',+ 'botocore>=1.43.46,<1.44.0', 'jmespath>=0.7.1,<2.0.0',
botocore pypi critical-tier BURST ×2
1.43.35
1.43.36
1.43.37
1.43.38
1.43.39
1.43.40
1.43.41
1.43.42
1.43.43
1.43.44
1.43.45
1.43.46
BURST
2 releases in 14m: 0.13.0, 0.13.1
info · registry-verified · 2013-07-18 · 12y ago
BURST
2 releases in 4m: 0.15.0, 0.15.1
info · registry-verified · 2013-08-23 · 12y ago
release diff 1.43.45 → 1.43.46
+0 added · -0 removed · ~12 modified
--- +++ @@ -19,3 +19,3 @@ -__version__ = '1.43.45'+__version__ = '1.43.46'
--- +++ @@ -1058,2 +1058,6 @@ "members":{+ "AnomalyDetectorId":{+ "shape":"AnomalyDetectorId",+ "documentation":"<p>The unique identifier of the anomaly detector.</p> <note> <p>The identifier does not restrict access to a specific anomaly detector in an IAM policy. Permissions for anomaly detector operations apply to all anomaly detectors in the account.</p> </note>"+ }, "Namespace":{@@ -1122,2 +1126,13 @@ "member":{"shape":"Range"}+ },+ "AnomalyDetectorId":{+ "type":"string",+ "max":128,+ "min":1,+ "pattern":"[A-Za-z0-9_./:%()+-]+"+ },+ "AnomalyDetectorIds":{+ "type":"list",+ "member":{"shape":"AnomalyDetectorId"},+ "max":50 },@@ -1541,2 +1556,6 @@ "members":{+ "AnomalyDetectorId":{+ "shape":"AnomalyDetectorId",+ "documentation":"<p>Specifies the unique identifier of the anomaly detector to delete. If you specify this parameter, you do not need to specify a metric to identify the detector.</p>"+ }, "Namespace":{@@ -1819,2 +1838,6 @@ "members":{+ "AnomalyDetectorIds":{+ "shape":"AnomalyDetectorIds",+ "documentation":"<p>Specifies the unique identifiers of the anomaly detectors to describe. You can specify up to 50 identifiers. If you specify this parameter, you cannot also specify the <code>Namespace</code>, <code>MetricName</code>, <code>Dimensions</code>, or <code>AnomalyDetectorTypes</code> metric filters.</p>"+ }, "NextToken":{@@ -4029,3 +4052,8 @@ "type":"structure",- "members":{}+ "members":{+ "AnomalyDetectorId":{+ "shape":"AnomalyDetectorId",+ "documentation":"<p>The unique identifier of the anomaly detector that you created or updated.</p>"+ }+ } },
--- +++ @@ -47871,3 +47871,196 @@ "m8id.metal-96xl",- "hpc8a.96xlarge"+ "hpc8a.96xlarge",+ "c8in.large",+ "c8in.xlarge",+ "c8in.2xlarge",+ "c8in.4xlarge",+ "c8in.8xlarge",+ "c8in.12xlarge",+ "c8in.16xlarge",+ "c8in.24xlarge",+ "c8in.32xlarge",+ "c8in.48xlarge",+ "c8in.96xlarge",+ "c8in.metal-48xl",+ "c8in.metal-96xl",+ "c8ib.large",+ "c8ib.xlarge",+ "c8ib.2xlarge",+ "c8ib.4xlarge",+ "c8ib.8xlarge",+ "c8ib.12xlarge",+ "c8ib.16xlarge",+ "c8ib.24xlarge",+ "c8ib.32xlarge",+ "c8ib.48xlarge",+ "c8ib.96xlarge",+ "c8ib.metal-48xl",+ "c8ib.metal-96xl",+ "r8in.large",+ "r8in.xlarge",+ "r8in.2xlarge",+ "r8in.4xlarge",+ "r8in.8xlarge",+ "r8in.12xlarge",+ "r8in.16xlarge",+ "r8in.24xlarge",+ "r8in.32xlarge",+ "r8in.48xlarge",+ "r8in.96xlarge",+ "r8ib.large",+ "r8ib.xlarge",+ "r8ib.2xlarge",+ "r8ib.4xlarge",+ "r8ib.8xlarge",+ "r8ib.12xlarge",+ "r8ib.16xlarge",+ "r8ib.24xlarge",+ "r8ib.32xlarge",+ "r8ib.48xlarge",+ "r8ib.96xlarge",+ "m8in.large",+ "m8in.xlarge",+ "m8in.2xlarge",+ "m8in.4xlarge",+ "m8in.8xlarge",+ "m8in.12xlarge",+ "m8in.16xlarge",+ "m8in.24xlarge",+ "m8in.32xlarge",+ "m8in.48xlarge",+ "m8in.96xlarge",+ "m8ib.large",+ "m8ib.xlarge",+ "m8ib.2xlarge",+ "m8ib.4xlarge",+ "m8ib.8xlarge",+ "m8ib.12xlarge",+ "m8ib.16xlarge",+ "m8ib.24xlarge",+ "m8ib.32xlarge",+ "m8ib.48xlarge",+ "m8ib.96xlarge",+ "m8ine.large",+ "m8ine.xlarge",+ "m8ine.2xlarge",+ "m8ine.4xlarge",+ "m8ine.8xlarge",+ "m8ine.12xlarge",+ "c8ine.large",+ "c8ine.xlarge",+ "c8ine.2xlarge",+ "c8ine.4xlarge",+ "c8ine.8xlarge",+ "c8ine.12xlarge",+ "m8idn.large",+ "m8idn.xlarge",+ "m8idn.2xlarge",+ "m8idn.4xlarge",+ "m8idn.8xlarge",+ "m8idn.12xlarge",+ "m8idn.16xlarge",+ "m8idn.24xlarge",+ "m8idn.32xlarge",+ "m8idn.48xlarge",+ "m8idn.96xlarge",+ "r8idn.large",+ "r8idn.xlarge",+ "r8idn.2xlarge",+ "r8idn.4xlarge",+ "r8idn.8xlarge",+ "r8idn.12xlarge",+ "r8idn.16xlarge",+ "r8idn.24xlarge",+ "r8idn.32xlarge",+ "r8idn.48xlarge",+ "r8idn.96xlarge",+ "m8idb.large",+ "m8idb.xlarge",+ "m8idb.2xlarge",+ "m8idb.4xlarge",+ "m8idb.8xlarge",+ "m8idb.12xlarge",+ "m8idb.16xlarge",+ "m8idb.24xlarge",+ "m8idb.32xlarge",+ "m8idb.48xlarge",+ "m8idb.96xlarge",+ "r8idb.large",+ "r8idb.xlarge",+ "r8idb.2xlarge",+ "r8idb.4xlarge",+ "r8idb.8xlarge",+ "r8idb.12xlarge",+ "r8idb.16xlarge",+ "r8idb.24xlarge",+ "r8idb.32xlarge",+ "r8idb.48xlarge",+ "r8idb.96xlarge",+ "mac-m3ultra.metal",+ "m9g.large",+ "m9g.xlarge",+ "m9g.2xlarge",+ "m9g.4xlarge",+ "m9g.8xlarge",+ "m9g.12xlarge",+ "m9g.16xlarge",+ "m9g.24xlarge",+ "m9g.48xlarge",+ "m9g.metal-24xl",+ "m9g.metal-48xl",+ "m9gd.large",+ "m9gd.xlarge",+ "m9gd.2xlarge",+ "m9gd.4xlarge",+ "m9gd.8xlarge",+ "m9gd.12xlarge",+ "m9gd.16xlarge",+ "m9gd.24xlarge",+ "m9gd.48xlarge",+ "m9gd.metal-24xl",+ "m9gd.metal-48xl",+ "r8in.metal-48xl",+ "r8in.metal-96xl",+ "r8ib.metal-48xl",+ "r8ib.metal-96xl",+ "r8idn.metal-48xl",+ "r8idn.metal-96xl",+ "r8idb.metal-48xl",+ "r8idb.metal-96xl",+ "m8in.metal-48xl",+ "m8in.metal-96xl",+ "m8ib.metal-48xl",+ "m8ib.metal-96xl",+ "m8idn.metal-48xl",+ "m8idn.metal-96xl",+ "m8idb.metal-48xl",+ "m8idb.metal-96xl",+ "g7.2xlarge",+ "g7.4xlarge",+ "g7.8xlarge",+ "g7.12xlarge",+ "g7.24xlarge",+ "g7.48xlarge",+ "c9g.medium",+ "c9g.large",+ "c9g.xlarge",+ "c9g.2xlarge",+ "c9g.4xlarge",+ "c9g.8xlarge",+ "c9g.12xlarge",+ "c9g.16xlarge",+ "c9g.24xlarge",+ "c9g.48xlarge",+ "c9g.metal-48xl",+ "c9gd.medium",+ "c9gd.large",+ "c9gd.xlarge",+ "c9gd.2xlarge",+ "c9gd.4xlarge",+ "c9gd.8xlarge",+ "c9gd.12xlarge",+ "c9gd.16xlarge",+ "c9gd.24xlarge",+ "c9gd.48xlarge",+ "c9gd.metal-48xl" ]
--- +++ @@ -2987,2 +2987,3 @@ "ap-southeast-5" : { },+ "ap-southeast-6" : { }, "ap-southeast-7" : { },
--- +++ @@ -6133,3 +6133,5 @@ "DAYS_90",- "DAYS_180"+ "DAYS_180",+ "DAYS_3",+ "DAYS_7" ]@@ -6165,3 +6167,5 @@ "DAYS_60",- "DAYS_90"+ "DAYS_90",+ "DAYS_3",+ "DAYS_7" ]
--- +++ @@ -2198,3 +2198,7 @@ },- "PropagateTags":{"shape":"PropagateTags"}+ "PropagateTags":{"shape":"PropagateTags"},+ "TelemetryConfig":{+ "shape":"CapacityProviderTelemetryConfig",+ "documentation":"<p>The telemetry configuration for the capacity provider, including logging settings.</p>"+ } },@@ -2234,2 +2238,16 @@ "exception":true+ },+ "CapacityProviderLoggingConfig":{+ "type":"structure",+ "members":{+ "SystemLogLevel":{+ "shape":"SystemLogLevel",+ "documentation":"<p>Set this property to filter the system logs for your capacity provider that Lambda sends to CloudWatch. Lambda only sends system logs at the selected level of detail and lower, where <code>DEBUG</code> is the highest level and <code>WARN</code> is the lowest.</p>"+ },+ "LogGroup":{+ "shape":"LogGroup",+ "documentation":"<p>The name of the Amazon CloudWatch log group the capacity provider sends logs to. By default, Lambda capacity providers send logs to a default log group named <code>/aws/lambda/capacity-provider/<capacity provider name></code>. To use a different log group, enter an existing log group or enter a new log group name.</p>"+ }+ },+ "documentation":"<p>The capacity provider's Amazon CloudWatch Logs configuration settings.</p>" },@@ -2314,2 +2332,12 @@ },+ "CapacityProviderTelemetryConfig":{+ "type":"structure",+ "members":{+ "LoggingConfig":{+ "shape":"CapacityProviderLoggingConfig",+ "documentation":"<p>The capacity provider's Amazon CloudWatch Logs configuration settings.</p>"+ }+ },+ "documentation":"<p>Configuration that specifies the telemetry collection for the capacity provider.</p>"+ }, "CapacityProviderVpcConfig":{@@ -2857,2 +2885,6 @@ "documentation":"<p>The tag propagation configuration for the capacity provider. Specifies tags to apply to managed resources at launch.</p>"+ },+ "TelemetryConfig":{+ "shape":"CapacityProviderTelemetryConfig",+ "documentation":"<p>The telemetry configuration for the capacity provider. Specifies logging settings for managed resources.</p>" }@@ -5998,2 +6030,30 @@ },+ "LogType":{+ "shape":"LogType",+ "documentation":"<p>Set to <code>Tail</code> to include the execution log in the response. Applies to synchronously invoked functions only.</p>",+ "location":"header",+ "locationName":"X-Amz-Log-Type"+ },+ "ClientContext":{+ "shape":"String",+ "documentation":"<p>Up to 3,583 bytes of base64-encoded data about the invoking client to pass to the function in the context object.</p>",+ "location":"header",+ "locationName":"X-Amz-Client-Context"+ },+ "Qualifier":{+ "shape":"NumericLatestPublishedOrAliasQualifier",+ "documentation":"<p>The alias name.</p>",+ "location":"querystring",+ "locationName":"Qualifier"+ },+ "Payload":{+ "shape":"Blob",+ "documentation":"<p>The JSON that you want to provide to your Lambda function as input.</p> <p>You can enter the JSON directly. For example, <code>--payload '{ \"key\": \"value\" }'</code>. You can also specify a file path. For example, <code>--payload file://payload.json</code>.</p>"+ },+ "TenantId":{+ "shape":"TenantId",+ "documentation":"<p>The identifier of the tenant in a multi-tenant Lambda function.</p>",+ "location":"header",+ "locationName":"X-Amz-Tenant-Id"+ }, "InvocationType":{@@ -6003,30 +6063,2 @@ "locationName":"X-Amz-Invocation-Type"- },- "LogType":{- "shape":"LogType",- "documentation":"<p>Set to <code>Tail</code> to include the execution log in the response. Applies to synchronously invoked functions only.</p>",- "location":"header",- "locationName":"X-Amz-Log-Type"- },- "ClientContext":{- "shape":"String",- "documentation":"<p>Up to 3,583 bytes of base64-encoded data about the invoking client to pass to the function in the context object.</p>",- "location":"header",- "locationName":"X-Amz-Client-Context"- },- "Qualifier":{- "shape":"NumericLatestPublishedOrAliasQualifier",- "documentation":"<p>The alias name.</p>",- "location":"querystring",- "locationName":"Qualifier"- },- "Payload":{- "shape":"Blob",- "documentation":"<p>The JSON that you want to provide to your Lambda function as input.</p> <p>You can enter the JSON directly. For example, <code>--payload '{ \"key\": \"value\" }'</code>. You can also specify a file path. For example, <code>--payload file://payload.json</code>.</p>"- },- "TenantId":{- "shape":"TenantId",- "documentation":"<p>The identifier of the tenant in a multi-tenant Lambda function.</p>",- "location":"header",- "locationName":"X-Amz-Tenant-Id" }@@ -9365,3 +9397,7 @@ },- "PropagateTags":{"shape":"PropagateTags"}+ "PropagateTags":{"shape":"PropagateTags"},+ "TelemetryConfig":{+ "shape":"CapacityProviderTelemetryConfig",+ "documentation":"<p>The updated telemetry configuration for the capacity provider.</p>"+ } }
--- +++ @@ -2032,2 +2032,6 @@ "documentation":"<p>Current version of the license.</p>"+ },+ "ResetUsage":{+ "shape":"Boolean",+ "documentation":"<p>Specifies whether to reset the license usage for the new license version. If you don't specify a value, the license usage is not reset.</p>" }
--- +++ @@ -434,2 +434,24 @@ },+ "CreateKnowledgeBase":{+ "name":"CreateKnowledgeBase",+ "http":{+ "method":"POST",+ "requestUri":"/v1/accounts/{AwsAccountId}/knowledge-bases",+ "responseCode":202+ },+ "input":{"shape":"CreateKnowledgeBaseRequest"},+ "output":{"shape":"CreateKnowledgeBaseResponse"},+ "errors":[+ {"shape":"ResourceExistsException"},+ {"shape":"ThrottlingException"},+ {"shape":"InvalidRequestException"},+ {"shape":"InvalidParameterValueException"},+ {"shape":"InternalFailureException"},+ {"shape":"PreconditionNotMetException"},+ {"shape":"ResourceNotFoundException"},+ {"shape":"LimitExceededException"},+ {"shape":"AccessDeniedException"}+ ],+ "documentation":"<p>Creates a knowledge base from a specified data source. Supported data source connector types include:</p> <ul> <li> <p> <code>S3_KNOWLEDGE_BASE</code> – Uses an Amazon S3 bucket as the data source.</p> </li> <li> <p> <code>WEB_CRAWLER</code> – Uses web pages indexed by the built-in web crawler as the data source.</p> </li> <li> <p> <code>GOOGLE_DRIVE</code> – Uses Google Drive as the data source. Supports service account authentication only.</p> </li> <li> <p> <code>SHAREPOINT</code> – Uses SharePoint as the data source. Supports two-legged OAuth only.</p> </li> <li> <p> <code>ONE_DRIVE</code> – Uses OneDrive as the data source. Supports two-legged OAuth only.</p> </li> </ul>"+ }, "CreateNamespace":{@@ -4590,2 +4612,25 @@ },+ "UpdateKnowledgeBase":{+ "name":"UpdateKnowledgeBase",+ "http":{+ "method":"POST",+ "requestUri":"/v1/accounts/{AwsAccountId}/knowledge-bases/{KnowledgeBaseId}",+ "responseCode":202+ },+ "input":{"shape":"UpdateKnowledgeBaseRequest"},+ "output":{"shape":"UpdateKnowledgeBaseResponse"},+ "errors":[+ {"shape":"ThrottlingException"},+ {"shape":"InvalidRequestException"},+ {"shape":"InvalidParameterValueException"},+ {"shape":"InternalFailureException"},+ {"shape":"PreconditionNotMetException"},+ {"shape":"ResourceNotFoundException"},+ {"shape":"LimitExceededException"},+ {"shape":"AccessDeniedException"},+ {"shape":"ConflictException"}+ ],+ "documentation":"<p>Updates the properties of an existing knowledge base.</p>",+ "idempotent":true+ }, "UpdateKnowledgeBasePermissions":{@@ -5107,2 +5152,13 @@ "documentation":"<p>Configuration for API key-based authentication to external services.</p>"+ },+ "AccessControlConfiguration":{+ "type":"structure",+ "members":{+ "isACLEnabled":{+ "shape":"Boolean",+ "documentation":"<p>Specifies whether ACLs are enabled for the knowledge base.</p>",+ "box":true+ }+ },+ "documentation":"<p>The access control settings for a knowledge base. Use this structure to enable or disable document-level access control lists (ACLs) that filter query results based on the permissions from the source data connector.</p>" },@@ -8004,2 +8060,10 @@ },+ "AuthType":{+ "type":"string",+ "enum":[+ "THREE_LEGGED_OAUTH",+ "TWO_LEGGED_OAUTH",+ "SERVICE_ACCOUNT"+ ]+ }, "AuthenticationMetadata":{@@ -13444,2 +13508,86 @@ },+ "CreateKnowledgeBaseRequest":{+ "type":"structure",+ "required":[+ "AwsAccountId",+ "KnowledgeBaseId",+ "Name",+ "DataSourceArn",+ "KnowledgeBaseConfiguration"+ ],+ "members":{+ "AwsAccountId":{+ "shape":"KbAwsAccountId",+ "documentation":"<p>The ID of the Amazon Web Services account that contains the knowledge base.</p>",+ "location":"uri",+ "locationName":"AwsAccountId"+ },+ "KnowledgeBaseId":{+ "shape":"KnowledgeBaseId",+ "documentation":"<p>The unique identifier for the knowledge base.</p>"+ },+ "Name":{+ "shape":"KnowledgeBaseName",+ "documentation":"<p>The name of the knowledge base.</p>"+ },+ "DataSourceArn":{+ "shape":"DataSourceArn",+ "documentation":"<p>The Amazon Resource Name (ARN) of the data source for the knowledge base.</p>"+ },+ "KnowledgeBaseConfiguration":{"shape":"KnowledgeBaseConfiguration"},+ "Description":{+ "shape":"KnowledgeBaseDescription",+ "documentation":"<p>A description for the knowledge base. If you don't specify a description, the knowledge base is created without one.</p>"+ },+ "Permissions":{+ "shape":"ResourcePermissionList",+ "documentation":"<p>A list of resource permissions on the knowledge base. Each entry grants a specified Amazon QuickSight principal either owner or viewer access. If you don't specify permissions, only the primary owner (if provided) receives owner access.</p>"+ },+ "MediaExtractionConfiguration":{"shape":"MediaExtractionConfiguration"},+ "AccessControlConfiguration":{+ "shape":"AccessControlConfiguration",+ "documentation":"<p>The access control configuration for the knowledge base. If you don't specify this parameter, document-level ACLs are disabled.</p>"+ },+ "PrimaryOwnerArn":{+ "shape":"String",+ "documentation":"<p>The Amazon Resource Name (ARN) of the primary owner for the knowledge base. The specified user is always granted owner access, regardless of what is specified in the <code>Permissions</code> field. If you don't specify a primary owner, the knowledge base is created without one.</p>"+ },+ "Tags":{+ "shape":"TagList",+ "documentation":"<p>The tags to assign to the knowledge base. If you don't specify tags, the knowledge base is created without tags.</p>"+ }+ }+ },+ "CreateKnowledgeBaseResponse":{+ "type":"structure",+ "required":[+ "KnowledgeBaseArn",+ "KnowledgeBaseId",+ "CreationStatus"+ ],+ "members":{+ "KnowledgeBaseArn":{+ "shape":"KnowledgeBaseArn",+ "documentation":"<p>The Amazon Resource Name (ARN) of the knowledge base.</p>"+ },+ "KnowledgeBaseId":{+ "shape":"KnowledgeBaseId",+ "documentation":"<p>The unique identifier for the knowledge base.</p>"+ },+ "CreationStatus":{+ "shape":"DataSetStatus",+ "documentation":"<p>The creation status of the knowledge base.</p>"+ },+ "RequestId":{+ "shape":"String",+ "documentation":"<p>The Amazon Web Services request ID for this operation.</p>"+ },+ "Status":{+ "shape":"StatusCode",+ "documentation":"<p>The HTTP status of the request.</p>",+ "box":true,+ "location":"statusCode"+ }+ }+ }, "CreateNamespaceRequest":{@@ -14257,2 +14405,10 @@ "documentation":"<p>The combination of user name and password that are used as credentials.</p>"+ },+ "CredentialStatus":{+ "type":"string",+ "enum":[+ "CONNECTED",+ "AUTH_FAILED",+ "NOT_VERIFIED"+ ] },@@ -16476,2 +16632,10 @@ "documentation":"<p>The Amazon Resource Name (ARN) of the secret associated with the data source in Amazon Secrets Manager.</p>"+ },+ "CredentialStatus":{+ "shape":"CredentialStatus",+ "documentation":"<p>The credential verification status of the data source. Valid values include:</p> <ul> <li> <p> <code>CONNECTED</code> – Credential validation succeeded.</p> </li> <li> <p> <code>AUTH_FAILED</code> – Credential validation failed.</p> </li> <li> <p> <code>NOT_VERIFIED</code> – Credential validation has not been performed.</p> </li> </ul>"+ },+ "LastCredentialVerifiedAt":{+ "shape":"Timestamp",+ "documentation":"<p>The time that the credentials were last verified.</p>" }@@ -16691,2 +16855,18 @@ "documentation":"<p>The parameters for Amazon Q Business.</p>"+ },+ "SharePointParameters":{+ "shape":"SharePointParameters",+ "documentation":"<p>The parameters for a SharePoint data source.</p>"+ },+ "GoogleDriveParameters":{+ "shape":"GoogleDriveParameters",+ "documentation":"<p>The parameters for a Google Drive data source.</p>"+ },+ "OneDriveParameters":{+ "shape":"OneDriveParameters",+ "documentation":"<p>The parameters for an OneDrive data source.</p>"+ },+ "FMKBParameters":{+ "shape":"FMKBParameters",+ "documentation":"<p>The parameters for a fully managed knowledge base data source.</p>" }@@ -22993,2 +23173,23 @@ },+ "FMKBKnowledgeBaseArn":{+ "type":"string",+ "max":128,+ "min":47,+ "pattern":"^arn:aws(-cn|-us-gov)?:bedrock:[a-zA-Z0-9-]*:[0-9]{12}:knowledge-base/[0-9a-zA-Z]+"+ },+ "FMKBParameters":{+ "type":"structure",+ "required":["KnowledgeBaseArn"],+ "members":{+ "KnowledgeBaseArn":{+ "shape":"FMKBKnowledgeBaseArn",+ "documentation":"<p>The Amazon Resource Name (ARN) of the Amazon Bedrock knowledge base.</p>"+ },+ "LinkedDataSourceIds":{+ "shape":"LinkedDataSourceIds",+ "documentation":"<p>The IDs of the linked data sources.</p>"+ }+ },+ "documentation":"<p>The connection parameters for a fully managed knowledge base data source. Provide these parameters in the <code>DataSourceParameters</code> object when you create or update a data source that uses a fully managed knowledge base.</p>"+ }, "FailedKeyRegistrationEntries":{@@ -26500,2 +26701,12 @@ "documentation":"<p>Determines the border options for a table visual.</p>"+ },+ "GoogleDriveParameters":{+ "type":"structure",+ "members":{+ "AuthType":{+ "shape":"AuthType",+ "documentation":"<p>The authentication type for the Google Drive data source. Valid values include:</p> <ul> <li> <p> <code>SERVICE_ACCOUNT</code> – Server-to-server authentication using a Google service account key.</p> </li> <li> <p> <code>THREE_LEGGED_OAUTH</code> – Interactive OAuth that requires user consent.</p> </li> </ul>"+ }+ },+ "documentation":"<p>The connection parameters for a Google Drive data source. Provide these parameters in the <code>DataSourceParameters</code> object when you create or update a data source that uses Google Drive.</p>" },@@ -28691,2 +28902,6 @@ },+ "AccessControlConfiguration":{+ "shape":"AccessControlConfiguration",+ "documentation":"<p>The access control configuration for the knowledge base.</p>"+ }, "Type":{
… 185 more lines (truncated)
--- +++ @@ -10534,3 +10534,3 @@ "shape":"ImageId",- "documentation":"<p>When configuring your HyperPod cluster, you can specify an image ID using one of the following options:</p> <ul> <li> <p> <code>HyperPodPublicAmiId</code>: Use a HyperPod public AMI</p> </li> <li> <p> <code>CustomAmiId</code>: Use your custom AMI</p> </li> <li> <p> <code>default</code>: Use the default latest system image</p> </li> </ul> <p>If you choose to use a custom AMI (<code>CustomAmiId</code>), ensure it meets the following requirements:</p> <ul> <li> <p>Encryption: The custom AMI must be unencrypted.</p> </li> <li> <p>Ownership: The custom AMI must be owned by the same Amazon Web Services account that is creating the HyperPod cluster.</p> </li> <li> <p>Volume support: Only the primary AMI snapshot volume is supported; additional AMI volumes are not supported.</p> </li> </ul> <p>When updating the instance group's AMI through the <code>UpdateClusterSoftware</code> operation, if an instance group uses a custom AMI, you must provide an <code>ImageId</code> or use the default as input. Note that if you don't specify an instance group in your <code>UpdateClusterSoftware</code> request, then all of the instance groups are patched with the specified image.</p>"+ "documentation":"<p>When configuring your HyperPod cluster, you can specify an image ID using one of the following options:</p> <ul> <li> <p> <code>HyperPodPublicAmiId</code>: Use a HyperPod public AMI</p> </li> <li> <p> <code>CustomAmiId</code>: Use your custom AMI</p> </li> <li> <p> <code>default</code>: Use the default latest system image. For clusters with continuous scaling node provisioning mode, new instance groups inherit the AMI from the earliest existing instance group</p> </li> </ul> <p>If you choose to use a custom AMI (<code>CustomAmiId</code>), ensure it meets the following requirements:</p> <ul> <li> <p>Encryption: The custom AMI must be unencrypted.</p> </li> <li> <p>Ownership: The custom AMI must be owned by the same Amazon Web Services account that is creating the HyperPod cluster.</p> </li> <li> <p>Volume support: Only the primary AMI snapshot volume is supported; additional AMI volumes are not supported.</p> </li> </ul> <p>When updating the instance group's AMI through the <code>UpdateClusterSoftware</code> operation, if an instance group uses a custom AMI, you must provide an <code>ImageId</code> or use the default as input. Note that if you don't specify an instance group in your <code>UpdateClusterSoftware</code> request, then all of the instance groups are patched with the specified image.</p>" },@@ -10797,3 +10797,35 @@ "ml.g7e.48xlarge",- "ml.p6-b300.48xlarge"+ "ml.p6-b300.48xlarge",+ "ml.g4dn.xlarge",+ "ml.g4dn.2xlarge",+ "ml.g4dn.4xlarge",+ "ml.g4dn.8xlarge",+ "ml.g4dn.12xlarge",+ "ml.g4dn.16xlarge",+ "ml.c6g.medium",+ "ml.c6g.large",+ "ml.c6g.xlarge",+ "ml.c6g.2xlarge",+ "ml.c6g.4xlarge",+ "ml.c6g.8xlarge",+ "ml.c6g.12xlarge",+ "ml.c6g.16xlarge",+ "ml.c7g.medium",+ "ml.c7g.large",+ "ml.c7g.xlarge",+ "ml.c7g.2xlarge",+ "ml.c7g.4xlarge",+ "ml.c7g.8xlarge",+ "ml.c7g.12xlarge",+ "ml.c7g.16xlarge",+ "ml.c8g.medium",+ "ml.c8g.large",+ "ml.c8g.xlarge",+ "ml.c8g.2xlarge",+ "ml.c8g.4xlarge",+ "ml.c8g.8xlarge",+ "ml.c8g.12xlarge",+ "ml.c8g.16xlarge",+ "ml.c8g.24xlarge",+ "ml.c8g.48xlarge" ]
--- +++ @@ -61,3 +61,3 @@ # The full version, including alpha/beta/rc tags.-release = '1.43.45'+release = '1.43.46'
idna pypi critical-tier BURST
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
3.18
BURST
2 releases in 23m: 0.7, 0.8
info · registry-verified · 2014-07-10 · 12y ago
release diff 3.17 → 3.18
+0 added · -0 removed · ~6 modified
--- +++ @@ -586,2 +586,3 @@ std3_rules: bool = False,+ display: bool = False, ) -> str:@@ -600,2 +601,9 @@ ``True``.+ :param display: If ``True``, any ``xn--`` label that fails IDNA+ validation is passed through unchanged (lowercased) rather than+ aborting the whole call. Intended for "decode for display"+ consumers (e.g. URL libraries, HTTP clients) that want to show+ the user the label as it appears on the wire when it cannot be+ rendered as Unicode. Matches the per-label recovery prescribed+ by UTS #46 §4 and the WHATWG URL "domain to Unicode" algorithm. :returns: The decoded domain as a Unicode string.@@ -626,5 +634,11 @@ for label in labels:- s = ulabel(label)- if s:- result.append(s)+ try:+ u = ulabel(label)+ except IDNAError:+ if display and label[:4].lower() == "xn--":+ u = label.lower()+ else:+ raise+ if u:+ result.append(u) else:
--- +++ @@ -1 +1 @@-__version__ = "3.17"+__version__ = "3.18"
--- +++ @@ -351,2 +351,57 @@ + def test_decode_display(self):+ # A label whose Punycode decode succeeds but contains disallowed+ # codepoints — under display decoding, the original A-label is kept.+ self.assertRaises(idna.IDNAError, idna.decode, "a.b.c.xn--pokxncvks")+ self.assertEqual(+ idna.decode("a.b.c.xn--pokxncvks", display=True),+ "a.b.c.xn--pokxncvks",+ )++ # Mixed valid/invalid labels: the valid label still decodes, the+ # invalid xn-- label is preserved verbatim.+ self.assertEqual(+ idna.decode("xn--zckzah.xn--pokxncvks", display=True),+ "テスト.xn--pokxncvks",+ )++ # A label whose Punycode itself is malformed.+ self.assertEqual(+ idna.decode("xn--.example", display=True),+ "xn--.example",+ )++ # Uppercase A-label prefix: the kept label is lowercased to match+ # what a successful ulabel() call would have returned.+ self.assertEqual(+ idna.decode("XN--POKXNCVKS.example", display=True),+ "xn--pokxncvks.example",+ )++ # display must not swallow errors for non-xn-- labels.+ self.assertRaises(+ idna.IDNAError,+ idna.decode,+ "-bad.example",+ display=True,+ )++ # display should be a no-op for fully valid input.+ self.assertEqual(+ idna.decode("xn--zckzah.xn--zckzah", display=True),+ "テスト.テスト",+ )++ # Trailing dot preserved under display recovery.+ self.assertEqual(+ idna.decode("xn--pokxncvks.", display=True),+ "xn--pokxncvks.",+ )++ # Bytes input is supported, matching decode()'s normal contract.+ self.assertEqual(+ idna.decode(b"a.b.c.xn--pokxncvks", display=True),+ "a.b.c.xn--pokxncvks",+ )+
iniconfig pypi no findings
0.1
1.0.0
1.0.1
1.1.0
1.1.1
2.0.0
2.1.0
2.2.0
2.3.0
CLEAN
no findings — nominal
release diff 2.2.0 → 2.3.0
+0 added · -0 removed · ~7 modified
--- +++ @@ -98,29 +98,82 @@ encoding: str = "utf-8",+ *,+ _sections: Mapping[str, Mapping[str, str]] | None = None,+ _sources: Mapping[tuple[str, str | None], int] | None = None, ) -> None: self.path = os.fspath(path)++ # Determine sections and sources+ if _sections is not None and _sources is not None:+ # Use provided pre-parsed data (called from parse())+ sections_data = _sections+ sources = _sources+ else:+ # Parse the data (backward compatible path)+ if data is None:+ with open(self.path, encoding=encoding) as fp:+ data = fp.read()++ # Use old behavior (no stripping) for backward compatibility+ sections_data, sources = _parse.parse_ini_data(+ self.path, data, strip_inline_comments=False+ )++ # Assign once to Final attributes+ self._sources = sources+ self.sections = sections_data++ @classmethod+ def parse(+ cls,+ path: str | os.PathLike[str],+ data: str | None = None,+ encoding: str = "utf-8",+ *,+ strip_inline_comments: bool = True,+ strip_section_whitespace: bool = False,+ ) -> "IniConfig":+ """Parse an INI file.++ Args:+ path: Path to the INI file (used for error messages)+ data: Optional INI content as string. If None, reads from path.+ encoding: Encoding to use when reading the file (default: utf-8)+ strip_inline_comments: Whether to strip inline comments from values+ (default: True). When True, comments starting with # or ; are+ removed from values, matching the behavior for section comments.+ strip_section_whitespace: Whether to strip whitespace from section and key names+ (default: False). When True, strips Unicode whitespace from section and key names,+ addressing issue #4. When False, preserves existing behavior for backward compatibility.++ Returns:+ IniConfig instance with parsed configuration++ Example:+ # With comment stripping (default):+ config = IniConfig.parse("setup.cfg")+ # value = "foo" instead of "foo # comment"++ # Without comment stripping (old behavior):+ config = IniConfig.parse("setup.cfg", strip_inline_comments=False)+ # value = "foo # comment"++ # With section name stripping (opt-in for issue #4):+ config = IniConfig.parse("setup.cfg", strip_section_whitespace=True)+ # section names and keys have Unicode whitespace stripped+ """+ fspath = os.fspath(path)+ if data is None:- with open(self.path, encoding=encoding) as fp:+ with open(fspath, encoding=encoding) as fp: data = fp.read() - tokens = _parse.parse_lines(self.path, data.splitlines(True))-- self._sources = {}- sections_data: dict[str, dict[str, str]]- self.sections = sections_data = {}-- for lineno, section, name, value in tokens:- if section is None:- raise ParseError(self.path, lineno, "no section header defined")- self._sources[section, name] = lineno- if name is None:- if section in self.sections:- raise ParseError(- self.path, lineno, f"duplicate section {section!r}"- )- sections_data[section] = {}- else:- if name in self.sections[section]:- raise ParseError(self.path, lineno, f"duplicate name {name!r}")- assert value is not None- sections_data[section][name] = value+ sections_data, sources = _parse.parse_ini_data(+ fspath,+ data,+ strip_inline_comments=strip_inline_comments,+ strip_section_whitespace=strip_section_whitespace,+ )++ # Call constructor with pre-parsed sections and sources+ return cls(path=fspath, _sections=sections_data, _sources=sources)
--- +++ @@ -1 +1,2 @@+from collections.abc import Mapping from typing import NamedTuple@@ -14,3 +15,57 @@ -def parse_lines(path: str, line_iter: list[str]) -> list[ParsedLine]:+def parse_ini_data(+ path: str,+ data: str,+ *,+ strip_inline_comments: bool,+ strip_section_whitespace: bool = False,+) -> tuple[Mapping[str, Mapping[str, str]], Mapping[tuple[str, str | None], int]]:+ """Parse INI data and return sections and sources mappings.++ Args:+ path: Path for error messages+ data: INI content as string+ strip_inline_comments: Whether to strip inline comments from values+ strip_section_whitespace: Whether to strip whitespace from section and key names+ (default: False). When True, addresses issue #4 by stripping Unicode whitespace.++ Returns:+ Tuple of (sections_data, sources) where:+ - sections_data: mapping of section -> {name -> value}+ - sources: mapping of (section, name) -> line number+ """+ tokens = parse_lines(+ path,+ data.splitlines(True),+ strip_inline_comments=strip_inline_comments,+ strip_section_whitespace=strip_section_whitespace,+ )++ sources: dict[tuple[str, str | None], int] = {}+ sections_data: dict[str, dict[str, str]] = {}++ for lineno, section, name, value in tokens:+ if section is None:+ raise ParseError(path, lineno, "no section header defined")+ sources[section, name] = lineno+ if name is None:+ if section in sections_data:+ raise ParseError(path, lineno, f"duplicate section {section!r}")+ sections_data[section] = {}+ else:+ if name in sections_data[section]:+ raise ParseError(path, lineno, f"duplicate name {name!r}")+ assert value is not None+ sections_data[section][name] = value++ return sections_data, sources+++def parse_lines(+ path: str,+ line_iter: list[str],+ *,+ strip_inline_comments: bool = False,+ strip_section_whitespace: bool = False,+) -> list[ParsedLine]: result: list[ParsedLine] = []@@ -18,3 +73,5 @@ for lineno, line in enumerate(line_iter):- name, data = _parseline(path, line, lineno)+ name, data = _parseline(+ path, line, lineno, strip_inline_comments, strip_section_whitespace+ ) # new value@@ -44,3 +101,9 @@ -def _parseline(path: str, line: str, lineno: int) -> tuple[str | None, str | None]:+def _parseline(+ path: str,+ line: str,+ lineno: int,+ strip_inline_comments: bool,+ strip_section_whitespace: bool,+) -> tuple[str | None, str | None]: # blank lines@@ -58,3 +121,7 @@ if line[-1] == "]":- return line[1:-1], None+ section_name = line[1:-1]+ # Optionally strip whitespace from section name (issue #4)+ if strip_section_whitespace:+ section_name = section_name.strip()+ return section_name, None return None, realline.strip()@@ -71,6 +138,22 @@ raise ParseError(path, lineno, f"unexpected line: {line!r}") from None- return name.strip(), value.strip()++ # Strip key name (always for backward compatibility, optionally with unicode awareness)+ key_name = name.strip()++ # Strip value+ value = value.strip()+ # Strip inline comments from values if requested (issue #55)+ if strip_inline_comments:+ for c in COMMENTCHARS:+ value = value.split(c)[0].rstrip()++ return key_name, value # continuation else:- return None, line.strip()+ line = line.strip()+ # Strip inline comments from continuations if requested (issue #55)+ if strip_inline_comments:+ for c in COMMENTCHARS:+ line = line.split(c)[0].rstrip()+ return None, line
--- +++ @@ -30,5 +30,5 @@ -__version__ = version = '2.2.0'-__version_tuple__ = version_tuple = (2, 2, 0)+__version__ = version = '2.3.0'+__version_tuple__ = version_tuple = (2, 3, 0) -__commit_id__ = commit_id = 'g57b7ed9c7'+__commit_id__ = commit_id = 'g7faed13ae'
--- +++ @@ -127,3 +127,3 @@ with pytest.raises(TypeError):- IniConfig(data=path.read_text()) # type: ignore+ IniConfig(data=path.read_text()) # type: ignore[call-arg] @@ -306 +306,109 @@ assert iscommentline(line)+++def test_parse_strips_inline_comments() -> None:+ """Test that IniConfig.parse() strips inline comments from values by default."""+ config = IniConfig.parse(+ "test.ini",+ data=dedent(+ """+ [section1]+ name1 = value1 # this is a comment+ name2 = value2 ; this is also a comment+ name3 = value3# no space before comment+ list = a, b, c # some items+ """+ ),+ )+ assert config["section1"]["name1"] == "value1"+ assert config["section1"]["name2"] == "value2"+ assert config["section1"]["name3"] == "value3"+ assert config["section1"]["list"] == "a, b, c"+++def test_parse_strips_inline_comments_from_continuations() -> None:+ """Test that inline comments are stripped from continuation lines."""+ config = IniConfig.parse(+ "test.ini",+ data=dedent(+ """+ [section]+ names =+ Alice # first person+ Bob ; second person+ Charlie+ """+ ),+ )+ assert config["section"]["names"] == "Alice\nBob\nCharlie"+++def test_parse_preserves_inline_comments_when_disabled() -> None:+ """Test that IniConfig.parse(strip_inline_comments=False) preserves comments."""+ config = IniConfig.parse(+ "test.ini",+ data=dedent(+ """+ [section1]+ name1 = value1 # this is a comment+ name2 = value2 ; this is also a comment+ list = a, b, c # some items+ """+ ),+ strip_inline_comments=False,+ )+ assert config["section1"]["name1"] == "value1 # this is a comment"+ assert config["section1"]["name2"] == "value2 ; this is also a comment"+ assert config["section1"]["list"] == "a, b, c # some items"+++def test_constructor_preserves_inline_comments_for_backward_compatibility() -> None:+ """Test that IniConfig() constructor preserves old behavior (no stripping)."""+ config = IniConfig(+ "test.ini",+ data=dedent(+ """+ [section1]+ name1 = value1 # this is a comment+ name2 = value2 ; this is also a comment+ """+ ),+ )+ assert config["section1"]["name1"] == "value1 # this is a comment"+ assert config["section1"]["name2"] == "value2 ; this is also a comment"+++def test_unicode_whitespace_stripped() -> None:+ """Test that Unicode whitespace is stripped (issue #4)."""+ config = IniConfig(+ "test.ini",+ data="[section]\n"+ + "name1 = \u00a0value1\u00a0\n" # NO-BREAK SPACE+ + "name2 = \u2000value2\u2000\n" # EN QUAD+ + "name3 = \u3000value3\u3000\n", # IDEOGRAPHIC SPACE+ )+ assert config["section"]["name1"] == "value1"+ assert config["section"]["name2"] == "value2"+ assert config["section"]["name3"] == "value3"+++def test_unicode_whitespace_in_section_names_with_opt_in() -> None:+ """Test that Unicode whitespace can be stripped from section names with opt-in (issue #4)."""+ config = IniConfig.parse(+ "test.ini",+ data="[section\u00a0]\n" # NO-BREAK SPACE at end+ + "key = value\n",+ strip_section_whitespace=True,+ )+ assert "section" in config+ assert config["section"]["key"] == "value"+++def test_unicode_whitespace_in_key_names() -> None:+ """Test that Unicode whitespace is stripped from key names (issue #4)."""+ config = IniConfig(+ "test.ini",+ data="[section]\n" + "key\u00a0 = value\n", # NO-BREAK SPACE after key+ )+ assert "key" in config["section"]+ assert config["section"]["key"] == "value"
pycparser pypi no findings
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
3.0
CLEAN
no findings — nominal
release diff 2.23 → 3.0
+1 added · -11 removed · ~33 modified
+4 more files not shown
--- +++ @@ -1,67 +1,3 @@-import os, sys-try:- from setuptools import setup- from setuptools.command.install import install as _install- from setuptools.command.sdist import sdist as _sdist-except ImportError:- from distutils.core import setup- from distutils.command.install import install as _install- from distutils.command.sdist import sdist as _sdist+from setuptools import setup --def _run_build_tables(dir):- from subprocess import check_call- # This is run inside the install staging directory (that had no .pyc files)- # We don't want to generate any.- # https://github.com/eliben/pycparser/pull/135- check_call([sys.executable, '-B', '_build_tables.py'],- cwd=os.path.join(dir, 'pycparser'))---class install(_install):- def run(self):- _install.run(self)- self.execute(_run_build_tables, (self.install_lib,),- msg="Build the lexing/parsing tables")---class sdist(_sdist):- def make_release_tree(self, basedir, files):- _sdist.make_release_tree(self, basedir, files)- self.execute(_run_build_tables, (basedir,),- msg="Build the lexing/parsing tables")---setup(- # metadata- name='pycparser',- description='C parser in Python',- long_description="""- pycparser is a complete parser of the C language, written in- pure Python using the PLY parsing library.- It parses C code into an AST and can serve as a front-end for- C compilers or analysis tools.- """,- license='BSD-3-Clause',- version='2.23',- author='Eli Bendersky',- maintainer='Eli Bendersky',- author_email='[email protected]',- url='https://github.com/eliben/pycparser',- platforms='Cross Platform',- classifiers = [- 'Development Status :: 5 - Production/Stable',- 'License :: OSI Approved :: BSD License',- 'Programming Language :: Python :: 3',- 'Programming Language :: Python :: 3.8',- 'Programming Language :: Python :: 3.9',- 'Programming Language :: Python :: 3.10',- 'Programming Language :: Python :: 3.11',- 'Programming Language :: Python :: 3.12',- 'Programming Language :: Python :: 3.13',- ],- python_requires=">=3.8",- packages=['pycparser', 'pycparser.ply'],- package_data={'pycparser': ['*.cfg']},- cmdclass={'install': install, 'sdist': sdist},-)+setup()
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c-to-c.py@@ -8,3 +8,3 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -18,5 +18,4 @@ -def translate_to_c(filename):- """ Simply use the c_generator module to emit a parsed AST.- """+def translate_to_c(filename: str) -> None:+ """Simply use the c_generator module to emit a parsed AST.""" ast = parse_file(filename, use_cpp=True)
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_json.py@@ -35,3 +35,3 @@ # }-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import json@@ -39,2 +39,3 @@ import re+from typing import Any, Callable, Dict, Optional, Set, TypeVar @@ -42,10 +43,10 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) from pycparser import parse_file, c_ast-from pycparser.plyparser import Coord---RE_CHILD_ARRAY = re.compile(r'(.*)\[(.*)\]')-RE_INTERNAL_ATTR = re.compile('__.*__')+from pycparser.c_parser import Coord+++RE_CHILD_ARRAY = re.compile(r"(.*)\[(.*)\]")+RE_INTERNAL_ATTR = re.compile("__.*__") @@ -56,9 +57,18 @@ -def memodict(fn):- """ Fast memoization decorator for a function taking a single argument """- class memodict(dict):- def __missing__(self, key):- ret = self[key] = fn(key)- return ret- return memodict().__getitem__+_T = TypeVar("_T")+_R = TypeVar("_R")+++def memodict(fn: Callable[[_T], _R]) -> Callable[[_T], _R]:+ """Fast memoization decorator for a function taking a single argument"""+ cache: Dict[_T, _R] = {}++ def memoized(arg: _T) -> _R:+ if arg in cache:+ return cache[arg]+ result = fn(arg)+ cache[arg] = result+ return result++ return memoized @@ -66,3 +76,3 @@ @memodict-def child_attrs_of(klass):+def child_attrs_of(klass: type[c_ast.Node]) -> Set[str]: """@@ -77,10 +87,10 @@ -def to_dict(node):- """ Recursively convert an ast into dict representation. """+def to_dict(node: c_ast.Node) -> Dict[str, Any]:+ """Recursively convert an ast into dict representation.""" klass = node.__class__ - result = {}+ result: Dict[str, Any] = {} # Metadata- result['_nodetype'] = klass.__name__+ result["_nodetype"] = klass.__name__ @@ -92,5 +102,5 @@ if node.coord:- result['coord'] = str(node.coord)+ result["coord"] = str(node.coord) else:- result['coord'] = None+ result["coord"] = None @@ -106,5 +116,8 @@ if array_index != len(result[array_name]):- raise CJsonError('Internal ast error. Array {} out of order. '- 'Expected index {}, got {}'.format(- array_name, len(result[array_name]), array_index))+ raise CJsonError(+ "Internal ast error. Array {} out of order. "+ "Expected index {}, got {}".format(+ array_name, len(result[array_name]), array_index+ )+ ) result[array_name].append(to_dict(child))@@ -121,4 +134,4 @@ -def to_json(node, **kwargs):- """ Convert ast node to json string """+def to_json(node: c_ast.Node, **kwargs: Any) -> str:+ """Convert ast node to json string""" return json.dumps(to_dict(node), **kwargs)@@ -126,4 +139,4 @@ -def file_to_dict(filename):- """ Load C file into dict representation of ast """+def file_to_dict(filename: str) -> Dict[str, Any]:+ """Load C file into dict representation of ast""" ast = parse_file(filename, use_cpp=True)@@ -132,4 +145,4 @@ -def file_to_json(filename, **kwargs):- """ Load C file into json string representation of ast """+def file_to_json(filename: str, **kwargs: Any) -> str:+ """Load C file into json string representation of ast""" ast = parse_file(filename, use_cpp=True)@@ -138,4 +151,4 @@ -def _parse_coord(coord_str):- """ Parse coord string (file:line[:column]) into Coord object. """+def _parse_coord(coord_str: Optional[str]) -> Optional[Coord]:+ """Parse coord string (file:line[:column]) into Coord object.""" if coord_str is None:@@ -143,9 +156,11 @@ - vals = coord_str.split(':')- vals.extend([None] * 3)+ vals = coord_str.split(":")+ vals.extend(["", "", ""]) filename, line, column = vals[:3]- return Coord(filename, line, column)---def _convert_to_obj(value):+ line_num = int(line) if line else 0+ column_num = int(column) if column else None+ return Coord(filename, line_num, column_num)+++def _convert_to_obj(value: Any) -> Any: """@@ -155,15 +170,15 @@ """- value_type = type(value)- if value_type == dict:- return from_dict(value)- elif value_type == list:- return [_convert_to_obj(item) for item in value]- else:- # String- return value---def from_dict(node_dict):- """ Recursively build an ast from dict representation """- class_name = node_dict.pop('_nodetype')+ match value:+ case dict():+ return from_dict(value)+ case list():+ return [_convert_to_obj(item) for item in value]+ case _:+ # String+ return value+++def from_dict(node_dict: Dict[str, Any]) -> c_ast.Node:+ """Recursively build an ast from dict representation"""+ class_name = node_dict.pop("_nodetype") @@ -175,3 +190,3 @@ for key, value in node_dict.items():- if key == 'coord':+ if key == "coord": objs[key] = _parse_coord(value)@@ -185,4 +200,4 @@ -def from_json(ast_json):- """ Build an ast from json string representation """+def from_json(ast_json: str) -> c_ast.Node:+ """Build an ast from json string representation""" return from_dict(json.loads(ast_json))@@ -190,3 +205,3 @@ -#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ if __name__ == "__main__":
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: cdecl.py@@ -33,5 +33,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import copy import sys+from typing import Optional @@ -39,3 +40,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -44,11 +45,13 @@ -def explain_c_declaration(c_decl, expand_struct=False, expand_typedef=False):- """ Parses the declaration in c_decl and returns a text- explanation as a string.-- The last external node of the string is used, to allow earlier typedefs- for used types.-- expand_struct=True will spell out struct definitions recursively.- expand_typedef=True will expand typedef'd types.+def explain_c_declaration(+ c_decl: str, expand_struct: bool = False, expand_typedef: bool = False+) -> str:+ """Parses the declaration in c_decl and returns a text+ explanation as a string.++ The last external node of the string is used, to allow earlier typedefs+ for used types.++ expand_struct=True will spell out struct definitions recursively.+ expand_typedef=True will expand typedef'd types. """@@ -57,3 +60,3 @@ try:- node = parser.parse(c_decl, filename='<stdin>')+ node = parser.parse(c_decl, filename="<stdin>") except c_parser.ParseError:@@ -62,5 +65,3 @@ - if (not isinstance(node, c_ast.FileAST) or- not isinstance(node.ext[-1], c_ast.Decl)- ):+ if not isinstance(node, c_ast.FileAST) or not isinstance(node.ext[-1], c_ast.Decl): return "Not a valid declaration"@@ -68,5 +69,8 @@ try:- expanded = expand_struct_typedef(node.ext[-1], node,- expand_struct=expand_struct,- expand_typedef=expand_typedef)+ expanded = expand_struct_typedef(+ node.ext[-1],+ node,+ expand_struct=expand_struct,+ expand_typedef=expand_typedef,+ ) except Exception as e:@@ -77,56 +81,52 @@ -def _explain_decl_node(decl_node):- """ Receives a c_ast.Decl note and returns its explanation in- English.+def _explain_decl_node(decl_node: c_ast.Decl) -> str:+ """Receives a c_ast.Decl note and returns its explanation in+ English. """- storage = ' '.join(decl_node.storage) + ' ' if decl_node.storage else ''-- return (decl_node.name +- " is a " +- storage +- _explain_type(decl_node.type))---def _explain_type(decl):- """ Recursively explains a type decl node- """- typ = type(decl)-- if typ == c_ast.TypeDecl:- quals = ' '.join(decl.quals) + ' ' if decl.quals else ''- return quals + _explain_type(decl.type)- elif typ == c_ast.Typename or typ == c_ast.Decl:- return _explain_type(decl.type)- elif typ == c_ast.IdentifierType:- return ' '.join(decl.names)- elif typ == c_ast.PtrDecl:- quals = ' '.join(decl.quals) + ' ' if decl.quals else ''- return quals + 'pointer to ' + _explain_type(decl.type)- elif typ == c_ast.ArrayDecl:- arr = 'array'- if decl.dim: arr += '[%s]' % decl.dim.value-- return arr + " of " + _explain_type(decl.type)-- elif typ == c_ast.FuncDecl:- if decl.args:- params = [_explain_type(param) for param in decl.args.params]- args = ', '.join(params)- else:- args = ''-- return ('function(%s) returning ' % (args) +- _explain_type(decl.type))-- elif typ == c_ast.Struct:- decls = [_explain_decl_node(mem_decl) for mem_decl in decl.decls]- members = ', '.join(decls)-- return ('struct%s ' % (' ' + decl.name if decl.name else '') +- ('containing {%s}' % members if members else ''))---def expand_struct_typedef(cdecl, file_ast,- expand_struct=False,- expand_typedef=False):+ storage = " ".join(decl_node.storage) + " " if decl_node.storage else ""++ return decl_node.name + " is a " + storage + _explain_type(decl_node.type)+++def _explain_type(decl: c_ast.Node) -> str:+ """Recursively explains a type decl node"""+ match decl:+ case c_ast.TypeDecl():+ quals = " ".join(decl.quals) + " " if decl.quals else ""+ return quals + _explain_type(decl.type)+ case c_ast.Typename() | c_ast.Decl():+ return _explain_type(decl.type)+ case c_ast.IdentifierType():+ return " ".join(decl.names)+ case c_ast.PtrDecl():+ quals = " ".join(decl.quals) + " " if decl.quals else ""+ return quals + "pointer to " + _explain_type(decl.type)+ case c_ast.ArrayDecl():+ arr = "array"+ if decl.dim is not None:+ arr += f"[{decl.dim.value}]"+ return arr + " of " + _explain_type(decl.type)+ case c_ast.FuncDecl():+ if decl.args is not None:+ params = [_explain_type(param) for param in decl.args.params]+ args = ", ".join(params)+ else:+ args = ""+ return f"function({args}) returning " + _explain_type(decl.type)+ case c_ast.Struct():+ decls = [_explain_decl_node(mem_decl) for mem_decl in decl.decls]+ members = ", ".join(decls)+ struct_name = f" {decl.name}" if decl.name else ""+ contents = f"containing {{{members}}}" if members else ""+ return f"struct{struct_name} " + contents+ case _:+ return ""+++def expand_struct_typedef(+ cdecl: c_ast.Decl,+ file_ast: c_ast.FileAST,+ expand_struct: bool = False,+ expand_typedef: bool = False,+) -> c_ast.Decl: """Expand struct & typedef and return a new expanded node."""@@ -137,33 +137,37 @@ -def _expand_in_place(decl, file_ast, expand_struct=False, expand_typedef=False):+def _expand_in_place(+ decl: c_ast.Node,+ file_ast: c_ast.FileAST,+ expand_struct: bool = False,+ expand_typedef: bool = False,+) -> c_ast.Node: """Recursively expand struct & typedef in place, throw RuntimeError if- undeclared struct or typedef are used+ undeclared struct or typedef are used """- typ = type(decl)-- if typ in (c_ast.Decl, c_ast.TypeDecl, c_ast.PtrDecl, c_ast.ArrayDecl):- decl.type = _expand_in_place(decl.type, file_ast, expand_struct,- expand_typedef)-- elif typ == c_ast.Struct:- if not decl.decls:- struct = _find_struct(decl.name, file_ast)- if not struct:- raise RuntimeError('using undeclared struct %s' % decl.name)- decl.decls = struct.decls-- for i, mem_decl in enumerate(decl.decls):- decl.decls[i] = _expand_in_place(mem_decl, file_ast, expand_struct,- expand_typedef)- if not expand_struct:- decl.decls = []-- elif (typ == c_ast.IdentifierType and- decl.names[0] not in ('int', 'char')):- typedef = _find_typedef(decl.names[0], file_ast)- if not typedef:- raise RuntimeError('using undeclared type %s' % decl.names[0])-- if expand_typedef:- return typedef.type+ match decl:+ case c_ast.Decl() | c_ast.TypeDecl() | c_ast.PtrDecl() | c_ast.ArrayDecl():+ decl.type = _expand_in_place(+ decl.type, file_ast, expand_struct, expand_typedef+ )+ case c_ast.Struct():+ if not decl.decls:+ struct = _find_struct(decl.name, file_ast)+ if struct is None:+ raise RuntimeError(f"using undeclared struct {decl.name}")+ decl.decls = struct.decls++ for i, mem_decl in enumerate(decl.decls):+ decl.decls[i] = _expand_in_place(+ mem_decl, file_ast, expand_struct, expand_typedef+ )+ if not expand_struct:+ decl.decls = []+ case c_ast.IdentifierType() if decl.names[0] not in ("int", "char"):+ typedef = _find_typedef(decl.names[0], file_ast)+ if typedef is None:+ raise RuntimeError(f"using undeclared type {decl.names[0]}")+ if expand_typedef:+ return typedef.type+ case _:+ pass @@ -172,18 +176,17 @@ -def _find_struct(name, file_ast):- """Receives a struct name and return declared struct object in file_ast- """+def _find_struct(name: str, file_ast: c_ast.FileAST) -> Optional[c_ast.Struct]:+ """Receives a struct name and return declared struct object in file_ast""" for node in file_ast.ext:- if (type(node) == c_ast.Decl and- type(node.type) == c_ast.Struct and- node.type.name == name):
… 25 more lines (truncated)
--- +++ @@ -12,3 +12,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -23,16 +23,23 @@ -def empty_main_function_ast():- constant_zero = c_ast.Constant(type='int', value='0')+def empty_main_function_ast() -> c_ast.FuncDef:+ constant_zero = c_ast.Constant(type="int", value="0") return_node = c_ast.Return(expr=constant_zero) compound_node = c_ast.Compound(block_items=[return_node])- type_decl_node = c_ast.TypeDecl(declname='main', quals=[],- type=c_ast.IdentifierType(names=['int']),- align=[])- func_decl_node = c_ast.FuncDecl(args=c_ast.ParamList([]),- type=type_decl_node)- func_def_node = c_ast.Decl(name='main', quals=[], storage=[], funcspec=[],- type=func_decl_node, init=None,- bitsize=None, align=[])- main_func_node = c_ast.FuncDef(decl=func_def_node, param_decls=None,- body=compound_node)+ type_decl_node = c_ast.TypeDecl(+ declname="main", quals=[], type=c_ast.IdentifierType(names=["int"]), align=[]+ )+ func_decl_node = c_ast.FuncDecl(args=c_ast.ParamList([]), type=type_decl_node)+ func_def_node = c_ast.Decl(+ name="main",+ quals=[],+ storage=[],+ funcspec=[],+ type=func_decl_node,+ init=None,+ bitsize=None,+ align=[],+ )+ main_func_node = c_ast.FuncDef(+ decl=func_def_node, param_decls=None, body=compound_node+ ) @@ -41,3 +48,3 @@ -def generate_c_code(my_ast):+def generate_c_code(my_ast: c_ast.Node) -> str: generator = c_generator.CGenerator()@@ -46,3 +53,3 @@ -if __name__ == '__main__':+if __name__ == "__main__": main_function_ast = empty_main_function_ast()@@ -52,2 +59,2 @@ main_c_code = generate_c_code(main_function_ast)- print("C code: \n%s" % main_c_code)+ print(f"C code: \n{main_c_code}")
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: dump_ast.py@@ -7,3 +7,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import argparse@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -18,9 +18,12 @@ if __name__ == "__main__":- argparser = argparse.ArgumentParser('Dump AST')- argparser.add_argument('filename',- default='examples/c_files/basic.c',- nargs='?',- help='name of file to parse')- argparser.add_argument('--coord', help='show coordinates in the dump',- action='store_true')+ argparser = argparse.ArgumentParser("Dump AST")+ argparser.add_argument(+ "filename",+ default="examples/c_files/basic.c",+ nargs="?",+ help="name of file to parse",+ )+ argparser.add_argument(+ "--coord", help="show coordinates in the dump", action="store_true"+ ) args = argparser.parse_args()
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: explore_ast.py@@ -13,3 +13,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -18,3 +18,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -60,3 +60,3 @@ parser = c_parser.CParser()-ast = parser.parse(text, filename='<none>')+ast = parser.parse(text, filename="<none>") @@ -67,3 +67,3 @@ -#ast.show(showcoord=True)+# ast.show(showcoord=True) @@ -80,3 +80,3 @@ -#ast.ext[2].show()+# ast.ext[2].show() @@ -92,4 +92,4 @@ -#function_decl.type.show()-#function_decl.type.args.show()+# function_decl.type.show()+# function_decl.type.args.show() @@ -97,6 +97,6 @@ -#for param_decl in function_decl.type.args.params:- #print('Arg name: %s' % param_decl.name)- #print('Type:')- #param_decl.type.show(offset=6)+# for param_decl in function_decl.type.args.params:+# print(f"Arg name: {param_decl.name}")+# print('Type:')+# param_decl.type.show(offset=6) @@ -112,4 +112,4 @@ -#for decl in function_body.block_items:- #decl.show()+# for decl in function_body.block_items:+# decl.show() @@ -121,3 +121,3 @@ for_stmt = function_body.block_items[2]-#for_stmt.show()+# for_stmt.show() @@ -131,3 +131,3 @@ while_stmt = for_stmt.stmt.block_items[1]-#while_stmt.show()+# while_stmt.show() @@ -137,3 +137,3 @@ while_cond = while_stmt.cond-#while_cond.show()+# while_cond.show() @@ -144,5 +144,5 @@ -#print(while_cond.op)-#while_cond.left.show()-#while_cond.right.show()+# print(while_cond.op)+# while_cond.left.show()+# while_cond.right.show()
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_calls.py@@ -8,3 +8,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -17,12 +17,13 @@ + # A visitor with some state information (the funcname it's looking for) class FuncCallVisitor(c_ast.NodeVisitor):- def __init__(self, funcname):+ def __init__(self, funcname: str) -> None: self.funcname = funcname - def visit_FuncCall(self, node):- if node.name.name == self.funcname:- print('%s called at %s' % (self.funcname, node.name.coord))+ def visit_FuncCall(self, node: c_ast.FuncCall) -> None:+ if isinstance(node.name, c_ast.ID) and node.name.name == self.funcname:+ print(f"{self.funcname} called at {node.name.coord}") # Visit args in case they contain more func calls.- if node.args:+ if node.args is not None: self.visit(node.args)@@ -30,3 +31,3 @@ -def show_func_calls(filename, funcname):+def show_func_calls(filename: str, funcname: str) -> None: ast = parse_file(filename, use_cpp=True)@@ -41,4 +42,4 @@ else:- filename = 'examples/c_files/basic.c'- func = 'foo'+ filename = "examples/c_files/basic.c"+ func = "foo"
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_defs.py@@ -11,3 +11,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -16,3 +16,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -24,11 +24,10 @@ class FuncDefVisitor(c_ast.NodeVisitor):- def visit_FuncDef(self, node):- print('%s at %s' % (node.decl.name, node.decl.coord))+ def visit_FuncDef(self, node: c_ast.FuncDef) -> None:+ print(f"{node.decl.name} at {node.decl.coord}") -def show_func_defs(filename):+def show_func_defs(filename: str) -> None: # Note that cpp is used. Provide a path to your own cpp or # make sure one exists in PATH.- ast = parse_file(filename, use_cpp=True,- cpp_args=r'-Iutils/fake_libc_include')+ ast = parse_file(filename, use_cpp=True, cpp_args=r"-Iutils/fake_libc_include") @@ -40,5 +39,5 @@ if len(sys.argv) > 1:- filename = sys.argv[1]+ filename = sys.argv[1] else:- filename = 'examples/c_files/memmgr.c'+ filename = "examples/c_files/memmgr.c"
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_defs_add_param.py@@ -8,5 +8,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys-sys.path.extend(['.', '..'])++sys.path.extend([".", ".."]) @@ -24,18 +25,18 @@ class ParamAdder(c_ast.NodeVisitor):- def visit_FuncDecl(self, node):- ty = c_ast.TypeDecl(declname='_hidden',- quals=[],- align=[],- type=c_ast.IdentifierType(['int']))+ def visit_FuncDecl(self, node: c_ast.FuncDecl) -> None:+ ty = c_ast.TypeDecl(+ declname="_hidden", quals=[], align=[], type=c_ast.IdentifierType(["int"])+ ) newdecl = c_ast.Decl(- name='_hidden',- quals=[],- align=[],- storage=[],- funcspec=[],- type=ty,- init=None,- bitsize=None,- coord=node.coord)- if node.args:+ name="_hidden",+ quals=[],+ align=[],+ storage=[],+ funcspec=[],+ type=ty,+ init=None,+ bitsize=None,+ coord=node.coord,+ )+ if node.args is not None: node.args.params.append(newdecl)@@ -45,3 +46,3 @@ -if __name__ == '__main__':+if __name__ == "__main__": parser = c_parser.CParser()
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: rewrite_ast.py@@ -7,6 +7,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys -sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) from pycparser import c_parser@@ -20,3 +20,3 @@ -if __name__ == '__main__':+if __name__ == "__main__": parser = c_parser.CParser()
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: serialize_ast.py@@ -8,7 +8,8 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import pickle import sys+import tempfile -sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) from pycparser import c_parser@@ -22,12 +23,12 @@ -if __name__ == '__main__':+if __name__ == "__main__": parser = c_parser.CParser() ast = parser.parse(text)- dump_filename = 'ast.pickle'-- with open(dump_filename, 'wb') as f:+ with tempfile.NamedTemporaryFile(delete=False, suffix=".pickle") as f:+ dump_filename = f.name pickle.dump(ast, f, protocol=pickle.HIGHEST_PROTOCOL)+ print(f"Dumped to {dump_filename}") # Deserialize.- with open(dump_filename, 'rb') as f:+ with open(dump_filename, "rb") as f: ast = pickle.load(f)
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: using_cpp_libc.py@@ -8,3 +8,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -20,9 +20,9 @@ if len(sys.argv) > 1:- filename = sys.argv[1]+ filename = sys.argv[1] else:- filename = 'examples/c_files/year.c'+ filename = "examples/c_files/year.c" - ast = parse_file(filename, use_cpp=True,- cpp_path='cpp',- cpp_args=r'-Iutils/fake_libc_include')+ ast = parse_file(+ filename, use_cpp=True, cpp_path="cpp", cpp_args=r"-Iutils/fake_libc_include"+ ) ast.show()
--- +++ @@ -1,2 +1,2 @@-#-------------------------------------------------------------------------------+# ------------------------------------------------------------------------------- # pycparser: using_gcc_E_libc.py@@ -9,3 +9,3 @@ # License: BSD-#-------------------------------------------------------------------------------+# ------------------------------------------------------------------------------- import sys@@ -14,3 +14,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -21,9 +21,12 @@ if len(sys.argv) > 1:- filename = sys.argv[1]+ filename = sys.argv[1] else:- filename = 'examples/c_files/year.c'+ filename = "examples/c_files/year.c" - ast = parse_file(filename, use_cpp=True,- cpp_path='gcc',- cpp_args=['-E', r'-Iutils/fake_libc_include'])+ ast = parse_file(+ filename,+ use_cpp=True,+ cpp_path="gcc",+ cpp_args=["-E", r"-Iutils/fake_libc_include"],+ ) ast.show()
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: __init__.py@@ -8,5 +8,5 @@ # License: BSD-#------------------------------------------------------------------__all__ = ['c_lexer', 'c_parser', 'c_ast']-__version__ = '2.23'+# -----------------------------------------------------------------+__all__ = ["c_lexer", "c_parser", "c_ast"]+__version__ = "3.00" @@ -14,18 +14,21 @@ from subprocess import check_output-from .c_parser import CParser++from . import c_parser++CParser = c_parser.CParser -def preprocess_file(filename, cpp_path='cpp', cpp_args=''):- """ Preprocess a file using cpp.+def preprocess_file(filename, cpp_path="cpp", cpp_args=""):+ """Preprocess a file using cpp. - filename:- Name of the file you want to preprocess.+ filename:+ Name of the file you want to preprocess. - cpp_path:- cpp_args:- Refer to the documentation of parse_file for the meaning of these- arguments.+ cpp_path:+ cpp_args:+ Refer to the documentation of parse_file for the meaning of these+ arguments. - When successful, returns the preprocessed file's contents.- Errors from cpp will be printed out.+ When successful, returns the preprocessed file's contents.+ Errors from cpp will be printed out. """@@ -34,3 +37,3 @@ path_list += cpp_args- elif cpp_args != '':+ elif cpp_args != "": path_list += [cpp_args]@@ -43,5 +46,7 @@ except OSError as e:- raise RuntimeError("Unable to invoke 'cpp'. " +- 'Make sure its path was passed correctly\n' +- ('Original error: %s' % e))+ raise RuntimeError(+ "Unable to invoke 'cpp'. "+ + "Make sure its path was passed correctly\n"+ + f"Original error: {e}"+ ) @@ -50,35 +55,36 @@ -def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='',- parser=None, encoding=None):- """ Parse a C file using pycparser.+def parse_file(+ filename, use_cpp=False, cpp_path="cpp", cpp_args="", parser=None, encoding=None+):+ """Parse a C file using pycparser. - filename:- Name of the file you want to parse.+ filename:+ Name of the file you want to parse. - use_cpp:- Set to True if you want to execute the C pre-processor- on the file prior to parsing it.+ use_cpp:+ Set to True if you want to execute the C pre-processor+ on the file prior to parsing it. - cpp_path:- If use_cpp is True, this is the path to 'cpp' on your- system. If no path is provided, it attempts to just- execute 'cpp', so it must be in your PATH.+ cpp_path:+ If use_cpp is True, this is the path to 'cpp' on your+ system. If no path is provided, it attempts to just+ execute 'cpp', so it must be in your PATH. - cpp_args:- If use_cpp is True, set this to the command line arguments strings- to cpp. Be careful with quotes - it's best to pass a raw string- (r'') here. For example:- r'-I../utils/fake_libc_include'- If several arguments are required, pass a list of strings.+ cpp_args:+ If use_cpp is True, set this to the command line arguments strings+ to cpp. Be careful with quotes - it's best to pass a raw string+ (r'') here. For example:+ r'-I../utils/fake_libc_include'+ If several arguments are required, pass a list of strings. - encoding:- Encoding to use for the file to parse+ encoding:+ Encoding to use for the file to parse - parser:- Optional parser object to be used instead of the default CParser+ parser:+ Optional parser object to be used instead of the default CParser - When successful, an AST is returned. ParseError can be- thrown if the file doesn't parse successfully.+ When successful, an AST is returned. ParseError can be+ thrown if the file doesn't parse successfully. - Errors from cpp will be printed out.+ Errors from cpp will be printed out. """
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # _ast_gen.py@@ -4,3 +4,6 @@ # Generates the AST Node classes from a specification given in-# a configuration file+# a configuration file. This module can also be run as a script to+# regenerate c_ast.py from _c_ast.cfg (from the repo root or the+# pycparser/ directory). Use 'make check' to reformat the generated+# file after running this script. #@@ -11,20 +14,22 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- from string import Template---class ASTCodeGenerator(object):- def __init__(self, cfg_filename='_c_ast.cfg'):- """ Initialize the code generator from a configuration- file.+import os+from typing import IO+++class ASTCodeGenerator:+ def __init__(self, cfg_filename="_c_ast.cfg"):+ """Initialize the code generator from a configuration+ file. """ self.cfg_filename = cfg_filename- self.node_cfg = [NodeCfg(name, contents)- for (name, contents) in self.parse_cfgfile(cfg_filename)]-- def generate(self, file=None):- """ Generates the code into file, an open file buffer.- """- src = Template(_PROLOGUE_COMMENT).substitute(- cfg_filename=self.cfg_filename)+ self.node_cfg = [+ NodeCfg(name, contents)+ for (name, contents) in self.parse_cfgfile(cfg_filename)+ ]++ def generate(self, file: IO[str]) -> None:+ """Generates the code into file, an open file buffer."""+ src = Template(_PROLOGUE_COMMENT).substitute(cfg_filename=self.cfg_filename) @@ -32,3 +37,3 @@ for node_cfg in self.node_cfg:- src += node_cfg.generate_source() + '\n\n'+ src += node_cfg.generate_source() + "\n\n" @@ -37,4 +42,4 @@ def parse_cfgfile(self, filename):- """ Parse the configuration file and yield pairs of- (name, contents) for each node.+ """Parse the configuration file and yield pairs of+ (name, contents) for each node. """@@ -43,13 +48,13 @@ line = line.strip()- if not line or line.startswith('#'):+ if not line or line.startswith("#"): continue- colon_i = line.find(':')- lbracket_i = line.find('[')- rbracket_i = line.find(']')+ colon_i = line.find(":")+ lbracket_i = line.find("[")+ rbracket_i = line.find("]") if colon_i < 1 or lbracket_i <= colon_i or rbracket_i <= lbracket_i:- raise RuntimeError("Invalid line in %s:\n%s\n" % (filename, line))+ raise RuntimeError(f"Invalid line in {filename}:\n{line}\n") name = line[:colon_i]- val = line[lbracket_i + 1:rbracket_i]- vallist = [v.strip() for v in val.split(',')] if val else []+ val = line[lbracket_i + 1 : rbracket_i]+ vallist = [v.strip() for v in val.split(",")] if val else [] yield name, vallist@@ -57,8 +62,8 @@ -class NodeCfg(object):- """ Node configuration.-- name: node name- contents: a list of contents - attributes and child nodes- See comment at the top of the configuration file for details.+class NodeCfg:+ """Node configuration.++ name: node name+ contents: a list of contents - attributes and child nodes+ See comment at the top of the configuration file for details. """@@ -73,8 +78,8 @@ for entry in contents:- clean_entry = entry.rstrip('*')+ clean_entry = entry.rstrip("*") self.all_entries.append(clean_entry) - if entry.endswith('**'):+ if entry.endswith("**"): self.seq_child.append(clean_entry)- elif entry.endswith('*'):+ elif entry.endswith("*"): self.child.append(clean_entry)@@ -85,5 +90,5 @@ src = self._gen_init()- src += '\n' + self._gen_children()- src += '\n' + self._gen_iter()- src += '\n' + self._gen_attr_names()+ src += "\n" + self._gen_children()+ src += "\n" + self._gen_iter()+ src += "\n" + self._gen_attr_names() return src@@ -91,18 +96,18 @@ def _gen_init(self):- src = "class %s(Node):\n" % self.name+ src = f"class {self.name}(Node):\n" if self.all_entries:- args = ', '.join(self.all_entries)- slots = ', '.join("'{0}'".format(e) for e in self.all_entries)+ args = ", ".join(self.all_entries)+ slots = ", ".join(f"'{e}'" for e in self.all_entries) slots += ", 'coord', '__weakref__'"- arglist = '(self, %s, coord=None)' % args+ arglist = f"(self, {args}, coord=None)" else: slots = "'coord', '__weakref__'"- arglist = '(self, coord=None)'-- src += " __slots__ = (%s)\n" % slots- src += " def __init__%s:\n" % arglist-- for name in self.all_entries + ['coord']:- src += " self.%s = %s\n" % (name, name)+ arglist = "(self, coord=None)"++ src += f" __slots__ = ({slots})\n"+ src += f" def __init__{arglist}:\n"++ for name in self.all_entries + ["coord"]:+ src += f" self.{name} = {name}\n" @@ -111,22 +116,18 @@ def _gen_children(self):- src = ' def children(self):\n'+ src = " def children(self):\n" if self.all_entries:- src += ' nodelist = []\n'+ src += " nodelist = []\n" for child in self.child:- src += (- ' if self.%(child)s is not None:' +- ' nodelist.append(("%(child)s", self.%(child)s))\n') % (- dict(child=child))+ src += f" if self.{child} is not None:\n"+ src += f' nodelist.append(("{child}", self.{child}))\n' for seq_child in self.seq_child:- src += (- ' for i, child in enumerate(self.%(child)s or []):\n'- ' nodelist.append(("%(child)s[%%d]" %% i, child))\n') % (- dict(child=seq_child))-- src += ' return tuple(nodelist)\n'+ src += f" for i, child in enumerate(self.{seq_child} or []):\n"+ src += f' nodelist.append((f"{seq_child}[{{i}}]", child))\n'++ src += " return tuple(nodelist)\n" else:- src += ' return ()\n'+ src += " return ()\n" @@ -135,3 +136,3 @@ def _gen_iter(self):- src = ' def __iter__(self):\n'+ src = " def __iter__(self):\n" @@ -139,10 +140,8 @@ for child in self.child:- src += (- ' if self.%(child)s is not None:\n' +- ' yield self.%(child)s\n') % (dict(child=child))+ src += f" if self.{child} is not None:\n"+ src += f" yield self.{child}\n" for seq_child in self.seq_child:- src += (- ' for child in (self.%(child)s or []):\n'- ' yield child\n') % (dict(child=seq_child))+ src += f" for child in (self.{seq_child} or []):\n"+ src += " yield child\n" @@ -150,10 +149,6 @@ # Empty generator- src += (- ' return\n' +- ' yield\n')+ src += " return\n" + " yield\n" else: # Empty generator- src += (- ' return\n' +- ' yield\n')+ src += " return\n" + " yield\n" @@ -162,11 +157,9 @@ def _gen_attr_names(self):- src = " attr_names = (" + ''.join("%r, " % nm for nm in self.attr) + ')'- return src---_PROLOGUE_COMMENT = \-r'''#-----------------------------------------------------------------+ src = " attr_names = (" + "".join(f"{nm!r}, " for nm in self.attr) + ")"+ return src+++_PROLOGUE_COMMENT = r"""#----------------------------------------------------------------- # ** ATTENTION **-# This code was automatically generated from the file:-# $cfg_filename+# This code was automatically generated from _c_ast.cfg #@@ -184,6 +177,6 @@ -'''-+""" _PROLOGUE_CODE = r''' import sys+from typing import Any, ClassVar, IO, Optional @@ -198,3 +191,3 @@ -class Node(object):+class Node: __slots__ = ()@@ -202,2 +195,4 @@ """
… 78 more lines (truncated)
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: ast_transforms.py@@ -7,3 +7,5 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------++from typing import Any, List, Tuple, cast @@ -12,52 +14,52 @@ -def fix_switch_cases(switch_node):- """ The 'case' statements in a 'switch' come out of parsing with one- child node, so subsequent statements are just tucked to the parent- Compound. Additionally, consecutive (fall-through) case statements- come out messy. This is a peculiarity of the C grammar. The following:+def fix_switch_cases(switch_node: c_ast.Switch) -> c_ast.Switch:+ """The 'case' statements in a 'switch' come out of parsing with one+ child node, so subsequent statements are just tucked to the parent+ Compound. Additionally, consecutive (fall-through) case statements+ come out messy. This is a peculiarity of the C grammar. The following: - switch (myvar) {- case 10:- k = 10;- p = k + 1;- return 10;- case 20:- case 30:- return 20;- default:- break;- }+ switch (myvar) {+ case 10:+ k = 10;+ p = k + 1;+ return 10;+ case 20:+ case 30:+ return 20;+ default:+ break;+ } - Creates this tree (pseudo-dump):+ Creates this tree (pseudo-dump): - Switch- ID: myvar- Compound:- Case 10:- k = 10+ Switch+ ID: myvar+ Compound:+ Case 10:+ k = 10+ p = k + 1+ return 10+ Case 20:+ Case 30:+ return 20+ Default:+ break++ The goal of this transform is to fix this mess, turning it into the+ following:++ Switch+ ID: myvar+ Compound:+ Case 10:+ k = 10 p = k + 1 return 10- Case 20:- Case 30:- return 20- Default:- break+ Case 20:+ Case 30:+ return 20+ Default:+ break - The goal of this transform is to fix this mess, turning it into the- following:-- Switch- ID: myvar- Compound:- Case 10:- k = 10- p = k + 1- return 10- Case 20:- Case 30:- return 20- Default:- break-- A fixed AST node is returned. The argument may be modified.+ A fixed AST node is returned. The argument may be modified. """@@ -72,3 +74,3 @@ # The last Case/Default node- last_case = None+ last_case: c_ast.Case | c_ast.Default | None = None @@ -77,3 +79,3 @@ # (for `switch(cond) {}`, block_items would have been None)- for child in (switch_node.stmt.block_items or []):+ for child in switch_node.stmt.block_items or []: if isinstance(child, (c_ast.Case, c_ast.Default)):@@ -98,18 +100,23 @@ -def _extract_nested_case(case_node, stmts_list):- """ Recursively extract consecutive Case statements that are made nested- by the parser and add them to the stmts_list.+def _extract_nested_case(+ case_node: c_ast.Case | c_ast.Default, stmts_list: List[c_ast.Node]+) -> None:+ """Recursively extract consecutive Case statements that are made nested+ by the parser and add them to the stmts_list. """ if isinstance(case_node.stmts[0], (c_ast.Case, c_ast.Default)):- stmts_list.append(case_node.stmts.pop())- _extract_nested_case(stmts_list[-1], stmts_list)+ nested = case_node.stmts.pop()+ stmts_list.append(nested)+ _extract_nested_case(cast(Any, nested), stmts_list) -def fix_atomic_specifiers(decl):- """ Atomic specifiers like _Atomic(type) are unusually structured,- conferring a qualifier upon the contained type.+def fix_atomic_specifiers(+ decl: c_ast.Decl | c_ast.Typedef,+) -> c_ast.Decl | c_ast.Typedef:+ """Atomic specifiers like _Atomic(type) are unusually structured,+ conferring a qualifier upon the contained type. - This function fixes a decl with atomic specifiers to have a sane AST- structure, by removing spurious Typename->TypeDecl pairs and attaching- the _Atomic qualifier in the right place.+ This function fixes a decl with atomic specifiers to have a sane AST+ structure, by removing spurious Typename->TypeDecl pairs and attaching+ the _Atomic qualifier in the right place. """@@ -125,3 +132,3 @@ # wrong place during construction).- typ = decl+ typ: Any = decl while not isinstance(typ, c_ast.TypeDecl):@@ -131,4 +138,4 @@ return decl- if '_Atomic' in typ.quals and '_Atomic' not in decl.quals:- decl.quals.append('_Atomic')+ if "_Atomic" in typ.quals and "_Atomic" not in decl.quals:+ decl.quals.append("_Atomic") if typ.declname is None:@@ -139,11 +146,13 @@ -def _fix_atomic_specifiers_once(decl):- """ Performs one 'fix' round of atomic specifiers.- Returns (modified_decl, found) where found is True iff a fix was made.+def _fix_atomic_specifiers_once(+ decl: c_ast.Decl | c_ast.Typedef,+) -> Tuple[c_ast.Decl | c_ast.Typedef, bool]:+ """Performs one 'fix' round of atomic specifiers.+ Returns (modified_decl, found) where found is True iff a fix was made. """- parent = decl- grandparent = None- node = decl.type+ parent: Any = decl+ grandparent: Any = None+ node: Any = decl.type while node is not None:- if isinstance(node, c_ast.Typename) and '_Atomic' in node.quals:+ if isinstance(node, c_ast.Typename) and "_Atomic" in node.quals: break@@ -160,5 +169,6 @@ assert isinstance(parent, c_ast.TypeDecl)- grandparent.type = node.type- if '_Atomic' not in node.type.quals:- node.type.quals.append('_Atomic')+ assert grandparent is not None+ cast(Any, grandparent).type = node.type+ if "_Atomic" not in node.type.quals:+ node.type.quals.append("_Atomic") return decl, True
--- +++ @@ -1,5 +1,4 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # ** ATTENTION **-# This code was automatically generated from the file:-# _c_ast.cfg+# This code was automatically generated from _c_ast.cfg #@@ -15,3 +14,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- @@ -19,2 +18,4 @@ import sys+from typing import Any, ClassVar, IO, Optional+ @@ -25,3 +26,3 @@ if isinstance(obj, list):- return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]'+ return "[" + (",\n ".join((_repr(e).replace("\n", "\n ") for e in obj))) + "\n]" else:@@ -29,3 +30,4 @@ -class Node(object):++class Node: __slots__ = ()@@ -33,9 +35,11 @@ """+ attr_names: ClassVar[tuple[str, ...]] = ()+ coord: Optional[Any]+ def __repr__(self):- """ Generates a python representation of the current node- """- result = self.__class__.__name__ + '('-- indent = ''- separator = ''+ """Generates a python representation of the current node"""+ result = self.__class__.__name__ + "("++ indent = ""+ separator = "" for name in self.__slots__[:-2]:@@ -43,8 +47,17 @@ result += indent- result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n ' + (' ' * (len(name) + len(self.__class__.__name__)))))-- separator = ','- indent = '\n ' + (' ' * len(self.__class__.__name__))-- result += indent + ')'+ result += (+ name+ + "="+ + (+ _repr(getattr(self, name)).replace(+ "\n",+ "\n " + (" " * (len(name) + len(self.__class__.__name__))),+ )+ )+ )++ separator = ","+ indent = "\n " + (" " * len(self.__class__.__name__))++ result += indent + ")" @@ -53,41 +66,59 @@ def children(self):- """ A sequence of all children that are Nodes+ """A sequence of all children that are Nodes"""+ pass++ def show(+ self,+ buf: IO[str] = sys.stdout,+ offset: int = 0,+ attrnames: bool = False,+ showemptyattrs: bool = True,+ nodenames: bool = False,+ showcoord: bool = False,+ _my_node_name: Optional[str] = None,+ ):+ """Pretty print the Node and all its attributes and+ children (recursively) to a buffer.++ buf:+ Open IO buffer into which the Node is printed.++ offset:+ Initial offset (amount of leading spaces)++ attrnames:+ True if you want to see the attribute names in+ name=value pairs. False to only see the values.++ showemptyattrs:+ False if you want to suppress printing empty attributes.++ nodenames:+ True if you want to see the actual node names+ within their parents.++ showcoord:+ Do you want the coordinates of each Node to be+ displayed. """- pass-- def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):- """ Pretty print the Node and all its attributes and- children (recursively) to a buffer.-- buf:- Open IO buffer into which the Node is printed.-- offset:- Initial offset (amount of leading spaces)-- attrnames:- True if you want to see the attribute names in- name=value pairs. False to only see the values.-- nodenames:- True if you want to see the actual node names- within their parents.-- showcoord:- Do you want the coordinates of each Node to be- displayed.- """- lead = ' ' * offset+ lead = " " * offset if nodenames and _my_node_name is not None:- buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')+ buf.write(lead + self.__class__.__name__ + " <" + _my_node_name + ">: ") else:- buf.write(lead + self.__class__.__name__+ ': ')+ buf.write(lead + self.__class__.__name__ + ": ") if self.attr_names:++ def is_empty(v):+ v is None or (hasattr(v, "__len__") and len(v) == 0)++ nvlist = [+ (n, getattr(self, n))+ for n in self.attr_names+ if showemptyattrs or not is_empty(getattr(self, n))+ ] if attrnames:- nvlist = [(n, getattr(self,n)) for n in self.attr_names]- attrstr = ', '.join('%s=%s' % nv for nv in nvlist)+ attrstr = ", ".join(f"{name}={value}" for name, value in nvlist) else:- vlist = [getattr(self, n) for n in self.attr_names]- attrstr = ', '.join('%s' % v for v in vlist)+ attrstr = ", ".join(f"{value}" for _, value in nvlist) buf.write(attrstr)@@ -95,6 +126,6 @@ if showcoord:- buf.write(' (at %s)' % self.coord)- buf.write('\n')-- for (child_name, child) in self.children():+ buf.write(f" (at {self.coord})")+ buf.write("\n")++ for child_name, child in self.children(): child.show(@@ -103,39 +134,41 @@ attrnames=attrnames,+ showemptyattrs=showemptyattrs, nodenames=nodenames, showcoord=showcoord,- _my_node_name=child_name)---class NodeVisitor(object):- """ A base NodeVisitor class for visiting c_ast nodes.- Subclass it and define your own visit_XXX methods, where- XXX is the class name you want to visit with these- methods.-- For example:-- class ConstantVisitor(NodeVisitor):- def __init__(self):- self.values = []-- def visit_Constant(self, node):- self.values.append(node.value)-- Creates a list of values of all the constant nodes- encountered below the given node. To use it:-- cv = ConstantVisitor()- cv.visit(node)-- Notes:-- * generic_visit() will be called for AST nodes for which- no visit_XXX method was defined.- * The children of nodes for which a visit_XXX was- defined will not be visited - if you need this, call- generic_visit() on the node.- You can use:- NodeVisitor.generic_visit(self, node)- * Modeled after Python's own AST visiting facilities- (the ast module of Python 3.0)+ _my_node_name=child_name,+ )+++class NodeVisitor:+ """A base NodeVisitor class for visiting c_ast nodes.+ Subclass it and define your own visit_XXX methods, where+ XXX is the class name you want to visit with these+ methods.++ For example:++ class ConstantVisitor(NodeVisitor):+ def __init__(self):+ self.values = []++ def visit_Constant(self, node):+ self.values.append(node.value)++ Creates a list of values of all the constant nodes+ encountered below the given node. To use it:++ cv = ConstantVisitor()+ cv.visit(node)++ Notes:++ * generic_visit() will be called for AST nodes for which+ no visit_XXX method was defined.+ * The children of nodes for which a visit_XXX was+ defined will not be visited - if you need this, call+ generic_visit() on the node.+ You can use:+ NodeVisitor.generic_visit(self, node)
… 918 more lines (truncated)
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_generator.py@@ -7,3 +7,5 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------+from typing import Callable, List, Optional+ from . import c_ast@@ -11,12 +13,16 @@ -class CGenerator(object):- """ Uses the same visitor pattern as c_ast.NodeVisitor, but modified to- return a value from each visit method, using string accumulation in- generic_visit.+class CGenerator:+ """Uses the same visitor pattern as c_ast.NodeVisitor, but modified to+ return a value from each visit method, using string accumulation in+ generic_visit. """- def __init__(self, reduce_parentheses=False):- """ Constructs C-code generator-- reduce_parentheses:- if True, eliminates needless parentheses on binary operators++ indent_level: int+ reduce_parentheses: bool++ def __init__(self, reduce_parentheses: bool = False) -> None:+ """Constructs C-code generator++ reduce_parentheses:+ if True, eliminates needless parentheses on binary operators """@@ -27,32 +33,32 @@ - def _make_indent(self):- return ' ' * self.indent_level-- def visit(self, node):- method = 'visit_' + node.__class__.__name__+ def _make_indent(self) -> str:+ return " " * self.indent_level++ def visit(self, node: c_ast.Node) -> str:+ method = "visit_" + node.__class__.__name__ return getattr(self, method, self.generic_visit)(node) - def generic_visit(self, node):+ def generic_visit(self, node: Optional[c_ast.Node]) -> str: if node is None:- return ''+ return "" else:- return ''.join(self.visit(c) for c_name, c in node.children())-- def visit_Constant(self, n):+ return "".join(self.visit(c) for c_name, c in node.children())++ def visit_Constant(self, n: c_ast.Constant) -> str: return n.value - def visit_ID(self, n):+ def visit_ID(self, n: c_ast.ID) -> str: return n.name - def visit_Pragma(self, n):- ret = '#pragma'+ def visit_Pragma(self, n: c_ast.Pragma) -> str:+ ret = "#pragma" if n.string:- ret += ' ' + n.string+ ret += " " + n.string return ret - def visit_ArrayRef(self, n):+ def visit_ArrayRef(self, n: c_ast.ArrayRef) -> str: arrref = self._parenthesize_unless_simple(n.name)- return arrref + '[' + self.visit(n.subscript) + ']'-- def visit_StructRef(self, n):+ return arrref + "[" + self.visit(n.subscript) + "]"++ def visit_StructRef(self, n: c_ast.StructRef) -> str: sref = self._parenthesize_unless_simple(n.name)@@ -60,19 +66,22 @@ - def visit_FuncCall(self, n):+ def visit_FuncCall(self, n: c_ast.FuncCall) -> str: fref = self._parenthesize_unless_simple(n.name)- return fref + '(' + self.visit(n.args) + ')'-- def visit_UnaryOp(self, n):- if n.op == 'sizeof':- # Always parenthesize the argument of sizeof since it can be- # a name.- return 'sizeof(%s)' % self.visit(n.expr)- else:- operand = self._parenthesize_unless_simple(n.expr)- if n.op == 'p++':- return '%s++' % operand- elif n.op == 'p--':- return '%s--' % operand- else:- return '%s%s' % (n.op, operand)+ args = self.visit(n.args) if n.args is not None else ""+ return fref + "(" + args + ")"++ def visit_UnaryOp(self, n: c_ast.UnaryOp) -> str:+ match n.op:+ case "sizeof":+ # Always parenthesize the argument of sizeof since it can be+ # a name.+ return f"sizeof({self.visit(n.expr)})"+ case "p++":+ operand = self._parenthesize_unless_simple(n.expr)+ return f"{operand}++"+ case "p--":+ operand = self._parenthesize_unless_simple(n.expr)+ return f"{operand}--"+ case _:+ operand = self._parenthesize_unless_simple(n.expr)+ return f"{n.op}{operand}" @@ -82,15 +91,23 @@ # Higher numbers are stronger binding- '||': 0, # weakest binding- '&&': 1,- '|': 2,- '^': 3,- '&': 4,- '==': 5, '!=': 5,- '>': 6, '>=': 6, '<': 6, '<=': 6,- '>>': 7, '<<': 7,- '+': 8, '-': 8,- '*': 9, '/': 9, '%': 9 # strongest binding+ "||": 0, # weakest binding+ "&&": 1,+ "|": 2,+ "^": 3,+ "&": 4,+ "==": 5,+ "!=": 5,+ ">": 6,+ ">=": 6,+ "<": 6,+ "<=": 6,+ ">>": 7,+ "<<": 7,+ "+": 8,+ "-": 8,+ "*": 9,+ "/": 9,+ "%": 9, # strongest binding } - def visit_BinaryOp(self, n):+ def visit_BinaryOp(self, n: c_ast.BinaryOp) -> str: # Note: all binary operators are left-to-right associative@@ -106,5 +123,9 @@ n.left,- lambda d: not (self._is_simple_node(d) or- self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and- self.precedence_map[d.op] >= self.precedence_map[n.op]))+ lambda d: not (+ self._is_simple_node(d)+ or self.reduce_parentheses+ and isinstance(d, c_ast.BinaryOp)+ and self.precedence_map[d.op] >= self.precedence_map[n.op]+ ),+ ) # If `n.right.op` has a stronger -but not equal- binding precedence,@@ -118,25 +139,30 @@ n.right,- lambda d: not (self._is_simple_node(d) or- self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and- self.precedence_map[d.op] > self.precedence_map[n.op]))- return '%s %s %s' % (lval_str, n.op, rval_str)-- def visit_Assignment(self, n):+ lambda d: not (+ self._is_simple_node(d)+ or self.reduce_parentheses+ and isinstance(d, c_ast.BinaryOp)+ and self.precedence_map[d.op] > self.precedence_map[n.op]+ ),+ )+ return f"{lval_str} {n.op} {rval_str}"++ def visit_Assignment(self, n: c_ast.Assignment) -> str: rval_str = self._parenthesize_if(- n.rvalue,- lambda n: isinstance(n, c_ast.Assignment))- return '%s %s %s' % (self.visit(n.lvalue), n.op, rval_str)-- def visit_IdentifierType(self, n):- return ' '.join(n.names)-- def _visit_expr(self, n):- if isinstance(n, c_ast.InitList):- return '{' + self.visit(n) + '}'- elif isinstance(n, (c_ast.ExprList, c_ast.Compound)):- return '(' + self.visit(n) + ')'- else:- return self.visit(n)-- def visit_Decl(self, n, no_type=False):+ n.rvalue, lambda n: isinstance(n, c_ast.Assignment)+ )+ return f"{self.visit(n.lvalue)} {n.op} {rval_str}"++ def visit_IdentifierType(self, n: c_ast.IdentifierType) -> str:+ return " ".join(n.names)++ def _visit_expr(self, n: c_ast.Node) -> str:+ match n:+ case c_ast.InitList():+ return "{" + self.visit(n) + "}"+ case c_ast.ExprList() | c_ast.Compound():+ return "(" + self.visit(n) + ")"+ case _:+ return self.visit(n)++ def visit_Decl(self, n: c_ast.Decl, no_type: bool = False) -> str: # no_type is used when a Decl is part of a DeclList, where the type is@@ -145,17 +171,20 @@ s = n.name if no_type else self._generate_decl(n)- if n.bitsize: s += ' : ' + self.visit(n.bitsize)+ if n.bitsize:+ s += " : " + self.visit(n.bitsize) if n.init:- s += ' = ' + self._visit_expr(n.init)- return s-- def visit_DeclList(self, n):+ s += " = " + self._visit_expr(n.init)+ return s++ def visit_DeclList(self, n: c_ast.DeclList) -> str: s = self.visit(n.decls[0]) if len(n.decls) > 1:- s += ', ' + ', '.join(self.visit_Decl(decl, no_type=True)- for decl in n.decls[1:])- return s-
… 641 more lines (truncated)
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_lexer.py@@ -7,36 +7,42 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import re--from .ply import lex-from .ply.lex import TOKEN---class CLexer(object):- """ A lexer for the C language. After building it, set the- input text with input(), and call token() to get new- tokens.-- The public attribute filename can be set to an initial- filename, but the lexer will update it upon #line- directives.+from dataclasses import dataclass+from enum import Enum+from typing import Callable, Dict, List, Optional, Tuple+++@dataclass(slots=True)+class _Token:+ type: str+ value: str+ lineno: int+ column: int+++class CLexer:+ """A standalone lexer for C.++ Parameters for construction:+ error_func:+ Called with (msg, line, column) on lexing errors.+ on_lbrace_func:+ Called when an LBRACE token is produced (used for scope tracking).+ on_rbrace_func:+ Called when an RBRACE token is produced (used for scope tracking).+ type_lookup_func:+ Called with an identifier name; expected to return True if it is+ a typedef name and should be tokenized as TYPEID.++ Call input(text) to initialize lexing, and then keep calling token() to+ get the next token, until it returns None (at end of input). """- def __init__(self, error_func, on_lbrace_func, on_rbrace_func,- type_lookup_func):- """ Create a new Lexer.-- error_func:- An error function. Will be called with an error- message, line and column as arguments, in case of- an error during lexing.-- on_lbrace_func, on_rbrace_func:- Called when an LBRACE or RBRACE is encountered- (likely to push/pop type_lookup_func's scope)-- type_lookup_func:- A type lookup function. Given a string, it must- return True IFF this string is a name of a type- that was defined with a typedef earlier.- """++ def __init__(+ self,+ error_func: Callable[[str, int, int], None],+ on_lbrace_func: Callable[[], None],+ on_rbrace_func: Callable[[], None],+ type_lookup_func: Callable[[str], bool],+ ) -> None: self.error_func = error_func@@ -45,525 +51,656 @@ self.type_lookup_func = type_lookup_func- self.filename = ''-- # Keeps track of the last token returned from self.token()- self.last_token = None-- # Allow either "# line" or "# <num>" to support GCC's- # cpp output- #- self.line_pattern = re.compile(r'([ \t]*line\W)|([ \t]*\d+)')- self.pragma_pattern = re.compile(r'[ \t]*pragma\W')-- def build(self, **kwargs):- """ Builds the lexer from the specification. Must be- called after the lexer object is created.-- This method exists separately, because the PLY- manual warns against calling lex.lex inside- __init__+ self._init_state()++ def input(self, text: str, filename: str = "") -> None:+ """Initialize the lexer to the given input text.++ filename is an optional name identifying the file from which the input+ comes. The lexer can modify it if #line directives are encountered. """- self.lexer = lex.lex(object=self, **kwargs)-- def reset_lineno(self):- """ Resets the internal line number counter of the lexer.+ self._init_state()+ self._lexdata = text+ self._filename = filename++ def _init_state(self) -> None:+ self._lexdata = ""+ self._filename = ""+ self._pos = 0+ self._line_start = 0+ self._pending_tok: Optional[_Token] = None+ self._lineno = 1++ @property+ def filename(self) -> str:+ return self._filename++ def token(self) -> Optional[_Token]:+ # Lexing strategy overview:+ #+ # - We maintain a current position (self._pos), line number, and the+ # byte offset of the current line start. The lexer is a simple loop+ # that skips whitespace/newlines and emits one token per call.+ # - A small amount of logic is handled manually before regex matching:+ #+ # * Preprocessor-style directives: if we see '#', we check whether+ # it's a #line or #pragma directive and consume it inline. #line+ # updates lineno/filename and produces no tokens. #pragma can yield+ # both PPPRAGMA and PPPRAGMASTR, but token() returns a single token,+ # so we stash the PPPRAGMASTR as _pending_tok to return on the next+ # token() call. Otherwise we return PPHASH.+ # * Newlines update lineno/line-start tracking so tokens can record+ # accurate columns.+ #+ # - The bulk of tokens are recognized in _match_token:+ #+ # * _regex_rules: regex patterns for identifiers, literals, and other+ # complex tokens (including error-producing patterns). The lexer+ # uses a combined _regex_master to scan options at the same time.+ # * _fixed_tokens: exact string matches for operators and punctuation,+ # resolved by longest match.+ #+ # - Error patterns call the error callback and advance minimally, which+ # keeps lexing resilient while reporting useful diagnostics.+ text = self._lexdata+ n = len(text)++ if self._pending_tok is not None:+ tok = self._pending_tok+ self._pending_tok = None+ return tok++ while self._pos < n:+ match text[self._pos]:+ case " " | "\t":+ self._pos += 1+ case "\n":+ self._lineno += 1+ self._pos += 1+ self._line_start = self._pos+ case "#":+ if _line_pattern.match(text, self._pos + 1):+ self._pos += 1+ self._handle_ppline()+ continue+ if _pragma_pattern.match(text, self._pos + 1):+ self._pos += 1+ toks = self._handle_pppragma()+ if len(toks) > 1:+ self._pending_tok = toks[1]+ if len(toks) > 0:+ return toks[0]+ continue+ tok = self._make_token("PPHASH", "#", self._pos)+ self._pos += 1+ return tok+ case _:+ if tok := self._match_token():+ return tok+ else:+ continue++ def _match_token(self) -> Optional[_Token]:+ """Match one token at the current position.++ Returns a Token on success, or None if no token could be matched and+ an error was reported. This method always advances _pos by the matched+ length, or by 1 on error/no-match. """- self.lexer.lineno = 1-- def input(self, text):- self.lexer.input(text)-- def token(self):- self.last_token = self.lexer.token()- return self.last_token-- def find_tok_column(self, token):- """ Find the column of the token in its line.+ text = self._lexdata+ pos = self._pos+ # We pick the longest match between:+ # - the master regex (identifiers, literals, error patterns, etc.)+ # - fixed operator/punctuator literals from the bucket for text[pos]+ #+ # The longest match is required to ensure we properly lex something+ # like ".123" (a floating-point constant) as a single entity (with+ # FLOAT_CONST), rather than a PERIOD followed by a number.+ #+ # The fixed-literal buckets are already length-sorted, so within that+ # bucket we can take the first match. However, we still compare its+ # length to the regex match because the regex may have matched a longer+ # token that should take precedence.+ best = None++ if m := _regex_master.match(text, pos):+ tok_type = m.lastgroup+ # All master-regex alternatives are named; lastgroup shouldn't be None.+ assert tok_type is not None+ value = m.group(tok_type)+ length = len(value)+ action, msg = _regex_actions[tok_type]+ best = (length, tok_type, value, action, msg)++ if bucket := _fixed_tokens_by_first.get(text[pos]):+ for entry in bucket:+ if text.startswith(entry.literal, pos):+ length = len(entry.literal)+ if best is None or length > best[0]:+ best = (+ length,+ entry.tok_type,+ entry.literal,+ _RegexAction.TOKEN,+ None,+ )+ break
… 1009 more lines (truncated)
--- +++ @@ -1,5 +1,5 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_parser.py #-# CParser class: Parser and AST builder for the C language+# Recursive-descent parser for the C language. #@@ -7,8 +7,18 @@ # License: BSD-#-------------------------------------------------------------------------------from .ply import yacc+# ------------------------------------------------------------------------------+from dataclasses import dataclass+from typing import (+ Any,+ Dict,+ List,+ Literal,+ NoReturn,+ Optional,+ Tuple,+ TypedDict,+ cast,+) from . import c_ast-from .c_lexer import CLexer-from .plyparser import PLYParser, ParseError, parameterized, template+from .c_lexer import CLexer, _Token from .ast_transforms import fix_switch_cases, fix_atomic_specifiers@@ -16,63 +26,48 @@ -@template-class CParser(PLYParser):+@dataclass+class Coord:+ """Coordinates of a syntactic element. Consists of:+ - File name+ - Line number+ - Column number+ """++ file: str+ line: int+ column: Optional[int] = None++ def __str__(self) -> str:+ text = f"{self.file}:{self.line}"+ if self.column:+ text += f":{self.column}"+ return text+++class ParseError(Exception):+ pass+++class CParser:+ """Recursive-descent C parser.++ Usage:+ parser = CParser()+ ast = parser.parse(text, filename)++ The `lexer` parameter lets you inject a lexer class (defaults to CLexer).+ The parameters after `lexer` are accepted for backward compatibility with+ the old PLY-based parser and are otherwise unused.+ """+ def __init__(- self,- lex_optimize=True,- lexer=CLexer,- lextab='pycparser.lextab',- yacc_optimize=True,- yacctab='pycparser.yacctab',- yacc_debug=False,- taboutputdir=''):- """ Create a new CParser.-- Some arguments for controlling the debug/optimization- level of the parser are provided. The defaults are- tuned for release/performance mode.- The simple rules for using them are:- *) When tweaking CParser/CLexer, set these to False- *) When releasing a stable parser, set to True-- lex_optimize:- Set to False when you're modifying the lexer.- Otherwise, changes in the lexer won't be used, if- some lextab.py file exists.- When releasing with a stable lexer, set to True- to save the re-generation of the lexer table on- each run.-- lexer:- Set this parameter to define the lexer to use if- you're not using the default CLexer.-- lextab:- Points to the lex table that's used for optimized- mode. Only if you're modifying the lexer and want- some tests to avoid re-generating the table, make- this point to a local lex table file (that's been- earlier generated with lex_optimize=True)-- yacc_optimize:- Set to False when you're modifying the parser.- Otherwise, changes in the parser won't be used, if- some parsetab.py file exists.- When releasing with a stable parser, set to True- to save the re-generation of the parser table on- each run.-- yacctab:- Points to the yacc table that's used for optimized- mode. Only if you're modifying the parser, make- this point to a local yacc table file-- yacc_debug:- Generate a parser.out file that explains how yacc- built the parsing table from the grammar.-- taboutputdir:- Set this parameter to control the location of generated- lextab and yacctab files.- """- self.clex = lexer(+ self,+ lex_optimize: bool = True,+ lexer: type[CLexer] = CLexer,+ lextab: str = "pycparser.lextab",+ yacc_optimize: bool = True,+ yacctab: str = "pycparser.yacctab",+ yacc_debug: bool = False,+ taboutputdir: str = "",+ ) -> None:+ self.clex: CLexer = lexer( error_func=self._lex_error_func,@@ -80,37 +75,4 @@ on_rbrace_func=self._lex_on_rbrace_func,- type_lookup_func=self._lex_type_lookup_func)-- self.clex.build(- optimize=lex_optimize,- lextab=lextab,- outputdir=taboutputdir)- self.tokens = self.clex.tokens-- rules_with_opt = [- 'abstract_declarator',- 'assignment_expression',- 'declaration_list',- 'declaration_specifiers_no_type',- 'designation',- 'expression',- 'identifier_list',- 'init_declarator_list',- 'id_init_declarator_list',- 'initializer_list',- 'parameter_type_list',- 'block_item_list',- 'type_qualifier_list',- 'struct_declarator_list'- ]-- for rule in rules_with_opt:- self._create_opt_rule(rule)-- self.cparser = yacc.yacc(- module=self,- start='translation_unit_or_empty',- debug=yacc_debug,- optimize=yacc_optimize,- tabmodule=yacctab,- outputdir=taboutputdir)+ type_lookup_func=self._lex_type_lookup_func,+ ) @@ -124,35 +86,43 @@ # in this scope at all.+ self._scope_stack: List[Dict[str, bool]] = [dict()]+ self._tokens: _TokenStream = _TokenStream(self.clex)++ def parse(+ self, text: str, filename: str = "", debug: bool = False+ ) -> c_ast.FileAST:+ """Parses C code and returns an AST.++ text:+ A string containing the C source code++ filename:+ Name of the file being parsed (for meaningful+ error messages)++ debug:+ Deprecated debug flag (unused); for backwards compatibility.+ """ self._scope_stack = [dict()]-- # Keeps track of the last token given to yacc (the lookahead token)- self._last_yielded_token = None-- def parse(self, text, filename='', debug=False):- """ Parses C code and returns an AST.-- text:- A string containing the C source code-- filename:- Name of the file being parsed (for meaningful- error messages)-- debug:- Debug flag to YACC- """- self.clex.filename = filename- self.clex.reset_lineno()- self._scope_stack = [dict()]- self._last_yielded_token = None- return self.cparser.parse(- input=text,- lexer=self.clex,- debug=debug)-- ######################-- PRIVATE --######################-- def _push_scope(self):+ self.clex.input(text, filename)+ self._tokens = _TokenStream(self.clex)++ ast = self._parse_translation_unit_or_empty()+ tok = self._peek()+ if tok is not None:+ self._parse_error(f"before: {tok.value}", self._tok_coord(tok))+ return ast++ # ------------------------------------------------------------------+ # Scope and declaration helpers+ # ------------------------------------------------------------------+ def _coord(self, lineno: int, column: Optional[int] = None) -> Coord:+ return Coord(file=self.clex.filename, line=lineno, column=column)++ def _parse_error(self, msg: str, coord: Coord | str | None) -> NoReturn:+ raise ParseError(f"{coord}: {msg}")+
… 3795 more lines (truncated)
--- +++ @@ -0,0 +1,38 @@+[build-system]+requires = ["setuptools>=69", "wheel"]+build-backend = "setuptools.build_meta"++[project]+name = "pycparser"+version = "3.00"+description = "C parser in Python"+readme = "README.rst"+license = "BSD-3-Clause"+license-files = ["LICENSE"]+requires-python = ">=3.10"+authors = [{name = "Eli Bendersky", email = "[email protected]"}]+maintainers = [{name = "Eli Bendersky", email = "[email protected]"}]+classifiers = [+ "Development Status :: 5 - Production/Stable",+ "Programming Language :: Python :: 3",+ "Programming Language :: Python :: 3.10",+ "Programming Language :: Python :: 3.11",+ "Programming Language :: Python :: 3.12",+ "Programming Language :: Python :: 3.13",+ "Programming Language :: Python :: 3.14",+]++[project.urls]+Homepage = "https://github.com/eliben/pycparser"++[tool.setuptools]+packages = ["pycparser"]++[tool.setuptools.package-data]+pycparser = ["*.cfg"]++[tool.ruff.lint]+ignore = ["F403", "F405"]++[tool.ty.src]+exclude = ["setup.py", "utils/internal/memprofiling.py"]
--- +++ @@ -4,5 +4,5 @@ -sys.path.insert(0, '..')+sys.path.insert(0, "..") import pycparser.c_ast as c_ast-import pycparser.plyparser as plyparser+from pycparser.c_parser import Coord @@ -12,18 +12,21 @@ b1 = c_ast.BinaryOp(- op='+',- left=c_ast.Constant(type='int', value='6'),- right=c_ast.ID(name='joe'))+ op="+",+ left=c_ast.Constant(type="int", value="6"),+ right=c_ast.ID(name="joe"),+ ) self.assertIsInstance(b1.left, c_ast.Constant)- self.assertEqual(b1.left.type, 'int')- self.assertEqual(b1.left.value, '6')+ self.assertEqual(b1.left.type, "int")+ self.assertEqual(b1.left.value, "6") self.assertIsInstance(b1.right, c_ast.ID)- self.assertEqual(b1.right.name, 'joe')+ self.assertEqual(b1.right.name, "joe") def test_weakref_works_on_nodes(self):- c1 = c_ast.Constant(type='float', value='3.14')+ c1 = c_ast.Constant(type="float", value="3.14") wr = weakref.ref(c1) cref = wr()- self.assertEqual(cref.type, 'float')+ self.assertIsNotNone(cref)+ assert cref is not None+ self.assertEqual(cref.type, "float") self.assertEqual(weakref.getweakrefcount(c1), 1)@@ -31,5 +34,7 @@ def test_weakref_works_on_coord(self):- coord = plyparser.Coord(file='a', line=2)+ coord = Coord(file="a", line=2) wr = weakref.ref(coord) cref = wr()+ self.assertIsNotNone(cref)+ assert cref is not None self.assertEqual(cref.line, 2)@@ -48,5 +53,6 @@ b1 = c_ast.BinaryOp(- op='+',- left=c_ast.Constant(type='int', value='6'),- right=c_ast.ID(name='joe'))+ op="+",+ left=c_ast.Constant(type="int", value="6"),+ right=c_ast.ID(name="joe"),+ ) @@ -55,13 +61,9 @@ - self.assertEqual(cv.values, ['6'])+ self.assertEqual(cv.values, ["6"]) b2 = c_ast.BinaryOp(- op='*',- left=c_ast.Constant(type='int', value='111'),- right=b1)+ op="*", left=c_ast.Constant(type="int", value="111"), right=b1+ ) - b3 = c_ast.BinaryOp(- op='^',- left=b2,- right=b1)+ b3 = c_ast.BinaryOp(op="^", left=b2, right=b1) @@ -70,20 +72,13 @@ - self.assertEqual(cv.values, ['111', '6', '6'])+ self.assertEqual(cv.values, ["111", "6", "6"]) def tests_list_children(self):- c1 = c_ast.Constant(type='float', value='5.6')- c2 = c_ast.Constant(type='char', value='t')+ c1 = c_ast.Constant(type="float", value="5.6")+ c2 = c_ast.Constant(type="char", value="t") - b1 = c_ast.BinaryOp(- op='+',- left=c1,- right=c2)+ b1 = c_ast.BinaryOp(op="+", left=c1, right=c2) - b2 = c_ast.BinaryOp(- op='-',- left=b1,- right=c2)+ b2 = c_ast.BinaryOp(op="-", left=b1, right=c2) - comp = c_ast.Compound(- block_items=[b1, b2, c1, c2])+ comp = c_ast.Compound(block_items=[b1, b2, c1, c2]) @@ -92,57 +87,50 @@ - self.assertEqual(cv.values,- ['5.6', 't', '5.6', 't', 't', '5.6', 't'])+ self.assertEqual(cv.values, ["5.6", "t", "5.6", "t", "t", "5.6", "t"]) def test_repr(self):- c1 = c_ast.Constant(type='float', value='5.6')- c2 = c_ast.Constant(type='char', value='t')+ c1 = c_ast.Constant(type="float", value="5.6")+ c2 = c_ast.Constant(type="char", value="t") - b1 = c_ast.BinaryOp(- op='+',- left=c1,- right=c2)+ b1 = c_ast.BinaryOp(op="+", left=c1, right=c2) - b2 = c_ast.BinaryOp(- op='-',- left=b1,- right=c2)+ b2 = c_ast.BinaryOp(op="-", left=b1, right=c2) - comp = c_ast.Compound(- block_items=[b1, b2, c1, c2])+ comp = c_ast.Compound(block_items=[b1, b2, c1, c2]) - expected = ("Compound(block_items=[BinaryOp(op='+',\n"- " left=Constant(type='float',\n"- " value='5.6'\n"- " ),\n"- " right=Constant(type='char',\n"- " value='t'\n"- " )\n"- " ),\n"- " BinaryOp(op='-',\n"- " left=BinaryOp(op='+',\n"- " left=Constant(type='float',\n"- " value='5.6'\n"- " ),\n"- " right=Constant(type='char',\n"- " value='t'\n"- " )\n"- " ),\n"- " right=Constant(type='char',\n"- " value='t'\n"- " )\n"- " ),\n"- " Constant(type='float',\n"- " value='5.6'\n"- " ),\n"- " Constant(type='char',\n"- " value='t'\n"- " )\n"- " ]\n"- " )")+ expected = (+ "Compound(block_items=[BinaryOp(op='+',\n"+ " left=Constant(type='float',\n"+ " value='5.6'\n"+ " ),\n"+ " right=Constant(type='char',\n"+ " value='t'\n"+ " )\n"+ " ),\n"+ " BinaryOp(op='-',\n"+ " left=BinaryOp(op='+',\n"+ " left=Constant(type='float',\n"+ " value='5.6'\n"+ " ),\n"+ " right=Constant(type='char',\n"+ " value='t'\n"+ " )\n"+ " ),\n"+ " right=Constant(type='char',\n"+ " value='t'\n"+ " )\n"+ " ),\n"+ " Constant(type='float',\n"+ " value='5.6'\n"+ " ),\n"+ " Constant(type='char',\n"+ " value='t'\n"+ " )\n"+ " ]\n"+ " )"+ ) - self.assertEqual(repr(comp),- expected)+ self.assertEqual(repr(comp), expected) -if __name__ == '__main__':+if __name__ == "__main__": unittest.main()
--- +++ @@ -5,3 +5,3 @@ # Run from the root dir-sys.path.insert(0, '.')+sys.path.insert(0, ".") @@ -10,7 +10,3 @@ -_c_parser = c_parser.CParser(- lex_optimize=False,- yacc_debug=True,- yacc_optimize=False,- yacctab='yacctab')+_c_parser = c_parser.CParser() @@ -26,3 +22,3 @@ # ast1 and ast2 are the same.- if type(ast1) != type(ast2):+ if type(ast1) is not type(ast2): return False@@ -67,6 +63,6 @@ def test_partial_funcdecl_generation(self):- src = r'''+ src = r""" void noop(void); void *something(void *thing);- int add(int x, int y);'''+ int add(int x, int y);""" ast = parse_to_ast(src)@@ -75,5 +71,5 @@ self.assertEqual(len(v.stubs), 3)- self.assertTrue(r'void noop(void)' in v.stubs)- self.assertTrue(r'void *something(void *thing)' in v.stubs)- self.assertTrue(r'int add(int x, int y)' in v.stubs)+ self.assertTrue(r"void noop(void)" in v.stubs)+ self.assertTrue(r"void *something(void *thing)" in v.stubs)+ self.assertTrue(r"int add(int x, int y)" in v.stubs) @@ -87,11 +83,13 @@ def _assert_ctoc_correct(self, src, *args, **kwargs):- """ Checks that the c2c translation was correct by parsing the code- generated by c2c for src and comparing the AST with the original- AST.-- Additional arguments are passed to CGenerator.__init__.+ """Checks that the c2c translation was correct by parsing the code+ generated by c2c for src and comparing the AST with the original+ AST.++ Additional arguments are passed to CGenerator.__init__. """ src2 = self._run_c_to_c(src, *args, **kwargs)- self.assertTrue(compare_asts(parse_to_ast(src), parse_to_ast(src2)),- "{!r} != {!r}".format(src, src2))+ self.assertTrue(+ compare_asts(parse_to_ast(src), parse_to_ast(src2)),+ "{!r} != {!r}".format(src, src2),+ ) return src2@@ -99,26 +97,26 @@ def test_trivial_decls(self):- self._assert_ctoc_correct('int a;')- self._assert_ctoc_correct('int b, a;')- self._assert_ctoc_correct('int c, b, a;')- self._assert_ctoc_correct('auto int a;')- self._assert_ctoc_correct('register int a;')- self._assert_ctoc_correct('_Thread_local int a;')+ self._assert_ctoc_correct("int a;")+ self._assert_ctoc_correct("int b, a;")+ self._assert_ctoc_correct("int c, b, a;")+ self._assert_ctoc_correct("auto int a;")+ self._assert_ctoc_correct("register int a;")+ self._assert_ctoc_correct("_Thread_local int a;") def test_complex_decls(self):- self._assert_ctoc_correct('int** (*a)(void);')- self._assert_ctoc_correct('int** (*a)(void*, int);')- self._assert_ctoc_correct('int (*b)(char * restrict k, float);')- self._assert_ctoc_correct('int (*b)(char * _Atomic k, float);')- self._assert_ctoc_correct('int (*b)(char * _Atomic volatile k, float);')- self._assert_ctoc_correct('int test(const char* const* arg);')- self._assert_ctoc_correct('int test(const char** const arg);')+ self._assert_ctoc_correct("int** (*a)(void);")+ self._assert_ctoc_correct("int** (*a)(void*, int);")+ self._assert_ctoc_correct("int (*b)(char * restrict k, float);")+ self._assert_ctoc_correct("int (*b)(char * _Atomic k, float);")+ self._assert_ctoc_correct("int (*b)(char * _Atomic volatile k, float);")+ self._assert_ctoc_correct("int test(const char* const* arg);")+ self._assert_ctoc_correct("int test(const char** const arg);") def test_alignment(self):- self._assert_ctoc_correct('_Alignas(32) int b;')- self._assert_ctoc_correct('int _Alignas(32) a;')- self._assert_ctoc_correct('_Alignas(32) _Atomic(int) b;')- self._assert_ctoc_correct('_Atomic(int) _Alignas(32) b;')- self._assert_ctoc_correct('_Alignas(long long) int a;')- self._assert_ctoc_correct('int _Alignas(long long) a;')- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct("_Alignas(32) int b;")+ self._assert_ctoc_correct("int _Alignas(32) a;")+ self._assert_ctoc_correct("_Alignas(32) _Atomic(int) b;")+ self._assert_ctoc_correct("_Atomic(int) _Alignas(32) b;")+ self._assert_ctoc_correct("_Alignas(long long) int a;")+ self._assert_ctoc_correct("int _Alignas(long long) a;")+ self._assert_ctoc_correct(r""" typedef struct node_t {@@ -127,4 +125,4 @@ } node;- ''')- self._assert_ctoc_correct(r'''+ """)+ self._assert_ctoc_correct(r""" typedef struct node_t {@@ -133,6 +131,6 @@ } node;- ''')+ """) def test_ternary(self):- self._assert_ctoc_correct('''+ self._assert_ctoc_correct(""" int main(void)@@ -141,6 +139,6 @@ (a == 0) ? (b = 1) : (b = 2);- }''')+ }""") def test_casts(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main() {@@ -148,4 +146,4 @@ int c = (int*) f;- }''')- self._assert_ctoc_correct(r'''+ }""")+ self._assert_ctoc_correct(r""" int main() {@@ -154,9 +152,9 @@ }- ''')+ """) def test_initlist(self):- self._assert_ctoc_correct('int arr[] = {1, 2, 3};')+ self._assert_ctoc_correct("int arr[] = {1, 2, 3};") def test_exprs(self):- self._assert_ctoc_correct('''+ self._assert_ctoc_correct(""" int main(void)@@ -168,3 +166,3 @@ int e = --a;- }''')+ }""") @@ -172,3 +170,3 @@ # note two minuses here- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main() {@@ -179,6 +177,6 @@ return a;- }''')+ }""") def test_struct_decl(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" typedef struct node_t {@@ -187,6 +185,6 @@ } node;- ''')+ """) def test_krstyle(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main(argc, argv)@@ -197,6 +195,6 @@ }- ''')+ """) def test_switchcase(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main() {@@ -216,6 +214,6 @@ }- ''')+ """) def test_nest_initializer_list(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main()@@ -223,6 +221,6 @@ int i[1][1] = { { 1 } };- }''')+ }""") def test_nest_named_initializer(self):- self._assert_ctoc_correct(r'''struct test+ self._assert_ctoc_correct(r"""struct test {@@ -236,6 +234,6 @@ struct test test_var = {.i = 0, .test_i = {.k = 1}, .j = 2};- ''')+ """) def test_expr_list_in_initializer_list(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main()@@ -243,11 +241,11 @@ int i[1] = { (1, 2) };- }''')+ }""") def test_issue36(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main() {- }''')+ }""") def test_issue37(self):- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" int main(void)@@ -257,3 +255,3 @@ return 0;- }''')+ }""") @@ -262,13 +260,13 @@ # (previous valid behavior, still working)- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" struct foo;- ''')+ """) # An empty body must be generated # (added behavior)- self._assert_ctoc_correct(r'''+ self._assert_ctoc_correct(r""" struct foo {};- ''')
… 369 more lines (truncated)
--- +++ @@ -3,5 +3,13 @@ import unittest--sys.path.insert(0, '..')-from pycparser.c_lexer import CLexer+from typing import Optional++sys.path.insert(0, "..")+from pycparser.c_lexer import CLexer, _Token+++def require_token(tok: Optional[_Token]) -> _Token:+ # In tests we know token() should produce a token here; this helper asserts+ # that and narrows Optional[_Token] to _Token, avoiding repeated casts/guards.+ assert tok is not None+ return tok @@ -17,6 +25,7 @@ class TestCLexerNoErrors(unittest.TestCase):- """ Test lexing of strings that are not supposed to cause- errors. Therefore, the error_func passed to the lexer- raises an exception.+ """Test lexing of strings that are not supposed to cause+ errors. Therefore, the error_func passed to the lexer+ raises an exception. """+ def error_func(self, msg, line, column):@@ -31,3 +40,3 @@ def type_lookup_func(self, typ):- if typ.startswith('mytype'):+ if typ.startswith("mytype"): return True@@ -37,5 +46,5 @@ def setUp(self):- self.clex = CLexer(self.error_func, lambda: None, lambda: None,- self.type_lookup_func)- self.clex.build(optimize=False)+ self.clex = CLexer(+ self.error_func, lambda: None, lambda: None, self.type_lookup_func+ ) @@ -46,91 +55,91 @@ def test_trivial_tokens(self):- self.assertTokensTypes('1', ['INT_CONST_DEC'])- self.assertTokensTypes('-', ['MINUS'])- self.assertTokensTypes('volatile', ['VOLATILE'])- self.assertTokensTypes('...', ['ELLIPSIS'])- self.assertTokensTypes('++', ['PLUSPLUS'])- self.assertTokensTypes('case int', ['CASE', 'INT'])- self.assertTokensTypes('caseint', ['ID'])- self.assertTokensTypes('$dollar cent$', ['ID', 'ID'])- self.assertTokensTypes('i ^= 1;', ['ID', 'XOREQUAL', 'INT_CONST_DEC', 'SEMI'])+ self.assertTokensTypes("1", ["INT_CONST_DEC"])+ self.assertTokensTypes("-", ["MINUS"])+ self.assertTokensTypes("volatile", ["VOLATILE"])+ self.assertTokensTypes("...", ["ELLIPSIS"])+ self.assertTokensTypes("++", ["PLUSPLUS"])+ self.assertTokensTypes("case int", ["CASE", "INT"])+ self.assertTokensTypes("caseint", ["ID"])+ self.assertTokensTypes("$dollar cent$", ["ID", "ID"])+ self.assertTokensTypes("i ^= 1;", ["ID", "XOREQUAL", "INT_CONST_DEC", "SEMI"]) def test_id_typeid(self):- self.assertTokensTypes('myt', ['ID'])- self.assertTokensTypes('mytype', ['TYPEID'])- self.assertTokensTypes('mytype6 var', ['TYPEID', 'ID'])+ self.assertTokensTypes("myt", ["ID"])+ self.assertTokensTypes("mytype", ["TYPEID"])+ self.assertTokensTypes("mytype6 var", ["TYPEID", "ID"]) def test_integer_constants(self):- self.assertTokensTypes('12', ['INT_CONST_DEC'])- self.assertTokensTypes('12u', ['INT_CONST_DEC'])- self.assertTokensTypes('12l', ['INT_CONST_DEC'])- self.assertTokensTypes('199872Ul', ['INT_CONST_DEC'])- self.assertTokensTypes('199872lU', ['INT_CONST_DEC'])- self.assertTokensTypes('199872LL', ['INT_CONST_DEC'])- self.assertTokensTypes('199872ull', ['INT_CONST_DEC'])- self.assertTokensTypes('199872llu', ['INT_CONST_DEC'])- self.assertTokensTypes('1009843200000uLL', ['INT_CONST_DEC'])- self.assertTokensTypes('1009843200000LLu', ['INT_CONST_DEC'])-- self.assertTokensTypes('077', ['INT_CONST_OCT'])- self.assertTokensTypes('0123456L', ['INT_CONST_OCT'])-- self.assertTokensTypes('0xf7', ['INT_CONST_HEX'])- self.assertTokensTypes('0b110', ['INT_CONST_BIN'])- self.assertTokensTypes('0x01202AAbbf7Ul', ['INT_CONST_HEX'])- self.assertTokensTypes("'12'", ['INT_CONST_CHAR'])- self.assertTokensTypes("'123'", ['INT_CONST_CHAR'])- self.assertTokensTypes("'1AB4'", ['INT_CONST_CHAR'])- self.assertTokensTypes(r"'1A\n4'", ['INT_CONST_CHAR'])+ self.assertTokensTypes("12", ["INT_CONST_DEC"])+ self.assertTokensTypes("12u", ["INT_CONST_DEC"])+ self.assertTokensTypes("12l", ["INT_CONST_DEC"])+ self.assertTokensTypes("199872Ul", ["INT_CONST_DEC"])+ self.assertTokensTypes("199872lU", ["INT_CONST_DEC"])+ self.assertTokensTypes("199872LL", ["INT_CONST_DEC"])+ self.assertTokensTypes("199872ull", ["INT_CONST_DEC"])+ self.assertTokensTypes("199872llu", ["INT_CONST_DEC"])+ self.assertTokensTypes("1009843200000uLL", ["INT_CONST_DEC"])+ self.assertTokensTypes("1009843200000LLu", ["INT_CONST_DEC"])++ self.assertTokensTypes("077", ["INT_CONST_OCT"])+ self.assertTokensTypes("0123456L", ["INT_CONST_OCT"])++ self.assertTokensTypes("0xf7", ["INT_CONST_HEX"])+ self.assertTokensTypes("0b110", ["INT_CONST_BIN"])+ self.assertTokensTypes("0x01202AAbbf7Ul", ["INT_CONST_HEX"])+ self.assertTokensTypes("'12'", ["INT_CONST_CHAR"])+ self.assertTokensTypes("'123'", ["INT_CONST_CHAR"])+ self.assertTokensTypes("'1AB4'", ["INT_CONST_CHAR"])+ self.assertTokensTypes(r"'1A\n4'", ["INT_CONST_CHAR"]) # no 0 before x, so ID catches it- self.assertTokensTypes('xf7', ['ID'])+ self.assertTokensTypes("xf7", ["ID"]) # - is MINUS, the rest a constnant- self.assertTokensTypes('-1', ['MINUS', 'INT_CONST_DEC'])+ self.assertTokensTypes("-1", ["MINUS", "INT_CONST_DEC"]) def test_special_names(self):- self.assertTokensTypes('sizeof offsetof', ['SIZEOF', 'OFFSETOF'])+ self.assertTokensTypes("sizeof offsetof", ["SIZEOF", "OFFSETOF"]) def test_new_keywords(self):- self.assertTokensTypes('_Bool', ['_BOOL'])- self.assertTokensTypes('_Atomic', ['_ATOMIC'])- self.assertTokensTypes('_Alignas _Alignof', ['_ALIGNAS', '_ALIGNOF'])+ self.assertTokensTypes("_Bool", ["_BOOL"])+ self.assertTokensTypes("_Atomic", ["_ATOMIC"])+ self.assertTokensTypes("_Alignas _Alignof", ["_ALIGNAS", "_ALIGNOF"]) def test_floating_constants(self):- self.assertTokensTypes('1.5f', ['FLOAT_CONST'])- self.assertTokensTypes('01.5', ['FLOAT_CONST'])- self.assertTokensTypes('.15L', ['FLOAT_CONST'])- self.assertTokensTypes('0.', ['FLOAT_CONST'])+ self.assertTokensTypes("1.5f", ["FLOAT_CONST"])+ self.assertTokensTypes("01.5", ["FLOAT_CONST"])+ self.assertTokensTypes(".15L", ["FLOAT_CONST"])+ self.assertTokensTypes("0.", ["FLOAT_CONST"]) # but just a period is a period- self.assertTokensTypes('.', ['PERIOD'])-- self.assertTokensTypes('3.3e-3', ['FLOAT_CONST'])- self.assertTokensTypes('.7e25L', ['FLOAT_CONST'])- self.assertTokensTypes('6.e+125f', ['FLOAT_CONST'])- self.assertTokensTypes('666e666', ['FLOAT_CONST'])- self.assertTokensTypes('00666e+3', ['FLOAT_CONST'])+ self.assertTokensTypes(".", ["PERIOD"])++ self.assertTokensTypes("3.3e-3", ["FLOAT_CONST"])+ self.assertTokensTypes(".7e25L", ["FLOAT_CONST"])+ self.assertTokensTypes("6.e+125f", ["FLOAT_CONST"])+ self.assertTokensTypes("666e666", ["FLOAT_CONST"])+ self.assertTokensTypes("00666e+3", ["FLOAT_CONST"]) # but this is a hex integer + 3- self.assertTokensTypes('0x0666e+3', ['INT_CONST_HEX', 'PLUS', 'INT_CONST_DEC'])+ self.assertTokensTypes("0x0666e+3", ["INT_CONST_HEX", "PLUS", "INT_CONST_DEC"]) def test_hexadecimal_floating_constants(self):- self.assertTokensTypes('0xDE.488641p0', ['HEX_FLOAT_CONST'])- self.assertTokensTypes('0x.488641p0', ['HEX_FLOAT_CONST'])- self.assertTokensTypes('0X12.P0', ['HEX_FLOAT_CONST'])+ self.assertTokensTypes("0xDE.488641p0", ["HEX_FLOAT_CONST"])+ self.assertTokensTypes("0x.488641p0", ["HEX_FLOAT_CONST"])+ self.assertTokensTypes("0X12.P0", ["HEX_FLOAT_CONST"]) def test_char_constants(self):- self.assertTokensTypes(r"""'x'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""L'x'""", ['WCHAR_CONST'])- self.assertTokensTypes(r"""u8'x'""", ['U8CHAR_CONST'])- self.assertTokensTypes(r"""u'x'""", ['U16CHAR_CONST'])- self.assertTokensTypes(r"""U'x'""", ['U32CHAR_CONST'])- self.assertTokensTypes(r"""'\t'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\''""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\?'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\0'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\012'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\x2f'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""'\x2f12'""", ['CHAR_CONST'])- self.assertTokensTypes(r"""L'\xaf'""", ['WCHAR_CONST'])+ self.assertTokensTypes(r"""'x'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""L'x'""", ["WCHAR_CONST"])+ self.assertTokensTypes(r"""u8'x'""", ["U8CHAR_CONST"])+ self.assertTokensTypes(r"""u'x'""", ["U16CHAR_CONST"])+ self.assertTokensTypes(r"""U'x'""", ["U32CHAR_CONST"])+ self.assertTokensTypes(r"""'\t'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\''""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\?'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\0'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\012'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\x2f'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""'\x2f12'""", ["CHAR_CONST"])+ self.assertTokensTypes(r"""L'\xaf'""", ["WCHAR_CONST"]) @@ -138,49 +147,42 @@ braces = []+ def on_lbrace():- braces.append('{')+ braces.append("{")+ def on_rbrace():- braces.append('}')- clex = CLexer(self.error_func, on_lbrace, on_rbrace,- self.type_lookup_func)- clex.build(optimize=False)- clex.input('hello { there } } and again }}{')+ braces.append("}")++ clex = CLexer(self.error_func, on_lbrace, on_rbrace, self.type_lookup_func)+ clex.input("hello { there } } and again }}{") token_list(clex)- self.assertEqual(braces, ['{', '}', '}', '}', '}', '{'])+ self.assertEqual(braces, ["{", "}", "}", "}", "}", "{"]) def test_string_literal(self):- self.assertTokensTypes('"a string"', ['STRING_LITERAL'])- self.assertTokensTypes('L"ing"', ['WSTRING_LITERAL'])- self.assertTokensTypes('u8"ing"', ['U8STRING_LITERAL'])- self.assertTokensTypes('u"ing"', ['U16STRING_LITERAL'])- self.assertTokensTypes('U"ing"', ['U32STRING_LITERAL'])- self.assertTokensTypes(- '"i am a string too \t"',- ['STRING_LITERAL'])- self.assertTokensTypes(- r'''"esc\ape \"\'\? \0234 chars \rule"''',- ['STRING_LITERAL'])- self.assertTokensTypes(- r'''"hello 'joe' wanna give it a \"go\"?"''',- ['STRING_LITERAL'])+ self.assertTokensTypes('"a string"', ["STRING_LITERAL"])+ self.assertTokensTypes('L"ing"', ["WSTRING_LITERAL"])+ self.assertTokensTypes('u8"ing"', ["U8STRING_LITERAL"])+ self.assertTokensTypes('u"ing"', ["U16STRING_LITERAL"])+ self.assertTokensTypes('U"ing"', ["U32STRING_LITERAL"])+ self.assertTokensTypes('"i am a string too \t"', ["STRING_LITERAL"])+ self.assertTokensTypes(+ r'''"esc\ape \"\'\? \0234 chars \rule"''', ["STRING_LITERAL"]+ )+ self.assertTokensTypes(+ r'''"hello 'joe' wanna give it a \"go\"?"''', ["STRING_LITERAL"]
… 544 more lines (truncated)
pygments pypi no findings
2.15.0
2.15.1
2.16.0
2.16.1
2.17.0
2.17.1
2.17.2
2.18.0
2.19.0
2.19.1
2.19.2
2.20.0
CLEAN
no findings — nominal
release diff 2.19.2 → 2.20.0
+29 added · -1 removed · ~420 modified
+358 more files not shown
--- +++ @@ -9,3 +9,3 @@ {s: HtmlFormatter(style=s).get_style_defs('.demo-highlight') for s in STYLE_MAP}- `).toJs();+ `).toJs({dict_converter: Object.fromEntries}); self.postMessage({loaded: {styles}})@@ -24,5 +24,8 @@ - lexer = pygments.lexers.get_lexer_by_name(lexer_name)+ if hasattr(code, 'to_py'):+ code = code.to_py() if type(code) == memoryview: code = bytes(code)++ lexer = pygments.lexers.get_lexer_by_name(lexer_name) tokens = lexer.get_tokens(code)@@ -53,6 +56,2 @@ const lexer = self.pyodide.runPython(`- import sys- sys.setrecursionlimit(1000)- # TODO: remove after upgrading to Pyodide 0.19- import pygments.lexers@@ -60,2 +59,4 @@ + if hasattr(code, 'to_py'):+ code = code.to_py() if type(code) == memoryview:
--- +++ @@ -34,3 +34,3 @@ return;- style.textContent = styles.get(styleSelect.value);+ style.textContent = styles[styleSelect.value]; updateCopyLink();@@ -94,3 +94,3 @@ loadingDiv.hidden = true;- style.textContent = styles.get(styleSelect.value);+ style.textContent = styles[styleSelect.value]; } else if (msg.data.tokens) {
--- +++ @@ -235,3 +235,4 @@ def pg_context(app, pagename, templatename, ctx, event_arg):- ctx['demo_active'] = bool(os.environ.get('WEBSITE_BUILD'))+ # casting string to bool doesn't work, we'll use 0 to disable+ ctx['demo_active'] = os.environ.get('WEBSITE_BUILD') != '0'
--- +++ @@ -1,2 +1,3 @@-from typing import Iterator+from collections.abc import Iterator+ @@ -12,2 +13,3 @@ + result = sum(Math.fib(42))
--- +++ @@ -23,3 +23,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -32,3 +32,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -23,3 +23,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.@@ -28,3 +28,3 @@ -__version__ = '2.19.2'+__version__ = '2.20.0' __docformat__ = 'restructuredtext'
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.@@ -187,3 +187,3 @@ if argns.V:- print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus '+ print(f'Pygments version {__version__}, (c) 2006-present by Georg Brandl, Matthäus ' 'Chajdas and contributors.')
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -7,3 +7,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.@@ -97,4 +97,6 @@ class SymbolFilter(Filter):- """Convert mathematical symbols such as \\<longrightarrow> in Isabelle- or \\longrightarrow in LaTeX into Unicode characters.+ """Convert mathematical symbols into Unicode characters.++ Examples are ``\\<longrightarrow>`` in Isabelle or+ ``\\longrightarrow`` in LaTeX. @@ -687,4 +689,5 @@ class KeywordCaseFilter(Filter):- """Convert keywords to lowercase or uppercase or capitalize them, which- means first letter uppercase, rest lowercase.+ """Convert keywords to lowercase or uppercase or capitalize them.++ This means first letter uppercase, rest lowercase. @@ -868,3 +871,3 @@ class GobbleFilter(Filter):- """Gobbles source code lines (eats initial characters).+ """Gobble source code lines (eats initial characters). @@ -907,4 +910,3 @@ class TokenMergeFilter(Filter):- """Merges consecutive tokens with the same token type in the output- stream of a lexer.+ """Merge consecutive tokens with the same token type in the output stream.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.@@ -19,2 +19,4 @@ from pygments.util import get_bool_opt, get_int_opt, get_list_opt++import html @@ -72,3 +74,3 @@ generated by Pygments <https://pygments.org/>-Copyright 2006-2025 by the Pygments team.+Copyright 2006-present by the Pygments team. Licensed under the BSD license, see LICENSE for details.@@ -83,3 +85,3 @@ generated by Pygments <https://pygments.org/>-Copyright 2006-2025 by the Pygments team.+Copyright 2006-present by the Pygments team. Licensed under the BSD license, see LICENSE for details.@@ -424,4 +426,4 @@ self.classprefix = options.get('classprefix', '')- self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight'))- self.cssstyles = self._decodeifneeded(options.get('cssstyles', ''))+ self.cssclass = html.escape(self._decodeifneeded(options.get('cssclass', 'highlight')))+ self.cssstyles = html.escape(self._decodeifneeded(options.get('cssstyles', ''))) self.prestyles = self._decodeifneeded(options.get('prestyles', ''))@@ -431,3 +433,3 @@ self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))- self.filename = self._decodeifneeded(options.get('filename', ''))+ self.filename = html.escape(self._decodeifneeded(options.get('filename', ''))) self.wrapcode = get_bool_opt(options, 'wrapcode', False)@@ -454,5 +456,5 @@ self.nobackground = get_bool_opt(options, 'nobackground', False)- self.lineseparator = options.get('lineseparator', '\n')- self.lineanchors = options.get('lineanchors', '')- self.linespans = options.get('linespans', '')+ self.lineseparator = html.escape(options.get('lineseparator', '\n'))+ self.lineanchors = html.escape(options.get('lineanchors', ''))+ self.linespans = html.escape(options.get('linespans', '')) self.anchorlinenos = get_bool_opt(options, 'anchorlinenos', False)
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.@@ -93,3 +93,2 @@ return add + text + sub- return '<'+add+'>'+text+'</'+sub+'>'
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
--- +++ @@ -6,3 +6,3 @@ - :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+ :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details.
python-dateutil pypi INSTALL-EXEC
2.6.0
2.6.1
2.7.0
2.7.1
2.7.2
2.7.3
2.7.4
2.7.5
2.8.0
2.8.1
2.8.2
2.9.0
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 2.8.2 → 2.9.0
+43 added · -41 removed · ~20 modified
new files touching dangerous APIs: src/dateutil/zoneinfo/rebuild.py, tests/_common.py, tests/test_tz.py
+15 more files not shown
--- +++ @@ -0,0 +1,75 @@+import logging+import os+import tempfile+import shutil+import json+from subprocess import check_call, check_output+from tarfile import TarFile++from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME+++def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None):+ """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar*++ filename is the timezone tarball from ``ftp.iana.org/tz``.++ """+ tmpdir = tempfile.mkdtemp()+ zonedir = os.path.join(tmpdir, "zoneinfo")+ moduledir = os.path.dirname(__file__)+ try:+ with TarFile.open(filename) as tf:+ for name in zonegroups:+ tf.extract(name, tmpdir)+ filepaths = [os.path.join(tmpdir, n) for n in zonegroups]++ _run_zic(zonedir, filepaths)++ # write metadata file+ with open(os.path.join(zonedir, METADATA_FN), 'w') as f:+ json.dump(metadata, f, indent=4, sort_keys=True)+ target = os.path.join(moduledir, ZONEFILENAME)+ with TarFile.open(target, "w:%s" % format) as tf:+ for entry in os.listdir(zonedir):+ entrypath = os.path.join(zonedir, entry)+ tf.add(entrypath, entry)+ finally:+ shutil.rmtree(tmpdir)+++def _run_zic(zonedir, filepaths):+ """Calls the ``zic`` compiler in a compatible way to get a "fat" binary.++ Recent versions of ``zic`` default to ``-b slim``, while older versions+ don't even have the ``-b`` option (but default to "fat" binaries). The+ current version of dateutil does not support Version 2+ TZif files, which+ causes problems when used in conjunction with "slim" binaries, so this+ function is used to ensure that we always get a "fat" binary.+ """++ try:+ help_text = check_output(["zic", "--help"])+ except OSError as e:+ _print_on_nosuchfile(e)+ raise++ if b"-b " in help_text:+ bloat_args = ["-b", "fat"]+ else:+ bloat_args = []++ check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths)+++def _print_on_nosuchfile(e):+ """Print helpful troubleshooting message++ e is an exception raised by subprocess.check_call()++ """+ if e.errno == 2:+ logging.error(+ "Could not find zic. Perhaps you need to install "+ "libc-bin or some other package that provides it, "+ "or it's not in your PATH?")
--- +++ @@ -0,0 +1,233 @@+from __future__ import unicode_literals+import os+import time+import subprocess+import warnings+import tempfile+import pickle++import pytest+++class PicklableMixin(object):+ def _get_nobj_bytes(self, obj, dump_kwargs, load_kwargs):+ """+ Pickle and unpickle an object using ``pickle.dumps`` / ``pickle.loads``+ """+ pkl = pickle.dumps(obj, **dump_kwargs)+ return pickle.loads(pkl, **load_kwargs)++ def _get_nobj_file(self, obj, dump_kwargs, load_kwargs):+ """+ Pickle and unpickle an object using ``pickle.dump`` / ``pickle.load`` on+ a temporary file.+ """+ with tempfile.TemporaryFile('w+b') as pkl:+ pickle.dump(obj, pkl, **dump_kwargs)+ pkl.seek(0) # Reset the file to the beginning to read it+ nobj = pickle.load(pkl, **load_kwargs)++ return nobj++ def assertPicklable(self, obj, singleton=False, asfile=False,+ dump_kwargs=None, load_kwargs=None):+ """+ Assert that an object can be pickled and unpickled. This assertion+ assumes that the desired behavior is that the unpickled object compares+ equal to the original object, but is not the same object.+ """+ get_nobj = self._get_nobj_file if asfile else self._get_nobj_bytes+ dump_kwargs = dump_kwargs or {}+ load_kwargs = load_kwargs or {}++ nobj = get_nobj(obj, dump_kwargs, load_kwargs)+ if not singleton:+ self.assertIsNot(obj, nobj)+ self.assertEqual(obj, nobj)+++class TZContextBase(object):+ """+ Base class for a context manager which allows changing of time zones.++ Subclasses may define a guard variable to either block or or allow time+ zone changes by redefining ``_guard_var_name`` and ``_guard_allows_change``.+ The default is that the guard variable must be affirmatively set.++ Subclasses must define ``get_current_tz`` and ``set_current_tz``.+ """+ _guard_var_name = "DATEUTIL_MAY_CHANGE_TZ"+ _guard_allows_change = True++ def __init__(self, tzval):+ self.tzval = tzval+ self._old_tz = None++ @classmethod+ def tz_change_allowed(cls):+ """+ Class method used to query whether or not this class allows time zone+ changes.+ """+ guard = bool(os.environ.get(cls._guard_var_name, False))++ # _guard_allows_change gives the "default" behavior - if True, the+ # guard is overcoming a block. If false, the guard is causing a block.+ # Whether tz_change is allowed is therefore the XNOR of the two.+ return guard == cls._guard_allows_change++ @classmethod+ def tz_change_disallowed_message(cls):+ """ Generate instructions on how to allow tz changes """+ msg = ('Changing time zone not allowed. Set {envar} to {gval} '+ 'if you would like to allow this behavior')++ return msg.format(envar=cls._guard_var_name,+ gval=cls._guard_allows_change)++ def __enter__(self):+ if not self.tz_change_allowed():+ msg = self.tz_change_disallowed_message()+ pytest.skip(msg)++ # If this is used outside of a test suite, we still want an error.+ raise ValueError(msg) # pragma: no cover++ self._old_tz = self.get_current_tz()+ self.set_current_tz(self.tzval)++ def __exit__(self, type, value, traceback):+ if self._old_tz is not None:+ self.set_current_tz(self._old_tz)++ self._old_tz = None++ def get_current_tz(self):+ raise NotImplementedError++ def set_current_tz(self):+ raise NotImplementedError+++class TZEnvContext(TZContextBase):+ """+ Context manager that temporarily sets the `TZ` variable (for use on+ *nix-like systems). Because the effect is local to the shell anyway, this+ will apply *unless* a guard is set.++ If you do not want the TZ environment variable set, you may set the+ ``DATEUTIL_MAY_NOT_CHANGE_TZ_VAR`` variable to a truthy value.+ """+ _guard_var_name = "DATEUTIL_MAY_NOT_CHANGE_TZ_VAR"+ _guard_allows_change = False++ def get_current_tz(self):+ return os.environ.get('TZ', UnsetTz)++ def set_current_tz(self, tzval):+ if tzval is UnsetTz and 'TZ' in os.environ:+ del os.environ['TZ']+ else:+ os.environ['TZ'] = tzval++ time.tzset()+++class TZWinContext(TZContextBase):+ """+ Context manager for changing local time zone on Windows.++ Because the effect of this is system-wide and global, it may have+ unintended side effect. Set the ``DATEUTIL_MAY_CHANGE_TZ`` environment+ variable to a truthy value before using this context manager.+ """+ def get_current_tz(self):+ p = subprocess.Popen(['tzutil', '/g'], stdout=subprocess.PIPE)++ ctzname, err = p.communicate()+ ctzname = ctzname.decode() # Popen returns++ if p.returncode:+ raise OSError('Failed to get current time zone: ' + err)++ return ctzname++ def set_current_tz(self, tzname):+ p = subprocess.Popen('tzutil /s "' + tzname + '"')++ out, err = p.communicate()++ if p.returncode:+ raise OSError('Failed to set current time zone: ' ++ (err or 'Unknown error.'))+++###+# Utility classes+class NotAValueClass(object):+ """+ A class analogous to NaN that has operations defined for any type.+ """+ def _op(self, other):+ return self # Operation with NotAValue returns NotAValue++ def _cmp(self, other):+ return False++ __add__ = __radd__ = _op+ __sub__ = __rsub__ = _op+ __mul__ = __rmul__ = _op+ __div__ = __rdiv__ = _op+ __truediv__ = __rtruediv__ = _op+ __floordiv__ = __rfloordiv__ = _op++ __lt__ = __rlt__ = _op+ __gt__ = __rgt__ = _op+ __eq__ = __req__ = _op+ __le__ = __rle__ = _op+ __ge__ = __rge__ = _op+++NotAValue = NotAValueClass()+++class ComparesEqualClass(object):+ """+ A class that is always equal to whatever you compare it to.+ """++ def __eq__(self, other):+ return True++ def __ne__(self, other):+ return False++ def __le__(self, other):+ return True++ def __ge__(self, other):+ return True++ def __lt__(self, other):+ return False++ def __gt__(self, other):+ return False++ __req__ = __eq__+ __rne__ = __ne__+ __rle__ = __le__+ __rge__ = __ge__+ __rlt__ = __lt__+ __rgt__ = __gt__+++ComparesEqual = ComparesEqualClass()+++class UnsetTzClass(object):+ """ Sentinel class for unset time zone variable """+ pass+++UnsetTz = UnsetTzClass()
--- +++ @@ -0,0 +1,2811 @@+# -*- coding: utf-8 -*-+from __future__ import unicode_literals+from ._common import PicklableMixin+from ._common import TZEnvContext, TZWinContext+from ._common import ComparesEqual++from datetime import datetime, timedelta+from datetime import time as dt_time+from datetime import tzinfo+from six import PY2+from io import BytesIO, StringIO+import unittest++import sys+import base64+import copy+import gc+import weakref++from functools import partial++IS_WIN = sys.platform.startswith('win')++import pytest++# dateutil imports+from dateutil.relativedelta import relativedelta, SU, TH+from dateutil.parser import parse+from dateutil import tz as tz+from dateutil import zoneinfo++try:+ from dateutil import tzwin+except ImportError as e:+ if IS_WIN:+ raise e+ else:+ pass++MISSING_TARBALL = ("This test fails if you don't have the dateutil "+ "timezone file installed. Please read the README")++TZFILE_EST5EDT = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh+ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e+S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0+YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg+yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db+wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW+8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b+YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g+BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR+iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x+znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H+cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w+Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH+JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM+jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w+4GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg+b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8+o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA+AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU+AEVQVAAAAAABAAAAAQ==+"""++EUROPE_HELSINKI = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAAAAAB1AAAABQAAAA2kc28Yy85RYMy/hdAV+I+uQFhPckBcDzZAX876QGOOvkBnToJAaw5GQG7y9EBysrhAdnJ8QHoyQEB98gRAgbHIQIVxjECJM+VBAjPEUQJCw2ECUcJxAmDBgQJwVDkCf1NJAo5SWQKdUWkCrFB5ArtPiQLKTpkC2U2pAuhMuQL3S8+kDBkrZAxXdkQMnK0EDM9uxA0UpYQNR2dEDYyeBA2/X8QOBuUkDjdYRA5+3aQOr1DEDvbWJA8pl+Q+Pbs6kD6GQZA/mxyQQGYjkEGEORBCRgWQQ2QbEEQl55BFQ/0QRgXJkEcj3xBH7uYQSQPBEEnOyBBK+46MQS66qEEzMv5BNjowQTqyhkE9ubhBQjIOQUVeKkFJsZZBTN2yQVExHkFUXTpBWLCmQVvcwkFgV+RhBY1xKQWfUoEFq29JBb1QoQXKAREF207BBef/MQX5TOEGBf1RBhfeqQYj+3EGNdzJBkH5kQZT2u+kGYItZBnHZCQZ+iXkGj9cpBpyHmQat1UkGuoW5BsxnEQbYg9kG6mUxBvaB+QcIY1EHFRPBByZhcQ+czEeEHRF+RB1EQAQdi8VkHbw4hB4DveQeNDEEHnu2ZB6sKYQe867kHyZwpB9rp2QfnmkkH+Of5AC+AQIDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQD+BAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAME+AwQAABdoAAAAACowAQQAABwgAAkAACowAQQAABwgAAlITVQARUVTVABFRVQAAAAAAQEAAAABAQ==+"""++NEW_YORK = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABcAAADrAAAABAAAABCeph5wn7rrYKCGAHCh+ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e+S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0+YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg+yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db+wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW+8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b+YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g+BGD9cAVQ4GEGQN9yBzDCYgeNGXMJEKRjCa2U9ArwhmQL4IV1DNmi5Q3AZ3YOuYTmD6mD9xCZZucR+iWX4EnlI6BNpR/kUWSrpFUkp+RY5DOoXKQv6GCIpaxkI7fsaAgtsGvIKfBvh7Wwc0ex8HcHPbR6x+zn0fobFtIHYA/SGBk20iVeL+I2qv7iQ1xP4lSpHuJhWm/ycqc+8n/sOAKQpV8CnepYAq6jfxK76H+gSzTVHItnmmCLrM2cy9+S4MwkxhzMWdoBDJy+nQzR0oENFLcdTUnLAU2Mr51NwcOBjgb2vY45vAG+Ofu89jrG0gY72572PK/uhj27gPY+j9CGP5ti9kBvsoZBhH92Qk+UhkNkYXZEL3aHRURDd0XzqQdH+LV/3R9OLB0kNQfdJs20HSu0j90uciYdM1kB3TXxrh062IndPXE2HUJYEd1E8L4dSdeZ3UxwRh1RV+yHdU+/OHVjWqd1blEAdYHsb3WMTyB1n+qPdapNQHW96K91yEtgddvmz3XmSYB1+eTvdgTbSHYYdr+d2ItlodjZ013ZA14h2VHL3dl7VqHZycRd2fNPIdpBvN3aa0eh2rm1XdrljsHbM/x9212HQdur9P3+b1X/B3CPtfdxNeEHcm+X93MVwwd0T3n3dP7fh3Y4lnd23sGHeBh4d3i+o4d5+Fp3ep6Fh3vYPHd8+fmeHfbged35eSYd/mAB3AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA+AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU+AEVQVAAEslgAAAAAAQWk7AEAAAACB4YfggAAAAMJZ1MDAAAABAtIhoQAAAAFDSsLhQAAAAYPDD8G+AAAABxDtcocAAAAIEs6mCAAAAAkVn8qJAAAACheA/goAAAALGWIxiwAAAAwdJeoMAAAADSHa5Q0A+AAAOJZ6djgAAAA8nf9EPAAAAECpQ9ZAAAAARLDIpEQAAABIuE1ySAAAAEzDnJBMAAAAUM7hIlAAA+ABU2jBAVAAAAFkO3G5YAAAAXAAAAAQAAAAE=+"""++TZICAL_EST5EDT = """+BEGIN:VTIMEZONE+TZID:US-Eastern+LAST-MODIFIED:19870101T000000Z+TZURL:http://zones.stds_r_us.net/tz/US-Eastern+BEGIN:STANDARD+DTSTART:19671029T020000+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10+TZOFFSETFROM:-0400+TZOFFSETTO:-0500+TZNAME:EST+END:STANDARD+BEGIN:DAYLIGHT+DTSTART:19870405T020000+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4+TZOFFSETFROM:-0500+TZOFFSETTO:-0400+TZNAME:EDT+END:DAYLIGHT+END:VTIMEZONE+"""++TZICAL_PST8PDT = """+BEGIN:VTIMEZONE+TZID:US-Pacific+LAST-MODIFIED:19870101T000000Z+BEGIN:STANDARD+DTSTART:19671029T020000+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10+TZOFFSETFROM:-0700+TZOFFSETTO:-0800+TZNAME:PST+END:STANDARD+BEGIN:DAYLIGHT+DTSTART:19870405T020000+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4+TZOFFSETFROM:-0800+TZOFFSETTO:-0700+TZNAME:PDT+END:DAYLIGHT+END:VTIMEZONE+"""++EST_TUPLE = ('EST', timedelta(hours=-5), timedelta(hours=0))+EDT_TUPLE = ('EDT', timedelta(hours=-4), timedelta(hours=1))++SUPPORTS_SUB_MINUTE_OFFSETS = sys.version_info >= (3, 6)+++###+# Helper functions+def get_timezone_tuple(dt):+ """Retrieve a (tzname, utcoffset, dst) tuple for a given DST"""+ return dt.tzname(), dt.utcoffset(), dt.dst()+++###+# Mix-ins+class context_passthrough(object):+ def __init__(*args, **kwargs):+ pass++ def __enter__(*args, **kwargs):+ pass++ def __exit__(*args, **kwargs):+ pass+++class TzFoldMixin(object):+ """ Mix-in class for testing ambiguous times """+ def gettz(self, tzname):+ raise NotImplementedError++ def _get_tzname(self, tzname):+ return tzname++ def _gettz_context(self, tzname):+ return context_passthrough()++ def testFoldPositiveUTCOffset(self):+ # Test that we can resolve ambiguous times+ tzname = self._get_tzname('Australia/Sydney')++ with self._gettz_context(tzname):+ SYD = self.gettz(tzname)++ t0_u = datetime(2012, 3, 31, 15, 30, tzinfo=tz.UTC) # AEST+ t1_u = datetime(2012, 3, 31, 16, 30, tzinfo=tz.UTC) # AEDT++ t0_syd0 = t0_u.astimezone(SYD)+ t1_syd1 = t1_u.astimezone(SYD)++ self.assertEqual(t0_syd0.replace(tzinfo=None),+ datetime(2012, 4, 1, 2, 30))++ self.assertEqual(t1_syd1.replace(tzinfo=None),+ datetime(2012, 4, 1, 2, 30))++ self.assertEqual(t0_syd0.utcoffset(), timedelta(hours=11))+ self.assertEqual(t1_syd1.utcoffset(), timedelta(hours=10))++ def testGapPositiveUTCOffset(self):+ # Test that we don't have a problem around gaps.+ tzname = self._get_tzname('Australia/Sydney')++ with self._gettz_context(tzname):+ SYD = self.gettz(tzname)++ t0_u = datetime(2012, 10, 6, 15, 30, tzinfo=tz.UTC) # AEST+ t1_u = datetime(2012, 10, 6, 16, 30, tzinfo=tz.UTC) # AEDT++ t0 = t0_u.astimezone(SYD)+ t1 = t1_u.astimezone(SYD)++ self.assertEqual(t0.replace(tzinfo=None),+ datetime(2012, 10, 7, 1, 30))++ self.assertEqual(t1.replace(tzinfo=None),+ datetime(2012, 10, 7, 3, 30))++ self.assertEqual(t0.utcoffset(), timedelta(hours=10))+ self.assertEqual(t1.utcoffset(), timedelta(hours=11))++ def testFoldNegativeUTCOffset(self):+ # Test that we can resolve ambiguous times+ tzname = self._get_tzname('America/Toronto')++ with self._gettz_context(tzname):+ TOR = self.gettz(tzname)++ t0_u = datetime(2011, 11, 6, 5, 30, tzinfo=tz.UTC)+ t1_u = datetime(2011, 11, 6, 6, 30, tzinfo=tz.UTC)++ t0_tor = t0_u.astimezone(TOR)
… 2564 more lines (truncated)
--- +++ @@ -13,3 +13,3 @@ -REPO_TARBALL=${REPO_DIR}/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz+REPO_TARBALL=${REPO_DIR}/src/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz TMP_TARBALL=${TMP_DIR}/dateutil-zoneinfo.tar.gz@@ -95,3 +95,3 @@ # Run the tests-python -m pytest ${REPO_DIR}/dateutil/test $EXTRA_TEST_ARGS+python -m pytest ${REPO_DIR}/tests $EXTRA_TEST_ARGS
--- +++ @@ -48 +48,19 @@ +[tool.black]+line-length = 80++[tool.isort]+atomic=true+force_grid_wrap=0+include_trailing_comma=true+known_first_party = ["dateutil"]+known_third_party=[+ "pytest",+ "hypothesis",+ "six",+ "freezegun",+ "mock",+]+multi_line_output=3+use_parentheses=true+
--- +++ @@ -33,2 +33,5 @@ Programming Language :: Python :: 3.9+ Programming Language :: Python :: 3.10+ Programming Language :: Python :: 3.11+ Programming Language :: Python :: 3.12 Topic :: Software Development :: Libraries@@ -39,9 +42,9 @@ install_requires = six >= 1.5+package_dir = + =src python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.* packages = find:-test_suite = dateutil.test [options.packages.find]-exclude = - dateutil.test+where = src
--- +++ @@ -50,3 +50,3 @@ use_scm_version={- 'write_to': 'dateutil/_version.py',+ 'write_to': 'src/dateutil/_version.py', },
--- +++ @@ -0,0 +1,24 @@+# -*- coding: utf-8 -*-+import sys++try:+ from ._version import version as __version__+except ImportError:+ __version__ = 'unknown'++__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz',+ 'utils', 'zoneinfo']++def __getattr__(name):+ import importlib++ if name in __all__:+ return importlib.import_module("." + name, __name__)+ raise AttributeError(+ "module {!r} has not attribute {!r}".format(__name__, name)+ )+++def __dir__():+ # __dir__ should include all the lazy-importable modules as well.+ return [x for x in globals() if x not in sys.modules] + __all__
--- +++ @@ -0,0 +1,43 @@+"""+Common code used in multiple modules.+"""+++class weekday(object):+ __slots__ = ["weekday", "n"]++ def __init__(self, weekday, n=None):+ self.weekday = weekday+ self.n = n++ def __call__(self, n):+ if n == self.n:+ return self+ else:+ return self.__class__(self.weekday, n)++ def __eq__(self, other):+ try:+ if self.weekday != other.weekday or self.n != other.n:+ return False+ except AttributeError:+ return False+ return True++ def __hash__(self):+ return hash((+ self.weekday,+ self.n,+ ))++ def __ne__(self, other):+ return not (self == other)++ def __repr__(self):+ s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday]+ if not self.n:+ return s+ else:+ return "%s(%+d)" % (s, self.n)++# vim:ts=4:sw=4:et
--- +++ @@ -0,0 +1,16 @@+# file generated by setuptools_scm+# don't change, don't track in version control+TYPE_CHECKING = False+if TYPE_CHECKING:+ from typing import Tuple, Union+ VERSION_TUPLE = Tuple[Union[int, str], ...]+else:+ VERSION_TUPLE = object++version: str+__version__: str+__version_tuple__: VERSION_TUPLE+version_tuple: VERSION_TUPLE++__version__ = version = '2.9.0'+__version_tuple__ = version_tuple = (2, 9, 0)
--- +++ @@ -0,0 +1,89 @@+# -*- coding: utf-8 -*-+"""+This module offers a generic Easter computing method for any given year, using+Western, Orthodox or Julian algorithms.+"""++import datetime++__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"]++EASTER_JULIAN = 1+EASTER_ORTHODOX = 2+EASTER_WESTERN = 3+++def easter(year, method=EASTER_WESTERN):+ """+ This method was ported from the work done by GM Arts,+ on top of the algorithm by Claus Tondering, which was+ based in part on the algorithm of Ouding (1940), as+ quoted in "Explanatory Supplement to the Astronomical+ Almanac", P. Kenneth Seidelmann, editor.++ This algorithm implements three different Easter+ calculation methods:++ 1. Original calculation in Julian calendar, valid in+ dates after 326 AD+ 2. Original method, with date converted to Gregorian+ calendar, valid in years 1583 to 4099+ 3. Revised method, in Gregorian calendar, valid in+ years 1583 to 4099 as well++ These methods are represented by the constants:++ * ``EASTER_JULIAN = 1``+ * ``EASTER_ORTHODOX = 2``+ * ``EASTER_WESTERN = 3``++ The default method is method 3.++ More about the algorithm may be found at:++ `GM Arts: Easter Algorithms <http://www.gmarts.org/index.php?go=415>`_++ and++ `The Calendar FAQ: Easter <https://www.tondering.dk/claus/cal/easter.php>`_++ """++ if not (1 <= method <= 3):+ raise ValueError("invalid method")++ # g - Golden year - 1+ # c - Century+ # h - (23 - Epact) mod 30+ # i - Number of days from March 21 to Paschal Full Moon+ # j - Weekday for PFM (0=Sunday, etc)+ # p - Number of days from March 21 to Sunday on or before PFM+ # (-6 to 28 methods 1 & 3, to 56 for method 2)+ # e - Extra days to add for method 2 (converting Julian+ # date to Gregorian date)++ y = year+ g = y % 19+ e = 0+ if method < 3:+ # Old method+ i = (19*g + 15) % 30+ j = (y + y//4 + i) % 7+ if method == 2:+ # Extra dates to convert Julian to Gregorian date+ e = 10+ if y > 1600:+ e = e + y//100 - 16 - (y//100 - 16)//4+ else:+ # New method+ c = y//100+ h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30+ i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11))+ j = (y + y//4 + i + 2 - c + c//4) % 7++ # p can be from -6 to 56 corresponding to dates 22 March to 23 May+ # (later dates apply to method 2, although 23 May never actually occurs)+ p = i - j + e+ d = 1 + (p + 27 + (p + 6)//40) % 31+ m = 3 + (p + 26)//30+ return datetime.date(int(y), int(m), int(d))
--- +++ @@ -0,0 +1,61 @@+# -*- coding: utf-8 -*-+from ._parser import parse, parser, parserinfo, ParserError+from ._parser import DEFAULTPARSER, DEFAULTTZPARSER+from ._parser import UnknownTimezoneWarning++from ._parser import __doc__++from .isoparser import isoparser, isoparse++__all__ = ['parse', 'parser', 'parserinfo',+ 'isoparse', 'isoparser',+ 'ParserError',+ 'UnknownTimezoneWarning']+++###+# Deprecate portions of the private interface so that downstream code that+# is improperly relying on it is given *some* notice.+++def __deprecated_private_func(f):+ from functools import wraps+ import warnings++ msg = ('{name} is a private function and may break without warning, '+ 'it will be moved and or renamed in future versions.')+ msg = msg.format(name=f.__name__)++ @wraps(f)+ def deprecated_func(*args, **kwargs):+ warnings.warn(msg, DeprecationWarning)+ return f(*args, **kwargs)++ return deprecated_func++def __deprecate_private_class(c):+ import warnings++ msg = ('{name} is a private class and may break without warning, '+ 'it will be moved and or renamed in future versions.')+ msg = msg.format(name=c.__name__)++ class private_class(c):+ __doc__ = c.__doc__++ def __init__(self, *args, **kwargs):+ warnings.warn(msg, DeprecationWarning)+ super(private_class, self).__init__(*args, **kwargs)++ private_class.__name__ = c.__name__++ return private_class+++from ._parser import _timelex, _resultbase+from ._parser import _tzparser, _parsetz++_timelex = __deprecate_private_class(_timelex)+_tzparser = __deprecate_private_class(_tzparser)+_resultbase = __deprecate_private_class(_resultbase)+_parsetz = __deprecated_private_func(_parsetz)
--- +++ @@ -0,0 +1,1613 @@+# -*- coding: utf-8 -*-+"""+This module offers a generic date/time string parser which is able to parse+most known formats to represent a date and/or time.++This module attempts to be forgiving with regards to unlikely input formats,+returning a datetime object even for dates which are ambiguous. If an element+of a date/time stamp is omitted, the following rules are applied:++- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour+ on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is+ specified.+- If a time zone is omitted, a timezone-naive datetime is returned.++If any other elements are missing, they are taken from the+:class:`datetime.datetime` object passed to the parameter ``default``. If this+results in a day number exceeding the valid number of days per month, the+value falls back to the end of the month.++Additional resources about date/time string formats can be found below:++- `A summary of the international standard date and time notation+ <https://www.cl.cam.ac.uk/~mgk25/iso-time.html>`_+- `W3C Date and Time Formats <https://www.w3.org/TR/NOTE-datetime>`_+- `Time Formats (Planetary Rings Node) <https://pds-rings.seti.org:443/tools/time_formats.html>`_+- `CPAN ParseDate module+ <https://metacpan.org/pod/release/MUIR/Time-modules-2013.0912/lib/Time/ParseDate.pm>`_+- `Java SimpleDateFormat Class+ <https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html>`_+"""+from __future__ import unicode_literals++import datetime+import re+import string+import time+import warnings++from calendar import monthrange+from io import StringIO++import six+from six import integer_types, text_type++from decimal import Decimal++from warnings import warn++from .. import relativedelta+from .. import tz++__all__ = ["parse", "parserinfo", "ParserError"]+++# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth+# making public and/or figuring out if there is something we can+# take off their plate.+class _timelex(object):+ # Fractional seconds are sometimes split by a comma+ _split_decimal = re.compile("([.,])")++ def __init__(self, instream):+ if isinstance(instream, (bytes, bytearray)):+ instream = instream.decode()++ if isinstance(instream, text_type):+ instream = StringIO(instream)+ elif getattr(instream, 'read', None) is None:+ raise TypeError('Parser must be a string or character stream, not '+ '{itype}'.format(itype=instream.__class__.__name__))++ self.instream = instream+ self.charstack = []+ self.tokenstack = []+ self.eof = False++ def get_token(self):+ """+ This function breaks the time string into lexical units (tokens), which+ can be parsed by the parser. Lexical units are demarcated by changes in+ the character set, so any continuous string of letters is considered+ one unit, any continuous string of numbers is considered one unit.++ The main complication arises from the fact that dots ('.') can be used+ both as separators (e.g. "Sep.20.2009") or decimal points (e.g.+ "4:30:21.447"). As such, it is necessary to read the full context of+ any dot-separated strings before breaking it into tokens; as such, this+ function maintains a "token stack", for when the ambiguous context+ demands that multiple tokens be parsed at once.+ """+ if self.tokenstack:+ return self.tokenstack.pop(0)++ seenletters = False+ token = None+ state = None++ while not self.eof:+ # We only realize that we've reached the end of a token when we+ # find a character that's not part of the current token - since+ # that character may be part of the next token, it's stored in the+ # charstack.+ if self.charstack:+ nextchar = self.charstack.pop(0)+ else:+ nextchar = self.instream.read(1)+ while nextchar == '\x00':+ nextchar = self.instream.read(1)++ if not nextchar:+ self.eof = True+ break+ elif not state:+ # First character of the token - determines if we're starting+ # to parse a word, a number or something else.+ token = nextchar+ if self.isword(nextchar):+ state = 'a'+ elif self.isnum(nextchar):+ state = '0'+ elif self.isspace(nextchar):+ token = ' '+ break # emit token+ else:+ break # emit token+ elif state == 'a':+ # If we've already started reading a word, we keep reading+ # letters until we find something that's not part of a word.+ seenletters = True+ if self.isword(nextchar):+ token += nextchar+ elif nextchar == '.':+ token += nextchar+ state = 'a.'+ else:+ self.charstack.append(nextchar)+ break # emit token+ elif state == '0':+ # If we've already started reading a number, we keep reading+ # numbers until we find something that doesn't fit.+ if self.isnum(nextchar):+ token += nextchar+ elif nextchar == '.' or (nextchar == ',' and len(token) >= 2):+ token += nextchar+ state = '0.'+ else:+ self.charstack.append(nextchar)+ break # emit token+ elif state == 'a.':+ # If we've seen some letters and a dot separator, continue+ # parsing, and the tokens will be broken up later.+ seenletters = True+ if nextchar == '.' or self.isword(nextchar):+ token += nextchar+ elif self.isnum(nextchar) and token[-1] == '.':+ token += nextchar+ state = '0.'+ else:+ self.charstack.append(nextchar)+ break # emit token+ elif state == '0.':+ # If we've seen at least one dot separator, keep going, we'll+ # break up the tokens later.+ if nextchar == '.' or self.isnum(nextchar):+ token += nextchar+ elif self.isword(nextchar) and token[-1] == '.':+ token += nextchar+ state = 'a.'+ else:+ self.charstack.append(nextchar)+ break # emit token++ if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or+ token[-1] in '.,')):+ l = self._split_decimal.split(token)+ token = l[0]+ for tok in l[1:]:+ if tok:+ self.tokenstack.append(tok)++ if state == '0.' and token.count('.') == 0:+ token = token.replace(',', '.')++ return token++ def __iter__(self):+ return self++ def __next__(self):+ token = self.get_token()+ if token is None:+ raise StopIteration++ return token++ def next(self):+ return self.__next__() # Python 2.x support++ @classmethod+ def split(cls, s):+ return list(cls(s))++ @classmethod+ def isword(cls, nextchar):+ """ Whether or not the next character is part of a word """+ return nextchar.isalpha()++ @classmethod+ def isnum(cls, nextchar):+ """ Whether the next character is part of a number """+ return nextchar.isdigit()++ @classmethod+ def isspace(cls, nextchar):+ """ Whether the next character is whitespace """+ return nextchar.isspace()+++class _resultbase(object):++ def __init__(self):+ for attr in self.__slots__:+ setattr(self, attr, None)++ def _repr(self, classname):+ l = []+ for attr in self.__slots__:+ value = getattr(self, attr)+ if value is not None:+ l.append("%s=%s" % (attr, repr(value)))+ return "%s(%s)" % (classname, ", ".join(l))++ def __len__(self):+ return (sum(getattr(self, attr) is not None+ for attr in self.__slots__))++ def __repr__(self):+ return self._repr(self.__class__.__name__)+++class parserinfo(object):+ """+ Class which handles what inputs are accepted. Subclass this to customize+ the language and acceptable values for each parameter.++ :param dayfirst:+ Whether to interpret the first value in an ambiguous 3-integer date
… 1366 more lines (truncated)
--- +++ @@ -0,0 +1,416 @@+# -*- coding: utf-8 -*-+"""+This module offers a parser for ISO-8601 strings++It is intended to support all valid date, time and datetime formats per the+ISO-8601 specification.++..versionadded:: 2.7.0+"""+from datetime import datetime, timedelta, time, date+import calendar+from dateutil import tz++from functools import wraps++import re+import six++__all__ = ["isoparse", "isoparser"]+++def _takes_ascii(f):+ @wraps(f)+ def func(self, str_in, *args, **kwargs):+ # If it's a stream, read the whole thing+ str_in = getattr(str_in, 'read', lambda: str_in)()++ # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII+ if isinstance(str_in, six.text_type):+ # ASCII is the same in UTF-8+ try:+ str_in = str_in.encode('ascii')+ except UnicodeEncodeError as e:+ msg = 'ISO-8601 strings should contain only ASCII characters'+ six.raise_from(ValueError(msg), e)++ return f(self, str_in, *args, **kwargs)++ return func+++class isoparser(object):+ def __init__(self, sep=None):+ """+ :param sep:+ A single character that separates date and time portions. If+ ``None``, the parser will accept any single character.+ For strict ISO-8601 adherence, pass ``'T'``.+ """+ if sep is not None:+ if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'):+ raise ValueError('Separator must be a single, non-numeric ' ++ 'ASCII character')++ sep = sep.encode('ascii')++ self._sep = sep++ @_takes_ascii+ def isoparse(self, dt_str):+ """+ Parse an ISO-8601 datetime string into a :class:`datetime.datetime`.++ An ISO-8601 datetime string consists of a date portion, followed+ optionally by a time portion - the date and time portions are separated+ by a single character separator, which is ``T`` in the official+ standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be+ combined with a time portion.++ Supported date formats are:++ Common:++ - ``YYYY``+ - ``YYYY-MM``+ - ``YYYY-MM-DD`` or ``YYYYMMDD``++ Uncommon:++ - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0)+ - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day++ The ISO week and day numbering follows the same logic as+ :func:`datetime.date.isocalendar`.++ Supported time formats are:++ - ``hh``+ - ``hh:mm`` or ``hhmm``+ - ``hh:mm:ss`` or ``hhmmss``+ - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits)++ Midnight is a special case for `hh`, as the standard supports both+ 00:00 and 24:00 as a representation. The decimal separator can be+ either a dot or a comma.+++ .. caution::++ Support for fractional components other than seconds is part of the+ ISO-8601 standard, but is not currently implemented in this parser.++ Supported time zone offset formats are:++ - `Z` (UTC)+ - `±HH:MM`+ - `±HHMM`+ - `±HH`++ Offsets will be represented as :class:`dateutil.tz.tzoffset` objects,+ with the exception of UTC, which will be represented as+ :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such+ as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`.++ :param dt_str:+ A string or stream containing only an ISO-8601 datetime string++ :return:+ Returns a :class:`datetime.datetime` representing the string.+ Unspecified components default to their lowest value.++ .. warning::++ As of version 2.7.0, the strictness of the parser should not be+ considered a stable part of the contract. Any valid ISO-8601 string+ that parses correctly with the default settings will continue to+ parse correctly in future versions, but invalid strings that+ currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not+ guaranteed to continue failing in future versions if they encode+ a valid date.++ .. versionadded:: 2.7.0+ """+ components, pos = self._parse_isodate(dt_str)++ if len(dt_str) > pos:+ if self._sep is None or dt_str[pos:pos + 1] == self._sep:+ components += self._parse_isotime(dt_str[pos + 1:])+ else:+ raise ValueError('String contains unknown ISO components')++ if len(components) > 3 and components[3] == 24:+ components[3] = 0+ return datetime(*components) + timedelta(days=1)++ return datetime(*components)++ @_takes_ascii+ def parse_isodate(self, datestr):+ """+ Parse the date portion of an ISO string.++ :param datestr:+ The string portion of an ISO string, without a separator++ :return:+ Returns a :class:`datetime.date` object+ """+ components, pos = self._parse_isodate(datestr)+ if pos < len(datestr):+ raise ValueError('String contains unknown ISO ' ++ 'components: {!r}'.format(datestr.decode('ascii')))+ return date(*components)++ @_takes_ascii+ def parse_isotime(self, timestr):+ """+ Parse the time portion of an ISO string.++ :param timestr:+ The time portion of an ISO string, without a separator++ :return:+ Returns a :class:`datetime.time` object+ """+ components = self._parse_isotime(timestr)+ if components[0] == 24:+ components[0] = 0+ return time(*components)++ @_takes_ascii+ def parse_tzstr(self, tzstr, zero_as_utc=True):+ """+ Parse a valid ISO time zone string.++ See :func:`isoparser.isoparse` for details on supported formats.++ :param tzstr:+ A string representing an ISO time zone offset++ :param zero_as_utc:+ Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones++ :return:+ Returns :class:`dateutil.tz.tzoffset` for offsets and+ :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is+ specified) offsets equivalent to UTC.+ """+ return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc)++ # Constants+ _DATE_SEP = b'-'+ _TIME_SEP = b':'+ _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)')++ def _parse_isodate(self, dt_str):+ try:+ return self._parse_isodate_common(dt_str)+ except ValueError:+ return self._parse_isodate_uncommon(dt_str)++ def _parse_isodate_common(self, dt_str):+ len_str = len(dt_str)+ components = [1, 1, 1]++ if len_str < 4:+ raise ValueError('ISO string too short')++ # Year+ components[0] = int(dt_str[0:4])+ pos = 4+ if pos >= len_str:+ return components, pos++ has_sep = dt_str[pos:pos + 1] == self._DATE_SEP+ if has_sep:+ pos += 1++ # Month+ if len_str - pos < 2:+ raise ValueError('Invalid common month')++ components[1] = int(dt_str[pos:pos + 2])+ pos += 2++ if pos >= len_str:+ if has_sep:+ return components, pos+ else:+ raise ValueError('Invalid ISO format')++ if has_sep:+ if dt_str[pos:pos + 1] != self._DATE_SEP:+ raise ValueError('Invalid separator in ISO string')+ pos += 1++ # Day
… 169 more lines (truncated)
--- +++ @@ -0,0 +1,599 @@+# -*- coding: utf-8 -*-+import datetime+import calendar++import operator+from math import copysign++from six import integer_types+from warnings import warn++from ._common import weekday++MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7))++__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"]+++class relativedelta(object):+ """+ The relativedelta type is designed to be applied to an existing datetime and+ can replace specific components of that datetime, or represents an interval+ of time.++ It is based on the specification of the excellent work done by M.-A. Lemburg+ in his+ `mx.DateTime <https://www.egenix.com/products/python/mxBase/mxDateTime/>`_ extension.+ However, notice that this type does *NOT* implement the same algorithm as+ his work. Do *NOT* expect it to behave like mx.DateTime's counterpart.++ There are two different ways to build a relativedelta instance. The+ first one is passing it two date/datetime classes::++ relativedelta(datetime1, datetime2)++ The second one is passing it any number of the following keyword arguments::++ relativedelta(arg1=x,arg2=y,arg3=z...)++ year, month, day, hour, minute, second, microsecond:+ Absolute information (argument is singular); adding or subtracting a+ relativedelta with absolute information does not perform an arithmetic+ operation, but rather REPLACES the corresponding value in the+ original datetime with the value(s) in relativedelta.++ years, months, weeks, days, hours, minutes, seconds, microseconds:+ Relative information, may be negative (argument is plural); adding+ or subtracting a relativedelta with relative information performs+ the corresponding arithmetic operation on the original datetime value+ with the information in the relativedelta.++ weekday:+ One of the weekday instances (MO, TU, etc) available in the+ relativedelta module. These instances may receive a parameter N,+ specifying the Nth weekday, which could be positive or negative+ (like MO(+1) or MO(-2)). Not specifying it is the same as specifying+ +1. You can also use an integer, where 0=MO. This argument is always+ relative e.g. if the calculated date is already Monday, using MO(1)+ or MO(-1) won't change the day. To effectively make it absolute, use+ it in combination with the day argument (e.g. day=1, MO(1) for first+ Monday of the month).++ leapdays:+ Will add given days to the date found, if year is a leap+ year, and the date found is post 28 of february.++ yearday, nlyearday:+ Set the yearday or the non-leap year day (jump leap days).+ These are converted to day/month/leapdays information.++ There are relative and absolute forms of the keyword+ arguments. The plural is relative, and the singular is+ absolute. For each argument in the order below, the absolute form+ is applied first (by setting each attribute to that value) and+ then the relative form (by adding the value to the attribute).++ The order of attributes considered when this relativedelta is+ added to a datetime is:++ 1. Year+ 2. Month+ 3. Day+ 4. Hours+ 5. Minutes+ 6. Seconds+ 7. Microseconds++ Finally, weekday is applied, using the rule described above.++ For example++ >>> from datetime import datetime+ >>> from dateutil.relativedelta import relativedelta, MO+ >>> dt = datetime(2018, 4, 9, 13, 37, 0)+ >>> delta = relativedelta(hours=25, day=1, weekday=MO(1))+ >>> dt + delta+ datetime.datetime(2018, 4, 2, 14, 37)++ First, the day is set to 1 (the first of the month), then 25 hours+ are added, to get to the 2nd day and 14th hour, finally the+ weekday is applied, but since the 2nd is already a Monday there is+ no effect.++ """++ def __init__(self, dt1=None, dt2=None,+ years=0, months=0, days=0, leapdays=0, weeks=0,+ hours=0, minutes=0, seconds=0, microseconds=0,+ year=None, month=None, day=None, weekday=None,+ yearday=None, nlyearday=None,+ hour=None, minute=None, second=None, microsecond=None):++ if dt1 and dt2:+ # datetime is a subclass of date. So both must be date+ if not (isinstance(dt1, datetime.date) and+ isinstance(dt2, datetime.date)):+ raise TypeError("relativedelta only diffs datetime/date")++ # We allow two dates, or two datetimes, so we coerce them to be+ # of the same type+ if (isinstance(dt1, datetime.datetime) !=+ isinstance(dt2, datetime.datetime)):+ if not isinstance(dt1, datetime.datetime):+ dt1 = datetime.datetime.fromordinal(dt1.toordinal())+ elif not isinstance(dt2, datetime.datetime):+ dt2 = datetime.datetime.fromordinal(dt2.toordinal())++ self.years = 0+ self.months = 0+ self.days = 0+ self.leapdays = 0+ self.hours = 0+ self.minutes = 0+ self.seconds = 0+ self.microseconds = 0+ self.year = None+ self.month = None+ self.day = None+ self.weekday = None+ self.hour = None+ self.minute = None+ self.second = None+ self.microsecond = None+ self._has_time = 0++ # Get year / month delta between the two+ months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month)+ self._set_months(months)++ # Remove the year/month delta so the timedelta is just well-defined+ # time units (seconds, days and microseconds)+ dtm = self.__radd__(dt2)++ # If we've overshot our target, make an adjustment+ if dt1 < dt2:+ compare = operator.gt+ increment = 1+ else:+ compare = operator.lt+ increment = -1++ while compare(dt1, dtm):+ months += increment+ self._set_months(months)+ dtm = self.__radd__(dt2)++ # Get the timedelta between the "months-adjusted" date and dt1+ delta = dt1 - dtm+ self.seconds = delta.seconds + delta.days * 86400+ self.microseconds = delta.microseconds+ else:+ # Check for non-integer values in integer-only quantities+ if any(x is not None and x != int(x) for x in (years, months)):+ raise ValueError("Non-integer years and months are "+ "ambiguous and not currently supported.")++ # Relative information+ self.years = int(years)+ self.months = int(months)+ self.days = days + weeks * 7+ self.leapdays = leapdays+ self.hours = hours+ self.minutes = minutes+ self.seconds = seconds+ self.microseconds = microseconds++ # Absolute information+ self.year = year+ self.month = month+ self.day = day+ self.hour = hour+ self.minute = minute+ self.second = second+ self.microsecond = microsecond++ if any(x is not None and int(x) != x+ for x in (year, month, day, hour,+ minute, second, microsecond)):+ # For now we'll deprecate floats - later it'll be an error.+ warn("Non-integer value passed as absolute information. " ++ "This is not a well-defined condition and will raise " ++ "errors in future versions.", DeprecationWarning)++ if isinstance(weekday, integer_types):+ self.weekday = weekdays[weekday]+ else:+ self.weekday = weekday++ yday = 0+ if nlyearday:+ yday = nlyearday+ elif yearday:+ yday = yearday+ if yearday > 59:+ self.leapdays = -1+ if yday:+ ydayidx = [31, 59, 90, 120, 151, 181, 212,+ 243, 273, 304, 334, 366]+ for idx, ydays in enumerate(ydayidx):+ if yday <= ydays:+ self.month = idx+1+ if idx == 0:+ self.day = yday+ else:+ self.day = yday-ydayidx[idx-1]+ break+ else:+ raise ValueError("invalid year day (%d)" % yday)++ self._fix()++ def _fix(self):+ if abs(self.microseconds) > 999999:+ s = _sign(self.microseconds)+ div, mod = divmod(self.microseconds * s, 1000000)+ self.microseconds = mod * s+ self.seconds += div * s+ if abs(self.seconds) > 59:+ s = _sign(self.seconds)+ div, mod = divmod(self.seconds * s, 60)+ self.seconds = mod * s+ self.minutes += div * s+ if abs(self.minutes) > 59:+ s = _sign(self.minutes)+ div, mod = divmod(self.minutes * s, 60)+ self.minutes = mod * s+ self.hours += div * s+ if abs(self.hours) > 23:
… 352 more lines (truncated)
--- +++ @@ -0,0 +1,1737 @@+# -*- coding: utf-8 -*-+"""+The rrule module offers a small, complete, and very fast, implementation of+the recurrence rules documented in the+`iCalendar RFC <https://tools.ietf.org/html/rfc5545>`_,+including support for caching of results.+"""+import calendar+import datetime+import heapq+import itertools+import re+import sys+from functools import wraps+# For warning about deprecation of until and count+from warnings import warn++from six import advance_iterator, integer_types++from six.moves import _thread, range++from ._common import weekday as weekdaybase++try:+ from math import gcd+except ImportError:+ from fractions import gcd++__all__ = ["rrule", "rruleset", "rrulestr",+ "YEARLY", "MONTHLY", "WEEKLY", "DAILY",+ "HOURLY", "MINUTELY", "SECONDLY",+ "MO", "TU", "WE", "TH", "FR", "SA", "SU"]++# Every mask is 7 days longer to handle cross-year weekly periods.+M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 ++ [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7)+M365MASK = list(M366MASK)+M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32))+MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])+MDAY365MASK = list(MDAY366MASK)+M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0))+NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])+NMDAY365MASK = list(NMDAY366MASK)+M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366)+M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)+WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55+del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31]+MDAY365MASK = tuple(MDAY365MASK)+M365MASK = tuple(M365MASK)++FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY']++(YEARLY,+ MONTHLY,+ WEEKLY,+ DAILY,+ HOURLY,+ MINUTELY,+ SECONDLY) = list(range(7))++# Imported on demand.+easter = None+parser = None+++class weekday(weekdaybase):+ """+ This version of weekday does not allow n = 0.+ """+ def __init__(self, wkday, n=None):+ if n == 0:+ raise ValueError("Can't create weekday with n==0")++ super(weekday, self).__init__(wkday, n)+++MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7))+++def _invalidates_cache(f):+ """+ Decorator for rruleset methods which may invalidate the+ cached length.+ """+ @wraps(f)+ def inner_func(self, *args, **kwargs):+ rv = f(self, *args, **kwargs)+ self._invalidate_cache()+ return rv++ return inner_func+++class rrulebase(object):+ def __init__(self, cache=False):+ if cache:+ self._cache = []+ self._cache_lock = _thread.allocate_lock()+ self._invalidate_cache()+ else:+ self._cache = None+ self._cache_complete = False+ self._len = None++ def __iter__(self):+ if self._cache_complete:+ return iter(self._cache)+ elif self._cache is None:+ return self._iter()+ else:+ return self._iter_cached()++ def _invalidate_cache(self):+ if self._cache is not None:+ self._cache = []+ self._cache_complete = False+ self._cache_gen = self._iter()++ if self._cache_lock.locked():+ self._cache_lock.release()++ self._len = None++ def _iter_cached(self):+ i = 0+ gen = self._cache_gen+ cache = self._cache+ acquire = self._cache_lock.acquire+ release = self._cache_lock.release+ while gen:+ if i == len(cache):+ acquire()+ if self._cache_complete:+ break+ try:+ for j in range(10):+ cache.append(advance_iterator(gen))+ except StopIteration:+ self._cache_gen = gen = None+ self._cache_complete = True+ break+ release()+ yield cache[i]+ i += 1+ while i < self._len:+ yield cache[i]+ i += 1++ def __getitem__(self, item):+ if self._cache_complete:+ return self._cache[item]+ elif isinstance(item, slice):+ if item.step and item.step < 0:+ return list(iter(self))[item]+ else:+ return list(itertools.islice(self,+ item.start or 0,+ item.stop or sys.maxsize,+ item.step or 1))+ elif item >= 0:+ gen = iter(self)+ try:+ for i in range(item+1):+ res = advance_iterator(gen)+ except StopIteration:+ raise IndexError+ return res+ else:+ return list(iter(self))[item]++ def __contains__(self, item):+ if self._cache_complete:+ return item in self._cache+ else:+ for i in self:+ if i == item:+ return True+ elif i > item:+ return False+ return False++ # __len__() introduces a large performance penalty.+ def count(self):+ """ Returns the number of recurrences in this set. It will have go+ through the whole recurrence, if this hasn't been done before. """+ if self._len is None:+ for x in self:+ pass+ return self._len++ def before(self, dt, inc=False):+ """ Returns the last recurrence before the given datetime instance. The+ inc keyword defines what happens if dt is an occurrence. With+ inc=True, if dt itself is an occurrence, it will be returned. """+ if self._cache_complete:+ gen = self._cache+ else:+ gen = self+ last = None+ if inc:+ for i in gen:+ if i > dt:+ break+ last = i+ else:+ for i in gen:+ if i >= dt:+ break+ last = i+ return last++ def after(self, dt, inc=False):+ """ Returns the first recurrence after the given datetime instance. The+ inc keyword defines what happens if dt is an occurrence. With+ inc=True, if dt itself is an occurrence, it will be returned. """+ if self._cache_complete:+ gen = self._cache+ else:+ gen = self+ if inc:+ for i in gen:+ if i >= dt:+ return i+ else:+ for i in gen:+ if i > dt:+ return i+ return None++ def xafter(self, dt, count=None, inc=False):+ """+ Generator which yields up to `count` recurrences after the given+ datetime instance, equivalent to `after`.++ :param dt:+ The datetime at which to start generating recurrences.++ :param count:+ The maximum number of recurrences to generate. If `None` (default),+ dates are generated until the recurrence rule is exhausted.++ :param inc:+ If `dt` is an instance of the rule and `inc` is `True`, it is+ included in the output.++ :yields: Yields a sequence of `datetime` objects.+ """
… 1490 more lines (truncated)
--- +++ @@ -0,0 +1,12 @@+# -*- coding: utf-8 -*-+from .tz import *+from .tz import __doc__++__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange",+ "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz",+ "enfold", "datetime_ambiguous", "datetime_exists",+ "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"]+++class DeprecatedTzFormatWarning(Warning):+ """Warning raised when time zones are parsed from deprecated formats."""
--- +++ @@ -0,0 +1,419 @@+from six import PY2++from functools import wraps++from datetime import datetime, timedelta, tzinfo+++ZERO = timedelta(0)++__all__ = ['tzname_in_python2', 'enfold']+++def tzname_in_python2(namefunc):+ """Change unicode output into bytestrings in Python 2++ tzname() API changed in Python 3. It used to return bytes, but was changed+ to unicode strings+ """+ if PY2:+ @wraps(namefunc)+ def adjust_encoding(*args, **kwargs):+ name = namefunc(*args, **kwargs)+ if name is not None:+ name = name.encode()++ return name++ return adjust_encoding+ else:+ return namefunc+++# The following is adapted from Alexander Belopolsky's tz library+# https://github.com/abalkin/tz+if hasattr(datetime, 'fold'):+ # This is the pre-python 3.6 fold situation+ def enfold(dt, fold=1):+ """+ Provides a unified interface for assigning the ``fold`` attribute to+ datetimes both before and after the implementation of PEP-495.++ :param fold:+ The value for the ``fold`` attribute in the returned datetime. This+ should be either 0 or 1.++ :return:+ Returns an object for which ``getattr(dt, 'fold', 0)`` returns+ ``fold`` for all versions of Python. In versions prior to+ Python 3.6, this is a ``_DatetimeWithFold`` object, which is a+ subclass of :py:class:`datetime.datetime` with the ``fold``+ attribute added, if ``fold`` is 1.++ .. versionadded:: 2.6.0+ """+ return dt.replace(fold=fold)++else:+ class _DatetimeWithFold(datetime):+ """+ This is a class designed to provide a PEP 495-compliant interface for+ Python versions before 3.6. It is used only for dates in a fold, so+ the ``fold`` attribute is fixed at ``1``.++ .. versionadded:: 2.6.0+ """+ __slots__ = ()++ def replace(self, *args, **kwargs):+ """+ Return a datetime with the same attributes, except for those+ attributes given new values by whichever keyword arguments are+ specified. Note that tzinfo=None can be specified to create a naive+ datetime from an aware datetime with no conversion of date and time+ data.++ This is reimplemented in ``_DatetimeWithFold`` because pypy3 will+ return a ``datetime.datetime`` even if ``fold`` is unchanged.+ """+ argnames = (+ 'year', 'month', 'day', 'hour', 'minute', 'second',+ 'microsecond', 'tzinfo'+ )++ for arg, argname in zip(args, argnames):+ if argname in kwargs:+ raise TypeError('Duplicate argument: {}'.format(argname))++ kwargs[argname] = arg++ for argname in argnames:+ if argname not in kwargs:+ kwargs[argname] = getattr(self, argname)++ dt_class = self.__class__ if kwargs.get('fold', 1) else datetime++ return dt_class(**kwargs)++ @property+ def fold(self):+ return 1++ def enfold(dt, fold=1):+ """+ Provides a unified interface for assigning the ``fold`` attribute to+ datetimes both before and after the implementation of PEP-495.++ :param fold:+ The value for the ``fold`` attribute in the returned datetime. This+ should be either 0 or 1.++ :return:+ Returns an object for which ``getattr(dt, 'fold', 0)`` returns+ ``fold`` for all versions of Python. In versions prior to+ Python 3.6, this is a ``_DatetimeWithFold`` object, which is a+ subclass of :py:class:`datetime.datetime` with the ``fold``+ attribute added, if ``fold`` is 1.++ .. versionadded:: 2.6.0+ """+ if getattr(dt, 'fold', 0) == fold:+ return dt++ args = dt.timetuple()[:6]+ args += (dt.microsecond, dt.tzinfo)++ if fold:+ return _DatetimeWithFold(*args)+ else:+ return datetime(*args)+++def _validate_fromutc_inputs(f):+ """+ The CPython version of ``fromutc`` checks that the input is a ``datetime``+ object and that ``self`` is attached as its ``tzinfo``.+ """+ @wraps(f)+ def fromutc(self, dt):+ if not isinstance(dt, datetime):+ raise TypeError("fromutc() requires a datetime argument")+ if dt.tzinfo is not self:+ raise ValueError("dt.tzinfo is not self")++ return f(self, dt)++ return fromutc+++class _tzinfo(tzinfo):+ """+ Base class for all ``dateutil`` ``tzinfo`` objects.+ """++ def is_ambiguous(self, dt):+ """+ Whether or not the "wall time" of a given datetime is ambiguous in this+ zone.++ :param dt:+ A :py:class:`datetime.datetime`, naive or time zone aware.+++ :return:+ Returns ``True`` if ambiguous, ``False`` otherwise.++ .. versionadded:: 2.6.0+ """++ dt = dt.replace(tzinfo=self)++ wall_0 = enfold(dt, fold=0)+ wall_1 = enfold(dt, fold=1)++ same_offset = wall_0.utcoffset() == wall_1.utcoffset()+ same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None)++ return same_dt and not same_offset++ def _fold_status(self, dt_utc, dt_wall):+ """+ Determine the fold status of a "wall" datetime, given a representation+ of the same datetime as a (naive) UTC datetime. This is calculated based+ on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all+ datetimes, and that this offset is the actual number of hours separating+ ``dt_utc`` and ``dt_wall``.++ :param dt_utc:+ Representation of the datetime as UTC++ :param dt_wall:+ Representation of the datetime as "wall time". This parameter must+ either have a `fold` attribute or have a fold-naive+ :class:`datetime.tzinfo` attached, otherwise the calculation may+ fail.+ """+ if self.is_ambiguous(dt_wall):+ delta_wall = dt_wall - dt_utc+ _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst()))+ else:+ _fold = 0++ return _fold++ def _fold(self, dt):+ return getattr(dt, 'fold', 0)++ def _fromutc(self, dt):+ """+ Given a timezone-aware datetime in a given timezone, calculates a+ timezone-aware datetime in a new timezone.++ Since this is the one time that we *know* we have an unambiguous+ datetime object, we take this opportunity to determine whether the+ datetime is ambiguous and in a "fold" state (e.g. if it's the first+ occurrence, chronologically, of the ambiguous datetime).++ :param dt:+ A timezone-aware :class:`datetime.datetime` object.+ """++ # Re-implement the algorithm from Python's datetime.py+ dtoff = dt.utcoffset()+ if dtoff is None:+ raise ValueError("fromutc() requires a non-None utcoffset() "+ "result")++ # The original datetime.py code assumes that `dst()` defaults to+ # zero during ambiguous times. PEP 495 inverts this presumption, so+ # for pre-PEP 495 versions of python, we need to tweak the algorithm.+ dtdst = dt.dst()+ if dtdst is None:+ raise ValueError("fromutc() requires a non-None dst() result")+ delta = dtoff - dtdst++ dt += delta+ # Set fold=1 so we can default to being in the fold for+ # ambiguous dates.+ dtdst = enfold(dt, fold=1).dst()+ if dtdst is None:+ raise ValueError("fromutc(): dt.dst gave inconsistent "+ "results; cannot convert")+ return dt + dtdst++ @_validate_fromutc_inputs+ def fromutc(self, dt):+ """+ Given a timezone-aware datetime in a given timezone, calculates a
… 172 more lines (truncated)
--- +++ @@ -0,0 +1,80 @@+from datetime import timedelta+import weakref+from collections import OrderedDict++from six.moves import _thread+++class _TzSingleton(type):+ def __init__(cls, *args, **kwargs):+ cls.__instance = None+ super(_TzSingleton, cls).__init__(*args, **kwargs)++ def __call__(cls):+ if cls.__instance is None:+ cls.__instance = super(_TzSingleton, cls).__call__()+ return cls.__instance+++class _TzFactory(type):+ def instance(cls, *args, **kwargs):+ """Alternate constructor that returns a fresh instance"""+ return type.__call__(cls, *args, **kwargs)+++class _TzOffsetFactory(_TzFactory):+ def __init__(cls, *args, **kwargs):+ cls.__instances = weakref.WeakValueDictionary()+ cls.__strong_cache = OrderedDict()+ cls.__strong_cache_size = 8++ cls._cache_lock = _thread.allocate_lock()++ def __call__(cls, name, offset):+ if isinstance(offset, timedelta):+ key = (name, offset.total_seconds())+ else:+ key = (name, offset)++ instance = cls.__instances.get(key, None)+ if instance is None:+ instance = cls.__instances.setdefault(key,+ cls.instance(name, offset))++ # This lock may not be necessary in Python 3. See GH issue #901+ with cls._cache_lock:+ cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance)++ # Remove an item if the strong cache is overpopulated+ if len(cls.__strong_cache) > cls.__strong_cache_size:+ cls.__strong_cache.popitem(last=False)++ return instance+++class _TzStrFactory(_TzFactory):+ def __init__(cls, *args, **kwargs):+ cls.__instances = weakref.WeakValueDictionary()+ cls.__strong_cache = OrderedDict()+ cls.__strong_cache_size = 8++ cls.__cache_lock = _thread.allocate_lock()++ def __call__(cls, s, posix_offset=False):+ key = (s, posix_offset)+ instance = cls.__instances.get(key, None)++ if instance is None:+ instance = cls.__instances.setdefault(key,+ cls.instance(s, posix_offset))++ # This lock may not be necessary in Python 3. See GH issue #901+ with cls.__cache_lock:+ cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance)++ # Remove an item if the strong cache is overpopulated+ if len(cls.__strong_cache) > cls.__strong_cache_size:+ cls.__strong_cache.popitem(last=False)++ return instance+
--- +++ @@ -0,0 +1,1849 @@+# -*- coding: utf-8 -*-+"""+This module offers timezone implementations subclassing the abstract+:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format+files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`,+etc), TZ environment string (in all known formats), given ranges (with help+from relative deltas), local machine timezone, fixed offset timezone, and UTC+timezone.+"""+import datetime+import struct+import time+import sys+import os+import bisect+import weakref+from collections import OrderedDict++import six+from six import string_types+from six.moves import _thread+from ._common import tzname_in_python2, _tzinfo+from ._common import tzrangebase, enfold+from ._common import _validate_fromutc_inputs++from ._factories import _TzSingleton, _TzOffsetFactory+from ._factories import _TzStrFactory+try:+ from .win import tzwin, tzwinlocal+except ImportError:+ tzwin = tzwinlocal = None++# For warning about rounding tzinfo+from warnings import warn++ZERO = datetime.timedelta(0)+EPOCH = datetime.datetime(1970, 1, 1, 0, 0)+EPOCHORDINAL = EPOCH.toordinal()++[email protected]_metaclass(_TzSingleton)+class tzutc(datetime.tzinfo):+ """+ This is a tzinfo object that represents the UTC time zone.++ **Examples:**++ .. doctest::++ >>> from datetime import *+ >>> from dateutil.tz import *++ >>> datetime.now()+ datetime.datetime(2003, 9, 27, 9, 40, 1, 521290)++ >>> datetime.now(tzutc())+ datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc())++ >>> datetime.now(tzutc()).tzname()+ 'UTC'++ .. versionchanged:: 2.7.0+ ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will+ always return the same object.++ .. doctest::++ >>> from dateutil.tz import tzutc, UTC+ >>> tzutc() is tzutc()+ True+ >>> tzutc() is UTC+ True+ """+ def utcoffset(self, dt):+ return ZERO++ def dst(self, dt):+ return ZERO++ @tzname_in_python2+ def tzname(self, dt):+ return "UTC"++ def is_ambiguous(self, dt):+ """+ Whether or not the "wall time" of a given datetime is ambiguous in this+ zone.++ :param dt:+ A :py:class:`datetime.datetime`, naive or time zone aware.+++ :return:+ Returns ``True`` if ambiguous, ``False`` otherwise.++ .. versionadded:: 2.6.0+ """+ return False++ @_validate_fromutc_inputs+ def fromutc(self, dt):+ """+ Fast track version of fromutc() returns the original ``dt`` object for+ any valid :py:class:`datetime.datetime` object.+ """+ return dt++ def __eq__(self, other):+ if not isinstance(other, (tzutc, tzoffset)):+ return NotImplemented++ return (isinstance(other, tzutc) or+ (isinstance(other, tzoffset) and other._offset == ZERO))++ __hash__ = None++ def __ne__(self, other):+ return not (self == other)++ def __repr__(self):+ return "%s()" % self.__class__.__name__++ __reduce__ = object.__reduce__+++#: Convenience constant providing a :class:`tzutc()` instance+#:+#: .. versionadded:: 2.7.0+UTC = tzutc()++[email protected]_metaclass(_TzOffsetFactory)+class tzoffset(datetime.tzinfo):+ """+ A simple class for representing a fixed offset from UTC.++ :param name:+ The timezone name, to be returned when ``tzname()`` is called.+ :param offset:+ The time zone offset in seconds, or (since version 2.6.0, represented+ as a :py:class:`datetime.timedelta` object).+ """+ def __init__(self, name, offset):+ self._name = name++ try:+ # Allow a timedelta+ offset = offset.total_seconds()+ except (TypeError, AttributeError):+ pass++ self._offset = datetime.timedelta(seconds=_get_supported_offset(offset))++ def utcoffset(self, dt):+ return self._offset++ def dst(self, dt):+ return ZERO++ @tzname_in_python2+ def tzname(self, dt):+ return self._name++ @_validate_fromutc_inputs+ def fromutc(self, dt):+ return dt + self._offset++ def is_ambiguous(self, dt):+ """+ Whether or not the "wall time" of a given datetime is ambiguous in this+ zone.++ :param dt:+ A :py:class:`datetime.datetime`, naive or time zone aware.+ :return:+ Returns ``True`` if ambiguous, ``False`` otherwise.++ .. versionadded:: 2.6.0+ """+ return False++ def __eq__(self, other):+ if not isinstance(other, tzoffset):+ return NotImplemented++ return self._offset == other._offset++ __hash__ = None++ def __ne__(self, other):+ return not (self == other)++ def __repr__(self):+ return "%s(%s, %s)" % (self.__class__.__name__,+ repr(self._name),+ int(self._offset.total_seconds()))++ __reduce__ = object.__reduce__+++class tzlocal(_tzinfo):+ """+ A :class:`tzinfo` subclass built around the ``time`` timezone functions.+ """+ def __init__(self):+ super(tzlocal, self).__init__()++ self._std_offset = datetime.timedelta(seconds=-time.timezone)+ if time.daylight:+ self._dst_offset = datetime.timedelta(seconds=-time.altzone)+ else:+ self._dst_offset = self._std_offset++ self._dst_saved = self._dst_offset - self._std_offset+ self._hasdst = bool(self._dst_saved)+ self._tznames = tuple(time.tzname)++ def utcoffset(self, dt):+ if dt is None and self._hasdst:+ return None++ if self._isdst(dt):+ return self._dst_offset+ else:+ return self._std_offset++ def dst(self, dt):+ if dt is None and self._hasdst:+ return None++ if self._isdst(dt):+ return self._dst_offset - self._std_offset+ else:+ return ZERO++ @tzname_in_python2+ def tzname(self, dt):+ return self._tznames[self._isdst(dt)]++ def is_ambiguous(self, dt):+ """+ Whether or not the "wall time" of a given datetime is ambiguous in this+ zone.++ :param dt:+ A :py:class:`datetime.datetime`, naive or time zone aware.+
… 1602 more lines (truncated)
--- +++ @@ -0,0 +1,370 @@+# -*- coding: utf-8 -*-+"""+This module provides an interface to the native time zone data on Windows,+including :py:class:`datetime.tzinfo` implementations.++Attempting to import this module on a non-Windows platform will raise an+:py:obj:`ImportError`.+"""+# This code was originally contributed by Jeffrey Harris.+import datetime+import struct++from six.moves import winreg+from six import text_type++try:+ import ctypes+ from ctypes import wintypes+except ValueError:+ # ValueError is raised on non-Windows systems for some horrible reason.+ raise ImportError("Running tzwin on non-Windows system")++from ._common import tzrangebase++__all__ = ["tzwin", "tzwinlocal", "tzres"]++ONEWEEK = datetime.timedelta(7)++TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"+TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones"+TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"+++def _settzkeyname():+ handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)+ try:+ winreg.OpenKey(handle, TZKEYNAMENT).Close()+ TZKEYNAME = TZKEYNAMENT+ except WindowsError:+ TZKEYNAME = TZKEYNAME9X+ handle.Close()+ return TZKEYNAME+++TZKEYNAME = _settzkeyname()+++class tzres(object):+ """+ Class for accessing ``tzres.dll``, which contains timezone name related+ resources.++ .. versionadded:: 2.5.0+ """+ p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char++ def __init__(self, tzres_loc='tzres.dll'):+ # Load the user32 DLL so we can load strings from tzres+ user32 = ctypes.WinDLL('user32')++ # Specify the LoadStringW function+ user32.LoadStringW.argtypes = (wintypes.HINSTANCE,+ wintypes.UINT,+ wintypes.LPWSTR,+ ctypes.c_int)++ self.LoadStringW = user32.LoadStringW+ self._tzres = ctypes.WinDLL(tzres_loc)+ self.tzres_loc = tzres_loc++ def load_name(self, offset):+ """+ Load a timezone name from a DLL offset (integer).++ >>> from dateutil.tzwin import tzres+ >>> tzr = tzres()+ >>> print(tzr.load_name(112))+ 'Eastern Standard Time'++ :param offset:+ A positive integer value referring to a string from the tzres dll.++ .. note::++ Offsets found in the registry are generally of the form+ ``@tzres.dll,-114``. The offset in this case is 114, not -114.++ """+ resource = self.p_wchar()+ lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR)+ nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0)+ return resource[:nchar]++ def name_from_string(self, tzname_str):+ """+ Parse strings as returned from the Windows registry into the time zone+ name as defined in the registry.++ >>> from dateutil.tzwin import tzres+ >>> tzr = tzres()+ >>> print(tzr.name_from_string('@tzres.dll,-251'))+ 'Dateline Daylight Time'+ >>> print(tzr.name_from_string('Eastern Standard Time'))+ 'Eastern Standard Time'++ :param tzname_str:+ A timezone name string as returned from a Windows registry key.++ :return:+ Returns the localized timezone string from tzres.dll if the string+ is of the form `@tzres.dll,-offset`, else returns the input string.+ """+ if not tzname_str.startswith('@'):+ return tzname_str++ name_splt = tzname_str.split(',-')+ try:+ offset = int(name_splt[1])+ except:+ raise ValueError("Malformed timezone string.")++ return self.load_name(offset)+++class tzwinbase(tzrangebase):+ """tzinfo class based on win32's timezones available in the registry."""+ def __init__(self):+ raise NotImplementedError('tzwinbase is an abstract base class')++ def __eq__(self, other):+ # Compare on all relevant dimensions, including name.+ if not isinstance(other, tzwinbase):+ return NotImplemented++ return (self._std_offset == other._std_offset and+ self._dst_offset == other._dst_offset and+ self._stddayofweek == other._stddayofweek and+ self._dstdayofweek == other._dstdayofweek and+ self._stdweeknumber == other._stdweeknumber and+ self._dstweeknumber == other._dstweeknumber and+ self._stdhour == other._stdhour and+ self._dsthour == other._dsthour and+ self._stdminute == other._stdminute and+ self._dstminute == other._dstminute and+ self._std_abbr == other._std_abbr and+ self._dst_abbr == other._dst_abbr)++ @staticmethod+ def list():+ """Return a list of all time zones known to the system."""+ with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:+ with winreg.OpenKey(handle, TZKEYNAME) as tzkey:+ result = [winreg.EnumKey(tzkey, i)+ for i in range(winreg.QueryInfoKey(tzkey)[0])]+ return result++ def display(self):+ """+ Return the display name of the time zone.+ """+ return self._display++ def transitions(self, year):+ """+ For a given year, get the DST on and off transition times, expressed+ always on the standard time side. For zones with no transitions, this+ function returns ``None``.++ :param year:+ The year whose transitions you would like to query.++ :return:+ Returns a :class:`tuple` of :class:`datetime.datetime` objects,+ ``(dston, dstoff)`` for zones with an annual DST transition, or+ ``None`` for fixed offset zones.+ """++ if not self.hasdst:+ return None++ dston = picknthweekday(year, self._dstmonth, self._dstdayofweek,+ self._dsthour, self._dstminute,+ self._dstweeknumber)++ dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek,+ self._stdhour, self._stdminute,+ self._stdweeknumber)++ # Ambiguous dates default to the STD side+ dstoff -= self._dst_base_offset++ return dston, dstoff++ def _get_hasdst(self):+ return self._dstmonth != 0++ @property+ def _dst_base_offset(self):+ return self._dst_base_offset_+++class tzwin(tzwinbase):+ """+ Time zone object created from the zone info in the Windows registry++ These are similar to :py:class:`dateutil.tz.tzrange` objects in that+ the time zone data is provided in the format of a single offset rule+ for either 0 or 2 time zone transitions per year.++ :param: name+ The name of a Windows time zone key, e.g. "Eastern Standard Time".+ The full list of keys can be retrieved with :func:`tzwin.list`.+ """++ def __init__(self, name):+ self._name = name++ with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:+ tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name)+ with winreg.OpenKey(handle, tzkeyname) as tzkey:+ keydict = valuestodict(tzkey)++ self._std_abbr = keydict["Std"]+ self._dst_abbr = keydict["Dlt"]++ self._display = keydict["Display"]++ # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm+ tup = struct.unpack("=3l16h", keydict["TZI"])+ stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1+ dstoffset = stdoffset-tup[2] # + DaylightBias * -1+ self._std_offset = datetime.timedelta(minutes=stdoffset)+ self._dst_offset = datetime.timedelta(minutes=dstoffset)++ # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs+ # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx+ (self._stdmonth,+ self._stddayofweek, # Sunday = 0+ self._stdweeknumber, # Last = 5+ self._stdhour,+ self._stdminute) = tup[4:9]++ (self._dstmonth,+ self._dstdayofweek, # Sunday = 0+ self._dstweeknumber, # Last = 5+ self._dsthour,+ self._dstminute) = tup[12:17]
… 123 more lines (truncated)
--- +++ @@ -0,0 +1,2 @@+# tzwin has moved to dateutil.tz.win+from .tz.win import *
--- +++ @@ -0,0 +1,71 @@+# -*- coding: utf-8 -*-+"""+This module offers general convenience and utility functions for dealing with+datetimes.++.. versionadded:: 2.7.0+"""+from __future__ import unicode_literals++from datetime import datetime, time+++def today(tzinfo=None):+ """+ Returns a :py:class:`datetime` representing the current day at midnight++ :param tzinfo:+ The time zone to attach (also used to determine the current day).++ :return:+ A :py:class:`datetime.datetime` object representing the current day+ at midnight.+ """++ dt = datetime.now(tzinfo)+ return datetime.combine(dt.date(), time(0, tzinfo=tzinfo))+++def default_tzinfo(dt, tzinfo):+ """+ Sets the ``tzinfo`` parameter on naive datetimes only++ This is useful for example when you are provided a datetime that may have+ either an implicit or explicit time zone, such as when parsing a time zone+ string.++ .. doctest::++ >>> from dateutil.tz import tzoffset+ >>> from dateutil.parser import parse+ >>> from dateutil.utils import default_tzinfo+ >>> dflt_tz = tzoffset("EST", -18000)+ >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz))+ 2014-01-01 12:30:00+00:00+ >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz))+ 2014-01-01 12:30:00-05:00++ :param dt:+ The datetime on which to replace the time zone++ :param tzinfo:+ The :py:class:`datetime.tzinfo` subclass instance to assign to+ ``dt`` if (and only if) it is naive.++ :return:+ Returns an aware :py:class:`datetime.datetime`.+ """+ if dt.tzinfo is not None:+ return dt+ else:+ return dt.replace(tzinfo=tzinfo)+++def within_delta(dt1, dt2, delta):+ """+ Useful for comparing two datetimes that may have a negligible difference+ to be considered equal.+ """+ delta = abs(delta)+ difference = dt1 - dt2+ return -delta <= difference <= delta
--- +++ @@ -0,0 +1,167 @@+# -*- coding: utf-8 -*-+import warnings+import json++from tarfile import TarFile+from pkgutil import get_data+from io import BytesIO++from dateutil.tz import tzfile as _tzfile++__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"]++ZONEFILENAME = "dateutil-zoneinfo.tar.gz"+METADATA_FN = 'METADATA'+++class tzfile(_tzfile):+ def __reduce__(self):+ return (gettz, (self._filename,))+++def getzoneinfofile_stream():+ try:+ return BytesIO(get_data(__name__, ZONEFILENAME))+ except IOError as e: # TODO switch to FileNotFoundError?+ warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror))+ return None+++class ZoneInfoFile(object):+ def __init__(self, zonefile_stream=None):+ if zonefile_stream is not None:+ with TarFile.open(fileobj=zonefile_stream) as tf:+ self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name)+ for zf in tf.getmembers()+ if zf.isfile() and zf.name != METADATA_FN}+ # deal with links: They'll point to their parent object. Less+ # waste of memory+ links = {zl.name: self.zones[zl.linkname]+ for zl in tf.getmembers() if+ zl.islnk() or zl.issym()}+ self.zones.update(links)+ try:+ metadata_json = tf.extractfile(tf.getmember(METADATA_FN))+ metadata_str = metadata_json.read().decode('UTF-8')+ self.metadata = json.loads(metadata_str)+ except KeyError:+ # no metadata in tar file+ self.metadata = None+ else:+ self.zones = {}+ self.metadata = None++ def get(self, name, default=None):+ """+ Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method+ for retrieving zones from the zone dictionary.++ :param name:+ The name of the zone to retrieve. (Generally IANA zone names)++ :param default:+ The value to return in the event of a missing key.++ .. versionadded:: 2.6.0++ """+ return self.zones.get(name, default)+++# The current API has gettz as a module function, although in fact it taps into+# a stateful class. So as a workaround for now, without changing the API, we+# will create a new "global" class instance the first time a user requests a+# timezone. Ugly, but adheres to the api.+#+# TODO: Remove after deprecation period.+_CLASS_ZONE_INSTANCE = []+++def get_zonefile_instance(new_instance=False):+ """+ This is a convenience function which provides a :class:`ZoneInfoFile`+ instance using the data provided by the ``dateutil`` package. By default, it+ caches a single instance of the ZoneInfoFile object and returns that.++ :param new_instance:+ If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and+ used as the cached instance for the next call. Otherwise, new instances+ are created only as necessary.++ :return:+ Returns a :class:`ZoneInfoFile` object.++ .. versionadded:: 2.6+ """+ if new_instance:+ zif = None+ else:+ zif = getattr(get_zonefile_instance, '_cached_instance', None)++ if zif is None:+ zif = ZoneInfoFile(getzoneinfofile_stream())++ get_zonefile_instance._cached_instance = zif++ return zif+++def gettz(name):+ """+ This retrieves a time zone from the local zoneinfo tarball that is packaged+ with dateutil.++ :param name:+ An IANA-style time zone name, as found in the zoneinfo file.++ :return:+ Returns a :class:`dateutil.tz.tzfile` time zone object.++ .. warning::+ It is generally inadvisable to use this function, and it is only+ provided for API compatibility with earlier versions. This is *not*+ equivalent to ``dateutil.tz.gettz()``, which selects an appropriate+ time zone based on the inputs, favoring system zoneinfo. This is ONLY+ for accessing the dateutil-specific zoneinfo (which may be out of+ date compared to the system zoneinfo).++ .. deprecated:: 2.6+ If you need to use a specific zoneinfofile over the system zoneinfo,+ instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call+ :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead.++ Use :func:`get_zonefile_instance` to retrieve an instance of the+ dateutil-provided zoneinfo.+ """+ warnings.warn("zoneinfo.gettz() will be removed in future versions, "+ "to use the dateutil-provided zoneinfo files, instantiate a "+ "ZoneInfoFile object and use ZoneInfoFile.zones.get() "+ "instead. See the documentation for details.",+ DeprecationWarning)++ if len(_CLASS_ZONE_INSTANCE) == 0:+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))+ return _CLASS_ZONE_INSTANCE[0].zones.get(name)+++def gettz_db_metadata():+ """ Get the zonefile metadata++ See `zonefile_metadata`_++ :returns:+ A dictionary with the database metadata++ .. deprecated:: 2.6+ See deprecation warning in :func:`zoneinfo.gettz`. To get metadata,+ query the attribute ``zoneinfo.ZoneInfoFile.metadata``.+ """+ warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future "+ "versions, to use the dateutil-provided zoneinfo files, "+ "ZoneInfoFile object and query the 'metadata' attribute "+ "instead. See the documentation for details.",+ DeprecationWarning)++ if len(_CLASS_ZONE_INSTANCE) == 0:+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))+ return _CLASS_ZONE_INSTANCE[0].metadata
binary or empty diff
pyyaml pypi INSTALL-EXEC
5.1
5.1.1
5.1.2
5.2
5.3
5.3.1
5.4
5.4.1
6.0
6.0.1
6.0.2
6.0.3
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 6.0.2 → 6.0.3
+1 added · -1 removed · ~9 modified
--- +++ @@ -10,3 +10,3 @@ -__version__ = '6.0.2'+__version__ = '6.0.3' try:
--- +++ @@ -3,2 +3,10 @@ set -eux++# build the requested version of libyaml locally+echo "::group::fetch libyaml ${LIBYAML_REF}"+git config --global advice.detachedHead false+git clone --branch "$LIBYAML_REF" "$LIBYAML_REPO" libyaml+pushd libyaml+git reset --hard "$LIBYAML_REF"+echo "::endgroup::" @@ -14,10 +22,10 @@ fi-echo "::endgroup::" -# build the requested version of libyaml locally-echo "::group::fetch libyaml ${LIBYAML_REF}"-git config --global advice.detachedHead false-git clone --branch "$LIBYAML_REF" "$LIBYAML_REPO" libyaml-pushd libyaml-git reset --hard "$LIBYAML_REF"+# hack to fix up locally musl1.2 libtool macros+if grep -m 1 alpine /etc/os-release; then+ if ! grep -E 'AC_CONFIG_MACRO_DIRS\(\[m4])' configure.ac; then+ echo 'AC_CONFIG_MACRO_DIRS([m4])' >> configure.ac+ ACLOCAL_PATH=/usr/local/share/libtool/ libtoolize+ fi+fi echo "::endgroup::"
--- +++ @@ -3,3 +3,2 @@ "setuptools", # FIXME: declare min/max setuptools versions?- "wheel", "Cython; python_version < '3.13'",
--- +++ @@ -2,3 +2,3 @@ NAME = 'PyYAML'-VERSION = '6.0.2'+VERSION = '6.0.3' DESCRIPTION = "YAML parser and emitter for Python"@@ -36,2 +36,3 @@ "Programming Language :: Python :: 3.13",+ "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython",
six pypi BURST ×2
1.7.2
1.7.3
1.8.0
1.9.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
BURST
2 releases in 28m: 1.6.0, 1.6.1
info · registry-verified · 2014-03-14 · 12y ago
BURST
2 releases in 18m: 1.7.1, 1.7.2
info · registry-verified · 2014-06-09 · 12y ago
release diff 1.16.0 → 1.17.0
+0 added · -0 removed · ~11 modified
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #@@ -31,3 +31,3 @@ __author__ = "Benjamin Peterson <[email protected]>"-__version__ = "1.16.0"+__version__ = "1.17.0" @@ -265,3 +265,3 @@ MovedAttribute("StringIO", "StringIO", "io"),- MovedAttribute("UserDict", "UserDict", "collections"),+ MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"), MovedAttribute("UserList", "UserList", "collections"),@@ -437,4 +437,2 @@ MovedAttribute("urlcleanup", "urllib", "urllib.request"),- MovedAttribute("URLopener", "urllib", "urllib.request"),- MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"),@@ -443,2 +441,9 @@ ]+if sys.version_info[:2] < (3, 14):+ _urllib_request_moved_attributes.extend(+ [+ MovedAttribute("URLopener", "urllib", "urllib.request"),+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),+ ]+ ) for attr in _urllib_request_moved_attributes:
--- +++ @@ -35,3 +35,3 @@ project = u"six"-copyright = u"2010-2020, Benjamin Peterson"+copyright = u"2010-2024, Benjamin Peterson"
--- +++ @@ -8,3 +8,3 @@ [metadata]-license_file = LICENSE+license_files = LICENSE @@ -12,9 +12,2 @@ minversion = 2.2.0-pep8ignore = - documentation/*.py ALL- test_six.py ALL-flakes-ignore = - documentation/*.py ALL- test_six.py ALL- six.py UndefinedName
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #@@ -115,2 +115,11 @@ +have_ndbm = True+try:+ import dbm+except ImportError:+ try:+ import dbm.ndbm+ except ImportError:+ have_ndbm = False+ @pytest.mark.parametrize("item_name",@@ -129,4 +138,8 @@ pytest.skip("requires tkinter")- if item_name.startswith("dbm_gnu") and not have_gdbm:+ if item_name == "tkinter_tix" and sys.version_info >= (3, 13):+ pytest.skip("tkinter.tix removed from Python 3.13")+ if item_name == "dbm_gnu" and not have_gdbm: pytest.skip("requires gdbm")+ if item_name == "dbm_ndbm":+ pytest.skip("requires ndbm") raise@@ -222,4 +235,4 @@ from six.moves import getoutput- output = getoutput('echo "foo"')- assert output == 'foo'+ output = getoutput('dir' if sys.platform.startswith('win') else 'echo foo')+ assert output != ''
typing-extensions pypi critical-tier no findings
4.10.0
4.11.0
4.12.0
4.12.1
4.12.2
4.13.0
4.13.1
4.13.2
4.14.0
4.14.1
4.15.0
4.16.0
CLEAN
no findings — nominal
release diff 4.15.0 → 4.16.0
+0 added · -0 removed · ~5 modified
--- +++ @@ -12,2 +12,3 @@ import itertools+import os import pickle@@ -104,2 +105,3 @@ runtime_checkable,+ sentinel, type_repr,@@ -133,2 +135,22 @@ TYPING_3_14_0 = sys.version_info[:3] >= (3, 14, 0)++TYPING_3_15_0 = sys.version_info[:3] >= (3, 15, 0)++TYPING_3_15_0_BETA_1 = sys.version_info[:5] == (3, 15, 0, 'beta', 1)++# We cannot control the repr of `TypeVarTuple` on versions of Python+# where `typing_extensions.TypeVarTuple()` does not return an instance+# of `typing_extensions.TypeVarTuple`. At time of writing, that's Python+# versions 3.11-3.14 inclusive (but not 3.10 or 3.15+). The exact version+# range has changed in the past and may do so again in the future.+#+# Note that we do not do an `isinstance()` check here because+# `typing_extensions.TypeVarTuple` does some trickery to pretend that+# instances of `typing.TypeVar` are also instances of+# `typing_extensions.TypeVarTuple` on Python 3.11-3.14.+# (Possibly we're being a little too clever for our own good there.)+GOOD_TYPEVARTUPLE_REPR_EXPECTED = (+ type(typing_extensions.TypeVarTuple("Ts"))+ is typing_extensions.TypeVarTuple+) @@ -533,2 +555,10 @@ + @skipUnless(TYPING_3_10_0, "PEP 604 has yet to be")+ def test_or(self):+ self.assertEqual(self.bottom_type | int, Union[self.bottom_type, int])+ self.assertEqual(int | self.bottom_type, Union[int, self.bottom_type])++ self.assertEqual(get_args(self.bottom_type | int), (self.bottom_type, int))+ self.assertEqual(get_args(int | self.bottom_type), (int, self.bottom_type))+ @@ -806,2 +836,21 @@ self.assertEqual(D.inited, 3)++ def test_existing_init_subclass_in_sibling_base(self):+ @deprecated("A will go away soon")+ class A:+ pass+ class B:+ def __init_subclass__(cls, x):+ super().__init_subclass__()+ cls.inited = x++ with self.assertWarnsRegex(DeprecationWarning, "A will go away soon"):+ class C(A, B, x=42):+ pass+ self.assertEqual(C.inited, 42)++ with self.assertWarnsRegex(DeprecationWarning, "A will go away soon"):+ class D(B, A, x=42):+ pass+ self.assertEqual(D.inited, 42) @@ -1731,7 +1780,5 @@ Optional[List[str]] : Optional[List[str]],- Optional[annotation] : Optional[annotation],+ Optional[annotation] : Optional[annotation], Union[str, None, str] : Optional[str], Unpack[Tuple[int, None]]: Unpack[Tuple[int, None]],- # Note: A starred *Ts will use typing.Unpack in 3.11+ see Issue #485- Unpack[Ts] : Unpack[Ts], }@@ -1751,3 +1798,11 @@ Annotated["annotation", "nested"] : Annotated[Union[int, None], "data", "nested"],+ # Note: A starred *Ts will use typing.Unpack in 3.11+ see Issue #485+ Unpack[Ts] : Unpack[Ts], }+ # Note: A starred *Ts will use typing.Unpack in 3.11+ see Issue #485+ if TYPING_3_15_0:+ # The repr is typing.Unpack[~Ts], which cannot be evaluated.+ do_not_stringify_cases[Unpack[Ts]] = Unpack[Ts]+ else:+ cases[Unpack[Ts]] = Unpack[Ts] if TYPING_3_10_0: # cannot construct UnionTypes before 3.10@@ -2212,2 +2267,35 @@ + def test_setattr(self):+ origin = collections.abc.Generator+ alias = typing_extensions.Generator+ original_name = alias._name++ def cleanup():+ for obj in origin, alias:+ for attr in 'foo', '__dunder__':+ try:+ delattr(obj, attr)+ except Exception:+ pass+ try:+ alias._name = original_name+ except Exception:+ pass++ self.addCleanup(cleanup)++ # Attribute assignment on generic alias sets attribute on origin+ alias.foo = 1+ self.assertEqual(alias.foo, 1)+ self.assertEqual(origin.foo, 1)+ # Except for dunders...+ alias.__dunder__ = 2+ self.assertEqual(alias.__dunder__, 2)+ self.assertRaises(AttributeError, lambda: origin.__dunder__)++ # ...and certain known attributes+ alias._name = "NewName"+ self.assertEqual(alias._name, "NewName")+ self.assertRaises(AttributeError, lambda: origin._name)+ @@ -2380,2 +2468,12 @@ ...++ def test_module_with_incomplete_sys(self):+ def does_not_exist(*args):+ raise AttributeError+ with (+ patch("sys._getframemodulename", does_not_exist, create=True),+ patch("sys._getframe", does_not_exist, create=True),+ ):+ X = NewType("X", int)+ self.assertEqual(X.__module__, None) @@ -3801,3 +3899,9 @@ + class CustomPathLikeProtocol(os.PathLike, Protocol):+ pass+ class CustomContextManager(typing.ContextManager, Protocol):+ pass++ class CustomAsyncIterator(typing.AsyncIterator, Protocol): pass@@ -4440,4 +4544,8 @@ )- base_anno = typing.ForwardRef("int", module="builtins") if base_future else int- child_anno = typing.ForwardRef("int", module="builtins") if child_future else int+ if sys.version_info >= (3, 14):+ base_anno = typing.ForwardRef("int", module="builtins", owner=base) if base_future else int+ child_anno = typing.ForwardRef("int", module="builtins", owner=child) if child_future else int+ else:+ base_anno = typing.ForwardRef("int", module="builtins") if base_future else int+ child_anno = typing.ForwardRef("int", module="builtins") if child_future else int self.assertEqual(base.__annotations__, {'base': base_anno})@@ -4569,2 +4677,43 @@ pass++ def test_keys_inheritance_with_same_name(self):+ class NotTotal(TypedDict, total=False):+ a: int++ class Total(NotTotal):+ a: int++ self.assertEqual(NotTotal.__required_keys__, frozenset())+ self.assertEqual(NotTotal.__optional_keys__, frozenset(['a']))+ self.assertEqual(Total.__required_keys__, frozenset(['a']))+ self.assertEqual(Total.__optional_keys__, frozenset())++ class Base(TypedDict):+ a: NotRequired[int]+ b: Required[int]++ class Child(Base):+ a: Required[int]+ b: NotRequired[int]++ self.assertEqual(Base.__required_keys__, frozenset(['b']))+ self.assertEqual(Base.__optional_keys__, frozenset(['a']))+ self.assertEqual(Child.__required_keys__, frozenset(['a']))+ self.assertEqual(Child.__optional_keys__, frozenset(['b']))++ def test_multiple_inheritance_with_same_key(self):+ class Base1(TypedDict):+ a: NotRequired[int]++ class Base2(TypedDict):+ a: Required[str]++ class Child(Base1, Base2):+ pass++ # Last base wins+ self.assertEqual(Child.__annotations__, {'a': Required[str]})+ self.assertEqual(Child.__required_keys__, frozenset(['a']))+ self.assertEqual(Child.__optional_keys__, frozenset())+ @@ -5299,2 +5448,13 @@ + @skipUnless(TYPING_3_10_0, "PEP 604 has yet to be")+ def test_or(self):+ class TD(TypedDict):+ a: int++ self.assertEqual(TD | int, Union[TD, int])+ self.assertEqual(int | TD, Union[int, TD])++ self.assertEqual(get_args(TD | int), (TD, int))+ self.assertEqual(get_args(int | TD), (int, TD))+ class AnnotatedTests(BaseTestCase):@@ -5519,2 +5679,15 @@ BA2+ )++ @skipUnless(TYPING_3_11_0, "TODO: evaluate nested forward refs in Python < 3.11")+ def test_get_type_hints_genericalias(self):+ def foobar(x: list['X']): ...+ X = Annotated[int, (1, 10)]+ self.assertEqual(+ get_type_hints(foobar, globals(), locals()),+ {'x': list[int]}+ )+ self.assertEqual(+ get_type_hints(foobar, globals(), locals(), include_extras=True),+ {'x': list[Annotated[int, (1, 10)]]} )@@ -5975,2 +6148,7 @@ + def test_subclass(self):+ with self.assertRaises(TypeError):+ class MyParamSpec(ParamSpec):+ pass+ @@ -6133,2 +6311,43 @@ + def test_isinstance_results_unaffected_by_presence_of_tracing_function(self):+ # See https://github.com/python/typing_extensions/issues/661++ code = textwrap.dedent(+ """\+ import sys, typing++ def trace_call(*args):+ return trace_call
… 410 more lines (truncated)
--- +++ @@ -8,3 +8,3 @@ name = "typing_extensions"-version = "4.15.0"+version = "4.16.0" description = "Backported and Experimental Type Hints for Python 3.9+"@@ -42,2 +42,3 @@ "Programming Language :: Python :: 3.14",+ "Programming Language :: Python :: 3.15", "Topic :: Software Development",@@ -92,3 +93,2 @@ "UP035",- "UP038", "UP045", # X | None instead of Optional[X]@@ -125,2 +125,3 @@ fail_under = 96+precision = 2 show_missing = true
--- +++ @@ -93,2 +93,3 @@ 'Protocol',+ 'sentinel', 'Sentinel',@@ -150,3 +151,2 @@ 'no_type_check',- 'no_type_check_decorator', ]@@ -162,13 +162,117 @@ ++def _caller(depth=1, default='__main__'):+ try:+ return sys._getframemodulename(depth + 1) or default+ except AttributeError: # For platforms without _getframemodulename()+ pass+ try:+ return sys._getframe(depth + 1).f_globals.get('__name__', default)+ except (AttributeError, ValueError): # For platforms without _getframe()+ pass+ return None+++# Placeholder for sentinel methods, because sentinels can not have their own sentinels+_sentinel_placeholder = object()++if hasattr(builtins, "sentinel"): # 3.15++ sentinel = builtins.sentinel+else:+ class sentinel:+ """Create a unique sentinel object.++ *name* should be the name of the variable to which the return value+ shall be assigned.+ """++ def __init__(+ self,+ __name: str = _sentinel_placeholder,+ __repr: typing.Optional[str] = _sentinel_placeholder,+ /,+ *,+ repr: typing.Optional[str] = None,+ name: str = _sentinel_placeholder,+ ) -> None:+ if name is not _sentinel_placeholder:+ warnings.warn(+ "Passing 'name' as a keyword argument is deprecated; "+ "pass it positionally instead.",+ DeprecationWarning,+ stacklevel=2,+ )+ __name = name+ if __name is _sentinel_placeholder:+ raise TypeError("First parameter 'name' is required")+ if __repr is not _sentinel_placeholder:+ warnings.warn(+ "Passing 'repr' as a positional argument is deprecated; "+ "pass it by keyword instead.",+ DeprecationWarning,+ stacklevel=2,+ )+ repr = __repr++ self._name = __name+ self._repr = repr if repr is not None else __name++ # For pickling as a singleton:+ self.__module__ = _caller()++ def __init_subclass__(cls):+ warnings.warn(+ "Subclassing sentinel is deprecated "+ "and will be disallowed in Python 3.15",+ DeprecationWarning,+ stacklevel=2,+ )+ super().__init_subclass__()++ def __setattr__(self, attr: str, value: object) -> None:+ if attr not in {"_name", "_repr", "__module__"}:+ warnings.warn(+ f"Setting attribute {attr!r} on sentinel objects is deprecated "+ "and will be disallowed in Python 3.15.",+ DeprecationWarning,+ stacklevel=2,+ )+ super().__setattr__(attr, value)++ @property+ def __name__(self) -> str:+ return self._name++ @__name__.setter+ def __name__(self, value: str) -> None:+ self._name = value++ def __repr__(self) -> str:+ return self._repr++ if sys.version_info < (3, 11):+ # The presence of this method convinces typing._type_check+ # that Sentinels are types.+ def __call__(self, *args, **kwargs):+ raise TypeError(f"{type(self).__name__!r} object is not callable")++ # Breakpoint: https://github.com/python/cpython/pull/21515+ if sys.version_info >= (3, 10):+ def __or__(self, other):+ return typing.Union[self, other]++ def __ror__(self, other):+ return typing.Union[other, self]++ def __reduce__(self) -> str:+ """Reduce this sentinel to a singleton."""+ return self.__name__ # Module is taken from the __module__ attribute++Sentinel = sentinel++_marker = sentinel("sentinel")++ # The functions below are modified copies of typing internal helpers. # They are needed by _ProtocolMeta and they provide support for PEP 646.---class _Sentinel:- def __repr__(self):- return "<sentinel>"---_marker = _Sentinel()- @@ -526,3 +630,5 @@ class _SpecialGenericAlias(typing._SpecialGenericAlias, _root=True):- def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()):+ def __init__(self, origin, nparams, *, defaults, inst=True, name=None):+ assert nparams > 0, "`nparams` must be a positive integer"+ assert defaults, "Must always specify a non-empty sequence for `defaults`" super().__init__(origin, nparams, inst=inst, name=name)@@ -544,4 +650,3 @@ if (- self._defaults- and len(params) < self._nparams+ len(params) < self._nparams and len(params) + len(self._defaults) >= self._nparams@@ -552,8 +657,3 @@ if actual_len != self._nparams:- if self._defaults:- expected = f"at least {self._nparams - len(self._defaults)}"- else:- expected = str(self._nparams)- if not self._nparams:- raise TypeError(f"{self} is not a generic class")+ expected = f"at least {self._nparams - len(self._defaults)}" raise TypeError(@@ -589,6 +689,9 @@ 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',- 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer',+ 'AsyncIterator', 'Hashable', 'Sized', 'Container', 'Collection',+ 'Reversible', 'Buffer', ], 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],+ 'io': ['Reader', 'Writer'], 'typing_extensions': ['Buffer'],+ 'os': ['PathLike'], }@@ -614,18 +717,8 @@ -def _caller(depth=1, default='__main__'):- try:- return sys._getframemodulename(depth + 1) or default- except AttributeError: # For platforms without _getframemodulename()- pass- try:- return sys._getframe(depth + 1).f_globals.get('__name__', default)- except (AttributeError, ValueError): # For platforms without _getframe()- pass- return None-- # `__match_args__` attribute was removed from protocol members in 3.13, # we want to backport this change to older Python versions.-# Breakpoint: https://github.com/python/cpython/pull/110683-if sys.version_info >= (3, 13):+# 3.14 additionally added `io.Reader`, `io.Writer` and `os.PathLike` to+# the list of allowed protocol allowlist.+# https://github.com/python/cpython/issues/127647+if sys.version_info >= (3, 14): Protocol = typing.Protocol@@ -1040,6 +1133,6 @@ # Update this to something like >=3.13.0b1 if and when-# PEP 728 is implemented in CPython-_PEP_728_IMPLEMENTED = False--if _PEP_728_IMPLEMENTED:+# PEP 764 is implemented in CPython+_PEP_764_IMPLEMENTED = False++if _PEP_764_IMPLEMENTED: # The standard library TypedDict in Python 3.9.0/1 does not honour the "total"@@ -1053,3 +1146,4 @@ # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier.- # PEP 728 (still pending) makes more changes.+ # PEP 728 (Python 3.15+) adds the `extra_items` and `closed` keywords.+ # PEP 764 (still pending) allows the `TypedDict` special form to be subscripted. TypedDict = typing.TypedDict@@ -1157,4 +1251,10 @@ annotations.update(base_dict.get('__annotations__', {}))- required_keys.update(base_dict.get('__required_keys__', ()))- optional_keys.update(base_dict.get('__optional_keys__', ()))+ base_required = base_dict.get('__required_keys__', set())+ required_keys |= base_required+ optional_keys -= base_required++ base_optional = base_dict.get('__optional_keys__', set())+ required_keys -= base_optional+ optional_keys |= base_optional+ readonly_keys.update(base_dict.get('__readonly_keys__', ()))@@ -1186,9 +1286,15 @@ if Required in qualifiers:+ is_required = True+ elif NotRequired in qualifiers:+ is_required = False+ else:+ is_required = total++ if is_required: required_keys.add(annotation_key)- elif NotRequired in qualifiers:- optional_keys.add(annotation_key)- elif total:- required_keys.add(annotation_key)+ optional_keys.discard(annotation_key) else: optional_keys.add(annotation_key)+ required_keys.discard(annotation_key)+ if ReadOnly in qualifiers:@@ -1800,3 +1906,3 @@ contravariant=contravariant)- paramspec.__infer_variance__ = infer_variance+ paramspec.__infer_variance__ = bool(infer_variance) @@ -1896,6 +2002,3 @@
… 238 more lines (truncated)
No packages match — nothing recent right now. Clear the filters to see the full watchlist.
alert feed
1d ago · eslint — BURST ACTIVE registry-verified
2 releases in 41m: 9.39.5, 10.7.0
4d ago · @types/node — BURST ACTIVE registry-verified
4 releases in 0m: 26.1.1, 25.9.5, 24.13.3, 22.20.1
6d ago · charset-normalizer — YANK ACTIVE registry-verified
3.4.8 marked yanked (still downloadable)
6d ago · grpcio-status — YANK ACTIVE registry-verified
1.82.0 marked yanked (still downloadable)
13d ago · prettier — BURST ACTIVE registry-verified
2 releases in 9m: 3.9.2, 3.9.3
23d ago · @types/node — BURST ACTIVE registry-verified
2 releases in 0m: 26.0.0, 25.9.4
28d ago · axios — BURST ACTIVE registry-verified
2 releases in 0m: 0.33.0, 1.18.0
1mo ago · @types/node — BURST ACTIVE registry-verified
4 releases in 0m: 25.9.3, 24.13.2, 22.19.21, 20.19.43
1mo ago · @types/node — BURST ACTIVE registry-verified
4 releases in 0m: 25.9.2, 24.13.1, 22.19.20, 20.19.42
1mo ago · @types/react — BURST ACTIVE registry-verified
2 releases in 0m: 19.2.17, 18.3.31
1mo ago · @types/react — BURST ACTIVE registry-verified
3 releases in 0m: 19.2.16, 18.3.30, 17.0.93
1mo ago · react-dom — BURST ACTIVE registry-verified
3 releases in 4m: 19.0.7, 19.1.8, 19.2.7
1mo ago · react — BURST ACTIVE registry-verified
3 releases in 4m: 19.0.7, 19.1.8, 19.2.7
1mo ago · @babel/core — BURST ACTIVE registry-verified
2 releases in 22m: 7.29.6, 7.29.7
1mo ago · @types/react — BURST ACTIVE registry-verified
5 releases in 0m: 19.2.15, 18.3.29, 17.0.92, 16.14.70, 15.7.37
2mo ago · @types/node — BURST ACTIVE registry-verified
3 releases in 0m: 24.12.4, 22.19.19, 20.19.41
2mo ago · @types/node — BURST ACTIVE registry-verified
4 releases in 0m: 25.6.2, 24.12.3, 22.19.18, 20.19.40
2mo ago · react-dom — BURST ACTIVE registry-verified
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
2mo ago · react — BURST ACTIVE registry-verified
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
2mo ago · axios — BURST ACTIVE registry-verified
2 releases in 4m: 1.15.1, 0.31.1
3mo ago · react-dom — BURST historic registry-verified
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
3mo ago · react — BURST historic registry-verified
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
3mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.5.2, 24.12.2, 22.19.17, 20.19.39
3mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.5.1, 24.12.1, 22.19.16, 20.19.38
3mo ago · ts-jest — BURST historic registry-verified
3 releases in 49m: 29.4.7, 29.4.8, 29.4.9
3mo ago · axios — DELETION historic registry-verified
0.30.4 published then removed
3mo ago · axios — DELETION historic registry-verified
1.14.1 published then removed
3mo ago · axios — BURST historic registry-verified
2 releases in 39m: 1.14.1, 0.30.4
3mo ago · pydantic-core — YANK historic registry-verified
2.44.0 marked yanked (still downloadable)
3mo ago · pydantic-core — YANK historic registry-verified
2.43.0 marked yanked (still downloadable)
4mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.5, 24.11.2, 22.19.15, 20.19.37
4mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.4, 24.11.1, 22.19.14, 20.19.36
4mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.2, 24.10.15, 22.19.13, 20.19.35
4mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.1, 24.10.14, 22.19.12, 20.19.34
4mo ago · rollup — BURST historic registry-verified
2 releases in 34m: 2.80.0, 3.30.0
4mo ago · grpcio-status — YANK historic registry-verified
1.78.1 marked yanked (still downloadable)
5mo ago · @types/node — BURST historic registry-verified
3 releases in 0m: 25.2.3, 24.10.13, 22.19.11
5mo ago · setuptools — BURST historic registry-verified
2 releases in 56m: 75.3.4, 82.0.0
5mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.2.2, 24.10.12, 22.19.10, 20.19.33
5mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.2.1, 24.10.11, 22.19.9, 20.19.32