@qelos/integrator-next 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,43 +1,25 @@
1
1
  import { NextResponse } from 'next/server';
2
+ import { rewriteSetCookieDomain } from './cookies';
2
3
  import { applyQelosForwardHeaders } from './forward-headers';
3
4
  import { getDefaultQelosConfig } from './env-config';
5
+ import { fetchMeIdentity } from './me-client';
6
+ import { resolveQelosProxyTarget } from './proxy-target';
4
7
  import { createRequestSdk } from './sdk-factory';
5
- const DEFAULT_ACCESS_COOKIE = 'q_access_token';
6
- const DEFAULT_REFRESH_COOKIE = 'q_refresh_token';
7
- function readTokens(req, config) {
8
- const accessCookie = config.accessTokenCookie || DEFAULT_ACCESS_COOKIE;
9
- const refreshCookie = config.refreshTokenCookie || DEFAULT_REFRESH_COOKIE;
10
- const cookieAccess = req.cookies.get(accessCookie)?.value;
11
- const cookieRefresh = req.cookies.get(refreshCookie)?.value;
12
- const authHeader = req.headers.get('authorization');
13
- const headerAccess = authHeader && authHeader.toLowerCase().startsWith('bearer ')
14
- ? authHeader.slice(7).trim()
15
- : undefined;
16
- return {
17
- accessToken: headerAccess || cookieAccess || undefined,
18
- refreshToken: cookieRefresh || undefined,
19
- };
20
- }
21
- function stagePendingCookies(pending, config, tokens) {
22
- const accessCookie = config.accessTokenCookie || DEFAULT_ACCESS_COOKIE;
23
- const refreshCookie = config.refreshTokenCookie || DEFAULT_REFRESH_COOKIE;
24
- const secure = !/^http:\/\//i.test(config.appUrl);
25
- const options = {
26
- httpOnly: true,
27
- secure,
28
- sameSite: 'lax',
29
- path: '/',
30
- };
31
- pending.push({ name: accessCookie, value: tokens.accessToken, options });
32
- if (tokens.refreshToken) {
33
- pending.push({ name: refreshCookie, value: tokens.refreshToken, options });
8
+ function mergeProxySkipPaths(config) {
9
+ const merged = [...(config.skipPaths ?? [])];
10
+ if (config.disableProxy !== true) {
11
+ const hasApiPrefix = merged.some((p) => p === '/api' || p === '/api/' || p.startsWith('/api/'));
12
+ if (!hasApiPrefix) {
13
+ merged.unshift('/api/');
14
+ }
34
15
  }
16
+ return merged.length ? merged : undefined;
35
17
  }
36
- function shouldSkip(req, config) {
37
- if (!config.skipPaths?.length)
18
+ function shouldSkip(req, skipPaths) {
19
+ if (!skipPaths?.length)
38
20
  return false;
39
21
  const path = req.nextUrl.pathname;
40
- return config.skipPaths.some((prefix) => path.startsWith(prefix));
22
+ return skipPaths.some((prefix) => path.startsWith(prefix));
41
23
  }
42
24
  function unauthorized() {
43
25
  return new NextResponse(JSON.stringify({ code: 'UNAUTHORIZED' }), {
@@ -47,72 +29,85 @@ function unauthorized() {
47
29
  }
48
30
  /**
49
31
  * Create a Next.js (App Router) edge middleware that identifies the user and
50
- * the active workspace via the Qelos SDK before the request reaches the
51
- * application's own handler. Resolved identity is forwarded to downstream
52
- * handlers via request headers (`x-qelos-user-id`, `x-qelos-workspace-id`);
53
- * use `getQelosContext()` from `@qelos/integrator-next/context` to obtain the
54
- * full user / workspace objects inside server components or route handlers.
32
+ * the active workspace via a same-origin BFF round-trip to Qelos `GET /api/me`
33
+ * before the request reaches the application's own handler. Resolved identity
34
+ * is forwarded to downstream handlers via request headers (`x-qelos-user-id`,
35
+ * `x-qelos-workspace-id`); use `getQelosContext()` from
36
+ * `@qelos/integrator-next/context` to obtain the full user / workspace objects
37
+ * inside server components or route handlers.
55
38
  */
56
39
  export function createQelosMiddleware(options) {
57
40
  const { config, resolveWorkspace } = options;
58
- const onTokenRefresh = options.onTokenRefresh ||
59
- (async ({ target, newTokens }) => {
60
- stagePendingCookies(target.pendingCookies, config, newTokens);
61
- });
41
+ const skipPathsEffective = mergeProxySkipPaths(config);
62
42
  return async function qelosMiddleware(req) {
63
- if (shouldSkip(req, config)) {
43
+ if (shouldSkip(req, skipPathsEffective)) {
64
44
  return NextResponse.next();
65
45
  }
66
- const tokens = readTokens(req, config);
67
- const pendingCookies = [];
68
- const forwardedHeaders = new Headers(req.headers);
69
- const sdk = createRequestSdk({
70
- config,
71
- tokens,
72
- refreshTarget: { req, pendingCookies },
73
- onTokenRefresh,
46
+ const getHeaders = () => ({
47
+ cookie: req.headers.get('cookie') ?? undefined,
48
+ authorization: req.headers.get('authorization') ?? undefined,
74
49
  });
75
- const hasAuthMaterial = Boolean(config.apiToken || tokens.accessToken || tokens.refreshToken);
50
+ const sdk = createRequestSdk({ config, getHeaders });
51
+ const base = resolveQelosProxyTarget(config);
52
+ if (!base && !config.apiToken) {
53
+ if (config.requireAuth) {
54
+ return unauthorized();
55
+ }
56
+ const forwardedHeaders = new Headers(req.headers);
57
+ applyQelosForwardHeaders(forwardedHeaders, null, null);
58
+ return NextResponse.next({ request: { headers: forwardedHeaders } });
59
+ }
76
60
  let user = null;
77
- let workspaces = [];
61
+ let setCookieValues = [];
62
+ const originalHost = req.headers.get('host');
63
+ if (base) {
64
+ const h = getHeaders();
65
+ const { response, user: meUser } = await fetchMeIdentity({
66
+ base,
67
+ cookie: h.cookie,
68
+ authorization: h.authorization,
69
+ });
70
+ user = meUser;
71
+ setCookieValues = response.headers.getSetCookie?.() ?? [];
72
+ }
78
73
  let workspace = null;
79
- let identifyFailed = false;
80
- if (hasAuthMaterial) {
74
+ let workspaces = [];
75
+ if (user) {
81
76
  try {
82
- user = await sdk.authentication.getLoggedInUser();
77
+ workspaces = await sdk.workspaces.getList();
83
78
  }
84
79
  catch {
85
- identifyFailed = true;
80
+ workspaces = [];
81
+ }
82
+ if (resolveWorkspace) {
83
+ workspace =
84
+ (await resolveWorkspace({ req, user, workspaces })) || null;
86
85
  }
87
- if (user) {
88
- try {
89
- workspaces = await sdk.workspaces.getList();
90
- }
91
- catch {
92
- workspaces = [];
93
- }
94
- if (workspaces.length) {
95
- if (resolveWorkspace) {
96
- workspace =
97
- (await resolveWorkspace({ req, user, workspaces })) || null;
98
- }
99
- else {
100
- workspace = workspaces[0] || null;
101
- }
102
- }
86
+ else {
87
+ workspace =
88
+ user.workspace ||
89
+ null;
103
90
  }
104
91
  }
105
- if (config.requireAuth && (!hasAuthMaterial || identifyFailed)) {
106
- return unauthorized();
92
+ if (!user) {
93
+ if (config.requireAuth) {
94
+ return unauthorized();
95
+ }
96
+ const forwardedHeaders = new Headers(req.headers);
97
+ applyQelosForwardHeaders(forwardedHeaders, null, null);
98
+ const res = NextResponse.next({ request: { headers: forwardedHeaders } });
99
+ for (const value of setCookieValues) {
100
+ res.headers.append('set-cookie', rewriteSetCookieDomain(value, originalHost ?? undefined));
101
+ }
102
+ return res;
107
103
  }
104
+ const forwardedHeaders = new Headers(req.headers);
108
105
  applyQelosForwardHeaders(forwardedHeaders, user, workspace);
109
- const response = NextResponse.next({
110
- request: { headers: forwardedHeaders },
111
- });
112
- for (const cookie of pendingCookies) {
113
- response.cookies.set(cookie.name, cookie.value, cookie.options);
106
+ const res = NextResponse.next({ request: { headers: forwardedHeaders } });
107
+ for (const value of setCookieValues) {
108
+ res.headers.append('set-cookie', rewriteSetCookieDomain(value, originalHost ?? undefined));
114
109
  }
115
- return response;
110
+ return res;
116
111
  };
117
112
  }
118
113
  let defaultMiddleware = null;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
package/dist/pages.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
1
+ import type { IncomingMessage } from 'node:http';
2
2
  import type { GetServerSideProps, GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';
3
3
  import type { IUser } from '@qelos/sdk/dist/authentication';
4
4
  import type { IWorkspace } from '@qelos/sdk/workspaces';
5
- import type { QelosNextConfig, QelosRequestContext, TokenRefreshHook } from './types';
5
+ import type { QelosNextConfig, QelosRequestContext } from './types';
6
6
  type CookieMap = Partial<Record<string, string>>;
7
7
  interface RequestWithCookies extends IncomingMessage {
8
8
  cookies?: CookieMap;
@@ -15,13 +15,9 @@ declare module 'http' {
15
15
  export interface PagesIntegratorOptions {
16
16
  config: QelosNextConfig;
17
17
  /**
18
- * Hook invoked after a successful token refresh. The default implementation
19
- * writes the new tokens back to the response cookies.
20
- */
21
- onTokenRefresh?: TokenRefreshHook<ServerResponse>;
22
- /**
23
- * Resolve the active workspace for a request. Defaults to picking the first
24
- * workspace returned from `sdk.workspaces.getList()`.
18
+ * Resolve the active workspace for a request. Defaults to whatever
19
+ * `/api/me` reports on `user.workspace` (the user's currently activated
20
+ * workspace, or `null` when none is active).
25
21
  */
26
22
  resolveWorkspace?: (params: {
27
23
  req: RequestWithCookies;
package/dist/pages.js CHANGED
@@ -1,54 +1,20 @@
1
+ import { rewriteSetCookieDomain } from './cookies';
2
+ import { fetchMeIdentity } from './me-client';
3
+ import { resolveQelosProxyTarget } from './proxy-target';
1
4
  import { createRequestSdk } from './sdk-factory';
2
5
  import { runWithQelosContext } from './context';
3
- const DEFAULT_ACCESS_COOKIE = 'q_access_token';
4
- const DEFAULT_REFRESH_COOKIE = 'q_refresh_token';
5
- function readCookieFromHeader(header, name) {
6
- if (!header)
7
- return undefined;
8
- const prefix = name + '=';
9
- for (const part of header.split(';')) {
10
- const trimmed = part.trim();
11
- if (trimmed.startsWith(prefix)) {
12
- try {
13
- return decodeURIComponent(trimmed.slice(prefix.length));
14
- }
15
- catch {
16
- return trimmed.slice(prefix.length);
17
- }
18
- }
19
- }
20
- return undefined;
21
- }
22
- function readTokens(req, config) {
23
- const accessCookie = config.accessTokenCookie || DEFAULT_ACCESS_COOKIE;
24
- const refreshCookie = config.refreshTokenCookie || DEFAULT_REFRESH_COOKIE;
25
- const parsed = req.cookies;
26
- const cookieAccess = (parsed && typeof parsed[accessCookie] === 'string'
27
- ? parsed[accessCookie]
28
- : undefined) || readCookieFromHeader(req.headers.cookie, accessCookie);
29
- const cookieRefresh = (parsed && typeof parsed[refreshCookie] === 'string'
30
- ? parsed[refreshCookie]
31
- : undefined) || readCookieFromHeader(req.headers.cookie, refreshCookie);
6
+ function getAuthorization(req) {
32
7
  const authHeaderRaw = req.headers.authorization;
33
8
  const authHeader = Array.isArray(authHeaderRaw) ? authHeaderRaw[0] : authHeaderRaw;
34
- const headerAccess = authHeader && authHeader.toLowerCase().startsWith('bearer ')
35
- ? authHeader.slice(7).trim()
36
- : undefined;
37
- return {
38
- accessToken: headerAccess || cookieAccess || undefined,
39
- refreshToken: cookieRefresh || undefined,
40
- };
9
+ return authHeader ?? undefined;
41
10
  }
42
- function serializeCookie(name, value, secure) {
43
- const parts = [
44
- `${name}=${encodeURIComponent(value)}`,
45
- 'Path=/',
46
- 'HttpOnly',
47
- 'SameSite=Lax',
48
- ];
49
- if (secure)
50
- parts.push('Secure');
51
- return parts.join('; ');
11
+ function getCookieHeader(req) {
12
+ const raw = req.headers.cookie;
13
+ if (typeof raw === 'string')
14
+ return raw;
15
+ if (Array.isArray(raw))
16
+ return raw.join('; ');
17
+ return undefined;
52
18
  }
53
19
  function appendSetCookie(res, value) {
54
20
  const existing = res.getHeader('set-cookie');
@@ -62,75 +28,71 @@ function appendSetCookie(res, value) {
62
28
  res.setHeader('set-cookie', [value]);
63
29
  }
64
30
  }
65
- function writeTokensToResponse(res, config, tokens) {
66
- const accessCookie = config.accessTokenCookie || DEFAULT_ACCESS_COOKIE;
67
- const refreshCookie = config.refreshTokenCookie || DEFAULT_REFRESH_COOKIE;
68
- const secure = !/^http:\/\//i.test(config.appUrl);
69
- appendSetCookie(res, serializeCookie(accessCookie, tokens.accessToken, secure));
70
- if (tokens.refreshToken) {
71
- appendSetCookie(res, serializeCookie(refreshCookie, tokens.refreshToken, secure));
72
- }
73
- }
74
31
  function shouldSkip(req, config) {
75
32
  if (!config.skipPaths?.length)
76
33
  return false;
77
34
  const path = req.url || '';
78
35
  return config.skipPaths.some((prefix) => path.startsWith(prefix));
79
36
  }
37
+ function requestHost(req) {
38
+ const h = req.headers.host;
39
+ return Array.isArray(h) ? h[0] ?? null : h ?? null;
40
+ }
80
41
  async function buildContext(req, res, options) {
81
42
  const { config, resolveWorkspace } = options;
82
- const onTokenRefresh = options.onTokenRefresh ||
83
- (async ({ target, newTokens }) => {
84
- writeTokensToResponse(target, config, newTokens);
85
- });
86
- const tokens = readTokens(req, config);
87
- const sdk = createRequestSdk({
88
- config,
89
- tokens,
90
- refreshTarget: res,
91
- onTokenRefresh,
43
+ const getHeaders = () => ({
44
+ cookie: getCookieHeader(req),
45
+ authorization: getAuthorization(req),
92
46
  });
47
+ const sdk = createRequestSdk({ config, getHeaders });
93
48
  const ctx = {
94
49
  user: null,
95
50
  workspace: null,
96
51
  workspaces: [],
97
52
  sdk,
98
- tokens,
99
53
  };
100
- const hasAuthMaterial = Boolean(config.apiToken || tokens.accessToken || tokens.refreshToken);
101
- if (!hasAuthMaterial) {
102
- return { ctx, identifyFailed: false };
54
+ const base = resolveQelosProxyTarget(config);
55
+ if (!base && !config.apiToken) {
56
+ return { ctx };
103
57
  }
104
- let identifyFailed = false;
105
- try {
106
- ctx.user = await sdk.authentication.getLoggedInUser();
58
+ if (!base) {
59
+ return { ctx };
107
60
  }
108
- catch {
109
- identifyFailed = true;
110
- return { ctx, identifyFailed };
61
+ const h = getHeaders();
62
+ const { response, user } = await fetchMeIdentity({
63
+ base,
64
+ cookie: h.cookie,
65
+ authorization: h.authorization,
66
+ });
67
+ const host = requestHost(req);
68
+ const setCookieValues = response.headers.getSetCookie?.() ?? [];
69
+ for (const value of setCookieValues) {
70
+ appendSetCookie(res, rewriteSetCookieDomain(value, host ?? undefined));
71
+ }
72
+ ctx.user = user;
73
+ if (!ctx.user) {
74
+ return { ctx };
111
75
  }
112
- if (!ctx.user)
113
- return { ctx, identifyFailed };
114
76
  try {
115
77
  ctx.workspaces = await sdk.workspaces.getList();
116
78
  }
117
79
  catch {
118
80
  ctx.workspaces = [];
119
81
  }
120
- if (ctx.workspaces.length) {
121
- if (resolveWorkspace) {
122
- ctx.workspace =
123
- (await resolveWorkspace({
124
- req,
125
- user: ctx.user,
126
- workspaces: ctx.workspaces,
127
- })) || null;
128
- }
129
- else {
130
- ctx.workspace = ctx.workspaces[0] || null;
131
- }
82
+ if (resolveWorkspace) {
83
+ ctx.workspace =
84
+ (await resolveWorkspace({
85
+ req,
86
+ user: ctx.user,
87
+ workspaces: ctx.workspaces,
88
+ })) || null;
89
+ }
90
+ else {
91
+ ctx.workspace =
92
+ ctx.user.workspace ||
93
+ null;
132
94
  }
133
- return { ctx, identifyFailed };
95
+ return { ctx };
134
96
  }
135
97
  /**
136
98
  * Wrap a Pages Router API route handler so that `req.qelos` is populated
@@ -143,9 +105,9 @@ export function withQelosApi(handler, options) {
143
105
  if (shouldSkip(req, config)) {
144
106
  return handler(req, res);
145
107
  }
146
- const { ctx, identifyFailed } = await buildContext(req, res, options);
108
+ const { ctx } = await buildContext(req, res, options);
147
109
  req.qelos = ctx;
148
- if (config.requireAuth && (!ctx.user || identifyFailed)) {
110
+ if (config.requireAuth && !ctx.user) {
149
111
  res.status(401).json({ code: 'UNAUTHORIZED' });
150
112
  return;
151
113
  }
@@ -171,17 +133,18 @@ export function withQelosSSR(handler, options) {
171
133
  const req = context.req;
172
134
  const res = context.res;
173
135
  if (shouldSkip(req, config)) {
174
- return runWithQelosContext({ user: null, workspace: null, workspaces: [], sdk: null, tokens: {} }, () => handler(context, {
136
+ const emptySdk = null;
137
+ const emptyCtx = {
175
138
  user: null,
176
139
  workspace: null,
177
140
  workspaces: [],
178
- sdk: null,
179
- tokens: {},
180
- }));
141
+ sdk: emptySdk,
142
+ };
143
+ return runWithQelosContext(emptyCtx, () => handler(context, emptyCtx));
181
144
  }
182
- const { ctx, identifyFailed } = await buildContext(req, res, options);
145
+ const { ctx } = await buildContext(req, res, options);
183
146
  req.qelos = ctx;
184
- if (config.requireAuth && (!ctx.user || identifyFailed)) {
147
+ if (config.requireAuth && !ctx.user) {
185
148
  return { redirect: { destination: '/login', permanent: false } };
186
149
  }
187
150
  return (await runWithQelosContext(ctx, () => handler(context, ctx)));
package/dist/pages.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { QelosNextConfig } from './types';
2
+ /**
3
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
4
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
5
+ * dev-time overrides when the configured `appUrl` is not reachable from
6
+ * the local host.
7
+ *
8
+ * Priority (highest first):
9
+ * 1. `process.env.NEXT_QELOS_PROXY_TARGET`
10
+ * 2. `process.env.QELOS_IP`
11
+ * 3. `process.env.QELOS_API_IP`
12
+ * 4. `config.appUrl`
13
+ *
14
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
15
+ * nothing is configured so the caller can surface a clear error.
16
+ */
17
+ export declare function resolveQelosProxyTarget(config: QelosNextConfig): string | undefined;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
3
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
4
+ * dev-time overrides when the configured `appUrl` is not reachable from
5
+ * the local host.
6
+ *
7
+ * Priority (highest first):
8
+ * 1. `process.env.NEXT_QELOS_PROXY_TARGET`
9
+ * 2. `process.env.QELOS_IP`
10
+ * 3. `process.env.QELOS_API_IP`
11
+ * 4. `config.appUrl`
12
+ *
13
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
14
+ * nothing is configured so the caller can surface a clear error.
15
+ */
16
+ export function resolveQelosProxyTarget(config) {
17
+ const env = process.env;
18
+ const fromEnv = env.NEXT_QELOS_PROXY_TARGET?.trim() ||
19
+ env.QELOS_IP?.trim() ||
20
+ env.QELOS_API_IP?.trim();
21
+ if (fromEnv)
22
+ return fromEnv;
23
+ const fromAppUrl = config.appUrl?.trim();
24
+ return fromAppUrl || undefined;
25
+ }
26
+ //# sourceMappingURL=proxy-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-target.js","sourceRoot":"","sources":["../src/proxy-target.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAuB;IAEvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,OAAO,GACX,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE;QACnC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE;QACpB,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type NextRequest } from 'next/server';
2
+ import type { QelosNextConfig } from '../types';
3
+ /**
4
+ * Handlers for a catch-all App Router route (e.g. `app/api/[...qelos]/route.ts`)
5
+ * that reverse-proxies every `/api/**` call to Qelos with `Set-Cookie` domain
6
+ * rewriting. Use `export const runtime = 'nodejs'`.
7
+ */
8
+ export declare function createQelosApiProxyHandlers(config: QelosNextConfig): {
9
+ runtime: "nodejs";
10
+ GET: (req: NextRequest) => Promise<Response>;
11
+ POST: (req: NextRequest) => Promise<Response>;
12
+ PUT: (req: NextRequest) => Promise<Response>;
13
+ PATCH: (req: NextRequest) => Promise<Response>;
14
+ DELETE: (req: NextRequest) => Promise<Response>;
15
+ OPTIONS: (req: NextRequest) => Promise<Response>;
16
+ };