graphile-build-pg 4.12.3 → 4.14.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.
- package/README.md +5 -8
- package/node8plus/plugins/PgIntrospectionPlugin.js +18 -5
- package/node8plus/plugins/PgIntrospectionPlugin.js.flow +30 -2
- package/node8plus/plugins/PgIntrospectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgTypesPlugin.js +46 -13
- package/node8plus/plugins/PgTypesPlugin.js.flow +78 -25
- package/node8plus/plugins/PgTypesPlugin.js.map +1 -1
- package/node8plus/plugins/introspectionQuery.js +3 -2
- package/node8plus/plugins/introspectionQuery.js.flow +11 -2
- package/node8plus/plugins/introspectionQuery.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -23,17 +23,14 @@ maintenance and development via sponsorship.
|
|
|
23
23
|
And please give some love to our featured sponsors 🤩:
|
|
24
24
|
|
|
25
25
|
<table><tr>
|
|
26
|
-
<td align="center"><a href="https://surge.io/"><img src="https://graphile.org/images/sponsors/surge.png" width="90" height="90" alt="Surge" /><br />Surge</a> *</td>
|
|
27
|
-
<td align="center"><a href="https://storyscript.com/?utm_source=postgraphile"><img src="https://graphile.org/images/sponsors/storyscript.png" width="90" height="90" alt="Story.ai" /><br />Story.ai</a> *</td>
|
|
28
|
-
<td align="center"><a href="http://chads.website"><img src="https://graphile.org/images/sponsors/chadf.png" width="90" height="90" alt="Chad Furman" /><br />Chad Furman</a> *</td>
|
|
29
26
|
<td align="center"><a href="https://www.the-guild.dev/"><img src="https://graphile.org/images/sponsors/theguild.png" width="90" height="90" alt="The Guild" /><br />The Guild</a> *</td>
|
|
30
|
-
</tr><tr>
|
|
31
|
-
<td align="center"><a href="https://qwick.com/"><img src="https://graphile.org/images/sponsors/qwick.png" width="90" height="90" alt="Qwick" /><br />Qwick</a> *</td>
|
|
32
|
-
<td align="center"><a href="https://www.fanatics.com/"><img src="https://graphile.org/images/sponsors/fanatics.png" width="90" height="90" alt="Fanatics" /><br />Fanatics</a> *</td>
|
|
33
|
-
<td align="center"><a href="https://graphcdn.io/"><img src="https://graphile.org/images/sponsors/GraphCDN.png" width="90" height="90" alt="GraphCDN" /><br />GraphCDN</a> *</td>
|
|
34
27
|
<td align="center"><a href="https://dovetailapp.com/"><img src="https://graphile.org/images/sponsors/dovetail.png" width="90" height="90" alt="Dovetail" /><br />Dovetail</a> *</td>
|
|
28
|
+
<td align="center"><a href="https://www.netflix.com/"><img src="https://graphile.org/images/sponsors/Netflix.png" width="90" height="90" alt="Netflix" /><br />Netflix</a> *</td>
|
|
29
|
+
<td align="center"><a href=""><img src="https://graphile.org/images/sponsors/chadf.png" width="90" height="90" alt="Chad Furman" /><br />Chad Furman</a> *</td>
|
|
35
30
|
</tr><tr>
|
|
36
|
-
<td align="center"><a href="https://
|
|
31
|
+
<td align="center"><a href="https://stellate.co/"><img src="https://graphile.org/images/sponsors/Stellate.png" width="90" height="90" alt="Stellate" /><br />Stellate</a> *</td>
|
|
32
|
+
<td align="center"><a href="https://www.accenture.com/"><img src="https://graphile.org/images/sponsors/accenture.svg" width="90" height="90" alt="Accenture" /><br />Accenture</a> *</td>
|
|
33
|
+
<td align="center"><a href="https://microteam.io/"><img src="https://graphile.org/images/sponsors/micro.png" width="90" height="90" alt="We Love Micro" /><br />We Love Micro</a> *</td>
|
|
37
34
|
</tr></table>
|
|
38
35
|
|
|
39
36
|
<em>\* Sponsors the entire Graphile suite</em>
|
|
@@ -36,6 +36,16 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
36
36
|
const debug = (0, _debug.default)("graphile-build-pg");
|
|
37
37
|
const WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`; // Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object
|
|
38
38
|
|
|
39
|
+
const fakeEnumIdentifier = (namespaceName, name, identifierExtra = "", list = false) => {
|
|
40
|
+
const baseEnumIdentifier = `FAKE_ENUM_${namespaceName}_${name}${identifierExtra}`;
|
|
41
|
+
|
|
42
|
+
if (list) {
|
|
43
|
+
return `${baseEnumIdentifier}_list`;
|
|
44
|
+
} else {
|
|
45
|
+
return baseEnumIdentifier;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
39
49
|
function readFile(filename, encoding) {
|
|
40
50
|
return new Promise((resolve, reject) => {
|
|
41
51
|
(0, _fs.readFile)(filename, encoding, (err, res) => {
|
|
@@ -326,7 +336,7 @@ function enumTables(introspectionResults) {
|
|
|
326
336
|
const enumTypeArray = {
|
|
327
337
|
kind: "type",
|
|
328
338
|
isFake: true,
|
|
329
|
-
id:
|
|
339
|
+
id: fakeEnumIdentifier(klass.namespaceName, klass.name, constraintIdent, true),
|
|
330
340
|
name: `_${klass.name}${constraintIdent}`,
|
|
331
341
|
description: null,
|
|
332
342
|
tags: {},
|
|
@@ -349,7 +359,7 @@ function enumTables(introspectionResults) {
|
|
|
349
359
|
const enumType = {
|
|
350
360
|
kind: "type",
|
|
351
361
|
isFake: true,
|
|
352
|
-
id:
|
|
362
|
+
id: fakeEnumIdentifier(klass.namespaceName, klass.name, constraintIdent, false),
|
|
353
363
|
name: `${klass.name}${constraintIdent}`,
|
|
354
364
|
description: klass.description,
|
|
355
365
|
tags: { ...klass.tags,
|
|
@@ -418,7 +428,8 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
|
|
|
418
428
|
pgLegacyFunctionsOnly = false,
|
|
419
429
|
pgIgnoreRBAC = true,
|
|
420
430
|
pgSkipInstallingWatchFixtures = false,
|
|
421
|
-
pgOwnerConnectionString
|
|
431
|
+
pgOwnerConnectionString,
|
|
432
|
+
pgUsePartitionedParent = false
|
|
422
433
|
}) {
|
|
423
434
|
/**
|
|
424
435
|
* Introspect database and get the table/view/constraints.
|
|
@@ -435,7 +446,8 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
|
|
|
435
446
|
const serverVersionNum = parseInt(versionResult.rows[0].server_version_num, 10);
|
|
436
447
|
const introspectionQuery = (0, _introspectionQuery.makeIntrospectionQuery)(serverVersionNum, {
|
|
437
448
|
pgLegacyFunctionsOnly,
|
|
438
|
-
pgIgnoreRBAC
|
|
449
|
+
pgIgnoreRBAC,
|
|
450
|
+
pgUsePartitionedParent
|
|
439
451
|
});
|
|
440
452
|
const {
|
|
441
453
|
rows
|
|
@@ -896,7 +908,8 @@ Original error: ${e.message}
|
|
|
896
908
|
}
|
|
897
909
|
|
|
898
910
|
return build.extend(build, {
|
|
899
|
-
pgIntrospectionResultsByKind: introspectionResultsByKind
|
|
911
|
+
pgIntrospectionResultsByKind: introspectionResultsByKind,
|
|
912
|
+
getPgFakeEnumIdentifier: fakeEnumIdentifier
|
|
900
913
|
});
|
|
901
914
|
}, ["PgIntrospection"], [], ["PgBasics"]);
|
|
902
915
|
}; // TypeScript compatibility
|
|
@@ -209,6 +209,20 @@ export type PgEntity =
|
|
|
209
209
|
| PgExtension
|
|
210
210
|
| PgIndex;
|
|
211
211
|
|
|
212
|
+
const fakeEnumIdentifier = (
|
|
213
|
+
namespaceName: string,
|
|
214
|
+
name: string,
|
|
215
|
+
identifierExtra = "",
|
|
216
|
+
list = false
|
|
217
|
+
) => {
|
|
218
|
+
const baseEnumIdentifier = `FAKE_ENUM_${namespaceName}_${name}${identifierExtra}`;
|
|
219
|
+
if (list) {
|
|
220
|
+
return `${baseEnumIdentifier}_list`;
|
|
221
|
+
} else {
|
|
222
|
+
return baseEnumIdentifier;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
212
226
|
export type PgIntrospectionResultsByKind = {
|
|
213
227
|
__pgVersion: number,
|
|
214
228
|
attribute: PgAttribute[],
|
|
@@ -556,7 +570,12 @@ function enumTables(introspectionResults) {
|
|
|
556
570
|
const enumTypeArray = {
|
|
557
571
|
kind: "type",
|
|
558
572
|
isFake: true,
|
|
559
|
-
id:
|
|
573
|
+
id: fakeEnumIdentifier(
|
|
574
|
+
klass.namespaceName,
|
|
575
|
+
klass.name,
|
|
576
|
+
constraintIdent,
|
|
577
|
+
true
|
|
578
|
+
),
|
|
560
579
|
name: `_${klass.name}${constraintIdent}`,
|
|
561
580
|
description: null,
|
|
562
581
|
tags: {},
|
|
@@ -579,7 +598,12 @@ function enumTables(introspectionResults) {
|
|
|
579
598
|
const enumType = {
|
|
580
599
|
kind: "type",
|
|
581
600
|
isFake: true,
|
|
582
|
-
id:
|
|
601
|
+
id: fakeEnumIdentifier(
|
|
602
|
+
klass.namespaceName,
|
|
603
|
+
klass.name,
|
|
604
|
+
constraintIdent,
|
|
605
|
+
false
|
|
606
|
+
),
|
|
583
607
|
name: `${klass.name}${constraintIdent}`,
|
|
584
608
|
description: klass.description,
|
|
585
609
|
tags: { ...klass.tags, ...constraint.tags },
|
|
@@ -657,6 +681,7 @@ export default (async function PgIntrospectionPlugin(
|
|
|
657
681
|
pgIgnoreRBAC = true,
|
|
658
682
|
pgSkipInstallingWatchFixtures = false,
|
|
659
683
|
pgOwnerConnectionString,
|
|
684
|
+
pgUsePartitionedParent = false,
|
|
660
685
|
}
|
|
661
686
|
) {
|
|
662
687
|
/**
|
|
@@ -681,6 +706,7 @@ export default (async function PgIntrospectionPlugin(
|
|
|
681
706
|
const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {
|
|
682
707
|
pgLegacyFunctionsOnly,
|
|
683
708
|
pgIgnoreRBAC,
|
|
709
|
+
pgUsePartitionedParent,
|
|
684
710
|
});
|
|
685
711
|
const { rows } = await pgClient.query(introspectionQuery, [
|
|
686
712
|
schemas,
|
|
@@ -1320,6 +1346,7 @@ Original error: ${e.message}
|
|
|
1320
1346
|
rawIntrospectionResultsByKind,
|
|
1321
1347
|
build.pgAugmentIntrospectionResults
|
|
1322
1348
|
);
|
|
1349
|
+
|
|
1323
1350
|
if (introspectionResultsByKind.__pgVersion < 90500) {
|
|
1324
1351
|
// TODO:v5: remove this workaround
|
|
1325
1352
|
// This is a bit of a hack, but until we have plugin priorities it's the
|
|
@@ -1330,6 +1357,7 @@ Original error: ${e.message}
|
|
|
1330
1357
|
}
|
|
1331
1358
|
return build.extend(build, {
|
|
1332
1359
|
pgIntrospectionResultsByKind: introspectionResultsByKind,
|
|
1360
|
+
getPgFakeEnumIdentifier: fakeEnumIdentifier,
|
|
1333
1361
|
});
|
|
1334
1362
|
},
|
|
1335
1363
|
["PgIntrospection"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","slice","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","isEnumConstraint","con","isEnumTable","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","enum","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTables","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","enumTableColumns","descriptionColumn","enumDescription","allData","_internalEnumData","col","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","typeById","fkattr","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","VALID_TYPE_IDS","all","includes","hasEnumConstraints","some","z","pgSql","compile","fragment","identifier","role","user","message","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","clientIsStillViable","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":";;;;;;;AAGA;;AAGA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;AAEA,MAAMA,KAAK,GAAG,oBAAa,mBAAb,CAAd;AACA,MAAMC,mBAAmB,GAAI,GAAEC,SAAU,+BAAzC,C,CAEA;;AAiNA,SAASC,QAAT,CAAkBC,QAAlB,EAA4BC,QAA5B,EAAsC;AACpC,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,sBAAYJ,QAAZ,EAAsBC,QAAtB,EAAgC,CAACI,GAAD,EAAMC,GAAN,KAAc;AAC5C,UAAID,GAAJ,EAASD,MAAM,CAACC,GAAD,CAAN,CAAT,KACKF,OAAO,CAACG,GAAD,CAAP;AACN,KAHD;AAID,GALM,CAAP;AAMD;;AAED,MAAMC,YAAY,GAAGC,GAAG,IAAI;AAC1B,QAAMC,OAAO,GAAGD,GAAG,CAACE,IAAJ,EAAhB;;AACA,MAAID,OAAO,CAAC,CAAD,CAAP,KAAe,GAAnB,EAAwB;AACtB,QAAIA,OAAO,CAACA,OAAO,CAACE,MAAR,GAAiB,CAAlB,CAAP,KAAgC,GAApC,EAAyC;AACvC,YAAM,IAAIC,KAAJ,CACH,2CAA0CJ,GAAI,yGAD3C,CAAN;AAGD;;AACD,WAAOC,OAAO,CAACI,KAAR,CAAc,CAAd,EAAiB,CAAC,CAAlB,CAAP;AACD,GAPD,MAOO;AACL;AACA,WAAOJ,OAAO,CAACK,WAAR,EAAP;AACD;AACF,CAbD;;AAeA,MAAMC,mBAAmB,GAAGP,GAAG,IAAI;AACjC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,QAAMQ,KAAK,GAAGR,GAAG,CAACS,KAAJ,CAAU,GAAV,CAAd;AACA,SAAOD,KAAK,CAACE,GAAN,CAAUX,YAAV,CAAP;AACD,CAND;;AAQA,MAAMY,oBAAoB,GAAGX,GAAG,IAAI;AAClC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,SAAOD,YAAY,CAACC,GAAD,CAAnB;AACD,CALD;;AAOA,SAASY,mBAAT,CAA6BC,OAA7B,EAAsC;AACpC,QAAM,CAACC,IAAD,EAAO,GAAGC,aAAV,IAA2BF,OAAO,CAACJ,KAAR,CAAc,IAAd,CAAjC;AACA,QAAMO,MAAM,GAAG,sBAAUD,aAAa,CAACE,IAAd,CAAmB,IAAnB,CAAV,CAAf;AACA,SAAO;AACLH,IAAAA,IADK;AAELI,IAAAA,IAAI,EAAEF,MAAM,CAACE,IAFR;AAGLC,IAAAA,WAAW,EAAEH,MAAM,CAACI;AAHf,GAAP;AAKD;;AAED,SAASC,uBAAT,CAAiCC,oBAAjC,EAAuD;AACrD,QAAMC,iBAAiB,GAAG,CAACC,GAAD,EAAMC,IAAN,EAAYC,QAAZ,KAAyB;AACjD,UAAMC,UAAU,GAAGL,oBAAoB,CAACM,SAArB,CAChBC,MADgB,CACTC,CAAC,IAAIA,CAAC,CAACC,OAAF,KAAcP,GAAG,CAACQ,EADd,EAEhBC,IAFgB,CAEX,CAACH,CAAD,EAAII,CAAJ,KAAUJ,CAAC,CAACK,GAAF,GAAQD,CAAC,CAACC,GAFT,CAAnB;;AAGA,QAAI,CAACV,IAAL,EAAW;AACT,YAAMW,EAAE,GAAGd,oBAAoB,CAACe,UAArB,CAAgCC,IAAhC,CACTC,CAAC,IAAIA,CAAC,CAACR,OAAF,IAAaP,GAAG,CAACQ,EAAjB,IAAuBO,CAAC,CAACC,IAAF,KAAW,GAD9B,CAAX;;AAGA,UAAIJ,EAAJ,EAAQ;AACN,eAAOA,EAAE,CAACK,gBAAH,CAAoB/B,GAApB,CAAwBgC,CAAC,IAAIf,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAACK,GAAF,KAAUO,CAA/B,CAA7B,CAAP;AACD,OAFD,MAEO;AACL,cAAM,IAAItC,KAAJ,CACH,6BAA4BoB,GAAG,CAACmB,aAAc,IAAGnB,GAAG,CAACoB,IAAK,WAAUpB,GAAG,CAACQ,EAAG,sBAAqBN,QAAS,IADtG,CAAN;AAGD;AACF;;AACD,WAAOD,IAAI,CAACf,GAAL,CAASmC,OAAO,IAAI;AACzB,YAAMC,IAAI,GAAGnB,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAACc,IAAF,KAAWC,OAAhC,CAAb;;AACA,UAAI,CAACC,IAAL,EAAW;AACT,cAAM,IAAI1C,KAAJ,CACH,6BAA4ByC,OAAQ,SAAQrB,GAAG,CAACmB,aAAc,IAAGnB,GAAG,CAACoB,IAAK,GADvE,CAAN;AAGD;;AACD,aAAOE,IAAP;AACD,KARM,CAAP;AASD,GAzBD,CADqD,CA4BrD;;;AACAxB,EAAAA,oBAAoB,CAACyB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG5B,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASiB,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,aAASE,MAAT,CAAgBC,GAAhB,EAA6BC,SAAS,GAAG,KAAzC,EAAgD;AAC9C,YAAMC,GAAG,GAAGD,SAAS,GAAG,aAAH,GAAmB,SAAxC;;AACA,UAAI,OAAOD,GAAP,KAAe,QAAnB,EAA6B;AAC3B,YAAIC,SAAJ,EAAe;AACb,gBAAM,IAAIlD,KAAJ,CACH,GAAEmD,GAAI,sBAAqBN,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,2CAA0CW,GAAI,aADxG,CAAN;AAGD;;AACD,cAAM,IAAInD,KAAJ,CACH,GAAEmD,GAAI,sBAAqBN,KAAK,CAACN,aAAc,IAC9CM,KAAK,CAACL,IACP,0BACCU,SAAS,GAAG,UAAH,GAAgB,0BAC1B,cAAa,OAAOD,GAAI,EALrB,CAAN;AAOD;;AACD,YAAM;AAAEvC,QAAAA,IAAI,EAAE0C,OAAR;AAAiBtC,QAAAA,IAAjB;AAAuBC,QAAAA;AAAvB,UAAuCP,mBAAmB,CAACyC,GAAD,CAAhE;AACA,YAAMI,OAAiB,GAAGlD,mBAAmB,CAACiD,OAAD,CAA7C;AACA,YAAM7B,UAAU,GAAGJ,iBAAiB,CAAC0B,KAAD,EAAQQ,OAAR,EAAkB,GAAEF,GAAI,IAAGF,GAAI,EAA/B,CAApC;;AACA,UAAIC,SAAJ,EAAe;AACb3B,QAAAA,UAAU,CAACqB,OAAX,CAAmBF,IAAI,IAAI;AACzBA,UAAAA,IAAI,CAAC5B,IAAL,CAAUwC,OAAV,GAAoB,IAApB;AACD,SAFD;AAGD;;AACD,YAAMjB,gBAAgB,GAAGd,UAAU,CAACjB,GAAX,CAAeoB,CAAC,IAAIA,CAAC,CAACK,GAAtB,CAAzB,CAxB8C,CAyB9C;;AACA,YAAMwB,cAAc,GAAG;AACrBC,QAAAA,IAAI,EAAE,YADe;AAErBC,QAAAA,MAAM,EAAE,IAFa;AAGrBC,QAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB9B,QAAAA,EAAE,EAAE+B,IAAI,CAACC,MAAL,EAJiB;AAKrBpB,QAAAA,IAAI,EAAG,QAAOK,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,IAAGW,GAAI,EALlC;AAMrBf,QAAAA,IAAI,EAAEc,SAAS,GAAG,GAAH,GAAS,GANH;AAOrBvB,QAAAA,OAAO,EAAEkB,KAAK,CAACjB,EAPM;AAQrBiC,QAAAA,cAAc,EAAE,IARK;AASrBC,QAAAA,OAAO,EAAE,IATY;AAUrB/C,QAAAA,WAVqB;AAWrBsB,QAAAA,gBAXqB;AAYrB0B,QAAAA,uBAAuB,EAAE,IAZJ;AAarBjD,QAAAA;AAbqB,OAAvB;AAeAI,MAAAA,oBAAoB,CAACe,UAArB,CAAgC+B,IAAhC,CAAqCT,cAArC;AACD;;AACD,QAAIV,KAAK,CAAC/B,IAAN,CAAWmD,UAAf,EAA2B;AACzBjB,MAAAA,MAAM,CAACH,KAAK,CAAC/B,IAAN,CAAWmD,UAAZ,EAAwB,IAAxB,CAAN;AACD;;AACD,QAAIpB,KAAK,CAAC/B,IAAN,CAAWoD,MAAf,EAAuB;AACrB,UAAIC,KAAK,CAACC,OAAN,CAAcvB,KAAK,CAAC/B,IAAN,CAAWoD,MAAzB,CAAJ,EAAsC;AACpCrB,QAAAA,KAAK,CAAC/B,IAAN,CAAWoD,MAAX,CAAkBtB,OAAlB,CAA0BK,GAAG,IAAID,MAAM,CAACC,GAAD,CAAvC;AACD,OAFD,MAEO;AACLD,QAAAA,MAAM,CAACH,KAAK,CAAC/B,IAAN,CAAWoD,MAAZ,CAAN;AACD;AACF;AACF,GA5DD,EA7BqD,CA0FrD;;AACAhD,EAAAA,oBAAoB,CAACyB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG5B,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASiB,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,UAAMuB,OAAO,GAAG,MACdnD,oBAAoB,CAACkB,IAArB,CAA0BF,IAA1B,CAA+BoC,CAAC,IAAIA,CAAC,CAAC1C,EAAF,KAASiB,KAAK,CAAC0B,MAAnD,CADF;;AAEA,UAAMC,UAAU,GAAG3B,KAAK,CAAC/B,IAAN,CAAW0D,UAAX,IAAyBH,OAAO,GAAGvD,IAAV,CAAe0D,UAA3D;;AACA,QAAIA,UAAJ,EAAgB;AACd,YAAMC,WAAW,GACf,OAAOD,UAAP,KAAsB,QAAtB,GAAiC,CAACA,UAAD,CAAjC,GAAgDA,UADlD;;AAEA,UAAI,CAACL,KAAK,CAACC,OAAN,CAAcK,WAAd,CAAL,EAAiC;AAC/B,cAAM,IAAIzE,KAAJ,CACH,mDAAkD6C,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GADjF,CAAN;AAGD;;AACDiC,MAAAA,WAAW,CAAC7B,OAAZ,CAAoB,CAAC8B,SAAD,EAAYC,KAAZ,KAAsB;AACxC,YAAI,OAAOD,SAAP,KAAqB,QAAzB,EAAmC;AACjC,gBAAM,IAAI1E,KAAJ,CACH,6BAA4B2E,KAAM,SAAQ9B,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GADzE,CAAN;AAGD;;AACD,cAAM;AACJ9B,UAAAA,IAAI,EAAEkE,MADF;AAEJ9D,UAAAA,IAFI;AAGJC,UAAAA;AAHI,YAIFP,mBAAmB,CAACkE,SAAD,CAJvB;AAKA,cAAMG,OAAO,GAAGD,MAAM,CAACE,KAAP,CACd,0EADc,CAAhB;;AAGA,YAAI,CAACD,OAAL,EAAc;AACZ,gBAAM,IAAI7E,KAAJ,CACH,kCAAiC6C,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,0FAAyFkC,SAAU,GADnK,CAAN;AAGD;;AACD,cAAM,GAEJK,UAFI,EAGJC,gBAHI,EAIJC,YAJI,EAKJC,iBALI,IAMFL,OANJ;AAOA,cAAMM,SAAS,GAAGF,YAAY,GAC1BD,gBAD0B,GAEzB,IAAGnC,KAAK,CAACN,aAAc,GAF5B;AAGA,cAAM6C,QAAQ,GAAGH,YAAY,IAAID,gBAAjC;AACA,cAAM3B,OAAiB,GAAGlD,mBAAmB,CAAC4E,UAAD,CAA7C;AACA,cAAMM,aAAqB,GAAG9E,oBAAoB,CAAC4E,SAAD,CAAlD;AACA,cAAMG,YAAoB,GAAG/E,oBAAoB,CAAC6E,QAAD,CAAjD;AACA,cAAMG,cAA+B,GAAGL,iBAAiB,GACrD/E,mBAAmB,CAAC+E,iBAAD,CADkC,GAErD,IAFJ;AAIA,cAAMM,YAAY,GAAGtE,oBAAoB,CAACyB,KAArB,CAA2BT,IAA3B,CACnBuD,CAAC,IAAIA,CAAC,CAACjD,IAAF,KAAW8C,YAAX,IAA2BG,CAAC,CAAClD,aAAF,KAAoB8C,aADjC,CAArB;;AAGA,YAAI,CAACG,YAAL,EAAmB;AACjB,gBAAM,IAAIxF,KAAJ,CACH,iEAAgEqF,aAAc,MAAKC,YAAa,4FAA2FZ,SAAU,GADlM,CAAN;AAGD;;AACD,cAAMgB,gBAAgB,GAAGxE,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CACvBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAAS4D,YAAY,CAACzC,WADJ,CAAzB;;AAGA,YAAI,CAAC2C,gBAAL,EAAuB;AACrB;AACD;;AAED,cAAMrD,gBAAgB,GAAGlB,iBAAiB,CACxC0B,KADwC,EAExCQ,OAFwC,EAGvC,eAAcqB,SAAU,EAHe,CAAjB,CAIvBpE,GAJuB,CAInBoB,CAAC,IAAIA,CAAC,CAACK,GAJY,CAAzB;AAKA,cAAMgC,uBAAuB,GAAG5C,iBAAiB,CAC/CqE,YAD+C,EAE/CD,cAF+C,EAG9C,eAAcb,SAAU,EAHsB,CAAjB,CAI9BpE,GAJ8B,CAI1BoB,CAAC,IAAIA,CAAC,CAACK,GAJmB,CAAhC,CAzDwC,CA+DxC;;AACA,cAAMwB,cAAc,GAAG;AACrBC,UAAAA,IAAI,EAAE,YADe;AAErBC,UAAAA,MAAM,EAAE,IAFa;AAGrBC,UAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB9B,UAAAA,EAAE,EAAE+B,IAAI,CAACC,MAAL,EAJiB;AAKrBpB,UAAAA,IAAI,EAAG,QAAOK,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,eAAcmC,KAAM,EAL/C;AAMrBvC,UAAAA,IAAI,EAAE,GANe;AAMV;AACXT,UAAAA,OAAO,EAAEkB,KAAK,CAACjB,EAPM;AAQrBiC,UAAAA,cAAc,EAAE2B,YAAY,CAAC5D,EARR;AASrBkC,UAAAA,OAAO,EAAE,IATY;AAUrB/C,UAAAA,WAVqB;AAWrBsB,UAAAA,gBAXqB;AAYrB0B,UAAAA,uBAZqB;AAarBjD,UAAAA;AAbqB,SAAvB;AAeAI,QAAAA,oBAAoB,CAACe,UAArB,CAAgC+B,IAAhC,CAAqCT,cAArC;AACD,OAhFD;AAiFD;AACF,GApGD;AAqGD;;AAED,SAASoC,gBAAT,CACE9C,KADF,EAEE+C,GAFF,EAGEC,WAHF,EAIE;AACA,MAAID,GAAG,CAACjE,OAAJ,KAAgBkB,KAAK,CAACjB,EAA1B,EAA8B;AAC5B,UAAMkE,YAAY,GAAGF,GAAG,CAACxD,IAAJ,KAAa,GAAlC;AACA,UAAM2D,kBAAkB,GAAGH,GAAG,CAACxD,IAAJ,KAAa,GAAxC;;AACA,QAAI0D,YAAY,IAAIC,kBAApB,EAAwC;AACtC,YAAMC,wBAAwB,GAC5BJ,GAAG,CAAC9E,IAAJ,CAASmF,IAAT,KAAkB,IAAlB,IAA0B,OAAOL,GAAG,CAAC9E,IAAJ,CAASmF,IAAhB,KAAyB,QADrD;AAEA,YAAMC,iCAAiC,GAAGN,GAAG,CAACxD,IAAJ,KAAa,GAAb,IAAoByD,WAA9D;;AACA,UAAIG,wBAAwB,IAAIE,iCAAhC,EAAmE;AACjE,cAAMC,mBAAmB,GAAGP,GAAG,CAACvD,gBAAJ,CAAqBtC,MAArB,KAAgC,CAA5D;;AACA,YAAI,CAACoG,mBAAL,EAA0B;AACxB,gBAAM,IAAInG,KAAJ,CACH,eAAc6C,KAAK,CAACN,aAAc,MAAKM,KAAK,CAACL,IAAK,sBAAqBoD,GAAG,CAACpD,IAAK,6DAA4DoD,GAAG,CAACvD,gBAAJ,CAAqBtC,MAAO,GADrK,CAAN;AAGD;;AACD,eAAO,IAAP;AACD;AACF;AACF;;AACD,SAAO,KAAP;AACD;;AAED,SAASqG,UAAT,CAAoBlF,oBAApB,EAA0C;AACxCA,EAAAA,oBAAoB,CAACyB,KAArB,CAA2BrC,GAA3B,CAA+B,MAAMuC,KAAN,IAAe;AAC5C,UAAMgD,WAAW,GACfhD,KAAK,CAAC/B,IAAN,CAAWmF,IAAX,KAAoB,IAApB,IAA4B,OAAOpD,KAAK,CAAC/B,IAAN,CAAWmF,IAAlB,KAA2B,QADzD;;AAGA,QAAIJ,WAAJ,EAAiB;AACf;AACA;AACAhD,MAAAA,KAAK,CAAC/B,IAAN,CAAWuF,IAAX,GAAkB,IAAlB,CAHe,CAIf;;AACAxD,MAAAA,KAAK,CAACyD,YAAN,GAAqB,KAArB,CALe,CAMf;;AACAzD,MAAAA,KAAK,CAAC0D,YAAN,GAAqB,KAArB,CAPe,CAQf;;AACA1D,MAAAA,KAAK,CAAC2D,WAAN,GAAoB,KAApB,CATe,CAUf;;AACA3D,MAAAA,KAAK,CAAC4D,WAAN,GAAoB,KAApB;AACD,KAhB2C,CAkB5C;AACA;;;AACA,UAAMC,eAAe,GAAGxF,oBAAoB,CAACe,UAArB,CAAgCR,MAAhC,CAAuCmE,GAAG,IAChED,gBAAgB,CAAC9C,KAAD,EAAQ+C,GAAR,EAAaC,WAAb,CADM,CAAxB,CApB4C,CAwB5C;;AACA,UAAMc,gBAAgB,GAAGzF,oBAAoB,CAACM,SAArB,CAA+BC,MAA/B,CACvBiB,IAAI,IAAIA,IAAI,CAACf,OAAL,KAAiBkB,KAAK,CAACjB,EADR,CAAzB,CAzB4C,CA6B5C;;AACA,UAAMgF,iBAAiB,GAAGD,gBAAgB,CAACzE,IAAjB,CACxBQ,IAAI,IAAIA,IAAI,CAACF,IAAL,KAAc,aAAd,IAA+BE,IAAI,CAAC5B,IAAL,CAAU+F,eADzB,CAA1B;AAGA,UAAMC,OAAO,GAAGjE,KAAK,CAACkE,iBAAN,IAA2B,EAA3C;AAEAL,IAAAA,eAAe,CAAC9D,OAAhB,CAAwBX,UAAU,IAAI;AACpC,YAAM+E,GAAG,GAAGL,gBAAgB,CAACzE,IAAjB,CACV8E,GAAG,IAAIA,GAAG,CAACjF,GAAJ,KAAYE,UAAU,CAACI,gBAAX,CAA4B,CAA5B,CADT,CAAZ;;AAGA,UAAI,CAAC2E,GAAL,EAAU;AACR;AACA,cAAM,IAAIhH,KAAJ,CACJ,mEADI,CAAN;AAGD;;AACD,YAAMiH,IAAI,GAAGH,OAAO,CAACrF,MAAR,CAAeyF,GAAG,IAAIA,GAAG,CAACF,GAAG,CAACxE,IAAL,CAAH,IAAiB,IAAvC,CAAb;;AACA,UAAIyE,IAAI,CAAClH,MAAL,GAAc,CAAlB,EAAqB;AACnB,cAAM,IAAIC,KAAJ,CACH,eAAc6C,KAAK,CAACN,aAAc,MAAKM,KAAK,CAACL,IAAK,sDAAqDP,UAAU,CAACO,IAAK,oHADpH,CAAN;AAGD,OAfmC,CAiBpC;;;AACA,YAAM2E,eAAe,GACnBlF,UAAU,CAACG,IAAX,KAAoB,GAApB,GAA0B,EAA1B,GAAgC,IAAGH,UAAU,CAACO,IAAK,EADrD;AAEA,YAAM4E,aAAa,GAAG;AACpB5D,QAAAA,IAAI,EAAE,MADc;AAEpBC,QAAAA,MAAM,EAAE,IAFY;AAGpB7B,QAAAA,EAAE,EAAG,aAAYiB,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GAAE2E,eAAgB,OAHjD;AAIpB3E,QAAAA,IAAI,EAAG,IAAGK,KAAK,CAACL,IAAK,GAAE2E,eAAgB,EAJnB;AAKpBpG,QAAAA,WAAW,EAAE,IALO;AAMpBD,QAAAA,IAAI,EAAE,EANc;AAOpBiC,QAAAA,WAAW,EAAEF,KAAK,CAACE,WAPC;AAQpBR,QAAAA,aAAa,EAAEM,KAAK,CAACN,aARD;AASpBH,QAAAA,IAAI,EAAE,GATc;AAUpBiF,QAAAA,QAAQ,EAAE,GAVU;AAWpBC,QAAAA,eAAe,EAAE,IAXG;AAYpBC,QAAAA,eAAe,EAAE,IAZG;AAapBC,QAAAA,UAAU,EAAE,CAAC,CAbO;AAcpBC,QAAAA,SAAS,EAAE,IAdS;AAepB9F,QAAAA,OAAO,EAAE,IAfW;AAgBpB+F,QAAAA,gBAAgB,EAAE,IAhBE;AAiBpBC,QAAAA,kBAAkB,EAAE,IAjBA;AAkBpBC,QAAAA,gBAAgB,EAAE,KAlBE;AAmBpBC,QAAAA,YAAY,EAAE,IAnBM;AAoBpBC,QAAAA,gBAAgB,EAAE,IApBE;AAqBpBC,QAAAA,cAAc,EAAE;AArBI,OAAtB;AAuBA,YAAMC,QAAQ,GAAG;AACfxE,QAAAA,IAAI,EAAE,MADS;AAEfC,QAAAA,MAAM,EAAE,IAFO;AAGf7B,QAAAA,EAAE,EAAG,aAAYiB,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GAAE2E,eAAgB,EAHtD;AAIf3E,QAAAA,IAAI,EAAG,GAAEK,KAAK,CAACL,IAAK,GAAE2E,eAAgB,EAJvB;AAKfpG,QAAAA,WAAW,EAAE8B,KAAK,CAAC9B,WALJ;AAMfD,QAAAA,IAAI,EAAE,EAAE,GAAG+B,KAAK,CAAC/B,IAAX;AAAiB,aAAGmB,UAAU,CAACnB;AAA/B,SANS;AAOfiC,QAAAA,WAAW,EAAEF,KAAK,CAACE,WAPJ;AAQfR,QAAAA,aAAa,EAAEM,KAAK,CAACN,aARN;AASfH,QAAAA,IAAI,EAAE,GATS;AAUfiF,QAAAA,QAAQ,EAAE,GAVK;AAWfC,QAAAA,eAAe,EAAE,IAXF;AAYfC,QAAAA,eAAe,EAAEH,aAAa,CAACxF,EAZhB;AAaf4F,QAAAA,UAAU,EAAE,CAbG;AAaA;AACfC,QAAAA,SAAS,EAAE,KAdI;AAef9F,QAAAA,OAAO,EAAE,IAfM;AAgBf+F,QAAAA,gBAAgB,EAAE,IAhBH;AAiBfC,QAAAA,kBAAkB,EAAE,IAjBL;AAkBfC,QAAAA,gBAAgB,EAAE,KAlBH;AAmBfC,QAAAA,YAAY,EAAEZ,IAAI,CAAC3G,GAAL,CAAS2H,CAAC,IAAIA,CAAC,CAACjB,GAAG,CAACxE,IAAL,CAAf,CAnBC;AAoBfsF,QAAAA,gBAAgB,EAAElB,iBAAiB,GAC/BK,IAAI,CAAC3G,GAAL,CAAS2H,CAAC,IAAIA,CAAC,CAACrB,iBAAiB,CAACpE,IAAnB,CAAf,CAD+B,GAE/B,IAtBW;AAuBf;AACAuF,QAAAA,cAAc,EAAE;AAxBD,OAAjB;AA0BA7G,MAAAA,oBAAoB,CAACkB,IAArB,CAA0B4B,IAA1B,CAA+BgE,QAA/B,EAAyCZ,aAAzC;AACAlG,MAAAA,oBAAoB,CAACgH,QAArB,CAA8BF,QAAQ,CAACpG,EAAvC,IAA6CoG,QAA7C;AACA9G,MAAAA,oBAAoB,CAACgH,QAArB,CAA8Bd,aAAa,CAACxF,EAA5C,IAAkDwF,aAAlD,CAvEoC,CAyEpC;AACA;;AACAlG,MAAAA,oBAAoB,CAACe,UAArB,CAAgCW,OAAhC,CAAwCT,CAAC,IAAI;AAC3C,YACEA,CAAC,CAACC,IAAF,KAAW,GAAX,IACAD,CAAC,CAAC0B,cAAF,KAAqBhB,KAAK,CAACjB,EAD3B,IAEAO,CAAC,CAAC4B,uBAAF,CAA0BhE,MAA1B,KAAqC,CAFrC,IAGAoC,CAAC,CAAC4B,uBAAF,CAA0B,CAA1B,MAAiCiD,GAAG,CAACjF,GAJvC,EAKE;AACA;AACA,gBAAMoG,MAAM,GAAGjH,oBAAoB,CAACM,SAArB,CAA+BU,IAA/B,CACbQ,IAAI,IACFA,IAAI,CAACf,OAAL,KAAiBQ,CAAC,CAACR,OAAnB,IAA8Be,IAAI,CAACX,GAAL,KAAaI,CAAC,CAACE,gBAAF,CAAmB,CAAnB,CAFhC,CAAf;;AAIA,cAAI8F,MAAJ,EAAY;AACV;AACAA,YAAAA,MAAM,CAAC5D,MAAP,GAAgByD,QAAQ,CAACpG,EAAzB;AACD;AACF;AACF,OAjBD;AAkBD,KA7FD;AA8FD,GAjID;AAkID;AAED;;;AACA,MAAMwG,SAAS,GAAGC,KAAK,IAAI;AACzB,MAAIlE,KAAK,CAACC,OAAN,CAAciE,KAAd,CAAJ,EAA0B;AACxB,WAAOA,KAAK,CAAC/H,GAAN,CAAUgI,GAAG,IAAIF,SAAS,CAACE,GAAD,CAA1B,CAAP;AACD,GAFD,MAEO,IAAI,OAAOD,KAAP,KAAiB,QAAjB,IAA6BA,KAAjC,EAAwC;AAC7C,WAAOE,MAAM,CAACC,IAAP,CAAYH,KAAZ,EAAmBI,MAAnB,CAA0B,CAACC,IAAD,EAAOjD,CAAP,KAAa;AAC5CiD,MAAAA,IAAI,CAACjD,CAAD,CAAJ,GAAU2C,SAAS,CAACC,KAAK,CAAC5C,CAAD,CAAN,CAAnB;AACA,aAAOiD,IAAP;AACD,KAHM,EAGJ,EAHI,CAAP;AAID,GALM,MAKA;AACL,WAAOL,KAAP;AACD;AACF,CAXD;;IAa+BM,qB,GAAf,eAAeA,qBAAf,CACdC,OADc,EAEd;AACEC,EAAAA,QADF;AAEEC,EAAAA,SAAS,EAAEC,OAFb;AAGEC,EAAAA,YAHF;AAIEC,EAAAA,wBAAwB,GAAG,CAAChG,GAAD,EAAMiG,EAAN,KAAaA,EAAE,EAJ5C;AAKEC,EAAAA,sBAAsB,GAAG,KAL3B;AAMEC,EAAAA,2BAA2B,GAAG,KANhC;AAOEC,EAAAA,qBAAqB,GAAG,KAP1B;AAQEC,EAAAA,YAAY,GAAG,IARjB;AASEC,EAAAA,6BAA6B,GAAG,KATlC;AAUEC,EAAAA;AAVF,CAFc,EAcd;AACA;AACF;AACA;AACE,iBAAeC,UAAf,GAAmE;AACjE;AACA,QAAI,CAACtF,KAAK,CAACC,OAAN,CAAc2E,OAAd,CAAL,EAA6B;AAC3B,YAAM,IAAI/I,KAAJ,CAAU,wCAAV,CAAN;AACD;;AACD,UAAM0J,QAAQ,GAAI,qDAAoDC,gBAAQ,EAA9E;AACA,UAAMC,0BAA0B,GAAGxB,SAAS,CAC1C,MAAMa,wBAAwB,CAACS,QAAD,EAAW,MACvC,2BAAab,QAAb,EAAuB,MAAMgB,QAAN,IAAkB;AACvC,YAAMC,aAAa,GAAG,MAAMD,QAAQ,CAACE,KAAT,CAC1B,0BAD0B,CAA5B;AAGA,YAAMC,gBAAgB,GAAGC,QAAQ,CAC/BH,aAAa,CAACI,IAAd,CAAmB,CAAnB,EAAsBC,kBADS,EAE/B,EAF+B,CAAjC;AAIA,YAAMC,kBAAkB,GAAG,gDAAuBJ,gBAAvB,EAAyC;AAClEX,QAAAA,qBADkE;AAElEC,QAAAA;AAFkE,OAAzC,CAA3B;AAIA,YAAM;AAAEY,QAAAA;AAAF,UAAW,MAAML,QAAQ,CAACE,KAAT,CAAeK,kBAAf,EAAmC,CACxDrB,OADwD,EAExDK,2BAFwD,CAAnC,CAAvB;AAKA,YAAMiB,MAAM,GAAG;AACbC,QAAAA,WAAW,EAAEN,gBADA;AAEblH,QAAAA,SAAS,EAAE,EAFE;AAGbH,QAAAA,KAAK,EAAE,EAHM;AAIbnB,QAAAA,SAAS,EAAE,EAJE;AAKbY,QAAAA,IAAI,EAAE,EALO;AAMbH,QAAAA,UAAU,EAAE,EANC;AAObsI,QAAAA,SAAS,EAAE,EAPE;AAQbC,QAAAA,SAAS,EAAE,EARE;AASb7F,QAAAA,KAAK,EAAE;AATM,OAAf;;AAWA,WAAK,MAAM;AAAE8F,QAAAA;AAAF,OAAX,IAAyBP,IAAzB,EAA+B;AAC7BG,QAAAA,MAAM,CAACI,MAAM,CAACjH,IAAR,CAAN,CAAoBQ,IAApB,CAAyByG,MAAzB;AACD,OA9BsC,CAgCvC;;;AACA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASE7H,OATF,CASUY,IAAI,IAAI;AAChB6G,QAAAA,MAAM,CAAC7G,IAAD,CAAN,CAAaZ,OAAb,CAAqB6H,MAAM,IAAI;AAC7B;AACAA,UAAAA,MAAM,CAAC3G,OAAP,GAAiB2G,MAAM,CAAC1J,WAAxB;;AACA,cAAIiI,YAAY,IAAIyB,MAAM,CAAC1J,WAA3B,EAAwC;AACtC,kBAAMH,MAAM,GAAG,sBAAU6J,MAAM,CAAC1J,WAAjB,CAAf;AACA0J,YAAAA,MAAM,CAAC3J,IAAP,GAAcF,MAAM,CAACE,IAArB;AACA2J,YAAAA,MAAM,CAAC1J,WAAP,GAAqBH,MAAM,CAACI,IAA5B;AACD,WAJD,MAIO;AACLyJ,YAAAA,MAAM,CAAC3J,IAAP,GAAc,EAAd;AACD;AACF,SAVD;AAWD,OArBD;AAuBA,YAAM4J,8BAA8B,GAAG,sBACrCL,MAAM,CAACG,SAD8B,EAErCG,CAAC,IAAIA,CAAC,CAACC,qBAF8B,CAAvC;AAIAP,MAAAA,MAAM,CAAC1H,KAAP,CAAaC,OAAb,CAAqBC,KAAK,IAAI;AAC5BA,QAAAA,KAAK,CAACgI,6BAAN,GACEH,8BAA8B,CAACI,OAA/B,CAAuCjI,KAAK,CAACjB,EAA7C,KAAoD,CADtD;AAED,OAHD,EA5DuC,CAiEvC;;AACA,YAAMmJ,UAAU,GAAG,MAAnB;AACA,YAAMC,OAAO,GAAG,IAAhB;AACA,YAAMC,OAAO,GAAG,IAAhB;AACA,YAAMC,SAAS,GAAG,MAAlB;AAEA,YAAMC,cAAc,GAAG,CAACJ,UAAD,EAAaC,OAAb,EAAsBC,OAAtB,EAA+BC,SAA/B,CAAvB;AAEA,YAAM5L,OAAO,CAAC8L,GAAR,CACJf,MAAM,CAAC1H,KAAP,CAAarC,GAAb,CAAiB,MAAMuC,KAAN,IAAe;AAC9B,YAAI,CAACkG,OAAO,CAACsC,QAAR,CAAiBxI,KAAK,CAACN,aAAvB,CAAL,EAA4C;AAC1C;AACA;AACD;;AACD,cAAMsD,WAAW,GACfhD,KAAK,CAAC/B,IAAN,CAAWmF,IAAX,KAAoB,IAApB,IAA4B,OAAOpD,KAAK,CAAC/B,IAAN,CAAWmF,IAAlB,KAA2B,QADzD,CAL8B,CAQ9B;AACA;;AACA,cAAMqF,kBAAkB,GAAGjB,MAAM,CAACpI,UAAP,CAAkBsJ,IAAlB,CAAuB3F,GAAG,IACnDD,gBAAgB,CAAC9C,KAAD,EAAQ+C,GAAR,EAAaC,WAAb,CADS,CAA3B;;AAGA,YAAIA,WAAW,IAAIyF,kBAAnB,EAAuC;AACrC;AACA,gBAAM3E,gBAAgB,GAAG0D,MAAM,CAAC7I,SAAP,CACtBC,MADsB,CAErBiB,IAAI,IACFA,IAAI,CAACf,OAAL,KAAiBkB,KAAK,CAACjB,EAAvB,IACAuJ,cAAc,CAACE,QAAf,CAAwB3I,IAAI,CAAC6B,MAA7B,CAJmB,EAMtB1C,IANsB,CAMjB,CAACH,CAAD,EAAI8J,CAAJ,KAAU9J,CAAC,CAACK,GAAF,GAAQyJ,CAAC,CAACzJ,GANH,CAAzB,CAFqC,CAUrC;;AACA,gBAAMgI,KAAK,GAAG0B,KAAK,CAACC,OAAN,CACZD,KAAK,CAACE,QAAS,UAASF,KAAK,CAAC5K,IAAN,CACtB8F,gBAAgB,CAACrG,GAAjB,CAAqB0G,GAAG,IAAIyE,KAAK,CAACG,UAAN,CAAiB5E,GAAG,CAACxE,IAArB,CAA5B,CADsB,EAEtB,IAFsB,CAGtB,SAAQiJ,KAAK,CAACG,UAAN,CAAiB/I,KAAK,CAACN,aAAvB,EAAsCM,KAAK,CAACL,IAA5C,CAAkD,GAJhD,CAAd;AAOA,cAAIsE,OAAJ;;AACA,cAAI;AACF,aAAC;AAAEoD,cAAAA,IAAI,EAAEpD;AAAR,gBAAoB,MAAM+C,QAAQ,CAACE,KAAT,CAAeA,KAAf,CAA3B;AACD,WAFD,CAEE,OAAOY,CAAP,EAAU;AACV,gBAAIkB,IAAI,GAAG,wBAAX;;AACA,gBAAI;AACF,oBAAM;AACJ3B,gBAAAA,IAAI,EAAE,CAAC;AAAE4B,kBAAAA;AAAF,iBAAD;AADF,kBAEF,MAAMjC,QAAQ,CAACE,KAAT,CAAe,cAAf,CAFV;AAGA8B,cAAAA,IAAI,GAAGC,IAAP;AACD,aALD,CAKE,OAAOnB,CAAP,EAAU;AACV;AACpB;AACA;AACA;AACmB;;AACD,kBAAM,IAAI3K,KAAJ,CAAW,iDAAgD6C,KAAK,CAACN,aAAc,MAAKM,KAAK,CAACL,IAAK;AACvH;AACA,2BAA2BK,KAAK,CAACN,aAAc,SAAQsJ,IAAK;AAC5D,qBAAqBhJ,KAAK,CAACN,aAAc,MAAKM,KAAK,CAACL,IAAK,SAAQqJ,IAAK;AACtE;AACA,kBAAkBlB,CAAC,CAACoB,OAAQ;AAC5B,CANwB,CAAN;AAOD;;AAEDlJ,UAAAA,KAAK,CAACkE,iBAAN,GAA0BD,OAA1B;AACD;AACF,OA1DD,CADI,CAAN;AA8DA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASElE,OATF,CASU6C,CAAC,IAAI;AACb4E,QAAAA,MAAM,CAAC5E,CAAD,CAAN,CAAU7C,OAAV,CAAkB2F,MAAM,CAACyD,MAAzB;AACD,OAXD;AAaA,aAAOzD,MAAM,CAACyD,MAAP,CAAc3B,MAAd,CAAP;AACD,KArJD,CAD4B,CADY,CAA5C;AA2JA,UAAM4B,YAAY,GAAGrC,0BAA0B,CAAC9G,SAA3B,CAAqCxC,GAArC,CAAyCgC,CAAC,IAAIA,CAAC,CAACE,IAAhD,CAArB;AACA,UAAM0J,cAAc,GAAGnD,OAAO,CAACtH,MAAR,CAAe0K,CAAC,IAAIF,YAAY,CAACnB,OAAb,CAAqBqB,CAArB,IAA0B,CAA9C,CAAvB;;AACA,QAAID,cAAc,CAACnM,MAAnB,EAA2B;AACzB,YAAMqM,YAAY,GAAI,gCAA+BrD,OAAO,CAAClI,IAAR,CACnD,MADmD,CAEnD,oEAAmEqL,cAAc,CAACrL,IAAf,CACnE,MADmE,CAEnE,GAJF;;AAKA,UAAIsI,sBAAJ,EAA4B;AAC1B,cAAM,IAAInJ,KAAJ,CAAUoM,YAAV,CAAN;AACD,OAFD,MAEO;AACLC,QAAAA,OAAO,CAACC,IAAR,CAAa,mBAAmBF,YAAhC,EADK,CAC0C;AAChD;AACF;;AACD,WAAOxC,0BAAP;AACD;;AAED,WAAS2C,2BAAT,CACEC,UADF,EAEEC,6BAFF,EAGE;AACA,UAAM7C,0BAA0B,GAAGxB,SAAS,CAACoE,UAAD,CAA5C;;AAEA,UAAME,IAAI,GAAG,CAACC,QAAD,EAAWC,OAAX,KACXD,QAAQ,CAAClE,MAAT,CAAgB,CAACC,IAAD,EAAOmE,CAAP,KAAa;AAC3BnE,MAAAA,IAAI,CAACmE,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmBC,CAAnB;AACA,aAAOnE,IAAP;AACD,KAHD,EAGG,EAHH,CADF;;AAKA,UAAMoE,QAAQ,GAAG,CAACH,QAAD,EAAWC,OAAX,EAAoBG,QAApB,KACfJ,QAAQ,CAAClE,MAAT,CAAgB,CAACC,IAAD,EAAOmE,CAAP,KAAa;AAC3B,UAAI,CAACnE,IAAI,CAACmE,CAAC,CAACD,OAAD,CAAF,CAAT,EAAuBlE,IAAI,CAACmE,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmB,EAAnB;AACvBlE,MAAAA,IAAI,CAACmE,CAAC,CAACD,OAAD,CAAF,CAAJ,CAAiBC,CAAC,CAACE,QAAD,CAAlB,IAAgCF,CAAhC;AACA,aAAOnE,IAAP;AACD,KAJD,EAIG,EAJH,CADF;;AAMAkB,IAAAA,0BAA0B,CAACoD,aAA3B,GAA2CN,IAAI,CAC7C9C,0BAA0B,CAAC9G,SADkB,EAE7C,IAF6C,CAA/C;AAIA8G,IAAAA,0BAA0B,CAACqD,SAA3B,GAAuCP,IAAI,CACzC9C,0BAA0B,CAACjH,KADc,EAEzC,IAFyC,CAA3C;AAIAiH,IAAAA,0BAA0B,CAAC1B,QAA3B,GAAsCwE,IAAI,CACxC9C,0BAA0B,CAACxH,IADa,EAExC,IAFwC,CAA1C;AAIAwH,IAAAA,0BAA0B,CAACsD,wBAA3B,GAAsDJ,QAAQ,CAC5DlD,0BAA0B,CAACpI,SADiC,EAE5D,SAF4D,EAG5D,KAH4D,CAA9D;AAKAoI,IAAAA,0BAA0B,CAACuD,aAA3B,GAA2CT,IAAI,CAC7C9C,0BAA0B,CAACY,SADkB,EAE7C,IAF6C,CAA/C;;AAKA,UAAM4C,MAAM,GAAG,CAACC,KAAD,EAAQC,OAAR,EAAiBC,UAAjB,EAA6BC,MAA7B,EAAqCC,SAAS,GAAG,KAAjD,KAA2D;AACxEJ,MAAAA,KAAK,CAACzK,OAAN,CAAc8K,KAAK,IAAI;AACrB,cAAMzK,GAAG,GAAGyK,KAAK,CAACH,UAAD,CAAjB;;AACA,YAAIpJ,KAAK,CAACC,OAAN,CAAcnB,GAAd,CAAJ,EAAwB;AACtByK,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBrK,GAAG,CACjB3C,GADc,CACVqN,QAAQ,IAAI;AACf,kBAAMtD,MAAM,GAAGmD,MAAM,CAACG,QAAD,CAArB;;AACA,gBAAIA,QAAQ,IAAI,CAACtD,MAAjB,EAAyB;AACvB,kBAAIoD,SAAJ,EAAe;AACb;AACD;;AACD,oBAAM,IAAIzN,KAAJ,CACH,sBAAqBsN,OAAQ,SAAQC,UAAW,OAAMI,QAAS,UAASC,IAAI,CAACC,SAAL,CACvEH,KADuE,CAEvE,GAHE,CAAN;AAKD;;AACD,mBAAOrD,MAAP;AACD,WAdc,EAed5I,MAfc,CAePqM,CAAC,IAAIA,CAfE,CAAjB;AAgBD,SAjBD,MAiBO;AACL,gBAAMzD,MAAM,GAAGmD,MAAM,CAACvK,GAAD,CAArB;;AACA,cAAIA,GAAG,IAAI,CAACoH,MAAZ,EAAoB;AAClB,gBAAIoD,SAAJ,EAAe;AACb;AACD;;AACD,kBAAM,IAAIzN,KAAJ,CACH,sBAAqBsN,OAAQ,SAAQC,UAAW,SAAQtK,GAAI,UAAS2K,IAAI,CAACC,SAAL,CACpEH,KADoE,CAEpE,GAHE,CAAN;AAKD;;AACDA,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBjD,MAAjB;AACD;AACF,OAjCD;AAkCD,KAnCD;;AAqCA,UAAM0D,OAAO,GAAG7M,oBAAoB,IAAI;AACtC,OACEuL,6BADF,EAEExL,uBAFF,EAGEmF,UAHF,EAIExD,OAJF,CAIUsG,EAAE,IAAKA,EAAE,GAAGA,EAAE,CAAChI,oBAAD,CAAL,GAA8B,IAJjD;AAKD,KAND;;AAOA6M,IAAAA,OAAO,CAACnE,0BAAD,CAAP;AAEAwD,IAAAA,MAAM,CACJxD,0BAA0B,CAACjH,KADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJiH,0BAA0B,CAACoD,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxD,0BAA0B,CAACjH,KADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJiH,0BAA0B,CAAC1B,QAJvB,CAAN;AAOAkF,IAAAA,MAAM,CACJxD,0BAA0B,CAACpI,SADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJoI,0BAA0B,CAACqD,SAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACpI,SADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJoI,0BAA0B,CAAC1B,QAJvB,CAAN;AAOAkF,IAAAA,MAAM,CACJxD,0BAA0B,CAACW,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJX,0BAA0B,CAACoD,aAJvB,CAAN;AAOAI,IAAAA,MAAM,CACJxD,0BAA0B,CAACxH,IADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJwH,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACxH,IADvB,EAEJ,gBAFI,EAGJ,kBAHI,EAIJwH,0BAA0B,CAAC1B,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAkF,IAAAA,MAAM,CACJxD,0BAA0B,CAACxH,IADvB,EAEJ,eAFI,EAGJ,iBAHI,EAIJwH,0BAA0B,CAAC1B,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAkF,IAAAA,MAAM,CACJxD,0BAA0B,CAAC3H,UADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJ2H,0BAA0B,CAACqD,SAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxD,0BAA0B,CAAC3H,UADvB,EAEJ,cAFI,EAGJ,gBAHI,EAIJ2H,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACY,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJZ,0BAA0B,CAACoD,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxD,0BAA0B,CAACY,SADvB,EAEJ,sBAFI,EAGJ,uBAHI,EAIJZ,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACjF,KADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJiF,0BAA0B,CAACqD,SAJvB,CAAN,CA7KA,CAoLA;;AACArD,IAAAA,0BAA0B,CAACxH,IAA3B,CAAgCQ,OAAhC,CAAwCR,IAAI,IAAI;AAC9C,UAAIA,IAAI,CAAC4L,aAAT,EAAwB;AACtB5L,QAAAA,IAAI,CAAC4L,aAAL,CAAmBC,SAAnB,GAA+B7L,IAA/B;AACD;AACF,KAJD,EArLA,CA2LA;;AACAwH,IAAAA,0BAA0B,CAACjH,KAA3B,CAAiCC,OAAjC,CAAyCC,KAAK,IAAI;AAChDA,MAAAA,KAAK,CAACtB,UAAN,GAAmBqI,0BAA0B,CAACpI,SAA3B,CAAqCC,MAArC,CACjBiB,IAAI,IAAIA,IAAI,CAACf,OAAL,KAAiBkB,KAAK,CAACjB,EADd,CAAnB;AAGAiB,MAAAA,KAAK,CAACqL,cAAN,GAAuB,CAACrL,KAAK,CAACtB,UAAN,CAAiBgK,IAAjB,CACtB7I,IAAI,IAAIA,IAAI,CAACyL,sBADS,CAAxB;AAGAtL,MAAAA,KAAK,CAACuL,WAAN,GAAoBxE,0BAA0B,CAAC3H,UAA3B,CAAsCR,MAAtC,CAClBQ,UAAU,IAAIA,UAAU,CAACN,OAAX,KAAuBkB,KAAK,CAACjB,EADzB,CAApB;AAGAiB,MAAAA,KAAK,CAACwL,kBAAN,GAA2BzE,0BAA0B,CAAC3H,UAA3B,CAAsCR,MAAtC,CACzBQ,UAAU,IAAIA,UAAU,CAAC4B,cAAX,KAA8BhB,KAAK,CAACjB,EADzB,CAA3B;AAGAiB,MAAAA,KAAK,CAACyL,oBAAN,GAA6BzL,KAAK,CAACuL,WAAN,CAAkBlM,IAAlB,CAC3BD,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GADP,CAA7B;AAGD,KAhBD,EA5LA,CA8MA;;AACAwH,IAAAA,0BAA0B,CAAC3H,UAA3B,CAAsCW,OAAtC,CAA8CX,UAAU,IAAI;AAC1D,UAAIA,UAAU,CAACI,gBAAX,IAA+BJ,UAAU,CAACU,KAA9C,EAAqD;AACnDV,QAAAA,UAAU,CAACsM,aAAX,GAA2BtM,UAAU,CAACI,gBAAX,CAA4B/B,GAA5B,CAAgCkO,EAAE,IAC3DvM,UAAU,CAACU,KAAX,CAAiBpB,UAAjB,CAA4BW,IAA5B,CAAiCQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAayM,EAAtD,CADyB,CAA3B;AAGD,OAJD,MAIO;AACLvM,QAAAA,UAAU,CAACsM,aAAX,GAA2B,EAA3B;AACD;;AACD,UAAItM,UAAU,CAAC8B,uBAAX,IAAsC9B,UAAU,CAACwM,YAArD,EAAmE;AACjExM,QAAAA,UAAU,CAACyM,oBAAX,GACEzM,UAAU,CAAC8B,uBAAX,CAAmCzD,GAAnC,CAAuCkO,EAAE,IACvCvM,UAAU,CAACwM,YAAX,CAAwBlN,UAAxB,CAAmCW,IAAnC,CAAwCQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAayM,EAA7D,CADF,CADF;AAID,OALD,MAKO;AACLvM,QAAAA,UAAU,CAACyM,oBAAX,GAAkC,EAAlC;AACD;AACF,KAhBD,EA/MA,CAiOA;;AACA9E,IAAAA,0BAA0B,CAACjF,KAA3B,CAAiC/B,OAAjC,CAAyC+B,KAAK,IAAI;AAChD,YAAMtB,OAAO,GAAGsB,KAAK,CAACgK,aAAN,CAAoBrO,GAApB,CAAwBkO,EAAE,IACxC7J,KAAK,CAAChC,KAAN,CAAYpB,UAAZ,CAAuBW,IAAvB,CAA4BQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAayM,EAAjD,CADc,CAAhB,CADgD,CAKhD;;AACA,UAAInL,OAAO,CAAC,CAAD,CAAX,EAAgB;AACdA,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAWK,SAAX,GAAuB,IAAvB;AACD;;AAED,UAAIL,OAAO,CAAC,CAAD,CAAP,IAAcA,OAAO,CAACtD,MAAR,KAAmB,CAAjC,IAAsC4E,KAAK,CAACiK,QAAhD,EAA0D;AACxDvL,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAWuL,QAAX,GAAsB,IAAtB;AACD,OAZ+C,CAchD;;;AACAjK,MAAAA,KAAK,CAAChC,KAAN,CAAYyL,WAAZ,CACG3M,MADH,CACUQ,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GAD5C,EAEGQ,OAFH,CAEWX,UAAU,IAAI;AACrB,YACEA,UAAU,CAACI,gBAAX,CAA4BwM,KAA5B,CACE,CAACL,EAAD,EAAKM,GAAL,KAAanK,KAAK,CAACgK,aAAN,CAAoBG,GAApB,MAA6BN,EAD5C,CADF,EAIE;AACAvM,UAAAA,UAAU,CAACyB,SAAX,GAAuB,IAAvB;AACD;AACF,OAVH;AAWD,KA1BD;AA4BA,WAAOkG,0BAAP;AACD;;AAED,MAAImF,6BAA6B,GAAG,MAAMtF,UAAU,EAApD;AAEA,MAAIuF,QAAJ;;AAEA,QAAMC,QAAN,CAAe;AAMbC,IAAAA,WAAW,CAACC,cAAD,EAAiB;AAC1B,WAAKC,OAAL,GAAe,KAAf;AACA,WAAKC,aAAL,GAAqB,uBACnB,YAAY;AACVrQ,QAAAA,KAAK,CAAE,iDAAF,CAAL;;AACA,YAAI;AACF+P,UAAAA,6BAA6B,GAAG,MAAMtF,UAAU,EAAhD;AACAzK,UAAAA,KAAK,CAAE,uDAAF,CAAL;AACAmQ,UAAAA,cAAc;AACf,SAJD,CAIE,OAAOxE,CAAP,EAAU;AACV;AACA0B,UAAAA,OAAO,CAACiD,KAAR,CAAe,gCAA+B3E,CAAC,CAACoB,OAAQ,EAAxD;AACD;AACF,OAXkB,EAYnB,GAZmB,EAanB;AACEwD,QAAAA,OAAO,EAAE,IADX;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OAbmB,CAArB;AAkBA,WAAKC,SAAL,GAAiB,KAAKA,SAAL,CAAeC,IAAf,CAAoB,IAApB,CAAjB;AACA,WAAKC,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA1B;;AACA,WAAKE,MAAL;AACD;;AAEW,UAANA,MAAM,CAACC,WAAW,GAAG,KAAf,EAAsB;AAChC,UAAI,KAAKT,OAAT,EAAkB;AAChB;AACD,OAH+B,CAIhC;;;AACA,UAAI;AACF,cAAM;AAAEvF,UAAAA,QAAF;AAAYiG,UAAAA;AAAZ,YACJ,MAAM,oDAAiCjH,QAAjC,CADR;AAEA,aAAKkH,MAAL,GAAclG,QAAd,CAHE,CAIF;;AACA,aAAKmG,oBAAL,GAA4BF,eAA5B;AACAjG,QAAAA,QAAQ,CAACoG,EAAT,CAAY,cAAZ,EAA4B,KAAKR,SAAjC;AACA5F,QAAAA,QAAQ,CAACoG,EAAT,CAAY,OAAZ,EAAqB,KAAKN,kBAA1B;;AACA,YAAI,KAAKP,OAAT,EAAkB;AAChB;AACA,iBAAO,KAAKc,cAAL,EAAP;AACD,SAHD,MAGO;AACL,gBAAMrG,QAAQ,CAACE,KAAT,CAAe,2BAAf,CAAN,CADK,CAGL;;AACA,cAAI,CAACR,6BAAL,EAAoC;AAClC,kBAAM4G,aAAa,GAAG,MAAMhR,QAAQ,CAACF,mBAAD,EAAsB,MAAtB,CAApC;AACA,kBAAMmR,GAAG,GAAI,UAASD,aAAc,GAApC;AACA,kBAAM,2BACJ3G,uBAAuB,IAAIX,QADvB,EAEJ,MAAMgB,QAAN,IAAkB;AAChB,kBAAI;AACF,sBAAMA,QAAQ,CAACE,KAAT,CAAeqG,GAAf,CAAN;AACD,eAFD,CAEE,OAAOd,KAAP,EAAc;AACd,oBAAI,CAAC,KAAKe,mBAAV,EAA+B;AAC7B,uBAAKA,mBAAL,GAA2B,IAA3B;AACA;;AACAhE,kBAAAA,OAAO,CAACC,IAAR,CACG,GAAEgE,eAAMC,IAAN,CAAWC,MAAX,CACD,qDADC,CAED,OAHJ;AAKAnE,kBAAAA,OAAO,CAACC,IAAR,CACEgE,eAAME,MAAN,CACE,iSADF,CADF;AAKAnE,kBAAAA,OAAO,CAACC,IAAR,CACEgE,eAAME,MAAN,CACE,mDADF,CADF;AAKA;AACD;;AACDxR,gBAAAA,KAAK,CAACsQ,KAAD,CAAL;AACD,eAxBD,SAwBU;AACR,sBAAMzF,QAAQ,CAACE,KAAT,CAAe,SAAf,CAAN;AACD;AACF,aA9BG,CAAN;AAgCD,WAvCI,CAyCL;;;AACA,cAAI8F,WAAJ,EAAiB;AACf,iBAAKR,aAAL;AACD;AACF;AACF,OAzDD,CAyDE,OAAO1E,CAAP,EAAU;AACV;AACA,aAAK8F,UAAL,CAAgB9F,CAAhB;AACD;AACF;;AAGDgF,IAAAA,kBAAkB,CAAChF,CAAD,EAAI;AACpB,WAAKuF,cAAL,CAAoB,KAApB;;AACA,WAAKO,UAAL,CAAgB9F,CAAhB;AACD;;AACe,UAAV8F,UAAU,CAAC9F,CAAD,EAAI;AAClB,UAAI,KAAKyE,OAAT,EAAkB;AAChB;AACD,OAHiB,CAIlB;;;AACA/C,MAAAA,OAAO,CAACiD,KAAR,CACE,mEADF,EAEE3E,CAAC,CAACoB,OAFJ;AAIA,YAAM,KAAKmE,cAAL,EAAN;AACAQ,MAAAA,UAAU,CAAC,MAAM;AACf,YAAI,CAAC,KAAKtB,OAAV,EAAmB;AACjB;AACA,eAAKQ,MAAL,CAAY,IAAZ;AACD;AACF,OALS,EAKP,IALO,CAAV;AAMD,KAxHY,CA0Hb;;;AAEA;AACe,UAATH,SAAS,CAACkB,YAAD,EAAoB;AACjC,UAAIA,YAAY,CAACC,OAAb,KAAyB,oBAA7B,EAAmD;AACjD;AACD;;AACD,UAAI;AACF,cAAMC,OAAO,GAAGjD,IAAI,CAACkD,KAAL,CAAWH,YAAY,CAACE,OAAxB,CAAhB;AACAA,QAAAA,OAAO,CAACA,OAAR,GAAkBA,OAAO,CAACA,OAAR,IAAmB,EAArC;;AACA,YAAIA,OAAO,CAACzO,IAAR,KAAiB,KAArB,EAA4B;AAC1B,gBAAM2O,QAAQ,GAAGF,OAAO,CAACA,OAAR,CACdpP,MADc,CAEb,CAAC;AAAEuP,YAAAA;AAAF,WAAD,KAAgBA,MAAM,IAAI,IAAV,IAAkBjI,OAAO,CAAC+B,OAAR,CAAgBkG,MAAhB,KAA2B,CAFhD,EAId1Q,GAJc,CAIV,CAAC;AAAE2Q,YAAAA;AAAF,WAAD,KAAiBA,OAJP,CAAjB;;AAKA,cAAIF,QAAQ,CAAChR,MAAb,EAAqB;AACnB,iBAAKsP,aAAL;AACD;AACF,SATD,MASO,IAAIwB,OAAO,CAACzO,IAAR,KAAiB,MAArB,EAA6B;AAClC,gBAAM8O,iBAAiB,GAAGL,OAAO,CAACA,OAAR,CAAgBtF,IAAhB,CACxB4F,UAAU,IAAIpI,OAAO,CAAC+B,OAAR,CAAgBqG,UAAhB,KAA+B,CADrB,CAA1B;;AAGA,cAAID,iBAAJ,EAAuB;AACrB,iBAAK7B,aAAL;AACD;AACF,SAPM,MAOA,IAAIwB,OAAO,CAACzO,IAAR,KAAiB,QAArB,EAA+B;AACpC,eAAKiN,aAAL;AACD,SAFM,MAEA;AACL,gBAAM,IAAIrP,KAAJ,CAAW,iBAAgB6Q,OAAO,CAACzO,IAAK,kBAAxC,CAAN;AACD;AACF,OAxBD,CAwBE,OAAOuI,CAAP,EAAU;AACV3L,QAAAA,KAAK,CAAE,gDAA+C2L,CAAE,EAAnD,CAAL;AACD;AACF;;AAES,UAAJyG,IAAI,GAAG;AACX,WAAKhC,OAAL,GAAe,IAAf;;AACA,WAAKC,aAAL,CAAmBgC,MAAnB;;AACA,YAAM,KAAKnB,cAAL,EAAN;AACD;AAED;AACJ;AACA;AACA;;;AACwB,UAAdA,cAAc,CAACoB,mBAAmB,GAAG,IAAvB,EAA6B;AAC/C;AACA,YAAMzH,QAAQ,GAAG,KAAKkG,MAAtB;AACA,YAAMwB,mBAAmB,GAAG,KAAKvB,oBAAjC;AACA,WAAKD,MAAL,GAAc,IAAd;AACA,WAAKC,oBAAL,GAA4B,IAA5B;;AACA,UAAInG,QAAJ,EAAc;AACZ;AACA,YAAIyH,mBAAJ,EAAyB;AACvBzH,UAAAA,QAAQ,CAACE,KAAT,CAAe,6BAAf,EAA8CyH,KAA9C,CAAoD7G,CAAC,IAAI;AACvD3L,YAAAA,KAAK,CAAE,4CAA2C2L,CAAE,EAA/C,CAAL;AACD,WAFD;AAGD;;AACDd,QAAAA,QAAQ,CAAC4H,cAAT,CAAwB,cAAxB,EAAwC,KAAKhC,SAA7C;AACA5F,QAAAA,QAAQ,CAAC4H,cAAT,CAAwB,OAAxB,EAAiC,KAAK9B,kBAAtC;AACD;;AACD,UAAI4B,mBAAJ,EAAyB;AACvB,cAAMA,mBAAmB,EAAzB;AACD;AACF;;AA3LY;;AA8Lf3I,EAAAA,OAAO,CAAC8I,eAAR,CACE,MAAMvC,cAAN,IAAwB;AACtB;AACA,QAAIH,QAAJ,EAAc;AACZ,YAAMA,QAAQ,CAACoC,IAAT,EAAN;AACD,KAJqB,CAKtB;AACA;;;AACApC,IAAAA,QAAQ,GAAG,IAAIC,QAAJ,CAAaE,cAAb,CAAX;AACD,GATH,EAUE,YAAY;AACV,UAAMwC,CAAC,GAAG3C,QAAV;AACAA,IAAAA,QAAQ,GAAG,IAAX;;AACA,QAAI2C,CAAJ,EAAO;AACL,YAAMA,CAAC,CAACP,IAAF,EAAN;AACD;AACF,GAhBH;AAmBAxI,EAAAA,OAAO,CAACgJ,IAAR,CACE,OADF,EAEEC,KAAK,IAAI;AACP,UAAMjI,0BAA0B,GAAG2C,2BAA2B,CAC5DwC,6BAD4D,EAE5D8C,KAAK,CAACpF,6BAFsD,CAA9D;;AAIA,QAAI7C,0BAA0B,CAACU,WAA3B,GAAyC,KAA7C,EAAoD;AAClD;AACA;AACA;AACAuH,MAAAA,KAAK,CAACC,sBAAN,GAA+B,0CAA4B;AACzDC,QAAAA,aAAa,EAAE;AAD0C,OAA5B,CAA/B;AAGD;;AACD,WAAOF,KAAK,CAACG,MAAN,CAAaH,KAAb,EAAoB;AACzBI,MAAAA,4BAA4B,EAAErI;AADL,KAApB,CAAP;AAGD,GAlBH,EAmBE,CAAC,iBAAD,CAnBF,EAoBE,EApBF,EAqBE,CAAC,UAAD,CArBF;AAuBD,C,EAED;;;;AACO,MAAMsI,YAAY,GAAG;AAC1BC,EAAAA,SAAS,EAAE,WADe;AAE1BC,EAAAA,SAAS,EAAE,WAFe;AAG1BC,EAAAA,KAAK,EAAE,OAHmB;AAI1BC,EAAAA,IAAI,EAAE,MAJoB;AAK1BC,EAAAA,SAAS,EAAE,WALe;AAM1BC,EAAAA,UAAU,EAAE,YANc;AAO1BC,EAAAA,SAAS,EAAE,WAPe;AAQ1BC,EAAAA,KAAK,EAAE;AARmB,CAArB","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n\n // eslint-disable-next-line flowtype/no-weak-types\n _internalEnumData?: any[], // This is Graphile internal, do not use this.\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n isFake: ?boolean,\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.slice(1, -1);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const {\n spec: fkSpec,\n tags,\n description,\n } = parseConstraintSpec(fkSpecRaw);\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nfunction isEnumConstraint(\n klass: PgClass,\n con: PgConstraint,\n isEnumTable: boolean\n) {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true || typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint = con.type === \"p\" && isEnumTable;\n if (isExplicitEnumConstraint || isPrimaryKeyOfEnumTableConstraint) {\n const hasExactlyOneColumn = con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n}\n\nfunction enumTables(introspectionResults) {\n introspectionResults.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n // By this point, even views should have \"fake\" constraints we can use\n // (e.g. `@primaryKey`)\n const enumConstraints = introspectionResults.constraint.filter(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n\n // Get all the columns\n const enumTableColumns = introspectionResults.attribute.filter(\n attr => attr.classId === klass.id\n );\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr => attr.name === \"description\" || attr.tags.enumDescription\n );\n const allData = klass._internalEnumData || [];\n\n enumConstraints.forEach(constraint => {\n const col = enumTableColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no visible entries for enum constraint '${constraint.name}'. Check that the table contains at least one row and that the rows are not hidden by row-level security policies.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}_list`,\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}`,\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n introspectionResults.type.push(enumType, enumTypeArray);\n introspectionResults.typeById[enumType.id] = enumType;\n introspectionResults.typeById[enumTypeArray.id] = enumTypeArray;\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n introspectionResults.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = introspectionResults.attribute.find(\n attr =>\n attr.classId === c.classId && attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n const VALID_TYPE_IDS = [VARCHAR_ID, TEXT_ID, CHAR_ID, BPCHAR_ID];\n\n await Promise.all(\n result.class.map(async klass => {\n if (!schemas.includes(klass.namespaceName)) {\n // Only support enums in public tables/views\n return;\n }\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n // NOTE: this only matches on tables (not views, since they don't\n // have constraints), which is why we repeat the isEnumTable check below.\n const hasEnumConstraints = result.constraint.some(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n if (isEnumTable || hasEnumConstraints) {\n // Get the list of columns enums are defined for\n const enumTableColumns = result.attribute\n .filter(\n attr =>\n attr.classId === klass.id &&\n VALID_TYPE_IDS.includes(attr.typeId)\n )\n .sort((a, z) => a.num - z.num);\n\n // Load data from the table/view.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumTableColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )} from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /*\n * Ignore; this is likely a 25P02 (transaction aborted)\n * error caused by the statement above failing.\n */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n klass._internalEnumData = allData;\n }\n })\n );\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' (= '${key}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [\n pgAugmentIntrospectionResults,\n smartCommentConstraints,\n enumTables,\n ].forEach(fn => (fn ? fn(introspectionResults) : null));\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes =\n constraint.foreignKeyAttributeNums.map(nr =>\n constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const { pgClient, releasePgClient } =\n await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n this._releaseClient(false);\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n this._handleChange.cancel();\n await this._releaseClient();\n }\n\n /**\n * Only pass `false` to this function if you know the client is going to be\n * terminated; otherwise we risk leaving listeners running.\n */\n async _releaseClient(clientIsStillViable = true) {\n // $FlowFixMe\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n // Don't attempt to run a query after a client has errored.\n if (clientIsStillViable) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n }\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n }\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","fakeEnumIdentifier","namespaceName","name","identifierExtra","list","baseEnumIdentifier","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","slice","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","isEnumConstraint","con","isEnumTable","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","enum","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTables","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","enumTableColumns","descriptionColumn","enumDescription","allData","_internalEnumData","col","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","typeById","fkattr","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","pgUsePartitionedParent","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","VALID_TYPE_IDS","all","includes","hasEnumConstraints","some","z","pgSql","compile","fragment","identifier","role","user","message","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","clientIsStillViable","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","getPgFakeEnumIdentifier","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":";;;;;;;AAGA;;AAGA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;AAEA,MAAMA,KAAK,GAAG,oBAAa,mBAAb,CAAd;AACA,MAAMC,mBAAmB,GAAI,GAAEC,SAAU,+BAAzC,C,CAEA;;AA8LA,MAAMC,kBAAkB,GAAG,CACzBC,aADyB,EAEzBC,IAFyB,EAGzBC,eAAe,GAAG,EAHO,EAIzBC,IAAI,GAAG,KAJkB,KAKtB;AACH,QAAMC,kBAAkB,GAAI,aAAYJ,aAAc,IAAGC,IAAK,GAAEC,eAAgB,EAAhF;;AACA,MAAIC,IAAJ,EAAU;AACR,WAAQ,GAAEC,kBAAmB,OAA7B;AACD,GAFD,MAEO;AACL,WAAOA,kBAAP;AACD;AACF,CAZD;;AAiCA,SAASC,QAAT,CAAkBC,QAAlB,EAA4BC,QAA5B,EAAsC;AACpC,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,sBAAYJ,QAAZ,EAAsBC,QAAtB,EAAgC,CAACI,GAAD,EAAMC,GAAN,KAAc;AAC5C,UAAID,GAAJ,EAASD,MAAM,CAACC,GAAD,CAAN,CAAT,KACKF,OAAO,CAACG,GAAD,CAAP;AACN,KAHD;AAID,GALM,CAAP;AAMD;;AAED,MAAMC,YAAY,GAAGC,GAAG,IAAI;AAC1B,QAAMC,OAAO,GAAGD,GAAG,CAACE,IAAJ,EAAhB;;AACA,MAAID,OAAO,CAAC,CAAD,CAAP,KAAe,GAAnB,EAAwB;AACtB,QAAIA,OAAO,CAACA,OAAO,CAACE,MAAR,GAAiB,CAAlB,CAAP,KAAgC,GAApC,EAAyC;AACvC,YAAM,IAAIC,KAAJ,CACH,2CAA0CJ,GAAI,yGAD3C,CAAN;AAGD;;AACD,WAAOC,OAAO,CAACI,KAAR,CAAc,CAAd,EAAiB,CAAC,CAAlB,CAAP;AACD,GAPD,MAOO;AACL;AACA,WAAOJ,OAAO,CAACK,WAAR,EAAP;AACD;AACF,CAbD;;AAeA,MAAMC,mBAAmB,GAAGP,GAAG,IAAI;AACjC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,QAAMQ,KAAK,GAAGR,GAAG,CAACS,KAAJ,CAAU,GAAV,CAAd;AACA,SAAOD,KAAK,CAACE,GAAN,CAAUX,YAAV,CAAP;AACD,CAND;;AAQA,MAAMY,oBAAoB,GAAGX,GAAG,IAAI;AAClC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,SAAOD,YAAY,CAACC,GAAD,CAAnB;AACD,CALD;;AAOA,SAASY,mBAAT,CAA6BC,OAA7B,EAAsC;AACpC,QAAM,CAACC,IAAD,EAAO,GAAGC,aAAV,IAA2BF,OAAO,CAACJ,KAAR,CAAc,IAAd,CAAjC;AACA,QAAMO,MAAM,GAAG,sBAAUD,aAAa,CAACE,IAAd,CAAmB,IAAnB,CAAV,CAAf;AACA,SAAO;AACLH,IAAAA,IADK;AAELI,IAAAA,IAAI,EAAEF,MAAM,CAACE,IAFR;AAGLC,IAAAA,WAAW,EAAEH,MAAM,CAACI;AAHf,GAAP;AAKD;;AAED,SAASC,uBAAT,CAAiCC,oBAAjC,EAAuD;AACrD,QAAMC,iBAAiB,GAAG,CAACC,GAAD,EAAMC,IAAN,EAAYC,QAAZ,KAAyB;AACjD,UAAMC,UAAU,GAAGL,oBAAoB,CAACM,SAArB,CAChBC,MADgB,CACTC,CAAC,IAAIA,CAAC,CAACC,OAAF,KAAcP,GAAG,CAACQ,EADd,EAEhBC,IAFgB,CAEX,CAACH,CAAD,EAAII,CAAJ,KAAUJ,CAAC,CAACK,GAAF,GAAQD,CAAC,CAACC,GAFT,CAAnB;;AAGA,QAAI,CAACV,IAAL,EAAW;AACT,YAAMW,EAAE,GAAGd,oBAAoB,CAACe,UAArB,CAAgCC,IAAhC,CACTC,CAAC,IAAIA,CAAC,CAACR,OAAF,IAAaP,GAAG,CAACQ,EAAjB,IAAuBO,CAAC,CAACC,IAAF,KAAW,GAD9B,CAAX;;AAGA,UAAIJ,EAAJ,EAAQ;AACN,eAAOA,EAAE,CAACK,gBAAH,CAAoB/B,GAApB,CAAwBgC,CAAC,IAAIf,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAACK,GAAF,KAAUO,CAA/B,CAA7B,CAAP;AACD,OAFD,MAEO;AACL,cAAM,IAAItC,KAAJ,CACH,6BAA4BoB,GAAG,CAACtC,aAAc,IAAGsC,GAAG,CAACrC,IAAK,WAAUqC,GAAG,CAACQ,EAAG,sBAAqBN,QAAS,IADtG,CAAN;AAGD;AACF;;AACD,WAAOD,IAAI,CAACf,GAAL,CAASiC,OAAO,IAAI;AACzB,YAAMC,IAAI,GAAGjB,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAAC3C,IAAF,KAAWwD,OAAhC,CAAb;;AACA,UAAI,CAACC,IAAL,EAAW;AACT,cAAM,IAAIxC,KAAJ,CACH,6BAA4BuC,OAAQ,SAAQnB,GAAG,CAACtC,aAAc,IAAGsC,GAAG,CAACrC,IAAK,GADvE,CAAN;AAGD;;AACD,aAAOyD,IAAP;AACD,KARM,CAAP;AASD,GAzBD,CADqD,CA4BrD;;;AACAtB,EAAAA,oBAAoB,CAACuB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG1B,oBAAoB,CAAC0B,SAArB,CAA+BV,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASe,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,aAASE,MAAT,CAAgBC,GAAhB,EAA6BC,SAAS,GAAG,KAAzC,EAAgD;AAC9C,YAAMC,GAAG,GAAGD,SAAS,GAAG,aAAH,GAAmB,SAAxC;;AACA,UAAI,OAAOD,GAAP,KAAe,QAAnB,EAA6B;AAC3B,YAAIC,SAAJ,EAAe;AACb,gBAAM,IAAIhD,KAAJ,CACH,GAAEiD,GAAI,sBAAqBN,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,2CAA0CkE,GAAI,aADxG,CAAN;AAGD;;AACD,cAAM,IAAIjD,KAAJ,CACH,GAAEiD,GAAI,sBAAqBN,KAAK,CAAC7D,aAAc,IAC9C6D,KAAK,CAAC5D,IACP,0BACCiE,SAAS,GAAG,UAAH,GAAgB,0BAC1B,cAAa,OAAOD,GAAI,EALrB,CAAN;AAOD;;AACD,YAAM;AAAErC,QAAAA,IAAI,EAAEwC,OAAR;AAAiBpC,QAAAA,IAAjB;AAAuBC,QAAAA;AAAvB,UAAuCP,mBAAmB,CAACuC,GAAD,CAAhE;AACA,YAAMI,OAAiB,GAAGhD,mBAAmB,CAAC+C,OAAD,CAA7C;AACA,YAAM3B,UAAU,GAAGJ,iBAAiB,CAACwB,KAAD,EAAQQ,OAAR,EAAkB,GAAEF,GAAI,IAAGF,GAAI,EAA/B,CAApC;;AACA,UAAIC,SAAJ,EAAe;AACbzB,QAAAA,UAAU,CAACmB,OAAX,CAAmBF,IAAI,IAAI;AACzBA,UAAAA,IAAI,CAAC1B,IAAL,CAAUsC,OAAV,GAAoB,IAApB;AACD,SAFD;AAGD;;AACD,YAAMf,gBAAgB,GAAGd,UAAU,CAACjB,GAAX,CAAeoB,CAAC,IAAIA,CAAC,CAACK,GAAtB,CAAzB,CAxB8C,CAyB9C;;AACA,YAAMsB,cAAc,GAAG;AACrBC,QAAAA,IAAI,EAAE,YADe;AAErBC,QAAAA,MAAM,EAAE,IAFa;AAGrBC,QAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB5B,QAAAA,EAAE,EAAE6B,IAAI,CAACC,MAAL,EAJiB;AAKrB3E,QAAAA,IAAI,EAAG,QAAO4D,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,IAAGkE,GAAI,EALlC;AAMrBb,QAAAA,IAAI,EAAEY,SAAS,GAAG,GAAH,GAAS,GANH;AAOrBrB,QAAAA,OAAO,EAAEgB,KAAK,CAACf,EAPM;AAQrB+B,QAAAA,cAAc,EAAE,IARK;AASrBC,QAAAA,OAAO,EAAE,IATY;AAUrB7C,QAAAA,WAVqB;AAWrBsB,QAAAA,gBAXqB;AAYrBwB,QAAAA,uBAAuB,EAAE,IAZJ;AAarB/C,QAAAA;AAbqB,OAAvB;AAeAI,MAAAA,oBAAoB,CAACe,UAArB,CAAgC6B,IAAhC,CAAqCT,cAArC;AACD;;AACD,QAAIV,KAAK,CAAC7B,IAAN,CAAWiD,UAAf,EAA2B;AACzBjB,MAAAA,MAAM,CAACH,KAAK,CAAC7B,IAAN,CAAWiD,UAAZ,EAAwB,IAAxB,CAAN;AACD;;AACD,QAAIpB,KAAK,CAAC7B,IAAN,CAAWkD,MAAf,EAAuB;AACrB,UAAIC,KAAK,CAACC,OAAN,CAAcvB,KAAK,CAAC7B,IAAN,CAAWkD,MAAzB,CAAJ,EAAsC;AACpCrB,QAAAA,KAAK,CAAC7B,IAAN,CAAWkD,MAAX,CAAkBtB,OAAlB,CAA0BK,GAAG,IAAID,MAAM,CAACC,GAAD,CAAvC;AACD,OAFD,MAEO;AACLD,QAAAA,MAAM,CAACH,KAAK,CAAC7B,IAAN,CAAWkD,MAAZ,CAAN;AACD;AACF;AACF,GA5DD,EA7BqD,CA0FrD;;AACA9C,EAAAA,oBAAoB,CAACuB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG1B,oBAAoB,CAAC0B,SAArB,CAA+BV,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASe,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,UAAMuB,OAAO,GAAG,MACdjD,oBAAoB,CAACkB,IAArB,CAA0BF,IAA1B,CAA+BkC,CAAC,IAAIA,CAAC,CAACxC,EAAF,KAASe,KAAK,CAAC0B,MAAnD,CADF;;AAEA,UAAMC,UAAU,GAAG3B,KAAK,CAAC7B,IAAN,CAAWwD,UAAX,IAAyBH,OAAO,GAAGrD,IAAV,CAAewD,UAA3D;;AACA,QAAIA,UAAJ,EAAgB;AACd,YAAMC,WAAW,GACf,OAAOD,UAAP,KAAsB,QAAtB,GAAiC,CAACA,UAAD,CAAjC,GAAgDA,UADlD;;AAEA,UAAI,CAACL,KAAK,CAACC,OAAN,CAAcK,WAAd,CAAL,EAAiC;AAC/B,cAAM,IAAIvE,KAAJ,CACH,mDAAkD2C,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,GADjF,CAAN;AAGD;;AACDwF,MAAAA,WAAW,CAAC7B,OAAZ,CAAoB,CAAC8B,SAAD,EAAYC,KAAZ,KAAsB;AACxC,YAAI,OAAOD,SAAP,KAAqB,QAAzB,EAAmC;AACjC,gBAAM,IAAIxE,KAAJ,CACH,6BAA4ByE,KAAM,SAAQ9B,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,GADzE,CAAN;AAGD;;AACD,cAAM;AACJ2B,UAAAA,IAAI,EAAEgE,MADF;AAEJ5D,UAAAA,IAFI;AAGJC,UAAAA;AAHI,YAIFP,mBAAmB,CAACgE,SAAD,CAJvB;AAKA,cAAMG,OAAO,GAAGD,MAAM,CAACE,KAAP,CACd,0EADc,CAAhB;;AAGA,YAAI,CAACD,OAAL,EAAc;AACZ,gBAAM,IAAI3E,KAAJ,CACH,kCAAiC2C,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,0FAAyFyF,SAAU,GADnK,CAAN;AAGD;;AACD,cAAM,GAEJK,UAFI,EAGJC,gBAHI,EAIJC,YAJI,EAKJC,iBALI,IAMFL,OANJ;AAOA,cAAMM,SAAS,GAAGF,YAAY,GAC1BD,gBAD0B,GAEzB,IAAGnC,KAAK,CAAC7D,aAAc,GAF5B;AAGA,cAAMoG,QAAQ,GAAGH,YAAY,IAAID,gBAAjC;AACA,cAAM3B,OAAiB,GAAGhD,mBAAmB,CAAC0E,UAAD,CAA7C;AACA,cAAMM,aAAqB,GAAG5E,oBAAoB,CAAC0E,SAAD,CAAlD;AACA,cAAMG,YAAoB,GAAG7E,oBAAoB,CAAC2E,QAAD,CAAjD;AACA,cAAMG,cAA+B,GAAGL,iBAAiB,GACrD7E,mBAAmB,CAAC6E,iBAAD,CADkC,GAErD,IAFJ;AAIA,cAAMM,YAAY,GAAGpE,oBAAoB,CAACuB,KAArB,CAA2BP,IAA3B,CACnBqD,CAAC,IAAIA,CAAC,CAACxG,IAAF,KAAWqG,YAAX,IAA2BG,CAAC,CAACzG,aAAF,KAAoBqG,aADjC,CAArB;;AAGA,YAAI,CAACG,YAAL,EAAmB;AACjB,gBAAM,IAAItF,KAAJ,CACH,iEAAgEmF,aAAc,MAAKC,YAAa,4FAA2FZ,SAAU,GADlM,CAAN;AAGD;;AACD,cAAMgB,gBAAgB,GAAGtE,oBAAoB,CAAC0B,SAArB,CAA+BV,IAA/B,CACvBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAAS0D,YAAY,CAACzC,WADJ,CAAzB;;AAGA,YAAI,CAAC2C,gBAAL,EAAuB;AACrB;AACD;;AAED,cAAMnD,gBAAgB,GAAGlB,iBAAiB,CACxCwB,KADwC,EAExCQ,OAFwC,EAGvC,eAAcqB,SAAU,EAHe,CAAjB,CAIvBlE,GAJuB,CAInBoB,CAAC,IAAIA,CAAC,CAACK,GAJY,CAAzB;AAKA,cAAM8B,uBAAuB,GAAG1C,iBAAiB,CAC/CmE,YAD+C,EAE/CD,cAF+C,EAG9C,eAAcb,SAAU,EAHsB,CAAjB,CAI9BlE,GAJ8B,CAI1BoB,CAAC,IAAIA,CAAC,CAACK,GAJmB,CAAhC,CAzDwC,CA+DxC;;AACA,cAAMsB,cAAc,GAAG;AACrBC,UAAAA,IAAI,EAAE,YADe;AAErBC,UAAAA,MAAM,EAAE,IAFa;AAGrBC,UAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB5B,UAAAA,EAAE,EAAE6B,IAAI,CAACC,MAAL,EAJiB;AAKrB3E,UAAAA,IAAI,EAAG,QAAO4D,KAAK,CAAC7D,aAAc,IAAG6D,KAAK,CAAC5D,IAAK,eAAc0F,KAAM,EAL/C;AAMrBrC,UAAAA,IAAI,EAAE,GANe;AAMV;AACXT,UAAAA,OAAO,EAAEgB,KAAK,CAACf,EAPM;AAQrB+B,UAAAA,cAAc,EAAE2B,YAAY,CAAC1D,EARR;AASrBgC,UAAAA,OAAO,EAAE,IATY;AAUrB7C,UAAAA,WAVqB;AAWrBsB,UAAAA,gBAXqB;AAYrBwB,UAAAA,uBAZqB;AAarB/C,UAAAA;AAbqB,SAAvB;AAeAI,QAAAA,oBAAoB,CAACe,UAArB,CAAgC6B,IAAhC,CAAqCT,cAArC;AACD,OAhFD;AAiFD;AACF,GApGD;AAqGD;;AAED,SAASoC,gBAAT,CACE9C,KADF,EAEE+C,GAFF,EAGEC,WAHF,EAIE;AACA,MAAID,GAAG,CAAC/D,OAAJ,KAAgBgB,KAAK,CAACf,EAA1B,EAA8B;AAC5B,UAAMgE,YAAY,GAAGF,GAAG,CAACtD,IAAJ,KAAa,GAAlC;AACA,UAAMyD,kBAAkB,GAAGH,GAAG,CAACtD,IAAJ,KAAa,GAAxC;;AACA,QAAIwD,YAAY,IAAIC,kBAApB,EAAwC;AACtC,YAAMC,wBAAwB,GAC5BJ,GAAG,CAAC5E,IAAJ,CAASiF,IAAT,KAAkB,IAAlB,IAA0B,OAAOL,GAAG,CAAC5E,IAAJ,CAASiF,IAAhB,KAAyB,QADrD;AAEA,YAAMC,iCAAiC,GAAGN,GAAG,CAACtD,IAAJ,KAAa,GAAb,IAAoBuD,WAA9D;;AACA,UAAIG,wBAAwB,IAAIE,iCAAhC,EAAmE;AACjE,cAAMC,mBAAmB,GAAGP,GAAG,CAACrD,gBAAJ,CAAqBtC,MAArB,KAAgC,CAA5D;;AACA,YAAI,CAACkG,mBAAL,EAA0B;AACxB,gBAAM,IAAIjG,KAAJ,CACH,eAAc2C,KAAK,CAAC7D,aAAc,MAAK6D,KAAK,CAAC5D,IAAK,sBAAqB2G,GAAG,CAAC3G,IAAK,6DAA4D2G,GAAG,CAACrD,gBAAJ,CAAqBtC,MAAO,GADrK,CAAN;AAGD;;AACD,eAAO,IAAP;AACD;AACF;AACF;;AACD,SAAO,KAAP;AACD;;AAED,SAASmG,UAAT,CAAoBhF,oBAApB,EAA0C;AACxCA,EAAAA,oBAAoB,CAACuB,KAArB,CAA2BnC,GAA3B,CAA+B,MAAMqC,KAAN,IAAe;AAC5C,UAAMgD,WAAW,GACfhD,KAAK,CAAC7B,IAAN,CAAWiF,IAAX,KAAoB,IAApB,IAA4B,OAAOpD,KAAK,CAAC7B,IAAN,CAAWiF,IAAlB,KAA2B,QADzD;;AAGA,QAAIJ,WAAJ,EAAiB;AACf;AACA;AACAhD,MAAAA,KAAK,CAAC7B,IAAN,CAAWqF,IAAX,GAAkB,IAAlB,CAHe,CAIf;;AACAxD,MAAAA,KAAK,CAACyD,YAAN,GAAqB,KAArB,CALe,CAMf;;AACAzD,MAAAA,KAAK,CAAC0D,YAAN,GAAqB,KAArB,CAPe,CAQf;;AACA1D,MAAAA,KAAK,CAAC2D,WAAN,GAAoB,KAApB,CATe,CAUf;;AACA3D,MAAAA,KAAK,CAAC4D,WAAN,GAAoB,KAApB;AACD,KAhB2C,CAkB5C;AACA;;;AACA,UAAMC,eAAe,GAAGtF,oBAAoB,CAACe,UAArB,CAAgCR,MAAhC,CAAuCiE,GAAG,IAChED,gBAAgB,CAAC9C,KAAD,EAAQ+C,GAAR,EAAaC,WAAb,CADM,CAAxB,CApB4C,CAwB5C;;AACA,UAAMc,gBAAgB,GAAGvF,oBAAoB,CAACM,SAArB,CAA+BC,MAA/B,CACvBe,IAAI,IAAIA,IAAI,CAACb,OAAL,KAAiBgB,KAAK,CAACf,EADR,CAAzB,CAzB4C,CA6B5C;;AACA,UAAM8E,iBAAiB,GAAGD,gBAAgB,CAACvE,IAAjB,CACxBM,IAAI,IAAIA,IAAI,CAACzD,IAAL,KAAc,aAAd,IAA+ByD,IAAI,CAAC1B,IAAL,CAAU6F,eADzB,CAA1B;AAGA,UAAMC,OAAO,GAAGjE,KAAK,CAACkE,iBAAN,IAA2B,EAA3C;AAEAL,IAAAA,eAAe,CAAC9D,OAAhB,CAAwBT,UAAU,IAAI;AACpC,YAAM6E,GAAG,GAAGL,gBAAgB,CAACvE,IAAjB,CACV4E,GAAG,IAAIA,GAAG,CAAC/E,GAAJ,KAAYE,UAAU,CAACI,gBAAX,CAA4B,CAA5B,CADT,CAAZ;;AAGA,UAAI,CAACyE,GAAL,EAAU;AACR;AACA,cAAM,IAAI9G,KAAJ,CACJ,mEADI,CAAN;AAGD;;AACD,YAAM+G,IAAI,GAAGH,OAAO,CAACnF,MAAR,CAAeuF,GAAG,IAAIA,GAAG,CAACF,GAAG,CAAC/H,IAAL,CAAH,IAAiB,IAAvC,CAAb;;AACA,UAAIgI,IAAI,CAAChH,MAAL,GAAc,CAAlB,EAAqB;AACnB,cAAM,IAAIC,KAAJ,CACH,eAAc2C,KAAK,CAAC7D,aAAc,MAAK6D,KAAK,CAAC5D,IAAK,sDAAqDkD,UAAU,CAAClD,IAAK,oHADpH,CAAN;AAGD,OAfmC,CAiBpC;;;AACA,YAAMkI,eAAe,GACnBhF,UAAU,CAACG,IAAX,KAAoB,GAApB,GAA0B,EAA1B,GAAgC,IAAGH,UAAU,CAAClD,IAAK,EADrD;AAEA,YAAMmI,aAAa,GAAG;AACpB5D,QAAAA,IAAI,EAAE,MADc;AAEpBC,QAAAA,MAAM,EAAE,IAFY;AAGpB3B,QAAAA,EAAE,EAAE/C,kBAAkB,CACpB8D,KAAK,CAAC7D,aADc,EAEpB6D,KAAK,CAAC5D,IAFc,EAGpBkI,eAHoB,EAIpB,IAJoB,CAHF;AASpBlI,QAAAA,IAAI,EAAG,IAAG4D,KAAK,CAAC5D,IAAK,GAAEkI,eAAgB,EATnB;AAUpBlG,QAAAA,WAAW,EAAE,IAVO;AAWpBD,QAAAA,IAAI,EAAE,EAXc;AAYpB+B,QAAAA,WAAW,EAAEF,KAAK,CAACE,WAZC;AAapB/D,QAAAA,aAAa,EAAE6D,KAAK,CAAC7D,aAbD;AAcpBsD,QAAAA,IAAI,EAAE,GAdc;AAepB+E,QAAAA,QAAQ,EAAE,GAfU;AAgBpBC,QAAAA,eAAe,EAAE,IAhBG;AAiBpBC,QAAAA,eAAe,EAAE,IAjBG;AAkBpBC,QAAAA,UAAU,EAAE,CAAC,CAlBO;AAmBpBC,QAAAA,SAAS,EAAE,IAnBS;AAoBpB5F,QAAAA,OAAO,EAAE,IApBW;AAqBpB6F,QAAAA,gBAAgB,EAAE,IArBE;AAsBpBC,QAAAA,kBAAkB,EAAE,IAtBA;AAuBpBC,QAAAA,gBAAgB,EAAE,KAvBE;AAwBpBC,QAAAA,YAAY,EAAE,IAxBM;AAyBpBC,QAAAA,gBAAgB,EAAE,IAzBE;AA0BpBC,QAAAA,cAAc,EAAE;AA1BI,OAAtB;AA4BA,YAAMC,QAAQ,GAAG;AACfxE,QAAAA,IAAI,EAAE,MADS;AAEfC,QAAAA,MAAM,EAAE,IAFO;AAGf3B,QAAAA,EAAE,EAAE/C,kBAAkB,CACpB8D,KAAK,CAAC7D,aADc,EAEpB6D,KAAK,CAAC5D,IAFc,EAGpBkI,eAHoB,EAIpB,KAJoB,CAHP;AASflI,QAAAA,IAAI,EAAG,GAAE4D,KAAK,CAAC5D,IAAK,GAAEkI,eAAgB,EATvB;AAUflG,QAAAA,WAAW,EAAE4B,KAAK,CAAC5B,WAVJ;AAWfD,QAAAA,IAAI,EAAE,EAAE,GAAG6B,KAAK,CAAC7B,IAAX;AAAiB,aAAGmB,UAAU,CAACnB;AAA/B,SAXS;AAYf+B,QAAAA,WAAW,EAAEF,KAAK,CAACE,WAZJ;AAaf/D,QAAAA,aAAa,EAAE6D,KAAK,CAAC7D,aAbN;AAcfsD,QAAAA,IAAI,EAAE,GAdS;AAef+E,QAAAA,QAAQ,EAAE,GAfK;AAgBfC,QAAAA,eAAe,EAAE,IAhBF;AAiBfC,QAAAA,eAAe,EAAEH,aAAa,CAACtF,EAjBhB;AAkBf0F,QAAAA,UAAU,EAAE,CAlBG;AAkBA;AACfC,QAAAA,SAAS,EAAE,KAnBI;AAoBf5F,QAAAA,OAAO,EAAE,IApBM;AAqBf6F,QAAAA,gBAAgB,EAAE,IArBH;AAsBfC,QAAAA,kBAAkB,EAAE,IAtBL;AAuBfC,QAAAA,gBAAgB,EAAE,KAvBH;AAwBfC,QAAAA,YAAY,EAAEZ,IAAI,CAACzG,GAAL,CAASyH,CAAC,IAAIA,CAAC,CAACjB,GAAG,CAAC/H,IAAL,CAAf,CAxBC;AAyBf6I,QAAAA,gBAAgB,EAAElB,iBAAiB,GAC/BK,IAAI,CAACzG,GAAL,CAASyH,CAAC,IAAIA,CAAC,CAACrB,iBAAiB,CAAC3H,IAAnB,CAAf,CAD+B,GAE/B,IA3BW;AA4Bf;AACA8I,QAAAA,cAAc,EAAE;AA7BD,OAAjB;AA+BA3G,MAAAA,oBAAoB,CAACkB,IAArB,CAA0B0B,IAA1B,CAA+BgE,QAA/B,EAAyCZ,aAAzC;AACAhG,MAAAA,oBAAoB,CAAC8G,QAArB,CAA8BF,QAAQ,CAAClG,EAAvC,IAA6CkG,QAA7C;AACA5G,MAAAA,oBAAoB,CAAC8G,QAArB,CAA8Bd,aAAa,CAACtF,EAA5C,IAAkDsF,aAAlD,CAjFoC,CAmFpC;AACA;;AACAhG,MAAAA,oBAAoB,CAACe,UAArB,CAAgCS,OAAhC,CAAwCP,CAAC,IAAI;AAC3C,YACEA,CAAC,CAACC,IAAF,KAAW,GAAX,IACAD,CAAC,CAACwB,cAAF,KAAqBhB,KAAK,CAACf,EAD3B,IAEAO,CAAC,CAAC0B,uBAAF,CAA0B9D,MAA1B,KAAqC,CAFrC,IAGAoC,CAAC,CAAC0B,uBAAF,CAA0B,CAA1B,MAAiCiD,GAAG,CAAC/E,GAJvC,EAKE;AACA;AACA,gBAAMkG,MAAM,GAAG/G,oBAAoB,CAACM,SAArB,CAA+BU,IAA/B,CACbM,IAAI,IACFA,IAAI,CAACb,OAAL,KAAiBQ,CAAC,CAACR,OAAnB,IAA8Ba,IAAI,CAACT,GAAL,KAAaI,CAAC,CAACE,gBAAF,CAAmB,CAAnB,CAFhC,CAAf;;AAIA,cAAI4F,MAAJ,EAAY;AACV;AACAA,YAAAA,MAAM,CAAC5D,MAAP,GAAgByD,QAAQ,CAAClG,EAAzB;AACD;AACF;AACF,OAjBD;AAkBD,KAvGD;AAwGD,GA3ID;AA4ID;AAED;;;AACA,MAAMsG,SAAS,GAAGC,KAAK,IAAI;AACzB,MAAIlE,KAAK,CAACC,OAAN,CAAciE,KAAd,CAAJ,EAA0B;AACxB,WAAOA,KAAK,CAAC7H,GAAN,CAAU8H,GAAG,IAAIF,SAAS,CAACE,GAAD,CAA1B,CAAP;AACD,GAFD,MAEO,IAAI,OAAOD,KAAP,KAAiB,QAAjB,IAA6BA,KAAjC,EAAwC;AAC7C,WAAOE,MAAM,CAACC,IAAP,CAAYH,KAAZ,EAAmBI,MAAnB,CAA0B,CAACC,IAAD,EAAOjD,CAAP,KAAa;AAC5CiD,MAAAA,IAAI,CAACjD,CAAD,CAAJ,GAAU2C,SAAS,CAACC,KAAK,CAAC5C,CAAD,CAAN,CAAnB;AACA,aAAOiD,IAAP;AACD,KAHM,EAGJ,EAHI,CAAP;AAID,GALM,MAKA;AACL,WAAOL,KAAP;AACD;AACF,CAXD;;IAa+BM,qB,GAAf,eAAeA,qBAAf,CACdC,OADc,EAEd;AACEC,EAAAA,QADF;AAEEC,EAAAA,SAAS,EAAEC,OAFb;AAGEC,EAAAA,YAHF;AAIEC,EAAAA,wBAAwB,GAAG,CAAChG,GAAD,EAAMiG,EAAN,KAAaA,EAAE,EAJ5C;AAKEC,EAAAA,sBAAsB,GAAG,KAL3B;AAMEC,EAAAA,2BAA2B,GAAG,KANhC;AAOEC,EAAAA,qBAAqB,GAAG,KAP1B;AAQEC,EAAAA,YAAY,GAAG,IARjB;AASEC,EAAAA,6BAA6B,GAAG,KATlC;AAUEC,EAAAA,uBAVF;AAWEC,EAAAA,sBAAsB,GAAG;AAX3B,CAFc,EAed;AACA;AACF;AACA;AACE,iBAAeC,UAAf,GAAmE;AACjE;AACA,QAAI,CAACvF,KAAK,CAACC,OAAN,CAAc2E,OAAd,CAAL,EAA6B;AAC3B,YAAM,IAAI7I,KAAJ,CAAU,wCAAV,CAAN;AACD;;AACD,UAAMyJ,QAAQ,GAAI,qDAAoDC,gBAAQ,EAA9E;AACA,UAAMC,0BAA0B,GAAGzB,SAAS,CAC1C,MAAMa,wBAAwB,CAACU,QAAD,EAAW,MACvC,2BAAad,QAAb,EAAuB,MAAMiB,QAAN,IAAkB;AACvC,YAAMC,aAAa,GAAG,MAAMD,QAAQ,CAACE,KAAT,CAC1B,0BAD0B,CAA5B;AAGA,YAAMC,gBAAgB,GAAGC,QAAQ,CAC/BH,aAAa,CAACI,IAAd,CAAmB,CAAnB,EAAsBC,kBADS,EAE/B,EAF+B,CAAjC;AAIA,YAAMC,kBAAkB,GAAG,gDAAuBJ,gBAAvB,EAAyC;AAClEZ,QAAAA,qBADkE;AAElEC,QAAAA,YAFkE;AAGlEG,QAAAA;AAHkE,OAAzC,CAA3B;AAKA,YAAM;AAAEU,QAAAA;AAAF,UAAW,MAAML,QAAQ,CAACE,KAAT,CAAeK,kBAAf,EAAmC,CACxDtB,OADwD,EAExDK,2BAFwD,CAAnC,CAAvB;AAKA,YAAMkB,MAAM,GAAG;AACbC,QAAAA,WAAW,EAAEN,gBADA;AAEbnH,QAAAA,SAAS,EAAE,EAFE;AAGbH,QAAAA,KAAK,EAAE,EAHM;AAIbjB,QAAAA,SAAS,EAAE,EAJE;AAKbY,QAAAA,IAAI,EAAE,EALO;AAMbH,QAAAA,UAAU,EAAE,EANC;AAObqI,QAAAA,SAAS,EAAE,EAPE;AAQbC,QAAAA,SAAS,EAAE,EARE;AASb9F,QAAAA,KAAK,EAAE;AATM,OAAf;;AAWA,WAAK,MAAM;AAAE+F,QAAAA;AAAF,OAAX,IAAyBP,IAAzB,EAA+B;AAC7BG,QAAAA,MAAM,CAACI,MAAM,CAAClH,IAAR,CAAN,CAAoBQ,IAApB,CAAyB0G,MAAzB;AACD,OA/BsC,CAiCvC;;;AACA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASE9H,OATF,CASUY,IAAI,IAAI;AAChB8G,QAAAA,MAAM,CAAC9G,IAAD,CAAN,CAAaZ,OAAb,CAAqB8H,MAAM,IAAI;AAC7B;AACAA,UAAAA,MAAM,CAAC5G,OAAP,GAAiB4G,MAAM,CAACzJ,WAAxB;;AACA,cAAI+H,YAAY,IAAI0B,MAAM,CAACzJ,WAA3B,EAAwC;AACtC,kBAAMH,MAAM,GAAG,sBAAU4J,MAAM,CAACzJ,WAAjB,CAAf;AACAyJ,YAAAA,MAAM,CAAC1J,IAAP,GAAcF,MAAM,CAACE,IAArB;AACA0J,YAAAA,MAAM,CAACzJ,WAAP,GAAqBH,MAAM,CAACI,IAA5B;AACD,WAJD,MAIO;AACLwJ,YAAAA,MAAM,CAAC1J,IAAP,GAAc,EAAd;AACD;AACF,SAVD;AAWD,OArBD;AAuBA,YAAM2J,8BAA8B,GAAG,sBACrCL,MAAM,CAACG,SAD8B,EAErCG,CAAC,IAAIA,CAAC,CAACC,qBAF8B,CAAvC;AAIAP,MAAAA,MAAM,CAAC3H,KAAP,CAAaC,OAAb,CAAqBC,KAAK,IAAI;AAC5BA,QAAAA,KAAK,CAACiI,6BAAN,GACEH,8BAA8B,CAACI,OAA/B,CAAuClI,KAAK,CAACf,EAA7C,KAAoD,CADtD;AAED,OAHD,EA7DuC,CAkEvC;;AACA,YAAMkJ,UAAU,GAAG,MAAnB;AACA,YAAMC,OAAO,GAAG,IAAhB;AACA,YAAMC,OAAO,GAAG,IAAhB;AACA,YAAMC,SAAS,GAAG,MAAlB;AAEA,YAAMC,cAAc,GAAG,CAACJ,UAAD,EAAaC,OAAb,EAAsBC,OAAtB,EAA+BC,SAA/B,CAAvB;AAEA,YAAM3L,OAAO,CAAC6L,GAAR,CACJf,MAAM,CAAC3H,KAAP,CAAanC,GAAb,CAAiB,MAAMqC,KAAN,IAAe;AAC9B,YAAI,CAACkG,OAAO,CAACuC,QAAR,CAAiBzI,KAAK,CAAC7D,aAAvB,CAAL,EAA4C;AAC1C;AACA;AACD;;AACD,cAAM6G,WAAW,GACfhD,KAAK,CAAC7B,IAAN,CAAWiF,IAAX,KAAoB,IAApB,IAA4B,OAAOpD,KAAK,CAAC7B,IAAN,CAAWiF,IAAlB,KAA2B,QADzD,CAL8B,CAQ9B;AACA;;AACA,cAAMsF,kBAAkB,GAAGjB,MAAM,CAACnI,UAAP,CAAkBqJ,IAAlB,CAAuB5F,GAAG,IACnDD,gBAAgB,CAAC9C,KAAD,EAAQ+C,GAAR,EAAaC,WAAb,CADS,CAA3B;;AAGA,YAAIA,WAAW,IAAI0F,kBAAnB,EAAuC;AACrC;AACA,gBAAM5E,gBAAgB,GAAG2D,MAAM,CAAC5I,SAAP,CACtBC,MADsB,CAErBe,IAAI,IACFA,IAAI,CAACb,OAAL,KAAiBgB,KAAK,CAACf,EAAvB,IACAsJ,cAAc,CAACE,QAAf,CAAwB5I,IAAI,CAAC6B,MAA7B,CAJmB,EAMtBxC,IANsB,CAMjB,CAACH,CAAD,EAAI6J,CAAJ,KAAU7J,CAAC,CAACK,GAAF,GAAQwJ,CAAC,CAACxJ,GANH,CAAzB,CAFqC,CAUrC;;AACA,gBAAM+H,KAAK,GAAG0B,KAAK,CAACC,OAAN,CACZD,KAAK,CAACE,QAAS,UAASF,KAAK,CAAC3K,IAAN,CACtB4F,gBAAgB,CAACnG,GAAjB,CAAqBwG,GAAG,IAAI0E,KAAK,CAACG,UAAN,CAAiB7E,GAAG,CAAC/H,IAArB,CAA5B,CADsB,EAEtB,IAFsB,CAGtB,SAAQyM,KAAK,CAACG,UAAN,CAAiBhJ,KAAK,CAAC7D,aAAvB,EAAsC6D,KAAK,CAAC5D,IAA5C,CAAkD,GAJhD,CAAd;AAOA,cAAI6H,OAAJ;;AACA,cAAI;AACF,aAAC;AAAEqD,cAAAA,IAAI,EAAErD;AAAR,gBAAoB,MAAMgD,QAAQ,CAACE,KAAT,CAAeA,KAAf,CAA3B;AACD,WAFD,CAEE,OAAOY,CAAP,EAAU;AACV,gBAAIkB,IAAI,GAAG,wBAAX;;AACA,gBAAI;AACF,oBAAM;AACJ3B,gBAAAA,IAAI,EAAE,CAAC;AAAE4B,kBAAAA;AAAF,iBAAD;AADF,kBAEF,MAAMjC,QAAQ,CAACE,KAAT,CAAe,cAAf,CAFV;AAGA8B,cAAAA,IAAI,GAAGC,IAAP;AACD,aALD,CAKE,OAAOnB,CAAP,EAAU;AACV;AACpB;AACA;AACA;AACmB;;AACD,kBAAM,IAAI1K,KAAJ,CAAW,iDAAgD2C,KAAK,CAAC7D,aAAc,MAAK6D,KAAK,CAAC5D,IAAK;AACvH;AACA,2BAA2B4D,KAAK,CAAC7D,aAAc,SAAQ8M,IAAK;AAC5D,qBAAqBjJ,KAAK,CAAC7D,aAAc,MAAK6D,KAAK,CAAC5D,IAAK,SAAQ6M,IAAK;AACtE;AACA,kBAAkBlB,CAAC,CAACoB,OAAQ;AAC5B,CANwB,CAAN;AAOD;;AAEDnJ,UAAAA,KAAK,CAACkE,iBAAN,GAA0BD,OAA1B;AACD;AACF,OA1DD,CADI,CAAN;AA8DA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASElE,OATF,CASU6C,CAAC,IAAI;AACb6E,QAAAA,MAAM,CAAC7E,CAAD,CAAN,CAAU7C,OAAV,CAAkB2F,MAAM,CAAC0D,MAAzB;AACD,OAXD;AAaA,aAAO1D,MAAM,CAAC0D,MAAP,CAAc3B,MAAd,CAAP;AACD,KAtJD,CAD4B,CADY,CAA5C;AA4JA,UAAM4B,YAAY,GAAGrC,0BAA0B,CAAC/G,SAA3B,CAAqCtC,GAArC,CAAyCgC,CAAC,IAAIA,CAAC,CAACvD,IAAhD,CAArB;AACA,UAAMkN,cAAc,GAAGpD,OAAO,CAACpH,MAAR,CAAeyK,CAAC,IAAIF,YAAY,CAACnB,OAAb,CAAqBqB,CAArB,IAA0B,CAA9C,CAAvB;;AACA,QAAID,cAAc,CAAClM,MAAnB,EAA2B;AACzB,YAAMoM,YAAY,GAAI,gCAA+BtD,OAAO,CAAChI,IAAR,CACnD,MADmD,CAEnD,oEAAmEoL,cAAc,CAACpL,IAAf,CACnE,MADmE,CAEnE,GAJF;;AAKA,UAAIoI,sBAAJ,EAA4B;AAC1B,cAAM,IAAIjJ,KAAJ,CAAUmM,YAAV,CAAN;AACD,OAFD,MAEO;AACLC,QAAAA,OAAO,CAACC,IAAR,CAAa,mBAAmBF,YAAhC,EADK,CAC0C;AAChD;AACF;;AACD,WAAOxC,0BAAP;AACD;;AAED,WAAS2C,2BAAT,CACEC,UADF,EAEEC,6BAFF,EAGE;AACA,UAAM7C,0BAA0B,GAAGzB,SAAS,CAACqE,UAAD,CAA5C;;AAEA,UAAME,IAAI,GAAG,CAACC,QAAD,EAAWC,OAAX,KACXD,QAAQ,CAACnE,MAAT,CAAgB,CAACC,IAAD,EAAOoE,CAAP,KAAa;AAC3BpE,MAAAA,IAAI,CAACoE,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmBC,CAAnB;AACA,aAAOpE,IAAP;AACD,KAHD,EAGG,EAHH,CADF;;AAKA,UAAMqE,QAAQ,GAAG,CAACH,QAAD,EAAWC,OAAX,EAAoBG,QAApB,KACfJ,QAAQ,CAACnE,MAAT,CAAgB,CAACC,IAAD,EAAOoE,CAAP,KAAa;AAC3B,UAAI,CAACpE,IAAI,CAACoE,CAAC,CAACD,OAAD,CAAF,CAAT,EAAuBnE,IAAI,CAACoE,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmB,EAAnB;AACvBnE,MAAAA,IAAI,CAACoE,CAAC,CAACD,OAAD,CAAF,CAAJ,CAAiBC,CAAC,CAACE,QAAD,CAAlB,IAAgCF,CAAhC;AACA,aAAOpE,IAAP;AACD,KAJD,EAIG,EAJH,CADF;;AAMAmB,IAAAA,0BAA0B,CAACoD,aAA3B,GAA2CN,IAAI,CAC7C9C,0BAA0B,CAAC/G,SADkB,EAE7C,IAF6C,CAA/C;AAIA+G,IAAAA,0BAA0B,CAACqD,SAA3B,GAAuCP,IAAI,CACzC9C,0BAA0B,CAAClH,KADc,EAEzC,IAFyC,CAA3C;AAIAkH,IAAAA,0BAA0B,CAAC3B,QAA3B,GAAsCyE,IAAI,CACxC9C,0BAA0B,CAACvH,IADa,EAExC,IAFwC,CAA1C;AAIAuH,IAAAA,0BAA0B,CAACsD,wBAA3B,GAAsDJ,QAAQ,CAC5DlD,0BAA0B,CAACnI,SADiC,EAE5D,SAF4D,EAG5D,KAH4D,CAA9D;AAKAmI,IAAAA,0BAA0B,CAACuD,aAA3B,GAA2CT,IAAI,CAC7C9C,0BAA0B,CAACY,SADkB,EAE7C,IAF6C,CAA/C;;AAKA,UAAM4C,MAAM,GAAG,CAACC,KAAD,EAAQC,OAAR,EAAiBC,UAAjB,EAA6BC,MAA7B,EAAqCC,SAAS,GAAG,KAAjD,KAA2D;AACxEJ,MAAAA,KAAK,CAAC1K,OAAN,CAAc+K,KAAK,IAAI;AACrB,cAAM1K,GAAG,GAAG0K,KAAK,CAACH,UAAD,CAAjB;;AACA,YAAIrJ,KAAK,CAACC,OAAN,CAAcnB,GAAd,CAAJ,EAAwB;AACtB0K,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBtK,GAAG,CACjBzC,GADc,CACVoN,QAAQ,IAAI;AACf,kBAAMtD,MAAM,GAAGmD,MAAM,CAACG,QAAD,CAArB;;AACA,gBAAIA,QAAQ,IAAI,CAACtD,MAAjB,EAAyB;AACvB,kBAAIoD,SAAJ,EAAe;AACb;AACD;;AACD,oBAAM,IAAIxN,KAAJ,CACH,sBAAqBqN,OAAQ,SAAQC,UAAW,OAAMI,QAAS,UAASC,IAAI,CAACC,SAAL,CACvEH,KADuE,CAEvE,GAHE,CAAN;AAKD;;AACD,mBAAOrD,MAAP;AACD,WAdc,EAed3I,MAfc,CAePoM,CAAC,IAAIA,CAfE,CAAjB;AAgBD,SAjBD,MAiBO;AACL,gBAAMzD,MAAM,GAAGmD,MAAM,CAACxK,GAAD,CAArB;;AACA,cAAIA,GAAG,IAAI,CAACqH,MAAZ,EAAoB;AAClB,gBAAIoD,SAAJ,EAAe;AACb;AACD;;AACD,kBAAM,IAAIxN,KAAJ,CACH,sBAAqBqN,OAAQ,SAAQC,UAAW,SAAQvK,GAAI,UAAS4K,IAAI,CAACC,SAAL,CACpEH,KADoE,CAEpE,GAHE,CAAN;AAKD;;AACDA,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBjD,MAAjB;AACD;AACF,OAjCD;AAkCD,KAnCD;;AAqCA,UAAM0D,OAAO,GAAG5M,oBAAoB,IAAI;AACtC,OACEsL,6BADF,EAEEvL,uBAFF,EAGEiF,UAHF,EAIExD,OAJF,CAIUsG,EAAE,IAAKA,EAAE,GAAGA,EAAE,CAAC9H,oBAAD,CAAL,GAA8B,IAJjD;AAKD,KAND;;AAOA4M,IAAAA,OAAO,CAACnE,0BAAD,CAAP;AAEAwD,IAAAA,MAAM,CACJxD,0BAA0B,CAAClH,KADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJkH,0BAA0B,CAACoD,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxD,0BAA0B,CAAClH,KADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJkH,0BAA0B,CAAC3B,QAJvB,CAAN;AAOAmF,IAAAA,MAAM,CACJxD,0BAA0B,CAACnI,SADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJmI,0BAA0B,CAACqD,SAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACnI,SADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJmI,0BAA0B,CAAC3B,QAJvB,CAAN;AAOAmF,IAAAA,MAAM,CACJxD,0BAA0B,CAACW,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJX,0BAA0B,CAACoD,aAJvB,CAAN;AAOAI,IAAAA,MAAM,CACJxD,0BAA0B,CAACvH,IADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJuH,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACvH,IADvB,EAEJ,gBAFI,EAGJ,kBAHI,EAIJuH,0BAA0B,CAAC3B,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAmF,IAAAA,MAAM,CACJxD,0BAA0B,CAACvH,IADvB,EAEJ,eAFI,EAGJ,iBAHI,EAIJuH,0BAA0B,CAAC3B,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAmF,IAAAA,MAAM,CACJxD,0BAA0B,CAAC1H,UADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJ0H,0BAA0B,CAACqD,SAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxD,0BAA0B,CAAC1H,UADvB,EAEJ,cAFI,EAGJ,gBAHI,EAIJ0H,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAACY,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJZ,0BAA0B,CAACoD,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxD,0BAA0B,CAACY,SADvB,EAEJ,sBAFI,EAGJ,uBAHI,EAIJZ,0BAA0B,CAACqD,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxD,0BAA0B,CAAClF,KADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJkF,0BAA0B,CAACqD,SAJvB,CAAN,CA7KA,CAoLA;;AACArD,IAAAA,0BAA0B,CAACvH,IAA3B,CAAgCM,OAAhC,CAAwCN,IAAI,IAAI;AAC9C,UAAIA,IAAI,CAAC2L,aAAT,EAAwB;AACtB3L,QAAAA,IAAI,CAAC2L,aAAL,CAAmBC,SAAnB,GAA+B5L,IAA/B;AACD;AACF,KAJD,EArLA,CA2LA;;AACAuH,IAAAA,0BAA0B,CAAClH,KAA3B,CAAiCC,OAAjC,CAAyCC,KAAK,IAAI;AAChDA,MAAAA,KAAK,CAACpB,UAAN,GAAmBoI,0BAA0B,CAACnI,SAA3B,CAAqCC,MAArC,CACjBe,IAAI,IAAIA,IAAI,CAACb,OAAL,KAAiBgB,KAAK,CAACf,EADd,CAAnB;AAGAe,MAAAA,KAAK,CAACsL,cAAN,GAAuB,CAACtL,KAAK,CAACpB,UAAN,CAAiB+J,IAAjB,CACtB9I,IAAI,IAAIA,IAAI,CAAC0L,sBADS,CAAxB;AAGAvL,MAAAA,KAAK,CAACwL,WAAN,GAAoBxE,0BAA0B,CAAC1H,UAA3B,CAAsCR,MAAtC,CAClBQ,UAAU,IAAIA,UAAU,CAACN,OAAX,KAAuBgB,KAAK,CAACf,EADzB,CAApB;AAGAe,MAAAA,KAAK,CAACyL,kBAAN,GAA2BzE,0BAA0B,CAAC1H,UAA3B,CAAsCR,MAAtC,CACzBQ,UAAU,IAAIA,UAAU,CAAC0B,cAAX,KAA8BhB,KAAK,CAACf,EADzB,CAA3B;AAGAe,MAAAA,KAAK,CAAC0L,oBAAN,GAA6B1L,KAAK,CAACwL,WAAN,CAAkBjM,IAAlB,CAC3BD,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GADP,CAA7B;AAGD,KAhBD,EA5LA,CA8MA;;AACAuH,IAAAA,0BAA0B,CAAC1H,UAA3B,CAAsCS,OAAtC,CAA8CT,UAAU,IAAI;AAC1D,UAAIA,UAAU,CAACI,gBAAX,IAA+BJ,UAAU,CAACQ,KAA9C,EAAqD;AACnDR,QAAAA,UAAU,CAACqM,aAAX,GAA2BrM,UAAU,CAACI,gBAAX,CAA4B/B,GAA5B,CAAgCiO,EAAE,IAC3DtM,UAAU,CAACQ,KAAX,CAAiBlB,UAAjB,CAA4BW,IAA5B,CAAiCM,IAAI,IAAIA,IAAI,CAACT,GAAL,KAAawM,EAAtD,CADyB,CAA3B;AAGD,OAJD,MAIO;AACLtM,QAAAA,UAAU,CAACqM,aAAX,GAA2B,EAA3B;AACD;;AACD,UAAIrM,UAAU,CAAC4B,uBAAX,IAAsC5B,UAAU,CAACuM,YAArD,EAAmE;AACjEvM,QAAAA,UAAU,CAACwM,oBAAX,GACExM,UAAU,CAAC4B,uBAAX,CAAmCvD,GAAnC,CAAuCiO,EAAE,IACvCtM,UAAU,CAACuM,YAAX,CAAwBjN,UAAxB,CAAmCW,IAAnC,CAAwCM,IAAI,IAAIA,IAAI,CAACT,GAAL,KAAawM,EAA7D,CADF,CADF;AAID,OALD,MAKO;AACLtM,QAAAA,UAAU,CAACwM,oBAAX,GAAkC,EAAlC;AACD;AACF,KAhBD,EA/MA,CAiOA;;AACA9E,IAAAA,0BAA0B,CAAClF,KAA3B,CAAiC/B,OAAjC,CAAyC+B,KAAK,IAAI;AAChD,YAAMtB,OAAO,GAAGsB,KAAK,CAACiK,aAAN,CAAoBpO,GAApB,CAAwBiO,EAAE,IACxC9J,KAAK,CAAChC,KAAN,CAAYlB,UAAZ,CAAuBW,IAAvB,CAA4BM,IAAI,IAAIA,IAAI,CAACT,GAAL,KAAawM,EAAjD,CADc,CAAhB,CADgD,CAKhD;;AACA,UAAIpL,OAAO,CAAC,CAAD,CAAX,EAAgB;AACdA,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAWK,SAAX,GAAuB,IAAvB;AACD;;AAED,UAAIL,OAAO,CAAC,CAAD,CAAP,IAAcA,OAAO,CAACpD,MAAR,KAAmB,CAAjC,IAAsC0E,KAAK,CAACkK,QAAhD,EAA0D;AACxDxL,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAWwL,QAAX,GAAsB,IAAtB;AACD,OAZ+C,CAchD;;;AACAlK,MAAAA,KAAK,CAAChC,KAAN,CAAY0L,WAAZ,CACG1M,MADH,CACUQ,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GAD5C,EAEGM,OAFH,CAEWT,UAAU,IAAI;AACrB,YACEA,UAAU,CAACI,gBAAX,CAA4BuM,KAA5B,CACE,CAACL,EAAD,EAAKM,GAAL,KAAapK,KAAK,CAACiK,aAAN,CAAoBG,GAApB,MAA6BN,EAD5C,CADF,EAIE;AACAtM,UAAAA,UAAU,CAACuB,SAAX,GAAuB,IAAvB;AACD;AACF,OAVH;AAWD,KA1BD;AA4BA,WAAOmG,0BAAP;AACD;;AAED,MAAImF,6BAA6B,GAAG,MAAMtF,UAAU,EAApD;AAEA,MAAIuF,QAAJ;;AAEA,QAAMC,QAAN,CAAe;AAMbC,IAAAA,WAAW,CAACC,cAAD,EAAiB;AAC1B,WAAKC,OAAL,GAAe,KAAf;AACA,WAAKC,aAAL,GAAqB,uBACnB,YAAY;AACV1Q,QAAAA,KAAK,CAAE,iDAAF,CAAL;;AACA,YAAI;AACFoQ,UAAAA,6BAA6B,GAAG,MAAMtF,UAAU,EAAhD;AACA9K,UAAAA,KAAK,CAAE,uDAAF,CAAL;AACAwQ,UAAAA,cAAc;AACf,SAJD,CAIE,OAAOxE,CAAP,EAAU;AACV;AACA0B,UAAAA,OAAO,CAACiD,KAAR,CAAe,gCAA+B3E,CAAC,CAACoB,OAAQ,EAAxD;AACD;AACF,OAXkB,EAYnB,GAZmB,EAanB;AACEwD,QAAAA,OAAO,EAAE,IADX;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OAbmB,CAArB;AAkBA,WAAKC,SAAL,GAAiB,KAAKA,SAAL,CAAeC,IAAf,CAAoB,IAApB,CAAjB;AACA,WAAKC,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA1B;;AACA,WAAKE,MAAL;AACD;;AAEW,UAANA,MAAM,CAACC,WAAW,GAAG,KAAf,EAAsB;AAChC,UAAI,KAAKT,OAAT,EAAkB;AAChB;AACD,OAH+B,CAIhC;;;AACA,UAAI;AACF,cAAM;AAAEvF,UAAAA,QAAF;AAAYiG,UAAAA;AAAZ,YACJ,MAAM,oDAAiClH,QAAjC,CADR;AAEA,aAAKmH,MAAL,GAAclG,QAAd,CAHE,CAIF;;AACA,aAAKmG,oBAAL,GAA4BF,eAA5B;AACAjG,QAAAA,QAAQ,CAACoG,EAAT,CAAY,cAAZ,EAA4B,KAAKR,SAAjC;AACA5F,QAAAA,QAAQ,CAACoG,EAAT,CAAY,OAAZ,EAAqB,KAAKN,kBAA1B;;AACA,YAAI,KAAKP,OAAT,EAAkB;AAChB;AACA,iBAAO,KAAKc,cAAL,EAAP;AACD,SAHD,MAGO;AACL,gBAAMrG,QAAQ,CAACE,KAAT,CAAe,2BAAf,CAAN,CADK,CAGL;;AACA,cAAI,CAACT,6BAAL,EAAoC;AAClC,kBAAM6G,aAAa,GAAG,MAAM/Q,QAAQ,CAACR,mBAAD,EAAsB,MAAtB,CAApC;AACA,kBAAMwR,GAAG,GAAI,UAASD,aAAc,GAApC;AACA,kBAAM,2BACJ5G,uBAAuB,IAAIX,QADvB,EAEJ,MAAMiB,QAAN,IAAkB;AAChB,kBAAI;AACF,sBAAMA,QAAQ,CAACE,KAAT,CAAeqG,GAAf,CAAN;AACD,eAFD,CAEE,OAAOd,KAAP,EAAc;AACd,oBAAI,CAAC,KAAKe,mBAAV,EAA+B;AAC7B,uBAAKA,mBAAL,GAA2B,IAA3B;AACA;;AACAhE,kBAAAA,OAAO,CAACC,IAAR,CACG,GAAEgE,eAAMC,IAAN,CAAWC,MAAX,CACD,qDADC,CAED,OAHJ;AAKAnE,kBAAAA,OAAO,CAACC,IAAR,CACEgE,eAAME,MAAN,CACE,iSADF,CADF;AAKAnE,kBAAAA,OAAO,CAACC,IAAR,CACEgE,eAAME,MAAN,CACE,mDADF,CADF;AAKA;AACD;;AACD7R,gBAAAA,KAAK,CAAC2Q,KAAD,CAAL;AACD,eAxBD,SAwBU;AACR,sBAAMzF,QAAQ,CAACE,KAAT,CAAe,SAAf,CAAN;AACD;AACF,aA9BG,CAAN;AAgCD,WAvCI,CAyCL;;;AACA,cAAI8F,WAAJ,EAAiB;AACf,iBAAKR,aAAL;AACD;AACF;AACF,OAzDD,CAyDE,OAAO1E,CAAP,EAAU;AACV;AACA,aAAK8F,UAAL,CAAgB9F,CAAhB;AACD;AACF;;AAGDgF,IAAAA,kBAAkB,CAAChF,CAAD,EAAI;AACpB,WAAKuF,cAAL,CAAoB,KAApB;;AACA,WAAKO,UAAL,CAAgB9F,CAAhB;AACD;;AACe,UAAV8F,UAAU,CAAC9F,CAAD,EAAI;AAClB,UAAI,KAAKyE,OAAT,EAAkB;AAChB;AACD,OAHiB,CAIlB;;;AACA/C,MAAAA,OAAO,CAACiD,KAAR,CACE,mEADF,EAEE3E,CAAC,CAACoB,OAFJ;AAIA,YAAM,KAAKmE,cAAL,EAAN;AACAQ,MAAAA,UAAU,CAAC,MAAM;AACf,YAAI,CAAC,KAAKtB,OAAV,EAAmB;AACjB;AACA,eAAKQ,MAAL,CAAY,IAAZ;AACD;AACF,OALS,EAKP,IALO,CAAV;AAMD,KAxHY,CA0Hb;;;AAEA;AACe,UAATH,SAAS,CAACkB,YAAD,EAAoB;AACjC,UAAIA,YAAY,CAACC,OAAb,KAAyB,oBAA7B,EAAmD;AACjD;AACD;;AACD,UAAI;AACF,cAAMC,OAAO,GAAGjD,IAAI,CAACkD,KAAL,CAAWH,YAAY,CAACE,OAAxB,CAAhB;AACAA,QAAAA,OAAO,CAACA,OAAR,GAAkBA,OAAO,CAACA,OAAR,IAAmB,EAArC;;AACA,YAAIA,OAAO,CAACxO,IAAR,KAAiB,KAArB,EAA4B;AAC1B,gBAAM0O,QAAQ,GAAGF,OAAO,CAACA,OAAR,CACdnP,MADc,CAEb,CAAC;AAAEsP,YAAAA;AAAF,WAAD,KAAgBA,MAAM,IAAI,IAAV,IAAkBlI,OAAO,CAACgC,OAAR,CAAgBkG,MAAhB,KAA2B,CAFhD,EAIdzQ,GAJc,CAIV,CAAC;AAAE0Q,YAAAA;AAAF,WAAD,KAAiBA,OAJP,CAAjB;;AAKA,cAAIF,QAAQ,CAAC/Q,MAAb,EAAqB;AACnB,iBAAKqP,aAAL;AACD;AACF,SATD,MASO,IAAIwB,OAAO,CAACxO,IAAR,KAAiB,MAArB,EAA6B;AAClC,gBAAM6O,iBAAiB,GAAGL,OAAO,CAACA,OAAR,CAAgBtF,IAAhB,CACxB4F,UAAU,IAAIrI,OAAO,CAACgC,OAAR,CAAgBqG,UAAhB,KAA+B,CADrB,CAA1B;;AAGA,cAAID,iBAAJ,EAAuB;AACrB,iBAAK7B,aAAL;AACD;AACF,SAPM,MAOA,IAAIwB,OAAO,CAACxO,IAAR,KAAiB,QAArB,EAA+B;AACpC,eAAKgN,aAAL;AACD,SAFM,MAEA;AACL,gBAAM,IAAIpP,KAAJ,CAAW,iBAAgB4Q,OAAO,CAACxO,IAAK,kBAAxC,CAAN;AACD;AACF,OAxBD,CAwBE,OAAOsI,CAAP,EAAU;AACVhM,QAAAA,KAAK,CAAE,gDAA+CgM,CAAE,EAAnD,CAAL;AACD;AACF;;AAES,UAAJyG,IAAI,GAAG;AACX,WAAKhC,OAAL,GAAe,IAAf;;AACA,WAAKC,aAAL,CAAmBgC,MAAnB;;AACA,YAAM,KAAKnB,cAAL,EAAN;AACD;AAED;AACJ;AACA;AACA;;;AACwB,UAAdA,cAAc,CAACoB,mBAAmB,GAAG,IAAvB,EAA6B;AAC/C;AACA,YAAMzH,QAAQ,GAAG,KAAKkG,MAAtB;AACA,YAAMwB,mBAAmB,GAAG,KAAKvB,oBAAjC;AACA,WAAKD,MAAL,GAAc,IAAd;AACA,WAAKC,oBAAL,GAA4B,IAA5B;;AACA,UAAInG,QAAJ,EAAc;AACZ;AACA,YAAIyH,mBAAJ,EAAyB;AACvBzH,UAAAA,QAAQ,CAACE,KAAT,CAAe,6BAAf,EAA8CyH,KAA9C,CAAoD7G,CAAC,IAAI;AACvDhM,YAAAA,KAAK,CAAE,4CAA2CgM,CAAE,EAA/C,CAAL;AACD,WAFD;AAGD;;AACDd,QAAAA,QAAQ,CAAC4H,cAAT,CAAwB,cAAxB,EAAwC,KAAKhC,SAA7C;AACA5F,QAAAA,QAAQ,CAAC4H,cAAT,CAAwB,OAAxB,EAAiC,KAAK9B,kBAAtC;AACD;;AACD,UAAI4B,mBAAJ,EAAyB;AACvB,cAAMA,mBAAmB,EAAzB;AACD;AACF;;AA3LY;;AA8Lf5I,EAAAA,OAAO,CAAC+I,eAAR,CACE,MAAMvC,cAAN,IAAwB;AACtB;AACA,QAAIH,QAAJ,EAAc;AACZ,YAAMA,QAAQ,CAACoC,IAAT,EAAN;AACD,KAJqB,CAKtB;AACA;;;AACApC,IAAAA,QAAQ,GAAG,IAAIC,QAAJ,CAAaE,cAAb,CAAX;AACD,GATH,EAUE,YAAY;AACV,UAAMwC,CAAC,GAAG3C,QAAV;AACAA,IAAAA,QAAQ,GAAG,IAAX;;AACA,QAAI2C,CAAJ,EAAO;AACL,YAAMA,CAAC,CAACP,IAAF,EAAN;AACD;AACF,GAhBH;AAmBAzI,EAAAA,OAAO,CAACiJ,IAAR,CACE,OADF,EAEEC,KAAK,IAAI;AACP,UAAMjI,0BAA0B,GAAG2C,2BAA2B,CAC5DwC,6BAD4D,EAE5D8C,KAAK,CAACpF,6BAFsD,CAA9D;;AAKA,QAAI7C,0BAA0B,CAACU,WAA3B,GAAyC,KAA7C,EAAoD;AAClD;AACA;AACA;AACAuH,MAAAA,KAAK,CAACC,sBAAN,GAA+B,0CAA4B;AACzDC,QAAAA,aAAa,EAAE;AAD0C,OAA5B,CAA/B;AAGD;;AACD,WAAOF,KAAK,CAACG,MAAN,CAAaH,KAAb,EAAoB;AACzBI,MAAAA,4BAA4B,EAAErI,0BADL;AAEzBsI,MAAAA,uBAAuB,EAAEpT;AAFA,KAApB,CAAP;AAID,GApBH,EAqBE,CAAC,iBAAD,CArBF,EAsBE,EAtBF,EAuBE,CAAC,UAAD,CAvBF;AAyBD,C,EAED;;;;AACO,MAAMqT,YAAY,GAAG;AAC1BC,EAAAA,SAAS,EAAE,WADe;AAE1BC,EAAAA,SAAS,EAAE,WAFe;AAG1BC,EAAAA,KAAK,EAAE,OAHmB;AAI1BC,EAAAA,IAAI,EAAE,MAJoB;AAK1BC,EAAAA,SAAS,EAAE,WALe;AAM1BC,EAAAA,UAAU,EAAE,YANc;AAO1BC,EAAAA,SAAS,EAAE,WAPe;AAQ1BC,EAAAA,KAAK,EAAE;AARmB,CAArB","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n\n // eslint-disable-next-line flowtype/no-weak-types\n _internalEnumData?: any[], // This is Graphile internal, do not use this.\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n isFake: ?boolean,\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nconst fakeEnumIdentifier = (\n namespaceName: string,\n name: string,\n identifierExtra = \"\",\n list = false\n) => {\n const baseEnumIdentifier = `FAKE_ENUM_${namespaceName}_${name}${identifierExtra}`;\n if (list) {\n return `${baseEnumIdentifier}_list`;\n } else {\n return baseEnumIdentifier;\n }\n};\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.slice(1, -1);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const {\n spec: fkSpec,\n tags,\n description,\n } = parseConstraintSpec(fkSpecRaw);\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nfunction isEnumConstraint(\n klass: PgClass,\n con: PgConstraint,\n isEnumTable: boolean\n) {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true || typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint = con.type === \"p\" && isEnumTable;\n if (isExplicitEnumConstraint || isPrimaryKeyOfEnumTableConstraint) {\n const hasExactlyOneColumn = con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n}\n\nfunction enumTables(introspectionResults) {\n introspectionResults.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n // By this point, even views should have \"fake\" constraints we can use\n // (e.g. `@primaryKey`)\n const enumConstraints = introspectionResults.constraint.filter(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n\n // Get all the columns\n const enumTableColumns = introspectionResults.attribute.filter(\n attr => attr.classId === klass.id\n );\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr => attr.name === \"description\" || attr.tags.enumDescription\n );\n const allData = klass._internalEnumData || [];\n\n enumConstraints.forEach(constraint => {\n const col = enumTableColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no visible entries for enum constraint '${constraint.name}'. Check that the table contains at least one row and that the rows are not hidden by row-level security policies.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n isFake: true,\n id: fakeEnumIdentifier(\n klass.namespaceName,\n klass.name,\n constraintIdent,\n true\n ),\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n isFake: true,\n id: fakeEnumIdentifier(\n klass.namespaceName,\n klass.name,\n constraintIdent,\n false\n ),\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n introspectionResults.type.push(enumType, enumTypeArray);\n introspectionResults.typeById[enumType.id] = enumType;\n introspectionResults.typeById[enumTypeArray.id] = enumTypeArray;\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n introspectionResults.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = introspectionResults.attribute.find(\n attr =>\n attr.classId === c.classId && attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n pgUsePartitionedParent = false,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n pgUsePartitionedParent,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n const VALID_TYPE_IDS = [VARCHAR_ID, TEXT_ID, CHAR_ID, BPCHAR_ID];\n\n await Promise.all(\n result.class.map(async klass => {\n if (!schemas.includes(klass.namespaceName)) {\n // Only support enums in public tables/views\n return;\n }\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n // NOTE: this only matches on tables (not views, since they don't\n // have constraints), which is why we repeat the isEnumTable check below.\n const hasEnumConstraints = result.constraint.some(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n if (isEnumTable || hasEnumConstraints) {\n // Get the list of columns enums are defined for\n const enumTableColumns = result.attribute\n .filter(\n attr =>\n attr.classId === klass.id &&\n VALID_TYPE_IDS.includes(attr.typeId)\n )\n .sort((a, z) => a.num - z.num);\n\n // Load data from the table/view.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumTableColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )} from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /*\n * Ignore; this is likely a 25P02 (transaction aborted)\n * error caused by the statement above failing.\n */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n klass._internalEnumData = allData;\n }\n })\n );\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' (= '${key}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [\n pgAugmentIntrospectionResults,\n smartCommentConstraints,\n enumTables,\n ].forEach(fn => (fn ? fn(introspectionResults) : null));\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes =\n constraint.foreignKeyAttributeNums.map(nr =>\n constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const { pgClient, releasePgClient } =\n await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n this._releaseClient(false);\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n this._handleChange.cancel();\n await this._releaseClient();\n }\n\n /**\n * Only pass `false` to this function if you know the client is going to be\n * terminated; otherwise we risk leaving listeners running.\n */\n async _releaseClient(clientIsStillViable = true) {\n // $FlowFixMe\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n // Don't attempt to run a query after a client has errored.\n if (clientIsStillViable) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n }\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n }\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n getPgFakeEnumIdentifier: fakeEnumIdentifier,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
|