UNPKG

368 kBSource Map (JSON)View Raw
1{"version":3,"file":"mirage-esm.js","sources":["../lib/utils/reference-sort.js","../lib/factory.js","../lib/identity-manager.js","../lib/association.js","../lib/trait.js","../lib/response.js","../lib/utils/inflector.js","../lib/utils/is-association.js","../lib/assert.js","../lib/orm/associations/association.js","../lib/orm/associations/belongs-to.js","../lib/db-collection.js","../lib/db.js","../lib/orm/collection.js","../lib/orm/polymorphic-collection.js","../lib/orm/associations/has-many.js","../lib/route-handlers/base.js","../lib/route-handlers/function.js","../lib/route-handlers/object.js","../lib/route-handlers/shorthands/base.js","../lib/route-handlers/shorthands/get.js","../lib/route-handlers/shorthands/post.js","../lib/route-handlers/shorthands/put.js","../lib/route-handlers/shorthands/delete.js","../lib/route-handlers/shorthands/head.js","../lib/route-handler.js","../lib/utils/extend.js","../lib/orm/model.js","../lib/serializer.js","../lib/serializers/json-api-serializer.js","../lib/serializer-registry.js","../lib/orm/schema.js","../lib/container.js","../lib/server.js","../lib/serializers/active-model-serializer.js","../lib/serializers/rest-serializer.js","../lib/utils/uuid.js","../lib/index.js"],"sourcesContent":["// jscs:disable disallowVar, requireArrayDestructuring\nimport uniq from \"lodash.uniq\";\nimport flatten from \"lodash.flatten\";\n/**\n @hide\n*/\nexport default function(edges) {\n let nodes = uniq(flatten(edges));\n let cursor = nodes.length;\n let sorted = new Array(cursor);\n let visited = {};\n let i = cursor;\n\n let visit = function(node, i, predecessors) {\n if (predecessors.indexOf(node) >= 0) {\n throw new Error(\n `Cyclic dependency in properties ${JSON.stringify(predecessors)}`\n );\n }\n\n if (visited[i]) {\n return;\n } else {\n visited[i] = true;\n }\n\n let outgoing = edges.filter(function(edge) {\n return edge && edge[0] === node;\n });\n i = outgoing.length;\n if (i) {\n let preds = predecessors.concat(node);\n do {\n let pair = outgoing[--i];\n let child = pair[1];\n if (child) {\n visit(child, nodes.indexOf(child), preds);\n }\n } while (i);\n }\n\n sorted[--cursor] = node;\n };\n\n while (i--) {\n if (!visited[i]) {\n visit(nodes[i], i, []);\n }\n }\n\n return sorted.reverse();\n}\n","import isPlainObject from \"lodash.isplainobject\";\nimport isFunction from \"lodash.isfunction\";\nimport mapValues from \"lodash.mapvalues\";\nimport referenceSort from \"./utils/reference-sort\";\n\nlet Factory = function() {\n this.build = function(sequence) {\n let object = {};\n let topLevelAttrs = Object.assign({}, this.attrs);\n delete topLevelAttrs.afterCreate;\n Object.keys(topLevelAttrs).forEach(attr => {\n if (Factory.isTrait.call(this, attr)) {\n delete topLevelAttrs[attr];\n }\n });\n let keys = sortAttrs(topLevelAttrs, sequence);\n\n keys.forEach(function(key) {\n let buildAttrs, buildSingleValue;\n\n buildAttrs = function(attrs) {\n return mapValues(attrs, buildSingleValue);\n };\n\n buildSingleValue = value => {\n if (Array.isArray(value)) {\n return value.map(buildSingleValue);\n } else if (isPlainObject(value)) {\n return buildAttrs(value);\n } else if (isFunction(value)) {\n return value.call(topLevelAttrs, sequence);\n } else {\n return value;\n }\n };\n\n let value = topLevelAttrs[key];\n if (isFunction(value)) {\n object[key] = value.call(object, sequence);\n } else {\n object[key] = buildSingleValue(value);\n }\n });\n\n return object;\n };\n};\n\nFactory.extend = function(attrs) {\n // Merge the new attributes with existing ones. If conflict, new ones win.\n let newAttrs = Object.assign({}, this.attrs, attrs);\n\n let Subclass = function() {\n this.attrs = newAttrs;\n Factory.call(this);\n };\n\n // Copy extend\n Subclass.extend = Factory.extend;\n Subclass.extractAfterCreateCallbacks = Factory.extractAfterCreateCallbacks;\n Subclass.isTrait = Factory.isTrait;\n\n // Store a reference on the class for future subclasses\n Subclass.attrs = newAttrs;\n\n return Subclass;\n};\n\nFactory.extractAfterCreateCallbacks = function({ traits } = {}) {\n let afterCreateCallbacks = [];\n let attrs = this.attrs || {};\n let traitCandidates;\n\n if (attrs.afterCreate) {\n afterCreateCallbacks.push(attrs.afterCreate);\n }\n\n if (Array.isArray(traits)) {\n traitCandidates = traits;\n } else {\n traitCandidates = Object.keys(attrs);\n }\n\n traitCandidates\n .filter(attr => {\n return this.isTrait(attr) && attrs[attr].extension.afterCreate;\n })\n .forEach(attr => {\n afterCreateCallbacks.push(attrs[attr].extension.afterCreate);\n });\n\n return afterCreateCallbacks;\n};\n\nFactory.isTrait = function(attrName) {\n let { attrs } = this;\n return isPlainObject(attrs[attrName]) && attrs[attrName].__isTrait__ === true;\n};\n\nfunction sortAttrs(attrs, sequence) {\n let Temp = function() {};\n let obj = new Temp();\n let refs = [];\n let property;\n\n Object.keys(attrs).forEach(function(key) {\n let value;\n Object.defineProperty(obj.constructor.prototype, key, {\n get() {\n refs.push([property, key]);\n return value;\n },\n set(newValue) {\n value = newValue;\n },\n enumerable: false,\n configurable: true\n });\n });\n\n Object.keys(attrs).forEach(function(key) {\n let value = attrs[key];\n if (typeof value !== \"function\") {\n obj[key] = value;\n }\n });\n\n Object.keys(attrs).forEach(function(key) {\n let value = attrs[key];\n property = key;\n\n if (typeof value === \"function\") {\n obj[key] = value.call(obj, sequence);\n }\n\n refs.push([key]);\n });\n\n return referenceSort(refs);\n}\n\n/**\n * @hide\n */\nexport default Factory;\n","function isNumber(n) {\n return (+n).toString() === n.toString();\n}\n\n/**\n By default Mirage uses autoincrementing numbers starting with `1` as IDs for records. This can be customized by implementing one or more IdentityManagers for your application.\n\n An IdentityManager is a class that's responsible for generating unique identifiers. You can define a custom identity manager for your entire application, as well as on a per-model basis.\n\n A custom IdentityManager must implement these methods:\n\n - `fetch`, which must return an identifier not yet used\n - `set`, which is called with an `id` of a record being insert into Mirage's database\n - `reset`, which should reset database to initial state\n\n Check out the advanced guide on Mocking UUIDs to see a complete example of a custom IdentityManager.\n\n @class IdentityManager\n @constructor\n @public\n*/\nclass IdentityManager {\n constructor() {\n this._nextId = 1;\n this._ids = {};\n }\n\n /**\n @method get\n @hide\n @private\n */\n get() {\n return this._nextId;\n }\n\n /**\n Registers `uniqueIdentifier` as used.\n\n This method should throw is `uniqueIdentifier` has already been taken.\n\n @method set\n @param {String|Number} uniqueIdentifier\n @public\n */\n set(uniqueIdentifier) {\n if (this._ids[uniqueIdentifier]) {\n throw new Error(\n `Attempting to use the ID ${uniqueIdentifier}, but it's already been used`\n );\n }\n\n if (isNumber(uniqueIdentifier) && +uniqueIdentifier >= this._nextId) {\n this._nextId = +uniqueIdentifier + 1;\n }\n\n this._ids[uniqueIdentifier] = true;\n }\n\n /**\n @method inc\n @hide\n @private\n */\n inc() {\n let nextValue = this.get() + 1;\n\n this._nextId = nextValue;\n\n return nextValue;\n }\n\n /**\n Returns the next unique identifier.\n\n @method fetch\n @return {String} Unique identifier\n @public\n */\n fetch() {\n let id = this.get();\n\n this._ids[id] = true;\n\n this.inc();\n\n return id.toString();\n }\n\n /**\n Resets the identity manager, marking all unique identifiers as available.\n\n @method reset\n @public\n */\n reset() {\n this._nextId = 1;\n this._ids = {};\n }\n}\n\nexport default IdentityManager;\n","/**\n @hide\n*/\nlet association = function(...traitsAndOverrides) {\n let __isAssociation__ = true;\n\n return {\n __isAssociation__,\n traitsAndOverrides\n };\n};\n\nexport default association;\n","let trait = function(extension) {\n let __isTrait__ = true;\n return {\n extension,\n __isTrait__\n };\n};\n\n/**\n @hide\n*/\nexport default trait;\n","const warn = console.warn; // eslint-disable-line no-console\n\n/**\n You can use this class when you want more control over your route handlers response.\n\n Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler.\n\n ```js\n import { Response } from 'miragejs';\n\n this.get('/users', () => {\n return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] });\n });\n ```\n*/\nexport default class Response {\n constructor(code, headers = {}, data) {\n this.code = code;\n this.headers = headers;\n\n // Default data for \"undefined 204\" responses to empty string (no content)\n if (code === 204) {\n if (data !== undefined && data !== \"\") {\n warn(\n `Mirage: One of your route handlers is returning a custom\n 204 Response that has data, but this is a violation of the HTTP spec\n and could lead to unexpected behavior. 204 responses should have no\n content (an empty string) as their body.`\n );\n } else {\n this.data = \"\";\n }\n\n // Default data for \"empty untyped\" responses to empty JSON object\n } else if (\n (data === undefined || data === \"\") &&\n !Object.prototype.hasOwnProperty.call(this.headers, \"Content-Type\")\n ) {\n this.data = {};\n } else {\n this.data = data;\n }\n\n // Default \"untyped\" responses to application/json\n if (\n code !== 204 &&\n !Object.prototype.hasOwnProperty.call(this.headers, \"Content-Type\")\n ) {\n this.headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n toRackResponse() {\n return [this.code, this.headers, this.data];\n }\n}\n","import {\n underscore as _underscore,\n capitalize as _capitalize,\n camelize as _camelize,\n dasherize as _dasherize\n} from \"inflected\";\nimport lowerFirst from \"lodash.lowerfirst\";\n\nconst camelizeCache = {};\nconst dasherizeCache = {};\nconst underscoreCache = {};\nconst capitalizeCache = {};\n\n/**\n * @param {String} word\n * @hide\n */\nexport function camelize(word) {\n if (typeof camelizeCache[word] !== \"string\") {\n let camelizedWord = _camelize(underscore(word), false);\n\n /*\n The `ember-inflector` package's version of camelize lower-cases the first\n word after a slash, e.g.\n\n camelize('my-things/nice-watch'); // 'myThings/niceWatch'\n\n The `inflected` package doesn't, so we make that change here to not break\n existing functionality. (This affects the name of the schema collections.)\n */\n const camelized = camelizedWord\n .split(\"/\")\n .map(lowerFirst)\n .join(\"/\");\n\n camelizeCache[word] = camelized;\n }\n\n return camelizeCache[word];\n}\n\n/**\n * @param {String} word\n * @hide\n */\nexport function dasherize(word) {\n if (typeof dasherizeCache[word] !== \"string\") {\n const dasherized = _dasherize(underscore(word));\n\n dasherizeCache[word] = dasherized;\n }\n\n return dasherizeCache[word];\n}\n\nexport function underscore(word) {\n if (typeof underscoreCache[word] !== \"string\") {\n const underscored = _underscore(word);\n\n underscoreCache[word] = underscored;\n }\n\n return underscoreCache[word];\n}\n\nexport function capitalize(word) {\n if (typeof capitalizeCache[word] !== \"string\") {\n const capitalized = _capitalize(word);\n\n capitalizeCache[word] = capitalized;\n }\n\n return capitalizeCache[word];\n}\n","import isPlainObject from \"lodash.isplainobject\";\n\n/**\n @hide\n*/\nexport default function(object) {\n return isPlainObject(object) && object.__isAssociation__ === true;\n}\n","/* eslint no-console: 0 */\nlet errorProps = [\n \"description\",\n \"fileName\",\n \"lineNumber\",\n \"message\",\n \"name\",\n \"number\",\n \"stack\"\n];\n\n/**\n @hide\n*/\nexport default function assert(bool, text) {\n if (typeof bool === \"string\" && !text) {\n // console.error(`Mirage: ${bool}`);\n throw new MirageError(bool);\n }\n\n if (!bool) {\n // console.error(`Mirage: ${text}`);\n throw new MirageError(text.replace(/^ +/gm, \"\") || \"Assertion failed\");\n }\n}\n\n/**\n @public\n @hide\n Copied from ember-metal/error\n*/\nexport function MirageError(message, stack) {\n let tmp = Error(message);\n\n if (stack) {\n tmp.stack = stack;\n }\n\n for (let idx = 0; idx < errorProps.length; idx++) {\n let prop = errorProps[idx];\n\n if ([\"description\", \"message\", \"stack\"].indexOf(prop) > -1) {\n this[prop] = `Mirage: ${tmp[prop]}`;\n } else {\n this[prop] = tmp[prop];\n }\n }\n}\n\nMirageError.prototype = Object.create(Error.prototype);\n","import { dasherize } from \"../../utils/inflector\";\n\n/**\n Associations are used to define relationships between your Models.\n\n @class Association\n @constructor\n @public\n*/\nexport default class Association {\n constructor(modelName, opts) {\n if (typeof modelName === \"object\") {\n // Received opts only\n this.modelName = undefined;\n this.opts = modelName;\n } else {\n // The modelName of the association. (Might not be passed in - set later\n // by schema).\n this.modelName = modelName ? dasherize(modelName) : \"\";\n this.opts = opts || {};\n }\n\n // The key pointing to the association\n this.key = \"\";\n\n // The modelName that owns this association\n this.ownerModelName = \"\";\n }\n\n /**\n A setter for schema, since we don't have a reference at constuction time.\n\n @method setSchema\n @public\n @hide\n */\n setSchema(schema) {\n this.schema = schema;\n }\n\n /**\n Returns true if the association is reflexive.\n\n @method isReflexive\n @return {Boolean}\n @public\n */\n isReflexive() {\n let isExplicitReflexive = !!(\n this.modelName === this.ownerModelName && this.opts.inverse\n );\n let isImplicitReflexive = !!(\n this.opts.inverse === undefined && this.ownerModelName === this.modelName\n );\n\n return isExplicitReflexive || isImplicitReflexive;\n }\n\n get isPolymorphic() {\n return this.opts.polymorphic;\n }\n\n /**\n @hide\n */\n get identifier() {\n throw new Error(\n \"Subclasses of Association must implement a getter for identifier\"\n );\n }\n}\n","import Association from \"./association\";\nimport { capitalize, camelize } from \"../../utils/inflector\";\nimport assert from \"../../assert\";\n\nconst identifierCache = {};\n\n/**\n * The belongsTo association adds a fk to the owner of the association\n *\n * @class BelongsTo\n * @extends Association\n * @constructor\n * @public\n * @hide\n */\nexport default class BelongsTo extends Association {\n get identifier() {\n if (typeof identifierCache[this.key] !== \"string\") {\n const identifier = `${camelize(this.key)}Id`;\n\n identifierCache[this.key] = identifier;\n }\n\n return identifierCache[this.key];\n }\n\n /**\n * @method getForeignKeyArray\n * @return {Array} Array of camelized name of the model owning the association\n * and foreign key for the association\n * @public\n */\n getForeignKeyArray() {\n return [camelize(this.ownerModelName), this.getForeignKey()];\n }\n\n /**\n * @method getForeignKey\n * @return {String} Foreign key for the association\n * @public\n */\n getForeignKey() {\n // we reuse identifierCache because it's the same logic as get identifier\n if (typeof identifierCache[this.key] !== \"string\") {\n const foreignKey = `${camelize(this.key)}Id`;\n\n identifierCache[this.key] = foreignKey;\n }\n\n return identifierCache[this.key];\n }\n\n /**\n * Registers belongs-to association defined by given key on given model,\n * defines getters / setters for associated parent and associated parent's id,\n * adds methods for creating unsaved parent record and creating a saved one\n *\n * @method addMethodsToModelClass\n * @param {Function} ModelClass\n * @param {String} key the named key for the association\n * @public\n */\n addMethodsToModelClass(ModelClass, key) {\n let modelPrototype = ModelClass.prototype;\n let association = this;\n let foreignKey = this.getForeignKey();\n let associationHash = { [key]: this };\n\n modelPrototype.belongsToAssociations = Object.assign(\n modelPrototype.belongsToAssociations,\n associationHash\n );\n\n // update belongsToAssociationFks\n Object.keys(modelPrototype.belongsToAssociations).forEach(key => {\n const value = modelPrototype.belongsToAssociations[key];\n modelPrototype.belongsToAssociationFks[value.getForeignKey()] = value;\n });\n\n // Add to target's dependent associations array\n this.schema.addDependentAssociation(this, this.modelName);\n\n // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above?\n // Or we could use a single data structure to store this information?\n modelPrototype.associationKeys.add(key);\n modelPrototype.associationIdKeys.add(foreignKey);\n\n Object.defineProperty(modelPrototype, foreignKey, {\n /*\n object.parentId\n - returns the associated parent's id\n */\n get() {\n this._tempAssociations = this._tempAssociations || {};\n let tempParent = this._tempAssociations[key];\n let id;\n\n if (tempParent === null) {\n id = null;\n } else {\n if (association.isPolymorphic) {\n if (tempParent) {\n id = { id: tempParent.id, type: tempParent.modelName };\n } else {\n id = this.attrs[foreignKey];\n }\n } else {\n if (tempParent) {\n id = tempParent.id;\n } else {\n id = this.attrs[foreignKey];\n }\n }\n }\n\n return id;\n },\n\n /*\n object.parentId = (parentId)\n - sets the associated parent via id\n */\n set(id) {\n let tempParent;\n\n if (id === null) {\n tempParent = null;\n } else if (id !== undefined) {\n if (association.isPolymorphic) {\n assert(\n typeof id === \"object\",\n `You're setting an ID on the polymorphic association '${association.key}' but you didn't pass in an object. Polymorphic IDs need to be in the form { type, id }.`\n );\n tempParent = association.schema[\n association.schema.toCollectionName(id.type)\n ].find(id.id);\n } else {\n tempParent = association.schema[\n association.schema.toCollectionName(association.modelName)\n ].find(id);\n assert(\n tempParent,\n `Couldn't find ${association.modelName} with id = ${id}`\n );\n }\n }\n\n this[key] = tempParent;\n }\n });\n\n Object.defineProperty(modelPrototype, key, {\n /*\n object.parent\n - returns the associated parent\n */\n get() {\n this._tempAssociations = this._tempAssociations || {};\n\n let tempParent = this._tempAssociations[key];\n let foreignKeyId = this[foreignKey];\n let model = null;\n\n if (tempParent) {\n model = tempParent;\n } else if (foreignKeyId !== null) {\n if (association.isPolymorphic) {\n model = association.schema[\n association.schema.toCollectionName(foreignKeyId.type)\n ].find(foreignKeyId.id);\n } else {\n model = association.schema[\n association.schema.toCollectionName(association.modelName)\n ].find(foreignKeyId);\n }\n }\n\n return model;\n },\n\n /*\n object.parent = (parentModel)\n - sets the associated parent via model\n\n I want to jot some notes about hasInverseFor. There used to be an\n association.inverse() check, but adding polymorphic associations\n complicated this. `comment.commentable`, you can't easily check for an\n inverse since `comments: hasMany()` could be on any model.\n\n Instead of making it very complex and looking for an inverse on the\n association in isoaltion, it was much simpler to ask the model being\n passed in if it had an inverse for the setting model and with its\n association.\n */\n set(model) {\n this._tempAssociations = this._tempAssociations || {};\n this._tempAssociations[key] = model;\n\n if (model && model.hasInverseFor(association)) {\n let inverse = model.inverseFor(association);\n\n model.associate(this, inverse);\n }\n }\n });\n\n /*\n object.newParent\n - creates a new unsaved associated parent\n\n TODO: document polymorphic\n */\n modelPrototype[`new${capitalize(key)}`] = function(...args) {\n let modelName, attrs;\n\n if (association.isPolymorphic) {\n modelName = args[0];\n attrs = args[1];\n } else {\n modelName = association.modelName;\n attrs = args[0];\n }\n\n let parent = association.schema[\n association.schema.toCollectionName(modelName)\n ].new(attrs);\n\n this[key] = parent;\n\n return parent;\n };\n\n /*\n object.createParent\n - creates a new saved associated parent, and immediately persists both models\n\n TODO: document polymorphic\n */\n modelPrototype[`create${capitalize(key)}`] = function(...args) {\n let modelName, attrs;\n if (association.isPolymorphic) {\n modelName = args[0];\n attrs = args[1];\n } else {\n modelName = association.modelName;\n attrs = args[0];\n }\n\n let parent = association.schema[\n association.schema.toCollectionName(modelName)\n ].create(attrs);\n\n this[key] = parent;\n this.save();\n\n return parent.reload();\n };\n }\n\n /**\n *\n *\n * @public\n */\n disassociateAllDependentsFromTarget(model) {\n let owner = this.ownerModelName;\n let fk;\n\n if (this.isPolymorphic) {\n fk = { type: model.modelName, id: model.id };\n } else {\n fk = model.id;\n }\n\n let dependents = this.schema[this.schema.toCollectionName(owner)].where(\n potentialOwner => {\n let id = potentialOwner[this.getForeignKey()];\n\n if (!id) {\n return false;\n }\n\n if (typeof id === \"object\") {\n return id.type === fk.type && id.id === fk.id;\n } else {\n return id === fk;\n }\n }\n );\n\n dependents.models.forEach(dependent => {\n dependent.disassociate(model, this);\n dependent.save();\n });\n }\n}\n","import isEqual from \"lodash.isequal\";\nimport map from \"lodash.map\";\n\nfunction duplicate(data) {\n if (Array.isArray(data)) {\n return data.map(duplicate);\n } else {\n return Object.assign({}, data);\n }\n}\n\n/**\n Mirage's `Db` has many `DbCollections`, which are equivalent to tables from traditional databases. They store specific types of data, for example `users` and `posts`.\n\n `DbCollections` have names, like `users`, which you use to access the collection from the `Db` object.\n\n Suppose you had a `user` model defined, and the following data had been inserted into your database (either through factories or fixtures):\n\n ```js\n export default [\n { id: 1, name: 'Zelda' },\n { id: 2, name: 'Link' }\n ];\n ```\n\n Then `db.contacts` would return this array.\n\n @class DbCollection\n @constructor\n @public\n */\nclass DbCollection {\n constructor(name, initialData, IdentityManager) {\n this.name = name;\n this._records = [];\n this.identityManager = new IdentityManager();\n\n if (initialData) {\n this.insert(initialData);\n }\n }\n\n /**\n * Returns a copy of the data, to prevent inadvertent data manipulation.\n * @method all\n * @public\n * @hide\n */\n all() {\n return duplicate(this._records);\n }\n\n /**\n Inserts `data` into the collection. `data` can be a single object\n or an array of objects. Returns the inserted record.\n\n ```js\n // Insert a single record\n let link = db.users.insert({ name: 'Link', age: 173 });\n\n link; // { id: 1, name: 'Link', age: 173 }\n\n // Insert an array\n let users = db.users.insert([\n { name: 'Zelda', age: 142 },\n { name: 'Epona', age: 58 },\n ]);\n\n users; // [ { id: 2, name: 'Zelda', age: 142 }, { id: 3, name: 'Epona', age: 58 } ]\n ```\n\n @method insert\n @param data\n @public\n */\n insert(data) {\n if (!Array.isArray(data)) {\n return this._insertRecord(data);\n } else {\n return map(data, attrs => this._insertRecord(attrs));\n }\n }\n\n /**\n Returns a single record from the `collection` if `ids` is a single\n id, or an array of records if `ids` is an array of ids. Note\n each id can be an int or a string, but integer ids as strings\n (e.g. the string “1”) will be treated as integers.\n\n ```js\n // Given users = [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]\n\n db.users.find(1); // {id: 1, name: 'Link'}\n db.users.find([1, 2]); // [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]\n ```\n\n @method find\n @param ids\n @public\n */\n find(ids) {\n if (Array.isArray(ids)) {\n let records = this._findRecords(ids)\n .filter(Boolean)\n .map(duplicate); // Return a copy\n\n return records;\n } else {\n let record = this._findRecord(ids);\n if (!record) {\n return null;\n }\n\n // Return a copy\n return duplicate(record);\n }\n }\n\n /**\n Returns the first model from `collection` that matches the\n key-value pairs in the `query` object. Note that a string\n comparison is used. `query` is a POJO.\n\n ```js\n // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]\n db.users.findBy({ name: 'Link' }); // { id: 1, name: 'Link' }\n ```\n\n @method find\n @param query\n @public\n */\n findBy(query) {\n let record = this._findRecordBy(query);\n if (!record) {\n return null;\n }\n\n // Return a copy\n return duplicate(record);\n }\n\n /**\n Returns an array of models from `collection` that match the\n key-value pairs in the `query` object. Note that a string\n comparison is used. `query` is a POJO.\n\n ```js\n // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]\n\n db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ]\n ```\n\n @method where\n @param query\n @public\n */\n where(query) {\n return this._findRecordsWhere(query).map(duplicate);\n }\n\n /**\n Finds the first record matching the provided _query_ in\n `collection`, or creates a new record using a merge of the\n `query` and optional `attributesForCreate`.\n\n Often times you may have a pattern like the following in your API stub:\n\n ```js\n // Given users = [\n // { id: 1, name: 'Link' },\n // { id: 2, name: 'Zelda' }\n // ]\n\n // Create Link if he doesn't yet exist\n let records = db.users.where({ name: 'Link' });\n let record;\n\n if (records.length > 0) {\n record = records[0];\n } else {\n record = db.users.insert({ name: 'Link' });\n }\n ```\n\n You can now replace this with the following:\n\n ```js\n let record = db.users.firstOrCreate({ name: 'Link' });\n ```\n\n An extended example using *attributesForCreate*:\n\n ```js\n let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false });\n ```\n\n @method firstOrCreate\n @param query\n @param attributesForCreate\n @public\n */\n firstOrCreate(query, attributesForCreate = {}) {\n let queryResult = this.where(query);\n let [record] = queryResult;\n\n if (record) {\n return record;\n } else {\n let mergedAttributes = Object.assign(attributesForCreate, query);\n let createdRecord = this.insert(mergedAttributes);\n\n return createdRecord;\n }\n }\n\n /**\n Updates one or more records in the collection.\n\n If *attrs* is the only arg present, updates all records in the collection according to the key-value pairs in *attrs*.\n\n If *target* is present, restricts updates to those that match *target*. If *target* is a number or string, finds a single record whose id is *target* to update. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and updates their *attrs*.\n\n Returns the updated record or records.\n\n ```js\n // Given users = [\n // {id: 1, name: 'Link'},\n // {id: 2, name: 'Zelda'}\n // ]\n\n db.users.update({name: 'Ganon'}); // db.users = [{id: 1, name: 'Ganon'}, {id: 2, name: 'Ganon'}]\n db.users.update(1, {name: 'Young Link'}); // db.users = [{id: 1, name: 'Young Link'}, {id: 2, name: 'Zelda'}]\n db.users.update({name: 'Link'}, {name: 'Epona'}); // db.users = [{id: 1, name: 'Epona'}, {id: 2, name: 'Zelda'}]\n ```\n\n @method update\n @param target\n @param attrs\n @public\n */\n update(target, attrs) {\n let records;\n\n if (typeof attrs === \"undefined\") {\n attrs = target;\n let changedRecords = [];\n\n this._records.forEach(record => {\n let oldRecord = Object.assign({}, record);\n\n this._updateRecord(record, attrs);\n\n if (!isEqual(oldRecord, record)) {\n changedRecords.push(record);\n }\n });\n\n return changedRecords;\n } else if (typeof target === \"number\" || typeof target === \"string\") {\n let id = target;\n let record = this._findRecord(id);\n\n this._updateRecord(record, attrs);\n\n return record;\n } else if (Array.isArray(target)) {\n let ids = target;\n records = this._findRecords(ids);\n\n records.forEach(record => {\n this._updateRecord(record, attrs);\n });\n\n return records;\n } else if (typeof target === \"object\") {\n let query = target;\n records = this._findRecordsWhere(query);\n\n records.forEach(record => {\n this._updateRecord(record, attrs);\n });\n\n return records;\n }\n }\n\n /**\n Removes one or more records in *collection*.\n\n If *target* is undefined, removes all records. If *target* is a number or string, removes a single record using *target* as id. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and removes them from the collection.\n\n ```js\n // Given users = [\n // {id: 1, name: 'Link'},\n // {id: 2, name: 'Zelda'}\n // ]\n\n db.users.remove(); // db.users = []\n db.users.remove(1); // db.users = [{id: 2, name: 'Zelda'}]\n db.users.remove({name: 'Zelda'}); // db.users = [{id: 1, name: 'Link'}]\n ```\n\n @method remove\n @param target\n @public\n */\n remove(target) {\n let records;\n\n if (typeof target === \"undefined\") {\n this._records = [];\n this.identityManager.reset();\n } else if (typeof target === \"number\" || typeof target === \"string\") {\n let record = this._findRecord(target);\n let index = this._records.indexOf(record);\n this._records.splice(index, 1);\n } else if (Array.isArray(target)) {\n records = this._findRecords(target);\n records.forEach(record => {\n let index = this._records.indexOf(record);\n this._records.splice(index, 1);\n });\n } else if (typeof target === \"object\") {\n records = this._findRecordsWhere(target);\n records.forEach(record => {\n let index = this._records.indexOf(record);\n this._records.splice(index, 1);\n });\n }\n }\n\n /*\n Private methods.\n\n These return the actual db objects, whereas the public\n API query methods return copies.\n */\n\n /**\n @method _findRecord\n @param id\n @private\n @hide\n */\n _findRecord(id) {\n id = id.toString();\n\n return this._records.find(obj => obj.id === id);\n }\n\n /**\n @method _findRecordBy\n @param query\n @private\n @hide\n */\n _findRecordBy(query) {\n return this._findRecordsWhere(query)[0];\n }\n\n /**\n @method _findRecords\n @param ids\n @private\n @hide\n */\n _findRecords(ids) {\n return ids.map(this._findRecord, this);\n }\n\n /**\n @method _findRecordsWhere\n @param query\n @private\n @hide\n */\n _findRecordsWhere(query) {\n let records = this._records;\n\n function defaultQueryFunction(record) {\n let keys = Object.keys(query);\n\n return keys.every(function(key) {\n return String(record[key]) === String(query[key]);\n });\n }\n\n let queryFunction =\n typeof query === \"object\" ? defaultQueryFunction : query;\n\n return records.filter(queryFunction);\n }\n\n /**\n @method _insertRecord\n @param data\n @private\n @hide\n */\n _insertRecord(data) {\n let attrs = duplicate(data);\n\n if (attrs && (attrs.id === undefined || attrs.id === null)) {\n attrs.id = this.identityManager.fetch(attrs);\n } else {\n attrs.id = attrs.id.toString();\n\n this.identityManager.set(attrs.id);\n }\n\n this._records.push(attrs);\n\n return duplicate(attrs);\n }\n\n /**\n @method _updateRecord\n @param record\n @param attrs\n @private\n @hide\n */\n _updateRecord(record, attrs) {\n let targetId =\n attrs && Object.prototype.hasOwnProperty.call(attrs, \"id\")\n ? attrs.id.toString()\n : null;\n let currentId = record.id;\n\n if (targetId && currentId !== targetId) {\n throw new Error(\"Updating the ID of a record is not permitted\");\n }\n\n for (let attr in attrs) {\n if (attr === \"id\") {\n continue;\n }\n\n record[attr] = attrs[attr];\n }\n }\n}\n\nexport default DbCollection;\n","import DbCollection from \"./db-collection\";\nimport IdentityManager from \"./identity-manager\";\nimport cloneDeep from \"lodash.clonedeep\";\n\n/**\n Your Mirage server has a database which you can interact with in your route handlers. You’ll typically use models to interact with your database data, but you can always reach into the db directly in the event you want more control.\n\n Access the db from your route handlers via `schema.db`.\n\n You can access individual DbCollections by using `schema.db.name`:\n\n ```js\n schema.db.users // would return, e.g., [ { id: 1, name: 'Yehuda' }, { id: 2, name: 'Tom '} ]\n ```\n\n @class Db\n @constructor\n @public\n */\nclass Db {\n constructor(initialData, identityManagers) {\n this._collections = [];\n\n this.registerIdentityManagers(identityManagers);\n\n if (initialData) {\n this.loadData(initialData);\n }\n }\n\n /**\n Loads an object of data into Mirage's database.\n\n The keys of the object correspond to the DbCollections, and the values are arrays of records.\n\n ```js\n server.db.loadData({\n users: [\n { name: 'Yehuda' },\n { name: 'Tom' }\n ]\n });\n ```\n\n As with `db.collection.insert`, IDs will automatically be created for records that don't have them.\n\n @method loadData\n @param {Object} data - Data to load\n @public\n */\n loadData(data) {\n for (let key in data) {\n this.createCollection(key, cloneDeep(data[key]));\n }\n }\n\n /**\n Logs out the contents of the Db.\n\n ```js\n server.db.dump() // { users: [ name: 'Yehuda', ...\n ```\n\n @method dump\n @public\n */\n dump() {\n return this._collections.reduce((data, collection) => {\n data[collection.name] = collection.all();\n\n return data;\n }, {});\n }\n\n /**\n Add an empty collection named _name_ to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined.\n\n @method createCollection\n @param name\n @param initialData (optional)\n @public\n */\n createCollection(name, initialData) {\n if (!this[name]) {\n let IdentityManager = this.identityManagerFor(name);\n let newCollection = new DbCollection(name, initialData, IdentityManager);\n\n // Public API has a convenient array interface. It comes at the cost of\n // returning a copy of all records to avoid accidental mutations.\n Object.defineProperty(this, name, {\n get() {\n let recordsCopy = newCollection.all();\n\n [\n \"insert\",\n \"find\",\n \"findBy\",\n \"where\",\n \"update\",\n \"remove\",\n \"firstOrCreate\"\n ].forEach(function(method) {\n recordsCopy[method] = function() {\n return newCollection[method](...arguments);\n };\n });\n\n return recordsCopy;\n }\n });\n\n // Private API does not have the array interface. This means internally, only\n // db-collection methods can be used. This is so records aren't copied redundantly\n // internally, which leads to accidental O(n^2) operations (e.g., createList).\n Object.defineProperty(this, `_${name}`, {\n get() {\n let recordsCopy = [];\n\n [\n \"insert\",\n \"find\",\n \"findBy\",\n \"where\",\n \"update\",\n \"remove\",\n \"firstOrCreate\"\n ].forEach(function(method) {\n recordsCopy[method] = function() {\n return newCollection[method](...arguments);\n };\n });\n\n return recordsCopy;\n }\n });\n\n this._collections.push(newCollection);\n } else if (initialData) {\n this[name].insert(initialData);\n }\n\n return this;\n }\n\n /**\n @method createCollections\n @param ...collections\n @public\n @hide\n */\n createCollections(...collections) {\n collections.forEach(c => this.createCollection(c));\n }\n\n /**\n Removes all data from Mirage's database.\n\n @method emptyData\n @public\n */\n emptyData() {\n this._collections.forEach(c => c.remove());\n }\n\n /**\n @method identityManagerFor\n @param name\n @public\n @hide\n */\n identityManagerFor(name) {\n return (\n this._identityManagers[this._container.inflector.singularize(name)] ||\n this._identityManagers.application ||\n IdentityManager\n );\n }\n\n /**\n @method registerIdentityManagers\n @public\n @hide\n */\n registerIdentityManagers(identityManagers) {\n this._identityManagers = identityManagers || {};\n }\n}\n\nexport default Db;\n","import assert from \"../assert\";\nimport invokeMap from \"lodash.invokemap\";\n\n/**\n Collections represent arrays of models. They are returned by a hasMany association, or by one of the ModelClass query methods:\n\n ```js\n let posts = user.blogPosts;\n let posts = schema.blogPosts.all();\n let posts = schema.blogPosts.find([1, 2, 4]);\n let posts = schema.blogPosts.where({ published: true });\n ```\n\n Note that there is also a `PolymorphicCollection` class that is identical to `Collection`, except it can contain a heterogeneous array of models. Thus, it has no `modelName` property. This lets serializers and other parts of the system interact with it differently.\n\n @class Collection\n @constructor\n @public\n*/\nexport default class Collection {\n constructor(modelName, models = []) {\n assert(\n modelName && typeof modelName === \"string\",\n \"You must pass a `modelName` into a Collection\"\n );\n\n /**\n The dasherized model name this Collection represents.\n\n ```js\n let posts = user.blogPosts;\n\n posts.modelName; // \"blog-post\"\n ```\n\n The model name is separate from the actual models, since Collections can be empty.\n\n @property modelName\n @type {String}\n @public\n */\n this.modelName = modelName;\n\n /**\n The underlying plain JavaScript array of Models in this Collection.\n\n ```js\n posts.models // [ post:1, post:2, ... ]\n ```\n\n While Collections have many array-ish methods like `filter` and `sort`, it\n can be useful to work with the plain array if you want to work with methods\n like `map`, or use the `[]` accessor.\n\n For example, in testing you might want to assert against a model from the\n collection:\n\n ```js\n let newPost = user.posts.models[0].title;\n\n assert.equal(newPost, \"My first post\");\n ```\n\n @property models\n @type {Array}\n @public\n */\n this.models = models;\n }\n\n /**\n The number of models in the collection.\n\n ```js\n user.posts.length; // 2\n ```\n\n @property length\n @type {Integer}\n @public\n */\n get length() {\n return this.models.length;\n }\n\n /**\n Updates each model in the collection, and immediately persists all changes to the db.\n\n ```js\n let posts = user.blogPosts;\n\n posts.update('published', true); // the db was updated for all posts\n ```\n\n @method update\n @param key\n @param val\n @return this\n @public\n */\n update(...args) {\n invokeMap(this.models, \"update\", ...args);\n\n return this;\n }\n\n /**\n Saves all models in the collection.\n\n ```js\n let posts = user.blogPosts;\n\n posts.models[0].published = true;\n\n posts.save(); // all posts saved to db\n ```\n\n @method save\n @return this\n @public\n */\n save() {\n invokeMap(this.models, \"save\");\n\n return this;\n }\n\n /**\n Reloads each model in the collection.\n\n ```js\n let posts = author.blogPosts;\n\n // ...\n\n posts.reload(); // reloads data for each post from the db\n ```\n\n @method reload\n @return this\n @public\n */\n reload() {\n invokeMap(this.models, \"reload\");\n\n return this;\n }\n\n /**\n Destroys the db record for all models in the collection.\n\n ```js\n let posts = user.blogPosts;\n\n posts.destroy(); // all posts removed from db\n ```\n\n @method destroy\n @return this\n @public\n */\n destroy() {\n invokeMap(this.models, \"destroy\");\n\n return this;\n }\n\n /**\n Adds a model to this collection.\n\n ```js\n posts.length; // 1\n\n posts.add(newPost);\n\n posts.length; // 2\n ```\n\n @method add\n @param {Model} model\n @return this\n @public\n */\n add(model) {\n this.models.push(model);\n\n return this;\n }\n\n /**\n Removes a model from this collection.\n\n ```js\n posts.length; // 5\n\n let firstPost = posts.models[0];\n posts.remove(firstPost);\n posts.save();\n\n posts.length; // 4\n ```\n\n @method remove\n @param {Model} model\n @return this\n @public\n */\n remove(model) {\n let match = this.models.find(m => m.toString() === model.toString());\n if (match) {\n let i = this.models.indexOf(match);\n this.models.splice(i, 1);\n }\n\n return this;\n }\n\n /**\n Checks if the Collection includes the given model.\n\n ```js\n posts.includes(newPost);\n ```\n\n Works by checking if the given model name and id exists in the Collection,\n making it a bit more flexible than strict object equality.\n\n ```js\n let post = server.create('post');\n let programming = server.create('tag', { text: 'Programming' });\n\n visit(`/posts/${post.id}`);\n click('.tag-selector');\n click('.tag:contains(Programming)');\n\n post.reload();\n assert.ok(post.tags.includes(programming));\n ```\n\n @method includes\n @return {Boolean}\n @public\n */\n includes(model) {\n return this.models.some(m => m.toString() === model.toString());\n }\n\n /**\n Returns a new Collection with its models filtered according to the provided [callback function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter).\n\n ```js\n let publishedPosts = user.posts.filter(post => post.isPublished);\n ```\n @method filter\n @param {Function} f\n @return {Collection}\n @public\n */\n filter(f) {\n let filteredModels = this.models.filter(f);\n\n return new Collection(this.modelName, filteredModels);\n }\n\n /**\n Returns a new Collection with its models sorted according to the provided [compare function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n\n ```js\n let postsByTitleAsc = user.posts.sort((a, b) => {\n return b.title < a.title;\n });\n ```\n\n @method sort\n @param {Function} f\n @return {Collection}\n @public\n */\n sort(f) {\n let sortedModels = this.models.concat().sort(f);\n\n return new Collection(this.modelName, sortedModels);\n }\n\n /**\n Returns a new Collection with a subset of its models selected from `begin` to `end`.\n\n ```js\n let firstThreePosts = user.posts.slice(0, 3);\n ```\n\n @method slice\n @param {Integer} begin\n @param {Integer} end\n @return {Collection}\n @public\n */\n slice(...args) {\n let slicedModels = this.models.slice(...args);\n\n return new Collection(this.modelName, slicedModels);\n }\n\n /**\n Modifies the Collection by merging the models from another collection.\n\n ```js\n user.posts.mergeCollection(newPosts);\n user.posts.save();\n ```\n\n @method mergeCollection\n @param {Collection} collection\n @return this\n @public\n */\n mergeCollection(collection) {\n this.models = this.models.concat(collection.models);\n\n return this;\n }\n\n /**\n Simple string representation of the collection and id.\n\n ```js\n user.posts.toString(); // collection:post(post:1,post:4)\n ```\n\n @method toString\n @return {String}\n @public\n */\n toString() {\n return `collection:${this.modelName}(${this.models\n .map(m => m.id)\n .join(\",\")})`;\n }\n}\n","import invokeMap from \"lodash.invokemap\";\nimport isEqual from \"lodash.isequal\";\n\n/**\n * An array of models, returned from one of the schema query\n * methods (all, find, where). Knows how to update and destroy its models.\n *\n * Identical to Collection except it can contain a heterogeneous array of\n * models. Thus, it has no `modelName` property. This lets serializers and\n * other parts of the system interact with it differently.\n *\n * @class PolymorphicCollection\n * @constructor\n * @public\n * @hide\n */\nexport default class PolymorphicCollection {\n constructor(models = []) {\n this.models = models;\n }\n\n /**\n * Number of models in the collection.\n *\n * @property length\n * @type Number\n * @public\n */\n get length() {\n return this.models.length;\n }\n\n /**\n * Updates each model in the collection (persisting immediately to the db).\n * @method update\n * @param key\n * @param val\n * @return this\n * @public\n */\n update(...args) {\n invokeMap(this.models, \"update\", ...args);\n\n return this;\n }\n\n /**\n * Destroys the db record for all models in the collection.\n * @method destroy\n * @return this\n * @public\n */\n destroy() {\n invokeMap(this.models, \"destroy\");\n\n return this;\n }\n\n /**\n * Saves all models in the collection.\n * @method save\n * @return this\n * @public\n */\n save() {\n invokeMap(this.models, \"save\");\n\n return this;\n }\n\n /**\n * Reloads each model in the collection.\n * @method reload\n * @return this\n * @public\n */\n reload() {\n invokeMap(this.models, \"reload\");\n\n return this;\n }\n\n /**\n * Adds a model to this collection\n *\n * @method add\n * @return this\n * @public\n */\n add(model) {\n this.models.push(model);\n\n return this;\n }\n\n /**\n * Removes a model to this collection\n *\n * @method remove\n * @return this\n * @public\n */\n remove(model) {\n let match = this.models.find(m => isEqual(m.attrs, model.attrs));\n if (match) {\n let i = this.models.indexOf(match);\n this.models.splice(i, 1);\n }\n\n return this;\n }\n\n /**\n * Checks if the collection includes the model\n *\n * @method includes\n * @return boolean\n * @public\n */\n includes(model) {\n return this.models.some(m => isEqual(m.attrs, model.attrs));\n }\n\n /**\n * @method filter\n * @param f\n * @return {Collection}\n * @public\n */\n filter(f) {\n let filteredModels = this.models.filter(f);\n\n return new PolymorphicCollection(filteredModels);\n }\n\n /**\n * @method sort\n * @param f\n * @return {Collection}\n * @public\n */\n sort(f) {\n let sortedModels = this.models.concat().sort(f);\n\n return new PolymorphicCollection(sortedModels);\n }\n\n /**\n * @method slice\n * @param {Integer} begin\n * @param {Integer} end\n * @return {Collection}\n * @public\n */\n slice(...args) {\n let slicedModels = this.models.slice(...args);\n\n return new PolymorphicCollection(slicedModels);\n }\n\n /**\n * @method mergeCollection\n * @param collection\n * @return this\n * @public\n */\n mergeCollection(collection) {\n this.models = this.models.concat(collection.models);\n\n return this;\n }\n\n /**\n * Simple string representation of the collection and id.\n * @method toString\n * @return {String}\n * @public\n */\n toString() {\n return `collection:${this.modelName}(${this.models\n .map(m => m.id)\n .join(\",\")})`;\n }\n}\n","import Association from \"./association\";\nimport Collection from \"../collection\";\nimport PolymorphicCollection from \"../polymorphic-collection\";\nimport compact from \"lodash.compact\";\nimport { capitalize, camelize } from \"../../utils/inflector\";\nimport assert from \"@lib/assert\";\n\nconst identifierCache = {};\n\n/**\n * @class HasMany\n * @extends Association\n * @constructor\n * @public\n * @hide\n */\nexport default class HasMany extends Association {\n get identifier() {\n if (typeof identifierCache[this.key] !== \"string\") {\n const identifier = `${camelize(\n this._container.inflector.singularize(this.key)\n )}Ids`;\n\n identifierCache[this.key] = identifier;\n }\n\n return identifierCache[this.key];\n }\n\n /**\n * @method getForeignKeyArray\n * @return {Array} Array of camelized model name of associated objects\n * and foreign key for the object owning the association\n * @public\n */\n getForeignKeyArray() {\n return [camelize(this.ownerModelName), this.getForeignKey()];\n }\n\n /**\n * @method getForeignKey\n * @return {String} Foreign key for the object owning the association\n * @public\n */\n getForeignKey() {\n // we reuse identifierCache because it's the same logic as get identifier\n if (typeof identifierCache[this.key] !== \"string\") {\n const foreignKey = `${this._container.inflector.singularize(\n camelize(this.key)\n )}Ids`;\n\n identifierCache[this.key] = foreignKey;\n }\n\n return identifierCache[this.key];\n }\n\n /**\n * Registers has-many association defined by given key on given model,\n * defines getters / setters for associated records and associated records' ids,\n * adds methods for creating unsaved child records and creating saved ones\n *\n * @method addMethodsToModelClass\n * @param {Function} ModelClass\n * @param {String} key\n * @public\n */\n addMethodsToModelClass(ModelClass, key) {\n let modelPrototype = ModelClass.prototype;\n let association = this;\n let foreignKey = this.getForeignKey();\n let associationHash = { [key]: this };\n\n modelPrototype.hasManyAssociations = Object.assign(\n modelPrototype.hasManyAssociations,\n associationHash\n );\n\n // update hasManyAssociationFks\n Object.keys(modelPrototype.hasManyAssociations).forEach(key => {\n const value = modelPrototype.hasManyAssociations[key];\n modelPrototype.hasManyAssociationFks[value.getForeignKey()] = value;\n });\n\n // Add to target's dependent associations array\n this.schema.addDependentAssociation(this, this.modelName);\n\n // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above?\n // Or we could use a single data structure to store this information?\n modelPrototype.associationKeys.add(key);\n modelPrototype.associationIdKeys.add(foreignKey);\n\n Object.defineProperty(modelPrototype, foreignKey, {\n /*\n object.childrenIds\n - returns an array of the associated children's ids\n */\n get() {\n this._tempAssociations = this._tempAssociations || {};\n let tempChildren = this._tempAssociations[key];\n let ids = [];\n\n if (tempChildren) {\n if (association.isPolymorphic) {\n ids = tempChildren.models.map(model => ({\n type: model.modelName,\n id: model.id\n }));\n } else {\n ids = tempChildren.models.map(model => model.id);\n }\n } else {\n ids = this.attrs[foreignKey] || [];\n }\n\n return ids;\n },\n\n /*\n object.childrenIds = ([childrenIds...])\n - sets the associated children (via id)\n */\n set(ids) {\n let tempChildren;\n\n if (ids === null) {\n tempChildren = [];\n } else if (ids !== undefined) {\n assert(\n Array.isArray(ids),\n `You must pass an array in when setting ${foreignKey} on ${this}`\n );\n\n if (association.isPolymorphic) {\n assert(\n ids.every(el => {\n return (\n typeof el === \"object\" &&\n typeof el.type !== undefined &&\n typeof el.id !== undefined\n );\n }),\n `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when setting ${foreignKey} on ${this}`\n );\n\n let models = ids.map(({ type, id }) => {\n return association.schema[\n association.schema.toCollectionName(type)\n ].find(id);\n });\n tempChildren = new PolymorphicCollection(models);\n } else {\n tempChildren = association.schema[\n association.schema.toCollectionName(association.modelName)\n ].find(ids);\n }\n }\n\n this[key] = tempChildren;\n }\n });\n\n Object.defineProperty(modelPrototype, key, {\n /*\n object.children\n - returns an array of associated children\n */\n get() {\n this._tempAssociations = this._tempAssociations || {};\n let collection = null;\n\n if (this._tempAssociations[key]) {\n collection = this._tempAssociations[key];\n } else {\n if (association.isPolymorphic) {\n if (this[foreignKey]) {\n let polymorphicIds = this[foreignKey];\n let models = polymorphicIds.map(({ type, id }) => {\n return association.schema[\n association.schema.toCollectionName(type)\n ].find(id);\n });\n\n collection = new PolymorphicCollection(models);\n } else {\n collection = new PolymorphicCollection(association.modelName);\n }\n } else {\n if (this[foreignKey]) {\n collection = association.schema[\n association.schema.toCollectionName(association.modelName)\n ].find(this[foreignKey]);\n } else {\n collection = new Collection(association.modelName);\n }\n }\n\n this._tempAssociations[key] = collection;\n }\n\n return collection;\n },\n\n /*\n object.children = [model1, model2, ...]\n - sets the associated children (via array of models or Collection)\n */\n set(models) {\n if (\n models instanceof Collection ||\n models instanceof PolymorphicCollection\n ) {\n models = models.models;\n }\n\n models = models ? compact(models) : [];\n this._tempAssociations = this._tempAssociations || {};\n\n let collection;\n if (association.isPolymorphic) {\n collection = new PolymorphicCollection(models);\n } else {\n collection = new Collection(association.modelName, models);\n }\n this._tempAssociations[key] = collection;\n\n models.forEach(model => {\n if (model.hasInverseFor(association)) {\n let inverse = model.inverseFor(association);\n\n model.associate(this, inverse);\n }\n });\n }\n });\n\n /*\n object.newChild\n - creates a new unsaved associated child\n */\n modelPrototype[\n `new${capitalize(\n camelize(this._container.inflector.singularize(association.key))\n )}`\n ] = function(...args) {\n let modelName, attrs;\n if (association.isPolymorphic) {\n modelName = args[0];\n attrs = args[1];\n } else {\n modelName = association.modelName;\n attrs = args[0];\n }\n\n let child = association.schema[\n association.schema.toCollectionName(modelName)\n ].new(attrs);\n let children = this[key].models;\n\n children.push(child);\n this[key] = children;\n\n return child;\n };\n\n /*\n object.createChild\n - creates a new saved associated child, and immediately persists both models\n\n TODO: forgot why this[key].add(child) doesn't work, most likely\n because these external APIs trigger saving cascades. Should probably\n have an internal method like this[key]._add.\n */\n modelPrototype[\n `create${capitalize(\n camelize(this._container.inflector.singularize(association.key))\n )}`\n ] = function(...args) {\n let modelName, attrs;\n if (association.isPolymorphic) {\n modelName = args[0];\n attrs = args[1];\n } else {\n modelName = association.modelName;\n attrs = args[0];\n }\n\n let child = association.schema[\n association.schema.toCollectionName(modelName)\n ].create(attrs);\n let children = this[key].models;\n\n children.push(child);\n this[key] = children;\n\n this.save();\n\n return child.reload();\n };\n }\n\n /**\n *\n *\n * @public\n */\n disassociateAllDependentsFromTarget(model) {\n let owner = this.ownerModelName;\n let fk;\n\n if (this.isPolymorphic) {\n fk = { type: model.modelName, id: model.id };\n } else {\n fk = model.id;\n }\n\n let dependents = this.schema[this.schema.toCollectionName(owner)].where(\n potentialOwner => {\n let currentIds = potentialOwner[this.getForeignKey()];\n\n // Need this check because currentIds could be null\n return (\n currentIds &&\n currentIds.find(id => {\n if (typeof id === \"object\") {\n return id.type === fk.type && id.id === fk.id;\n } else {\n return id === fk;\n }\n })\n );\n }\n );\n\n dependents.models.forEach(dependent => {\n dependent.disassociate(model, this);\n dependent.save();\n });\n }\n}\n","import assert from \"../assert\";\nimport { camelize, dasherize } from \"../utils/inflector\";\nimport HasMany from \"../orm/associations/has-many\";\n\nconst pathModelClassCache = {};\n\n/**\n @hide\n*/\nexport default class BaseRouteHandler {\n getModelClassFromPath(fullPath) {\n if (!fullPath) {\n return;\n }\n\n if (typeof pathModelClassCache[fullPath] !== \"string\") {\n let path = fullPath.split(\"/\");\n let lastPath;\n\n for (let i = path.length - 1; i >= 0; i--) {\n const segment = path[i];\n if (segment.length && segment[0] !== \":\") {\n lastPath = segment;\n break;\n }\n }\n\n pathModelClassCache[fullPath] = dasherize(\n camelize(this._container.inflector.singularize(lastPath))\n );\n }\n\n return pathModelClassCache[fullPath];\n }\n\n _getIdForRequest(request, jsonApiDoc) {\n let id;\n if (request && request.params && request.params.id) {\n id = request.params.id;\n } else if (jsonApiDoc && jsonApiDoc.data && jsonApiDoc.data.id) {\n id = jsonApiDoc.data.id;\n }\n return id;\n }\n\n _getJsonApiDocForRequest(request, modelName) {\n let body;\n if (request && request.requestBody) {\n body = JSON.parse(request.requestBody);\n }\n return this.serializerOrRegistry.normalize(body, modelName);\n }\n\n _getAttrsForRequest(request, modelName) {\n let json = this._getJsonApiDocForRequest(request, modelName);\n let id = this._getIdForRequest(request, json);\n let attrs = {};\n\n assert(\n json.data &&\n (json.data.attributes || json.data.type || json.data.relationships),\n `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. Consult the docs for the normalize hook on the Serializer class.`\n );\n\n if (json.data.attributes) {\n attrs = Object.keys(json.data.attributes).reduce((sum, key) => {\n sum[camelize(key)] = json.data.attributes[key];\n return sum;\n }, {});\n }\n\n if (json.data.relationships) {\n Object.keys(json.data.relationships).forEach(relationshipName => {\n let relationship = json.data.relationships[relationshipName];\n let modelClass = this.schema.modelClassFor(modelName);\n let association = modelClass.associationFor(camelize(relationshipName));\n let valueForRelationship;\n\n assert(\n association,\n `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model.`\n );\n\n if (association.isPolymorphic) {\n valueForRelationship = relationship.data;\n } else if (association instanceof HasMany) {\n valueForRelationship =\n relationship.data && relationship.data.map(rel => rel.id);\n } else {\n valueForRelationship = relationship.data && relationship.data.id;\n }\n\n attrs[association.identifier] = valueForRelationship;\n }, {});\n }\n\n if (id) {\n attrs.id = id;\n }\n\n return attrs;\n }\n\n _getAttrsForFormRequest({ requestBody }) {\n let attrs;\n let urlEncodedParts = [];\n\n assert(\n requestBody && typeof requestBody === \"string\",\n `You're using the helper method #normalizedFormData, but the request body is empty or not a valid url encoded string.`\n );\n\n urlEncodedParts = requestBody.split(\"&\");\n\n attrs = urlEncodedParts.reduce((a, urlEncodedPart) => {\n let [key, value] = urlEncodedPart.split(\"=\");\n a[key] = decodeURIComponent(value.replace(/\\+/g, \" \"));\n return a;\n }, {});\n\n return attrs;\n }\n}\n","import BaseRouteHandler from \"./base\";\nimport assert from \"../assert\";\nimport { dasherize } from \"../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class FunctionRouteHandler extends BaseRouteHandler {\n constructor(schema, serializerOrRegistry, userFunction, path, server) {\n super(server);\n this.schema = schema;\n this.serializerOrRegistry = serializerOrRegistry;\n this.userFunction = userFunction;\n this.path = path;\n }\n\n handle(request) {\n return this.userFunction(this.schema, request);\n }\n\n setRequest(request) {\n this.request = request;\n }\n\n serialize(response, serializerType) {\n let serializer;\n\n if (serializerType) {\n serializer = this.serializerOrRegistry.serializerFor(serializerType, {\n explicit: true\n });\n } else {\n serializer = this.serializerOrRegistry;\n }\n\n return serializer.serialize(response, this.request);\n }\n\n normalizedRequestAttrs(modelName = null) {\n let {\n path,\n request,\n request: { requestHeaders }\n } = this;\n let attrs;\n\n let lowerCaseHeaders = {};\n for (let header in requestHeaders) {\n lowerCaseHeaders[header.toLowerCase()] = requestHeaders[header];\n }\n if (/x-www-form-urlencoded/.test(lowerCaseHeaders[\"content-type\"])) {\n attrs = this._getAttrsForFormRequest(request);\n } else {\n if (modelName) {\n assert(\n dasherize(modelName) === modelName,\n `You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(\n modelName\n )}').`\n );\n } else {\n modelName = this.getModelClassFromPath(path);\n }\n\n assert(\n this.schema.hasModelForModelName(modelName),\n `You're using a shorthand or the #normalizedRequestAttrs helper but the detected model of '${modelName}' does not exist. You might need to pass in the correct modelName as the first argument to #normalizedRequestAttrs.`\n );\n\n attrs = this._getAttrsForRequest(request, modelName);\n }\n\n return attrs;\n }\n}\n","/**\n * @hide\n */\nexport default class ObjectRouteHandler {\n constructor(schema, serializerOrRegistry, object) {\n this.schema = schema;\n this.serializerOrRegistry = serializerOrRegistry;\n this.object = object;\n }\n\n handle(/* request */) {\n return this.object;\n }\n}\n","import BaseRouteHandler from \"../base\";\n\n/**\n @hide\n*/\nexport default class BaseShorthandRouteHandler extends BaseRouteHandler {\n constructor(schema, serializerOrRegistry, shorthand, path, options = {}) {\n super();\n shorthand = shorthand || this.getModelClassFromPath(path);\n this.schema = schema;\n this.serializerOrRegistry = serializerOrRegistry;\n this.shorthand = shorthand;\n this.options = options;\n\n let type = Array.isArray(shorthand) ? \"array\" : typeof shorthand;\n if (type === \"string\") {\n let modelClass = this.schema[this.schema.toCollectionName(shorthand)];\n this.handle = request => {\n return this.handleStringShorthand(request, modelClass);\n };\n } else if (type === \"array\") {\n let modelClasses = shorthand.map(\n modelName => this.schema[this.schema.toCollectionName(modelName)]\n );\n this.handle = request => {\n return this.handleArrayShorthand(request, modelClasses);\n };\n }\n }\n\n // handleStringShorthand() {\n //\n // }\n //\n // handleArrayShorthand() {\n //\n // }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport Response from \"../../response\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class GetShorthandRouteHandler extends BaseShorthandRouteHandler {\n /*\n Retrieve a model/collection from the db.\n\n Examples:\n this.get('/contacts', 'contact');\n this.get('/contacts/:id', 'contact');\n */\n handleStringShorthand(request, modelClass) {\n let modelName = this.shorthand;\n let camelizedModelName = camelize(modelName);\n\n assert(\n modelClass,\n `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n );\n\n let id = this._getIdForRequest(request);\n if (id) {\n let model = modelClass.find(id);\n if (!model) {\n return new Response(404);\n } else {\n return model;\n }\n } else if (this.options.coalesce) {\n let ids = this.serializerOrRegistry.getCoalescedIds(\n request,\n camelizedModelName\n );\n if (ids) {\n return modelClass.find(ids);\n }\n }\n return modelClass.all();\n }\n\n /*\n Retrieve an array of collections from the db.\n\n Ex: this.get('/home', ['contacts', 'pictures']);\n */\n handleArrayShorthand(request, modelClasses) {\n let keys = this.shorthand;\n let id = this._getIdForRequest(request);\n\n /*\n If the first key is singular and we have an id param in\n the request, we're dealing with the version of the shorthand\n that has a parent model and several has-many relationships.\n We throw an error, because the serializer is the appropriate\n place for this now.\n */\n assert(\n !id || this._container.inflector.singularize(keys[0]) !== keys[0],\n `It looks like you're using the \"Single record with\n related records\" version of the array shorthand, in addition to opting\n in to the model layer. This shorthand was made when there was no\n serializer layer. Now that you're using models, please ensure your\n relationships are defined, and create a serializer for the parent\n model, adding the relationships there.`\n );\n\n return modelClasses.map(modelClass => modelClass.all());\n }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class PostShorthandRouteHandler extends BaseShorthandRouteHandler {\n /*\n Push a new model of type *camelizedModelName* to the db.\n\n For example, this will push a 'user':\n this.post('/contacts', 'user');\n */\n\n handleStringShorthand(request, modelClass) {\n let modelName = this.shorthand;\n let camelizedModelName = camelize(modelName);\n assert(\n modelClass,\n `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n );\n\n let attrs = this._getAttrsForRequest(\n request,\n modelClass.camelizedModelName\n );\n return modelClass.create(attrs);\n }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\nimport Response from \"../../response\";\n\n/**\n * @hide\n */\nexport default class PutShorthandRouteHandler extends BaseShorthandRouteHandler {\n /*\n Update an object from the db, specifying the type.\n\n this.put('/contacts/:id', 'user');\n */\n handleStringShorthand(request, modelClass) {\n let modelName = this.shorthand;\n let camelizedModelName = camelize(modelName);\n\n assert(\n modelClass,\n `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n );\n\n let id = this._getIdForRequest(request);\n\n let model = modelClass.find(id);\n if (!model) {\n return new Response(404);\n }\n\n let attrs = this._getAttrsForRequest(\n request,\n modelClass.camelizedModelName\n );\n\n return model.update(attrs);\n }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\nimport Response from \"../../response\";\n\n/**\n * @hide\n */\nexport default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandler {\n /*\n Remove the model from the db of type *camelizedModelName*.\n\n This would remove the user with id :id:\n Ex: this.del('/contacts/:id', 'user');\n */\n handleStringShorthand(request, modelClass) {\n let modelName = this.shorthand;\n let camelizedModelName = camelize(modelName);\n assert(\n modelClass,\n `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n );\n\n let id = this._getIdForRequest(request);\n let model = modelClass.find(id);\n if (!model) {\n return new Response(404);\n }\n\n model.destroy();\n }\n\n /*\n Remove the model and child related models from the db.\n\n This would remove the contact with id `:id`, as well\n as this contact's addresses and phone numbers.\n Ex: this.del('/contacts/:id', ['contact', 'addresses', 'numbers');\n */\n handleArrayShorthand(request, modelClasses) {\n let id = this._getIdForRequest(request);\n\n let parent = modelClasses[0].find(id);\n let childTypes = modelClasses\n .slice(1)\n .map(modelClass =>\n this._container.inflector.pluralize(modelClass.camelizedModelName)\n );\n\n // Delete related children\n childTypes.forEach(type => parent[type].destroy());\n parent.destroy();\n }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport Response from \"../../response\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class HeadShorthandRouteHandler extends BaseShorthandRouteHandler {\n /*\n Retrieve a model/collection from the db.\n\n Examples:\n this.head('/contacts', 'contact');\n this.head('/contacts/:id', 'contact');\n */\n handleStringShorthand(request, modelClass) {\n let modelName = this.shorthand;\n let camelizedModelName = camelize(modelName);\n\n assert(\n modelClass,\n `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n );\n\n let id = this._getIdForRequest(request);\n if (id) {\n let model = modelClass.find(id);\n if (!model) {\n return new Response(404);\n } else {\n return new Response(204);\n }\n } else if (\n this.options.coalesce &&\n request.queryParams &&\n request.queryParams.ids\n ) {\n let model = modelClass.find(request.queryParams.ids);\n\n if (!model) {\n return new Response(404);\n } else {\n return new Response(204);\n }\n } else {\n return new Response(204);\n }\n }\n}\n","import { MirageError } from \"./assert\";\nimport Response from \"./response\";\nimport FunctionHandler from \"./route-handlers/function\";\nimport ObjectHandler from \"./route-handlers/object\";\nimport GetShorthandHandler from \"./route-handlers/shorthands/get\";\nimport PostShorthandHandler from \"./route-handlers/shorthands/post\";\nimport PutShorthandHandler from \"./route-handlers/shorthands/put\";\nimport DeleteShorthandHandler from \"./route-handlers/shorthands/delete\";\nimport HeadShorthandHandler from \"./route-handlers/shorthands/head\";\n\nconst DEFAULT_CODES = { get: 200, put: 204, post: 201, delete: 204 };\n\nfunction createHandler({\n verb,\n schema,\n serializerOrRegistry,\n path,\n rawHandler,\n options\n}) {\n let handler;\n let args = [schema, serializerOrRegistry, rawHandler, path, options];\n let type = typeof rawHandler;\n\n if (type === \"function\") {\n handler = new FunctionHandler(...args);\n } else if (type === \"object\" && rawHandler) {\n handler = new ObjectHandler(...args);\n } else if (verb === \"get\") {\n handler = new GetShorthandHandler(...args);\n } else if (verb === \"post\") {\n handler = new PostShorthandHandler(...args);\n } else if (verb === \"put\" || verb === \"patch\") {\n handler = new PutShorthandHandler(...args);\n } else if (verb === \"delete\") {\n handler = new DeleteShorthandHandler(...args);\n } else if (verb === \"head\") {\n handler = new HeadShorthandHandler(...args);\n }\n return handler;\n}\n\n/**\n * @hide\n */\nexport default class RouteHandler {\n constructor({\n schema,\n verb,\n rawHandler,\n customizedCode,\n options,\n path,\n serializerOrRegistry\n }) {\n this.verb = verb;\n this.customizedCode = customizedCode;\n this.serializerOrRegistry = serializerOrRegistry;\n this.handler = createHandler({\n verb,\n schema,\n path,\n serializerOrRegistry,\n rawHandler,\n options\n });\n }\n\n handle(request) {\n return this._getMirageResponseForRequest(request)\n .then(mirageResponse => this.serialize(mirageResponse, request))\n .then(serializedMirageResponse => {\n return serializedMirageResponse.toRackResponse();\n });\n }\n\n _getMirageResponseForRequest(request) {\n let result;\n try {\n /*\n We need to do this for the #serialize convenience method. Probably is\n a better way.\n */\n if (this.handler instanceof FunctionHandler) {\n this.handler.setRequest(request);\n }\n\n result = this.handler.handle(request);\n } catch (e) {\n if (e instanceof MirageError) {\n result = new Response(500, {}, e);\n } else {\n let message = e.message || e;\n\n result = new Response(\n 500,\n {},\n {\n message,\n stack: `Mirage: Your ${request.method} handler for the url ${\n request.url\n } threw an error:\\n\\n${e.stack || e}`\n }\n );\n }\n }\n\n return this._toMirageResponse(result);\n }\n\n _toMirageResponse(result) {\n let mirageResponse;\n\n return new Promise((resolve, reject) => {\n Promise.resolve(result)\n .then(response => {\n if (response instanceof Response) {\n mirageResponse = result;\n } else {\n let code = this._getCodeForResponse(response);\n mirageResponse = new Response(code, {}, response);\n }\n resolve(mirageResponse);\n })\n .catch(reject);\n });\n }\n\n _getCodeForResponse(response) {\n let code;\n if (this.customizedCode) {\n code = this.customizedCode;\n } else {\n code = DEFAULT_CODES[this.verb];\n // Returning any data for a 204 is invalid\n if (code === 204 && response !== undefined && response !== \"\") {\n code = 200;\n }\n }\n return code;\n }\n\n serialize(mirageResponse, request) {\n mirageResponse.data = this.serializerOrRegistry.serialize(\n mirageResponse.data,\n request\n );\n\n return mirageResponse;\n }\n}\n","import has from \"lodash.has\";\n\n/**\n @hide\n*/\nexport default function extend(protoProps, staticProps) {\n class Child extends this {\n constructor(...args) {\n super(...args);\n // The constructor function for the new subclass is optionally defined by you\n // in your `extend` definition\n if (protoProps && has(protoProps, \"constructor\")) {\n protoProps.constructor.call(this, ...args);\n }\n }\n }\n\n // Add static properties to the constructor function, if supplied.\n\n Object.assign(Child, this, staticProps);\n\n // Add prototype properties (instance properties) to the subclass,\n // if supplied.\n if (protoProps) {\n Object.assign(Child.prototype, protoProps);\n }\n\n return Child;\n}\n","import BelongsTo from \"./associations/belongs-to\";\nimport HasMany from \"./associations/has-many\";\nimport extend from \"../utils/extend\";\nimport assert from \"../assert\";\nimport Collection from \"./collection\";\nimport PolymorphicCollection from \"./polymorphic-collection\";\nimport values from \"lodash.values\";\nimport compact from \"lodash.compact\";\n\n/**\n Models wrap your database, and allow you to define relationships.\n\n **Class vs. instance methods**\n\n The methods documented below apply to _instances_ of models, but you'll typically use the `Schema` to access the model _class_, which can be used to find or create instances.\n\n You can find the Class methods documented under the `Schema` API docs.\n\n **Accessing properties and relationships**\n\n You can access properites (fields) and relationships directly off of models.\n\n ```js\n user.name; // 'Sam'\n user.team; // Team model\n user.teamId; // Team id (foreign key)\n ```\n\n Mirage Models are schemaless in their attributes, but their relationship schema is known.\n\n For example,\n\n ```js\n let user = schema.users.create();\n user.attrs // { }\n user.name // undefined\n\n let user = schema.users.create({ name: 'Sam' });\n user.attrs // { name: 'Sam' }\n user.name // 'Sam'\n ```\n\n However, if a `user` has a `posts` relationships defined,\n\n ```js\n let user = schema.users.create();\n user.posts // returns an empty Posts Collection\n ```\n\n @class Model\n @constructor\n @public\n */\nclass Model {\n // TODO: schema and modelName now set statically at registration, need to remove\n /*\n Notes:\n\n - We need to pass in modelName, because models are created with\n .extend and anonymous functions, so you cannot use\n reflection to find the name of the constructor.\n */\n constructor(schema, modelName, attrs, fks) {\n assert(schema, \"A model requires a schema\");\n assert(modelName, \"A model requires a modelName\");\n\n this._schema = schema;\n this.modelName = modelName;\n this.fks = fks || [];\n\n /**\n Returns the attributes of your model.\n\n ```js\n let post = schema.blogPosts.find(1);\n post.attrs; // {id: 1, title: 'Lorem Ipsum', publishedAt: '2012-01-01 10:00:00'}\n ```\n\n Note that you can also access individual attributes directly off a model, e.g. `post.title`.\n\n @property attrs\n @public\n */\n this.attrs = {};\n\n attrs = attrs || {};\n\n // Ensure fks are there\n this.fks.forEach(fk => {\n this.attrs[fk] = attrs[fk] !== undefined ? attrs[fk] : null;\n });\n\n Object.keys(attrs).forEach(name => {\n const value = attrs[name];\n\n this._validateAttr(name, value);\n this._setupAttr(name, value);\n this._setupRelationship(name, value);\n });\n\n return this;\n }\n\n /**\n Create or saves the model.\n\n ```js\n let post = blogPosts.new({ title: 'Lorem ipsum' });\n post.id; // null\n\n post.save();\n post.id; // 1\n\n post.title = 'Hipster ipsum'; // db has not been updated\n post.save(); // ...now the db is updated\n ```\n\n @method save\n @return this\n @public\n */\n save() {\n let collection = this._schema.toInternalCollectionName(this.modelName);\n\n if (this.isNew()) {\n // Update the attrs with the db response\n this.attrs = this._schema.db[collection].insert(this.attrs);\n\n // Ensure the id getter/setter is set\n this._definePlainAttribute(\"id\");\n } else {\n this._schema.isSaving[this.toString()] = true;\n this._schema.db[collection].update(this.attrs.id, this.attrs);\n }\n\n this._saveAssociations();\n\n this._schema.isSaving[this.toString()] = false;\n return this;\n }\n\n /**\n Updates the record in the db.\n\n ```js\n let post = blogPosts.find(1);\n post.update('title', 'Hipster ipsum'); // the db was updated\n post.update({\n title: 'Lorem ipsum',\n created_at: 'before it was cool'\n });\n ```\n\n @method update\n @param {String} key\n @param {String} val\n @return this\n @public\n */\n update(key, val) {\n let attrs;\n if (key == null) {\n return this;\n }\n\n if (typeof key === \"object\") {\n attrs = key;\n } else {\n (attrs = {})[key] = val;\n }\n\n Object.keys(attrs).forEach(function(attr) {\n if (\n !this.associationKeys.has(attr) &&\n !this.associationIdKeys.has(attr)\n ) {\n this._definePlainAttribute(attr);\n }\n this[attr] = attrs[attr];\n }, this);\n\n this.save();\n\n return this;\n }\n\n /**\n Destroys the db record.\n\n ```js\n let post = blogPosts.find(1);\n post.destroy(); // removed from the db\n ```\n\n @method destroy\n @public\n */\n destroy() {\n if (this.isSaved()) {\n this._disassociateFromDependents();\n\n let collection = this._schema.toInternalCollectionName(this.modelName);\n this._schema.db[collection].remove(this.attrs.id);\n }\n }\n\n /**\n Boolean, true if the model has not been persisted yet to the db.\n\n ```js\n let post = blogPosts.new({title: 'Lorem ipsum'});\n post.isNew(); // true\n post.id; // null\n\n post.save(); // true\n post.isNew(); // false\n post.id; // 1\n ```\n\n @method isNew\n @return {Boolean}\n @public\n */\n isNew() {\n let hasDbRecord = false;\n let hasId = this.attrs.id !== undefined && this.attrs.id !== null;\n\n if (hasId) {\n let collectionName = this._schema.toInternalCollectionName(\n this.modelName\n );\n let record = this._schema.db[collectionName].find(this.attrs.id);\n\n if (record) {\n hasDbRecord = true;\n }\n }\n\n return !hasDbRecord;\n }\n\n /**\n Boolean, opposite of `isNew`\n\n @method isSaved\n @return {Boolean}\n @public\n */\n isSaved() {\n return !this.isNew();\n }\n\n /**\n Reload a model's data from the database.\n\n ```js\n let post = blogPosts.find(1);\n post.attrs; // {id: 1, title: 'Lorem ipsum'}\n\n post.title = 'Hipster ipsum';\n post.title; // 'Hipster ipsum';\n\n post.reload(); // true\n post.title; // 'Lorem ipsum'\n ```\n\n @method reload\n @return this\n @public\n */\n reload() {\n if (this.id) {\n let collection = this._schema.toInternalCollectionName(this.modelName);\n let attrs = this._schema.db[collection].find(this.id);\n\n Object.keys(attrs)\n .filter(function(attr) {\n return attr !== \"id\";\n })\n .forEach(function(attr) {\n this.attrs[attr] = attrs[attr];\n }, this);\n }\n\n // Clear temp associations\n this._tempAssociations = {};\n\n return this;\n }\n\n toJSON() {\n return this.attrs;\n }\n\n /**\n Returns the association for the given key\n\n @method associationFor\n @param key\n @public\n @hide\n */\n associationFor(key) {\n return this._schema.associationsFor(this.modelName)[key];\n }\n\n /**\n Returns this model's inverse association for the given\n model-type-association pair, if it exists.\n\n Example:\n\n post: Model.extend({\n comments: hasMany()\n }),\n comments: Model.extend({\n post: belongsTo()\n })\n\n post.inversefor(commentsPostAssociation) would return the\n `post.comments` association object.\n\n Originally we had association.inverse() but that became impossible with\n the addition of polymorphic models. Consider the following:\n\n post: Model.extend({\n comments: hasMany()\n }),\n picture: Model.extend({\n comments: hasMany()\n }),\n comments: Model.extend({\n commentable: belongsTo({ polymorphic: true })\n })\n\n `commentable.inverse()` is ambiguous - does it return\n `post.comments` or `picture.comments`? Instead we need to ask each model\n if it has an inverse for a given association. post.inverseFor(commentable)\n is no longer ambiguous.\n\n @method hasInverseFor\n @param {String} modelName The model name of the class we're scanning\n @param {ORM/Association} association\n @return {ORM/Association}\n @public\n @hide\n */\n inverseFor(association) {\n return (\n this._explicitInverseFor(association) ||\n this._implicitInverseFor(association)\n );\n }\n\n /**\n Finds the inverse for an association that explicity defines it's inverse\n\n @private\n @hide\n */\n _explicitInverseFor(association) {\n this._checkForMultipleExplicitInverses(association);\n\n let associations = this._schema.associationsFor(this.modelName);\n let inverse = association.opts.inverse;\n let candidate = inverse ? associations[inverse] : null;\n let matchingPolymorphic = candidate && candidate.isPolymorphic;\n let matchingInverse =\n candidate && candidate.modelName === association.ownerModelName;\n let candidateInverse = candidate && candidate.opts.inverse;\n\n if (candidateInverse && candidate.opts.inverse !== association.key) {\n assert(\n false,\n `You specified an inverse of ${inverse} for ${association.key}, but it does not match ${candidate.modelName} ${candidate.key}'s inverse`\n );\n }\n\n return matchingPolymorphic || matchingInverse ? candidate : null;\n }\n\n /**\n Ensures multiple explicit inverses don't exist on the current model\n for the given association.\n\n TODO: move this to compile-time check\n\n @private\n @hide\n */\n _checkForMultipleExplicitInverses(association) {\n let associations = this._schema.associationsFor(this.modelName);\n let matchingExplicitInverses = Object.keys(associations).filter(key => {\n let candidate = associations[key];\n let modelMatches = association.ownerModelName === candidate.modelName;\n let inverseKeyMatches = association.key === candidate.opts.inverse;\n\n return modelMatches && inverseKeyMatches;\n });\n assert(\n matchingExplicitInverses.length <= 1,\n `The ${this.modelName} model has defined multiple explicit inverse associations for the ${association.ownerModelName}.${association.key} association.`\n );\n }\n\n /**\n Finds if there is an inverse for an association that does not\n explicitly define one.\n\n @private\n @hide\n */\n _implicitInverseFor(association) {\n let associations = this._schema.associationsFor(this.modelName);\n let modelName = association.ownerModelName;\n\n return values(associations)\n .filter(candidate => candidate.modelName === modelName)\n .reduce((inverse, candidate) => {\n let candidateInverse = candidate.opts.inverse;\n let candidateIsImplicitInverse = candidateInverse === undefined;\n let candidateIsExplicitInverse = candidateInverse === association.key;\n\n let candidateMatches =\n candidateIsImplicitInverse || candidateIsExplicitInverse;\n\n if (candidateMatches) {\n // Need to move this check to compile-time init\n assert(\n !inverse,\n `The ${this.modelName} model has multiple possible inverse associations for the ${association.ownerModelName}.${association.key} association.`\n );\n inverse = candidate;\n }\n\n return inverse;\n }, null);\n }\n\n /**\n Returns whether this model has an inverse association for the given\n model-type-association pair.\n\n @method hasInverseFor\n @param {String} modelName\n @param {ORM/Association} association\n @return {Boolean}\n @public\n @hide\n */\n hasInverseFor(association) {\n return !!this.inverseFor(association);\n }\n\n /**\n Used to check if models match each other. If models are saved, we check model type\n and id, since they could have other non-persisted properties that are different.\n\n @public\n @hide\n */\n alreadyAssociatedWith(model, association) {\n let { key } = association;\n let associatedModelOrCollection = this[key];\n\n if (associatedModelOrCollection && model) {\n if (associatedModelOrCollection instanceof Model) {\n if (associatedModelOrCollection.isSaved() && model.isSaved()) {\n return associatedModelOrCollection.toString() === model.toString();\n } else {\n return associatedModelOrCollection === model;\n }\n } else {\n return associatedModelOrCollection.includes(model);\n }\n }\n }\n\n associate(model, association) {\n if (this.alreadyAssociatedWith(model, association)) {\n return;\n }\n\n let { key } = association;\n\n if (association instanceof HasMany) {\n if (!this[key].includes(model)) {\n this[key].add(model);\n }\n } else {\n this[key] = model;\n }\n }\n\n disassociate(model, association) {\n let fk = association.getForeignKey();\n\n if (association instanceof HasMany) {\n let i;\n if (association.isPolymorphic) {\n let found = this[fk].find(\n ({ type, id }) => type === model.modelName && id === model.id\n );\n i = found && this[fk].indexOf(found);\n } else {\n i = this[fk].map(key => key.toString()).indexOf(model.id.toString());\n }\n\n if (i > -1) {\n this.attrs[fk].splice(i, 1);\n }\n } else {\n this.attrs[fk] = null;\n }\n }\n\n /**\n @hide\n */\n get isSaving() {\n return this._schema.isSaving[this.toString()];\n }\n\n // Private\n /**\n model.attrs represents the persistable attributes, i.e. your db\n table fields.\n @method _setupAttr\n @param attr\n @param value\n @private\n @hide\n */\n _setupAttr(attr, value) {\n const isAssociation =\n this.associationKeys.has(attr) || this.associationIdKeys.has(attr);\n\n if (!isAssociation) {\n this.attrs[attr] = value;\n // define plain getter/setters for non-association keys\n this._definePlainAttribute(attr);\n }\n }\n\n /**\n Define getter/setter for a plain attribute\n @method _definePlainAttribute\n @param attr\n @private\n @hide\n */\n _definePlainAttribute(attr) {\n // Ensure the property hasn't already been defined\n let existingProperty = Object.getOwnPropertyDescriptor(this, attr);\n if (existingProperty && existingProperty.get) {\n return;\n }\n\n // Ensure the attribute is on the attrs hash\n if (!Object.prototype.hasOwnProperty.call(this.attrs, attr)) {\n this.attrs[attr] = null;\n }\n\n // Define the getter/setter\n Object.defineProperty(this, attr, {\n get() {\n return this.attrs[attr];\n },\n set(val) {\n this.attrs[attr] = val;\n return this;\n }\n });\n }\n\n /**\n Foreign keys get set on attrs directly (to avoid potential recursion), but\n model references use the setter.\n *\n We validate foreign keys during instantiation.\n *\n @method _setupRelationship\n @param attr\n @param value\n @private\n @hide\n */\n _setupRelationship(attr, value) {\n const isFk = this.associationIdKeys.has(attr) || this.fks.includes(attr);\n const isAssociation = this.associationKeys.has(attr);\n\n if (isFk) {\n if (value !== undefined && value !== null) {\n this._validateForeignKeyExistsInDatabase(attr, value);\n }\n this.attrs[attr] = value;\n }\n if (isAssociation) {\n this[attr] = value;\n }\n }\n\n /**\n @method _validateAttr\n @private\n @hide\n */\n _validateAttr(key, value) {\n // Verify attr passed in for associations is actually an association\n {\n if (this.associationKeys.has(key)) {\n let association = this.associationFor(key);\n let isNull = value === null;\n\n if (association instanceof HasMany) {\n let isCollection =\n value instanceof Collection ||\n value instanceof PolymorphicCollection;\n let isArrayOfModels =\n Array.isArray(value) && value.every(item => item instanceof Model);\n\n assert(\n isCollection || isArrayOfModels || isNull,\n `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`\n );\n } else if (association instanceof BelongsTo) {\n assert(\n value instanceof Model || isNull,\n `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a BelongsTo relationship. You must pass in a Model or null.`\n );\n }\n }\n }\n\n // Verify attrs passed in for association foreign keys are actually fks\n {\n if (this.associationIdKeys.has(key)) {\n if (key.endsWith(\"Ids\")) {\n let isArray = Array.isArray(value);\n let isNull = value === null;\n assert(\n isArray || isNull,\n `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a foreign key for a HasMany relationship. You must pass in an array of ids or null.`\n );\n }\n }\n }\n\n // Verify no undefined associations are passed in\n {\n let isModelOrCollection =\n value instanceof Model ||\n value instanceof Collection ||\n value instanceof PolymorphicCollection;\n let isArrayOfModels =\n Array.isArray(value) &&\n value.length &&\n value.every(item => item instanceof Model);\n\n if (isModelOrCollection || isArrayOfModels) {\n let modelOrCollection = value;\n\n assert(\n this.associationKeys.has(key),\n `You're trying to create a ${\n this.modelName\n } model and you passed in a ${modelOrCollection.toString()} under the ${key} key, but you haven't defined that key as an association on your model.`\n );\n }\n }\n }\n\n /**\n Originally we validated this via association.setId method, but it triggered\n recursion. That method is designed for updating an existing model's ID so\n this method is needed during instantiation.\n *\n @method _validateForeignKeyExistsInDatabase\n @private\n @hide\n */\n _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) {\n if (Array.isArray(foreignKeys)) {\n let association = this.hasManyAssociationFks[foreignKeyName];\n\n let found;\n if (association.isPolymorphic) {\n found = foreignKeys.map(({ type, id }) => {\n return this._schema.db[\n this._schema.toInternalCollectionName(type)\n ].find(id);\n });\n found = compact(found);\n } else {\n found = this._schema.db[\n this._schema.toInternalCollectionName(association.modelName)\n ].find(foreignKeys);\n }\n\n let foreignKeyLabel = association.isPolymorphic\n ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(\",\")\n : foreignKeys;\n assert(\n found.length === foreignKeys.length,\n `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but some of those records don't exist in the database.`\n );\n } else {\n let association = this.belongsToAssociationFks[foreignKeyName];\n\n let found;\n if (association.isPolymorphic) {\n found = this._schema.db[\n this._schema.toInternalCollectionName(foreignKeys.type)\n ].find(foreignKeys.id);\n } else {\n found = this._schema.db[\n this._schema.toInternalCollectionName(association.modelName)\n ].find(foreignKeys);\n }\n\n let foreignKeyLabel = association.isPolymorphic\n ? `${foreignKeys.type}:${foreignKeys.id}`\n : foreignKeys;\n assert(\n found,\n `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but that record doesn't exist in the database.`\n );\n }\n }\n\n /**\n Update associated children when saving a collection\n *\n @method _saveAssociations\n @private\n @hide\n */\n _saveAssociations() {\n this._saveBelongsToAssociations();\n this._saveHasManyAssociations();\n }\n\n _saveBelongsToAssociations() {\n values(this.belongsToAssociations).forEach(association => {\n this._disassociateFromOldInverses(association);\n this._saveNewAssociates(association);\n this._associateWithNewInverses(association);\n });\n }\n\n _saveHasManyAssociations() {\n values(this.hasManyAssociations).forEach(association => {\n this._disassociateFromOldInverses(association);\n this._saveNewAssociates(association);\n this._associateWithNewInverses(association);\n });\n }\n\n _disassociateFromOldInverses(association) {\n if (association instanceof HasMany) {\n this._disassociateFromHasManyInverses(association);\n } else if (association instanceof BelongsTo) {\n this._disassociateFromBelongsToInverse(association);\n }\n }\n\n // Disassociate currently persisted models that are no longer associated\n _disassociateFromHasManyInverses(association) {\n let { key } = association;\n let fk = association.getForeignKey();\n let tempAssociation = this._tempAssociations && this._tempAssociations[key];\n let associateIds = this.attrs[fk];\n\n if (tempAssociation && associateIds) {\n let models;\n if (association.isPolymorphic) {\n models = associateIds.map(({ type, id }) => {\n return this._schema[this._schema.toCollectionName(type)].find(id);\n });\n } else {\n // TODO: prob should initialize hasMany fks with []\n models = this._schema[\n this._schema.toCollectionName(association.modelName)\n ].find(associateIds || []).models;\n }\n\n models\n .filter(\n associate =>\n // filter out models that are already being saved\n !associate.isSaving &&\n // filter out models that will still be associated\n !tempAssociation.includes(associate) &&\n associate.hasInverseFor(association)\n )\n .forEach(associate => {\n let inverse = associate.inverseFor(association);\n\n associate.disassociate(this, inverse);\n associate.save();\n });\n }\n }\n\n /*\n Disassociate currently persisted models that are no longer associated.\n\n Example:\n\n post: Model.extend({\n comments: hasMany()\n }),\n\n comment: Model.extend({\n post: belongsTo()\n })\n\n Assume `this` is comment:1. When saving, if comment:1 is no longer\n associated with post:1, we need to remove comment:1 from post:1.comments.\n In this example `association` would be `comment.post`.\n */\n _disassociateFromBelongsToInverse(association) {\n let { key } = association;\n let fk = association.getForeignKey();\n let tempAssociation = this._tempAssociations && this._tempAssociations[key];\n let associateId = this.attrs[fk];\n\n if (tempAssociation !== undefined && associateId) {\n let associate;\n if (association.isPolymorphic) {\n associate = this._schema[\n this._schema.toCollectionName(associateId.type)\n ].find(associateId.id);\n } else {\n associate = this._schema[\n this._schema.toCollectionName(association.modelName)\n ].find(associateId);\n }\n\n if (associate.hasInverseFor(association)) {\n let inverse = associate.inverseFor(association);\n\n associate.disassociate(this, inverse);\n associate._updateInDb(associate.attrs);\n }\n }\n }\n\n // Find all other models that depend on me and update their foreign keys\n _disassociateFromDependents() {\n this._schema\n .dependentAssociationsFor(this.modelName)\n .forEach(association => {\n association.disassociateAllDependentsFromTarget(this);\n });\n }\n\n _saveNewAssociates(association) {\n let { key } = association;\n let fk = association.getForeignKey();\n let tempAssociate = this._tempAssociations && this._tempAssociations[key];\n\n if (tempAssociate !== undefined) {\n this.__isSavingNewChildren = true;\n delete this._tempAssociations[key];\n\n if (tempAssociate instanceof Collection) {\n tempAssociate.models\n .filter(model => !model.isSaving)\n .forEach(child => {\n child.save();\n });\n\n this._updateInDb({ [fk]: tempAssociate.models.map(child => child.id) });\n } else if (tempAssociate instanceof PolymorphicCollection) {\n tempAssociate.models\n .filter(model => !model.isSaving)\n .forEach(child => {\n child.save();\n });\n\n this._updateInDb({\n [fk]: tempAssociate.models.map(child => {\n return { type: child.modelName, id: child.id };\n })\n });\n } else {\n // Clearing the association\n if (tempAssociate === null) {\n this._updateInDb({ [fk]: null });\n\n // Self-referential\n } else if (this.equals(tempAssociate)) {\n this._updateInDb({ [fk]: this.id });\n\n // Non-self-referential\n } else if (!tempAssociate.isSaving) {\n // Save the tempAssociate and update the local reference\n tempAssociate.save();\n this._syncTempAssociations(tempAssociate);\n\n let fkValue;\n if (association.isPolymorphic) {\n fkValue = { id: tempAssociate.id, type: tempAssociate.modelName };\n } else {\n fkValue = tempAssociate.id;\n }\n\n this._updateInDb({ [fk]: fkValue });\n }\n }\n\n this.__isSavingNewChildren = false;\n }\n }\n\n /*\n Step 3 in saving associations.\n\n Example:\n\n // initial state\n post.author = steinbeck;\n\n // new state\n post.author = twain;\n\n 1. Disassociate from old inverse (remove post from steinbeck.posts)\n 2. Save new associates (if twain.isNew, save twain)\n -> 3. Associate with new inverse (add post to twain.posts)\n */\n _associateWithNewInverses(association) {\n if (!this.__isSavingNewChildren) {\n let modelOrCollection = this[association.key];\n\n if (modelOrCollection instanceof Model) {\n this._associateModelWithInverse(modelOrCollection, association);\n } else if (\n modelOrCollection instanceof Collection ||\n modelOrCollection instanceof PolymorphicCollection\n ) {\n modelOrCollection.models.forEach(model => {\n this._associateModelWithInverse(model, association);\n });\n }\n\n delete this._tempAssociations[association.key];\n }\n }\n\n _associateModelWithInverse(model, association) {\n if (model.hasInverseFor(association)) {\n let inverse = model.inverseFor(association);\n let inverseFk = inverse.getForeignKey();\n\n let ownerId = this.id;\n if (inverse instanceof BelongsTo) {\n let newId;\n if (inverse.isPolymorphic) {\n newId = { type: this.modelName, id: ownerId };\n } else {\n newId = ownerId;\n }\n this._schema.db[\n this._schema.toInternalCollectionName(model.modelName)\n ].update(model.id, { [inverseFk]: newId });\n } else {\n let inverseCollection = this._schema.db[\n this._schema.toInternalCollectionName(model.modelName)\n ];\n let currentIdsForInverse =\n inverseCollection.find(model.id)[inverse.getForeignKey()] || [];\n let newIdsForInverse = Object.assign([], currentIdsForInverse);\n let newId, alreadyAssociatedWith;\n\n if (inverse.isPolymorphic) {\n newId = { type: this.modelName, id: ownerId };\n alreadyAssociatedWith = newIdsForInverse.some(\n key => key.type == this.modelName && key.id == ownerId\n );\n } else {\n newId = ownerId;\n alreadyAssociatedWith = newIdsForInverse.includes(ownerId);\n }\n\n if (!alreadyAssociatedWith) {\n newIdsForInverse.push(newId);\n }\n\n inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse });\n }\n }\n }\n\n // Used to update data directly, since #save and #update can retrigger saves,\n // which can cause cycles with associations.\n _updateInDb(attrs) {\n this.attrs = this._schema.db[\n this._schema.toInternalCollectionName(this.modelName)\n ].update(this.attrs.id, attrs);\n }\n\n /*\n Super gnarly: after we save this tempAssociate, we we need to through\n all other tempAssociates for a reference to this same model, and\n update it. Otherwise those other references are stale, which could\n cause a bug when they are subsequently saved.\n\n This only works for belongsTo right now, should add hasMany logic to it.\n\n See issue #1613: https://github.com/samselikoff/ember-cli-mirage/pull/1613\n */\n _syncTempAssociations(tempAssociate) {\n Object.keys(this._tempAssociations).forEach(key => {\n if (\n this._tempAssociations[key] &&\n this._tempAssociations[key].toString() === tempAssociate.toString()\n ) {\n this._tempAssociations[key] = tempAssociate;\n }\n });\n }\n\n /**\n Simple string representation of the model and id.\n\n ```js\n let post = blogPosts.find(1);\n post.toString(); // \"model:blogPost:1\"\n ```\n\n @method toString\n @return {String}\n @public\n */\n toString() {\n let idLabel = this.id ? `(${this.id})` : \"\";\n\n return `model:${this.modelName}${idLabel}`;\n }\n\n /**\n Checks the equality of this model and the passed-in model\n *\n @method equals\n @return boolean\n @public\n @hide\n */\n equals(model) {\n return this.toString() === model.toString();\n }\n}\n\nModel.extend = extend;\nModel.findBelongsToAssociation = function(associationType) {\n return this.prototype.belongsToAssociations[associationType];\n};\n\nexport default Model;\n","import Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport PolymorphicCollection from \"./orm/polymorphic-collection\";\nimport extend from \"./utils/extend\";\nimport { camelize } from \"./utils/inflector\";\nimport assert from \"./assert\";\nimport isFunction from \"lodash.isfunction\";\nimport isEmpty from \"lodash.isempty\";\nimport get from \"lodash.get\";\nimport flatten from \"lodash.flatten\";\nimport compact from \"lodash.compact\";\nimport uniqBy from \"lodash.uniqby\";\n\n/**\n Serializers are responsible for formatting your route handler's response.\n\n The application serializer will apply to every response. To make specific customizations, define per-model serializers.\n\n ```js\n import { Server, RestSerializer } from 'miragejs';\n\n new Server({\n serializers: {\n application: RestSerializer,\n user: RestSerializer.extend({\n // user-specific customizations\n })\n }\n })\n ```\n\n Any Model or Collection returned from a route handler will pass through the serializer layer. Highest priority will be given to a model-specific serializer, then the application serializer, then the default serializer.\n\n Mirage ships with three named serializers:\n\n - **JSONAPISerializer**, to simulate JSON:API compliant API servers:\n\n ```js\n import { Server, JSONAPISerializer } from 'miragejs';\n\n new Server({\n serializers: {\n application: JSONAPISerializer\n }\n })\n ```\n\n - **ActiveModelSerializer**, to mock Rails APIs that use AMS-style responses:\n\n ```js\n import { Server, ActiveModelSerializer } from 'miragejs';\n\n new Server({\n serializers: {\n application: JSONAPISerializer\n }\n })\n ```\n\n - **RestSerializer**, a good starting point for many generic REST APIs:\n\n ```js\n import { Server, RestSerializer } from 'miragejs';\n\n new Server({\n serializers: {\n application: JSONAPISerializer\n }\n })\n ```\n\n Additionally, Mirage has a basic Serializer class which you can customize using the hooks documented below:\n\n ```js\n import { Server, Serializer } from 'miragejs';\n\n new Server({\n serializers: {\n application: JSONAPISerializer\n }\n })\n ```\n\n When writing model-specific serializers, remember to extend from your application serializer so shared logic is used by your model-specific classes:\n\n ```js\n import { Server, Serializer } from 'miragejs';\n\n const ApplicationSerializer = Serializer.extend()\n\n new Server({\n serializers: {\n application: ApplicationSerializer,\n blogPost: ApplicationSerializer.extend({\n include: ['comments']\n })\n }\n })\n ```\n\n @class Serializer\n @constructor\n @public\n*/\nclass Serializer {\n constructor(registry, type, request = {}) {\n this.registry = registry;\n this.type = type;\n this.request = request;\n\n /**\n Use this property on a model serializer to whitelist attributes that will be used in your JSON payload.\n\n For example, if you had a `blog-post` model in your database that looked like\n\n ```\n {\n id: 1,\n title: 'Lorem ipsum',\n createdAt: '2014-01-01 10:00:00',\n updatedAt: '2014-01-03 11:42:12'\n }\n ```\n\n and you just wanted `id` and `title`, you could write\n\n ```js\n Serializer.extend({\n attrs: ['id', 'title']\n });\n ```\n\n and the payload would look like\n\n ```\n {\n id: 1,\n title: 'Lorem ipsum'\n }\n ```\n\n @property attrs\n @public\n */\n this.attrs = this.attrs || undefined; // this is just here so I can add the doc comment. Better way?\n\n /**\n Use this property on a model serializer to specify related models you'd like to include in your JSON payload. (These can be considered default server-side includes.)\n\n For example, if you had an `author` with many `blog-post`s and you wanted to sideload these, specify so in the `include` key:\n\n ```js\n new Server({\n models: {\n author: Model.extend({\n blogPosts: hasMany()\n })\n },\n serializers: {\n author: Serializer.extend({\n include: ['blogPosts']\n });\n }\n })\n ```\n\n Now a response to a request for an author would look like this:\n\n ```\n GET /authors/1\n\n {\n author: {\n id: 1,\n name: 'Link',\n blogPostIds: [1, 2]\n },\n blogPosts: [\n {id: 1, authorId: 1, title: 'Lorem'},\n {id: 2, authorId: 1, title: 'Ipsum'}\n ]\n }\n ```\n\n You can also define `include` as a function so it can be determined dynamically:\n\n ```js\n Serializer.extend({\n include: function(request) {\n if (request.queryParams.posts) {\n return ['blogPosts'];\n } else {\n return [];\n }\n }\n });\n ```\n\n **Query param includes for JSONAPISerializer**\n\n The JSONAPISerializer supports the use of `include` query parameter to return compound documents out of the box.\n\n For example, if your app makes the following request\n\n ```\n GET /api/authors?include=blogPosts\n ```\n\n the `JSONAPISerializer` will inspect the query params of the request, see that the blogPosts relationship is present, and then proceed as if this relationship was specified directly in the include: [] array on the serializer itself.\n\n Note that, in accordance with the spec, Mirage gives precedence to an ?include query param over a default include: [] array that you might have specified directly on the serializer. Default includes will still be in effect, however, if a request does not have an ?include query param.\n\n Also note that default includes specified with the `include: []` array can only take a single model; they cannot take dot-separated paths to nested relationships.\n\n If you'd like to set a default dot-separated (nested) include path for a resource, you have to do it at the route level by setting a default value for `request.queryParams`:\n\n ```js\n this.get('/users', function(schema, request) => {\n request.queryParams = request.queryParams || {};\n if (!request.queryParams.include) {\n request.queryParams.include = 'blog-posts.comments';\n }\n\n // rest of route handler logic\n });\n ```\n\n @property include\n @public\n */\n this.include = this.include || []; // this is just here so I can add the doc comment. Better way?\n\n /**\n Set whether your JSON response should have a root key in it.\n\n *Doesn't apply to JSONAPISerializer.*\n\n Defaults to true, so a request for an author looks like:\n\n ```\n GET /authors/1\n\n {\n author: {\n id: 1,\n name: 'Link'\n }\n }\n ```\n\n Setting `root` to false disables this:\n\n ```js\n Serializer.extend({\n root: false\n });\n ```\n\n Now the response looks like:\n\n ```\n GET /authors/1\n\n {\n id: 1,\n name: 'Link'\n }\n ```\n\n @property root\n @public\n */\n this.root = this.root || undefined; // this is just here so I can add the doc comment. Better way?\n\n /**\n Set whether related models should be embedded or sideloaded.\n\n *Doesn't apply to JSONAPISerializer.*\n\n By default this false, so relationships are sideloaded:\n\n ```\n GET /authors/1\n\n {\n author: {\n id: 1,\n name: 'Link',\n blogPostIds: [1, 2]\n },\n blogPosts: [\n { id: 1, authorId: 1, title: 'Lorem' },\n { id: 2, authorId: 1, title: 'Ipsum' }\n ]\n }\n ```\n\n Setting `embed` to true will embed related records:\n\n ```js\n Serializer.extend({\n embed: true\n });\n ```\n\n Now the response looks like:\n\n ```\n GET /authors/1\n\n {\n author: {\n id: 1,\n name: 'Link',\n blogPosts: [\n { id: 1, authorId: 1, title: 'Lorem' },\n { id: 2, authorId: 1, title: 'Ipsum' }\n ]\n }\n }\n ```\n */\n this.embed = this.embed || undefined; // this is just here so I can add the doc comment. Better way?\n\n /**\n Use this to define how your serializer handles serializing relationship keys. It can take one of three values:\n\n - `included`, which is the default, will serialize the ids of a relationship if that relationship is included (sideloaded) along with the model or collection in the response\n - `always` will always serialize the ids of all relationships for the model or collection in the response\n - `never` will never serialize the ids of relationships for the model or collection in the response\n\n _Note: this feature was added in 0.2.2._\n\n @property serializeIds\n @public\n */\n this.serializeIds = this.serializeIds || undefined; // this is just here so I can add the doc comment. Better way?\n }\n\n /**\n Override this method to implement your own custom serialize function. *response* is whatever was returned from your route handler, and *request* is the Pretender request object.\n\n Returns a plain JavaScript object or array, which Mirage uses as the response data to your app's XHR request.\n\n You can also override this method, call super, and manipulate the data before Mirage responds with it. This is a great place to add metadata, or for one-off operations that don't fit neatly into any of Mirage's other abstractions:\n\n ```js\n serialize(object, request) {\n // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend)\n let json = Serializer.prototype.serialize.apply(this, arguments);\n\n // Add metadata, sort parts of the response, etc.\n\n return json;\n }\n ```\n\n @param primaryResource\n @param request\n @return { Object } the json response\n */\n serialize(primaryResource /* , request */) {\n return this.buildPayload(primaryResource);\n }\n\n /**\n This method is used by the POST and PUT shorthands. These shorthands expect a valid JSON:API document as part of the request, so that they know how to create or update the appropriate resouce. The *normalize* method allows you to transform your request body into a JSON:API document, which lets you take advantage of the shorthands when you otherwise may not be able to.\n\n Note that this method is a noop if you're using JSON:API already, since request payloads sent along with POST and PUT requests will already be in the correct format.\n\n Take a look at the included `ActiveModelSerializer`'s normalize method for an example.\n\n @method normalize\n @param json\n @public\n */\n normalize(json) {\n return json;\n }\n\n buildPayload(primaryResource, toInclude, didSerialize, json) {\n if (!primaryResource && isEmpty(toInclude)) {\n return json;\n } else if (primaryResource) {\n let [resourceHash, newIncludes] = this.getHashForPrimaryResource(\n primaryResource\n );\n let newDidSerialize = this.isCollection(primaryResource)\n ? primaryResource.models\n : [primaryResource];\n\n return this.buildPayload(\n undefined,\n newIncludes,\n newDidSerialize,\n resourceHash\n );\n } else {\n let nextIncludedResource = toInclude.shift();\n let [resourceHash, newIncludes] = this.getHashForIncludedResource(\n nextIncludedResource\n );\n\n let newToInclude = newIncludes\n .filter(resource => {\n return !didSerialize\n .map(m => m.toString())\n .includes(resource.toString());\n })\n .concat(toInclude);\n let newDidSerialize = (this.isCollection(nextIncludedResource)\n ? nextIncludedResource.models\n : [nextIncludedResource]\n ).concat(didSerialize);\n let newJson = this.mergePayloads(json, resourceHash);\n\n return this.buildPayload(\n undefined,\n newToInclude,\n newDidSerialize,\n newJson\n );\n }\n }\n\n getHashForPrimaryResource(resource) {\n let [hash, addToIncludes] = this.getHashForResource(resource);\n let hashWithRoot;\n\n if (this.root) {\n assert(\n !(resource instanceof PolymorphicCollection),\n `The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true, since PolymorphicCollections have no type.`\n );\n\n let serializer = this.serializerFor(resource.modelName);\n let rootKey = serializer.keyForResource(resource);\n hashWithRoot = { [rootKey]: hash };\n } else {\n hashWithRoot = hash;\n }\n\n return [hashWithRoot, addToIncludes];\n }\n\n getHashForIncludedResource(resource) {\n let hashWithRoot, addToIncludes;\n\n if (resource instanceof PolymorphicCollection) {\n hashWithRoot = {};\n addToIncludes = resource.models;\n } else {\n let serializer = this.serializerFor(resource.modelName);\n let [hash, newModels] = serializer.getHashForResource(resource);\n\n // Included resources always have a root, and are always pushed to an array.\n let rootKey = serializer.keyForRelationship(resource.modelName);\n hashWithRoot = Array.isArray(hash)\n ? { [rootKey]: hash }\n : { [rootKey]: [hash] };\n addToIncludes = newModels;\n }\n\n return [hashWithRoot, addToIncludes];\n }\n\n getHashForResource(\n resource,\n removeForeignKeys = false,\n didSerialize = {},\n lookupSerializer = false\n ) {\n let hash, serializer;\n\n if (!lookupSerializer) {\n serializer = this; // this is used for embedded responses\n }\n\n // PolymorphicCollection lacks a modelName, but is dealt with in the map\n // by looking up the serializer on a per-model basis\n if (lookupSerializer && resource.modelName) {\n serializer = this.serializerFor(resource.modelName);\n }\n\n if (this.isModel(resource)) {\n hash = serializer._hashForModel(\n resource,\n removeForeignKeys,\n didSerialize\n );\n } else {\n hash = resource.models.map(m => {\n let modelSerializer = serializer;\n\n if (!modelSerializer) {\n // Can't get here if lookupSerializer is false, so look it up\n modelSerializer = this.serializerFor(m.modelName);\n }\n\n return modelSerializer._hashForModel(\n m,\n removeForeignKeys,\n didSerialize\n );\n });\n }\n\n if (this.embed) {\n return [hash, []];\n } else {\n let addToIncludes = uniqBy(\n compact(\n flatten(\n serializer.getKeysForIncluded().map(key => {\n if (this.isCollection(resource)) {\n return resource.models.map(m => m[key]);\n } else {\n return resource[key];\n }\n })\n )\n ),\n m => m.toString()\n );\n return [hash, addToIncludes];\n }\n }\n\n /*\n Merges new resource hash into json. If json already has root key,\n pushes value of resourceHash onto that key.\n\n For example,\n\n json = {\n post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] },\n comments: [\n { id: 1, text: 'foo' }\n ]\n };\n\n resourceHash = {\n comments: [\n { id: 2, text: 'bar' }\n ]\n };\n\n would yield\n\n {\n post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] },\n comments: [\n { id: 1, text: 'foo' },\n { id: 2, text: 'bar' }\n ]\n };\n\n */\n mergePayloads(json, resourceHash) {\n let newJson;\n let [resourceHashKey] = Object.keys(resourceHash);\n\n if (json[resourceHashKey]) {\n newJson = json;\n newJson[resourceHashKey] = json[resourceHashKey].concat(\n resourceHash[resourceHashKey]\n );\n } else {\n newJson = Object.assign(json, resourceHash);\n }\n\n return newJson;\n }\n\n keyForResource(resource) {\n let { modelName } = resource;\n return this.isModel(resource)\n ? this.keyForModel(modelName)\n : this.keyForCollection(modelName);\n }\n\n /**\n Used to define a custom key when serializing a primary model of modelName *modelName*. For example, the default Serializer will return something like the following:\n\n ```\n GET /blogPosts/1\n\n {\n blogPost: {\n id: 1,\n title: 'Lorem ipsum'\n }\n }\n ```\n\n If your API uses hyphenated keys, you could overwrite `keyForModel`:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForModel(modelName) {\n return hyphenate(modelName);\n }\n });\n ```\n\n Now the response will look like\n\n ```\n {\n 'blog-post': {\n id: 1,\n title: 'Lorem ipsum'\n }\n }\n ```\n\n @method keyForModel\n @param modelName\n @public\n */\n keyForModel(modelName) {\n return camelize(modelName);\n }\n\n /**\n Used to customize the key when serializing a primary collection. By default this pluralizes the return value of `keyForModel`.\n\n For example, by default the following request may look like:\n\n ```\n GET /blogPosts\n\n {\n blogPosts: [\n {\n id: 1,\n title: 'Lorem ipsum'\n },\n ...\n ]\n }\n ```\n\n If your API hyphenates keys, you could overwrite `keyForCollection`:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForCollection(modelName) {\n return this._container.inflector.pluralize(dasherize(modelName));\n }\n });\n ```\n\n Now the response would look like:\n\n ```\n {\n 'blog-posts': [\n {\n id: 1,\n title: 'Lorem ipsum'\n },\n ...\n ]\n }\n ```\n\n @method keyForCollection\n @param modelName\n @public\n */\n keyForCollection(modelName) {\n return this._container.inflector.pluralize(this.keyForModel(modelName));\n }\n\n _hashForModel(model, removeForeignKeys, didSerialize = {}) {\n let attrs = this._attrsForModel(model);\n\n if (removeForeignKeys) {\n model.fks.forEach(fk => {\n delete attrs[fk];\n });\n }\n\n if (this.embed) {\n let newDidSerialize = Object.assign({}, didSerialize);\n newDidSerialize[model.modelName] = newDidSerialize[model.modelName] || {};\n newDidSerialize[model.modelName][model.id] = true;\n\n this.getKeysForIncluded().forEach(key => {\n let associatedResource = model[key];\n if (\n associatedResource &&\n !get(\n newDidSerialize,\n `${associatedResource.modelName}.${associatedResource.id}`\n )\n ) {\n let [associatedResourceHash] = this.getHashForResource(\n associatedResource,\n true,\n newDidSerialize,\n true\n );\n let formattedKey = this.keyForEmbeddedRelationship(key);\n attrs[formattedKey] = associatedResourceHash;\n\n if (this.isModel(associatedResource)) {\n let fk = `${camelize(key)}Id`;\n delete attrs[fk];\n }\n }\n });\n\n return attrs;\n } else {\n return this._maybeAddAssociationIds(model, attrs);\n }\n }\n\n /**\n @method _attrsForModel\n @param model\n @private\n @hide\n */\n _attrsForModel(model) {\n let attrs = {};\n\n if (this.attrs) {\n attrs = this.attrs.reduce((memo, attr) => {\n memo[attr] = model[attr];\n return memo;\n }, {});\n } else {\n attrs = Object.assign(attrs, model.attrs);\n }\n\n // Remove fks\n model.fks.forEach(key => delete attrs[key]);\n\n return this._formatAttributeKeys(attrs);\n }\n\n /**\n @method _maybeAddAssociationIds\n @param model\n @param attrs\n @private\n @hide\n */\n _maybeAddAssociationIds(model, attrs) {\n let newHash = Object.assign({}, attrs);\n\n if (this.serializeIds === \"always\") {\n model.associationKeys.forEach(key => {\n let resource = model[key];\n let association = model.associationFor(key);\n\n if (this.isCollection(resource)) {\n let formattedKey = this.keyForRelationshipIds(key);\n newHash[formattedKey] =\n model[`${this._container.inflector.singularize(key)}Ids`];\n } else if (this.isModel(resource) && association.isPolymorphic) {\n let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key);\n let formattedIdKey = this.keyForPolymorphicForeignKeyId(key);\n\n newHash[formattedTypeKey] = model[`${key}Id`].type;\n newHash[formattedIdKey] = model[`${key}Id`].id;\n } else if (resource) {\n let formattedKey = this.keyForForeignKey(key);\n newHash[formattedKey] = model[`${key}Id`];\n }\n });\n } else if (this.serializeIds === \"included\") {\n this.getKeysForIncluded().forEach(key => {\n let resource = model[key];\n let association = model.associationFor(key);\n\n if (this.isCollection(resource)) {\n let formattedKey = this.keyForRelationshipIds(key);\n\n newHash[formattedKey] =\n model[`${this._container.inflector.singularize(key)}Ids`];\n } else if (this.isModel(resource) && association.isPolymorphic) {\n let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key);\n let formattedIdKey = this.keyForPolymorphicForeignKeyId(key);\n\n newHash[formattedTypeKey] = model[`${key}Id`].type;\n newHash[formattedIdKey] = model[`${key}Id`].id;\n } else if (this.isModel(resource)) {\n let formattedKey = this.keyForForeignKey(key);\n\n newHash[formattedKey] = model[`${key}Id`];\n }\n });\n }\n\n return newHash;\n }\n\n /**\n Used to customize how a model's attribute is formatted in your JSON payload.\n\n By default, model attributes are camelCase:\n\n ```\n GET /authors/1\n\n {\n author: {\n firstName: 'Link',\n lastName: 'The WoodElf'\n }\n }\n ```\n\n If your API expects snake case, you could write the following:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForAttribute(attr) {\n return underscore(attr);\n }\n });\n ```\n\n Now the response would look like:\n\n ```\n {\n author: {\n first_name: 'Link',\n last_name: 'The WoodElf'\n }\n }\n ```\n\n @method keyForAttribute\n @param attr\n @public\n */\n keyForAttribute(attr) {\n return attr;\n }\n\n /**\n Use this hook to format the key for collections related to this model. *modelName* is the named parameter for the relationship.\n\n For example, if you're serializing an `author` that\n sideloads many `blogPosts`, the default response will look like:\n\n ```\n {\n author: {...},\n blogPosts: [...]\n }\n ```\n\n Overwrite `keyForRelationship` to format this key:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForRelationship(modelName) {\n return underscore(modelName);\n }\n });\n ```\n\n Now the response will look like this:\n\n ```\n {\n author: {...},\n blog_posts: [...]\n }\n ```\n\n @method keyForRelationship\n @param modelName\n @public\n */\n keyForRelationship(modelName) {\n return camelize(this._container.inflector.pluralize(modelName));\n }\n\n /**\n Like `keyForRelationship`, but for embedded relationships.\n\n @method keyForEmbeddedRelationship\n @param attributeName\n @public\n */\n keyForEmbeddedRelationship(attributeName) {\n return camelize(attributeName);\n }\n\n /**\n Use this hook to format the key for the IDS of a `hasMany` relationship\n in this model's JSON representation.\n\n For example, if you're serializing an `author` that\n sideloads many `blogPosts`, by default your `author` JSON would include a `blogPostIds` key:\n\n ```\n {\n author: {\n id: 1,\n blogPostIds: [1, 2, 3]\n },\n blogPosts: [...]\n }\n ```\n\n Overwrite `keyForRelationshipIds` to format this key:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForRelationshipIds(relationship) {\n return underscore(relationship) + '_ids';\n }\n });\n ```\n\n Now the response will look like:\n\n ```\n {\n author: {\n id: 1,\n blog_post_ids: [1, 2, 3]\n },\n blogPosts: [...]\n }\n ```\n\n @method keyForRelationshipIds\n @param modelName\n @public\n */\n keyForRelationshipIds(relationshipName) {\n return `${this._container.inflector.singularize(\n camelize(relationshipName)\n )}Ids`;\n }\n\n /**\n Like `keyForRelationshipIds`, but for `belongsTo` relationships.\n\n For example, if you're serializing a `blogPost` that sideloads one `author`,\n your `blogPost` JSON would include a `authorId` key:\n\n ```\n {\n blogPost: {\n id: 1,\n authorId: 1\n },\n author: ...\n }\n ```\n\n Overwrite `keyForForeignKey` to format this key:\n\n ```js\n // serializers/application.js\n export default Serializer.extend({\n keyForForeignKey(relationshipName) {\n return underscore(relationshipName) + '_id';\n }\n });\n ```\n\n Now the response will look like:\n\n ```js\n {\n blogPost: {\n id: 1,\n author_id: 1\n },\n author: ...\n }\n ```\n\n @method keyForForeignKey\n @param relationshipName\n @public\n */\n keyForForeignKey(relationshipName) {\n return `${camelize(relationshipName)}Id`;\n }\n\n /**\n Polymorphic relationships are represented with type-id pairs.\n\n Given the following model\n\n ```js\n Model.extend({\n commentable: belongsTo({ polymorphic: true })\n });\n ```\n\n the default Serializer would produce\n\n ```js\n {\n comment: {\n id: 1,\n commentableType: 'post',\n commentableId: '1'\n }\n }\n ```\n\n This hook controls how the `id` field (`commentableId` in the above example)\n is serialized. By default it camelizes the relationship and adds `Id` as a suffix.\n\n @method keyForPolymorphicForeignKeyId\n @param {String} relationshipName\n @return {String}\n @public\n */\n keyForPolymorphicForeignKeyId(relationshipName) {\n return `${camelize(relationshipName)}Id`;\n }\n\n /**\n Polymorphic relationships are represented with type-id pairs.\n\n Given the following model\n\n ```js\n Model.extend({\n commentable: belongsTo({ polymorphic: true })\n });\n ```\n\n the default Serializer would produce\n\n ```js\n {\n comment: {\n id: 1,\n commentableType: 'post',\n commentableId: '1'\n }\n }\n ```\n\n This hook controls how the `type` field (`commentableType` in the above example)\n is serialized. By default it camelizes the relationship and adds `Type` as a suffix.\n\n @method keyForPolymorphicForeignKeyType\n @param {String} relationshipName\n @return {String}\n @public\n */\n keyForPolymorphicForeignKeyType(relationshipName) {\n return `${camelize(relationshipName)}Type`;\n }\n\n /**\n @method isModel\n @param object\n @return {Boolean}\n @public\n @hide\n */\n isModel(object) {\n return object instanceof Model;\n }\n\n /**\n @method isCollection\n @param object\n @return {Boolean}\n @public\n @hide\n */\n isCollection(object) {\n return (\n object instanceof Collection || object instanceof PolymorphicCollection\n );\n }\n\n /**\n @method isModelOrCollection\n @param object\n @return {Boolean}\n @public\n @hide\n */\n isModelOrCollection(object) {\n return this.isModel(object) || this.isCollection(object);\n }\n\n /**\n @method serializerFor\n @param type\n @public\n @hide\n */\n serializerFor(type) {\n return this.registry.serializerFor(type);\n }\n\n getKeysForIncluded() {\n return isFunction(this.include) ? this.include(this.request) : this.include;\n }\n\n /**\n Foo bar.\n\n @property schema\n @public\n @hide\n */\n get schema() {\n return this.registry.schema;\n }\n\n /**\n @method _formatAttributeKeys\n @param attrs\n @private\n @hide\n */\n _formatAttributeKeys(attrs) {\n let formattedAttrs = {};\n\n for (let key in attrs) {\n let formattedKey = this.keyForAttribute(key);\n formattedAttrs[formattedKey] = attrs[key];\n }\n\n return formattedAttrs;\n }\n\n getCoalescedIds(/* request */) {}\n}\n\n// Defaults\nSerializer.prototype.include = [];\nSerializer.prototype.root = true;\nSerializer.prototype.embed = false;\nSerializer.prototype.serializeIds = \"included\"; // can be 'included', 'always', or 'never'\n\nSerializer.extend = extend;\n\nexport default Serializer;\n","import Serializer from \"../serializer\";\nimport { dasherize, camelize } from \"../utils/inflector\";\nimport assert from \"../assert\";\nimport get from \"lodash.get\";\nimport flatten from \"lodash.flatten\";\nimport compact from \"lodash.compact\";\nimport uniqBy from \"lodash.uniqby\";\nimport isEmpty from \"lodash.isempty\";\n/**\n The JSONAPISerializer. Subclass of Serializer.\n\n @class JSONAPISerializer\n @constructor\n @public\n */\nclass JSONAPISerializer extends Serializer {\n constructor() {\n super(...arguments);\n\n /**\n By default, JSON:API's linkage data is only added for relationships that are being included in the current request.\n\n That means given an `author` model with a `posts` relationship, a GET request to /authors/1 would return a JSON:API document with an empty `relationships` hash:\n\n ```js\n {\n data: {\n type: 'authors',\n id: '1',\n attributes: { ... }\n }\n }\n ```\n\n but a request to GET /authors/1?include=posts would have linkage data added (in addition to the included resources):\n\n ```js\n {\n data: {\n type: 'authors',\n id: '1',\n attributes: { ... },\n relationships: {\n data: [\n { type: 'posts', id: '1' },\n { type: 'posts', id: '2' },\n { type: 'posts', id: '3' }\n ]\n }\n },\n included: [ ... ]\n }\n ```\n\n To add the linkage data for all relationships, you could set `alwaysIncludeLinkageData` to `true`:\n\n ```js\n JSONAPISerializer.extend({\n alwaysIncludeLinkageData: true\n });\n ```\n\n Then, a GET to /authors/1 would respond with\n\n ```js\n {\n data: {\n type: 'authors',\n id: '1',\n attributes: { ... },\n relationships: {\n posts: {\n data: [\n { type: 'posts', id: '1' },\n { type: 'posts', id: '2' },\n { type: 'posts', id: '3' }\n ]\n }\n }\n }\n }\n ```\n\n even though the related `posts` are not included in the same document.\n\n You can also use the `links` method (on the Serializer base class) to add relationship links (which will always be added regardless of the relationship is being included document), or you could use `shouldIncludeLinkageData` for more granular control.\n\n For more background on the behavior of this API, see [this blog post](http://www.ember-cli-mirage.com/blog/changing-mirages-default-linkage-data-behavior-1475).\n\n @property alwaysIncludeLinkageData\n @type {Boolean}\n @public\n */\n this.alwaysIncludeLinkageData = this.alwaysIncludeLinkageData || undefined; // this is just here so I can add the doc comment. Better way?\n }\n\n // Don't think this is used?\n keyForModel(modelName) {\n return dasherize(modelName);\n }\n\n // Don't think this is used?\n keyForCollection(modelName) {\n return dasherize(modelName);\n }\n\n /**\n Used to customize the key for an attribute. By default, compound attribute names are dasherized.\n\n For example, the JSON:API document for a `post` model with a `commentCount` attribute would be:\n\n ```js\n {\n data: {\n id: 1,\n type: 'posts',\n attributes: {\n 'comment-count': 28\n }\n }\n }\n ```\n\n @method keyForAttribute\n @param {String} attr\n @return {String}\n @public\n */\n keyForAttribute(attr) {\n return dasherize(attr);\n }\n\n /**\n Used to customize the key for a relationships. By default, compound relationship names are dasherized.\n\n For example, the JSON:API document for an `author` model with a `blogPosts` relationship would be:\n\n ```js\n {\n data: {\n id: 1,\n type: 'author',\n attributes: {\n ...\n },\n relationships: {\n 'blog-posts': {\n ...\n }\n }\n }\n }\n ```\n\n @method keyForRelationship\n @param {String} key\n @return {String}\n @public\n */\n keyForRelationship(key) {\n return dasherize(key);\n }\n\n /**\n Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized.\n\n ```js\n // serializers/author.js\n import { JSONAPISerializer } from 'miragejs';\n\n export default JSONAPISerializer.extend({\n\n links(author) {\n return {\n 'posts': {\n related: `/api/authors/${author.id}/posts`\n }\n };\n }\n\n });\n ```\n\n @method links\n @param model\n */\n links() {}\n\n getHashForPrimaryResource(resource) {\n this._createRequestedIncludesGraph(resource);\n\n let resourceHash = this.getHashForResource(resource);\n let hashWithRoot = { data: resourceHash };\n let addToIncludes = this.getAddToIncludesForResource(resource);\n\n return [hashWithRoot, addToIncludes];\n }\n\n getHashForIncludedResource(resource) {\n let serializer = this.serializerFor(resource.modelName);\n let hash = serializer.getHashForResource(resource);\n let hashWithRoot = { included: this.isModel(resource) ? [hash] : hash };\n let addToIncludes = [];\n\n if (!this.hasQueryParamIncludes()) {\n addToIncludes = this.getAddToIncludesForResource(resource);\n }\n\n return [hashWithRoot, addToIncludes];\n }\n\n getHashForResource(resource) {\n let hash;\n\n if (this.isModel(resource)) {\n hash = this.getResourceObjectForModel(resource);\n } else {\n hash = resource.models.map(m => this.getResourceObjectForModel(m));\n }\n\n return hash;\n }\n\n /*\n Returns a flat unique list of resources that need to be added to includes\n */\n getAddToIncludesForResource(resource) {\n let relationshipPaths;\n\n if (this.hasQueryParamIncludes()) {\n relationshipPaths = this.request.queryParams.include.split(\",\");\n } else {\n let serializer = this.serializerFor(resource.modelName);\n relationshipPaths = serializer.getKeysForIncluded();\n }\n\n return this.getAddToIncludesForResourceAndPaths(\n resource,\n relationshipPaths\n );\n }\n\n getAddToIncludesForResourceAndPaths(resource, relationshipPaths) {\n let includes = [];\n\n relationshipPaths.forEach(path => {\n let relationshipNames = path.split(\".\");\n let newIncludes = this.getIncludesForResourceAndPath(\n resource,\n ...relationshipNames\n );\n includes.push(newIncludes);\n });\n\n return uniqBy(compact(flatten(includes)), m => m.toString());\n }\n\n getIncludesForResourceAndPath(resource, ...names) {\n let nameForCurrentResource = camelize(names.shift());\n let includes = [];\n let modelsToAdd = [];\n\n if (this.isModel(resource)) {\n let relationship = resource[nameForCurrentResource];\n\n if (this.isModel(relationship)) {\n modelsToAdd = [relationship];\n } else if (this.isCollection(relationship)) {\n modelsToAdd = relationship.models;\n }\n } else {\n resource.models.forEach(model => {\n let relationship = model[nameForCurrentResource];\n\n if (this.isModel(relationship)) {\n modelsToAdd.push(relationship);\n } else if (this.isCollection(relationship)) {\n modelsToAdd = modelsToAdd.concat(relationship.models);\n }\n });\n }\n\n includes = includes.concat(modelsToAdd);\n\n if (names.length) {\n modelsToAdd.forEach(model => {\n includes = includes.concat(\n this.getIncludesForResourceAndPath(model, ...names)\n );\n });\n }\n\n return includes;\n }\n\n getResourceObjectForModel(model) {\n let attrs = this._attrsForModel(model, true);\n delete attrs.id;\n\n let hash = {\n type: this.typeKeyForModel(model),\n id: model.id,\n attributes: attrs\n };\n\n return this._maybeAddRelationshipsToResourceObjectForModel(hash, model);\n }\n\n _maybeAddRelationshipsToResourceObjectForModel(hash, model) {\n const relationships = {};\n\n model.associationKeys.forEach(key => {\n let relationship = model[key];\n let relationshipKey = this.keyForRelationship(key);\n let relationshipHash = {};\n\n if (this.hasLinksForRelationship(model, key)) {\n let serializer = this.serializerFor(model.modelName);\n let links = serializer.links(model);\n relationshipHash.links = links[key];\n }\n\n if (\n this.alwaysIncludeLinkageData ||\n this.shouldIncludeLinkageData(key, model) ||\n this._relationshipIsIncludedForModel(key, model)\n ) {\n let data = null;\n if (this.isModel(relationship)) {\n data = {\n type: this.typeKeyForModel(relationship),\n id: relationship.id\n };\n } else if (this.isCollection(relationship)) {\n data = relationship.models.map(model => {\n return {\n type: this.typeKeyForModel(model),\n id: model.id\n };\n });\n }\n relationshipHash.data = data;\n }\n\n if (!isEmpty(relationshipHash)) {\n relationships[relationshipKey] = relationshipHash;\n }\n });\n\n if (!isEmpty(relationships)) {\n hash.relationships = relationships;\n }\n\n return hash;\n }\n\n hasLinksForRelationship(model, relationshipKey) {\n let serializer = this.serializerFor(model.modelName);\n let links = serializer.links && serializer.links(model);\n\n return links && links[relationshipKey] != null;\n }\n\n /*\n This code (and a lot of this serializer) need to be re-worked according to\n the graph logic...\n */\n _relationshipIsIncludedForModel(relationshipKey, model) {\n if (this.hasQueryParamIncludes()) {\n let graph = this.request._includesGraph;\n let graphKey = this._graphKeyForModel(model);\n\n // Find the resource in the graph\n let graphResource;\n\n // Check primary data\n if (graph.data[graphKey]) {\n graphResource = graph.data[graphKey];\n\n // Check includes\n } else if (\n graph.included[this._container.inflector.pluralize(model.modelName)]\n ) {\n graphResource =\n graph.included[this._container.inflector.pluralize(model.modelName)][\n graphKey\n ];\n }\n\n // If the model's in the graph, check if relationshipKey should be included\n return (\n graphResource &&\n graphResource.relationships &&\n Object.prototype.hasOwnProperty.call(\n graphResource.relationships,\n dasherize(relationshipKey)\n )\n );\n } else {\n let relationshipPaths = this.getKeysForIncluded();\n\n return relationshipPaths.includes(relationshipKey);\n }\n }\n\n /*\n This is needed for _relationshipIsIncludedForModel - see the note there for\n more background.\n\n If/when we can refactor this serializer, the logic in this method would\n probably be the basis for the new overall json/graph creation.\n */\n _createRequestedIncludesGraph(primaryResource, secondaryResource = null) {\n let graph = {\n data: {}\n };\n\n if (this.isModel(primaryResource)) {\n let primaryResourceKey = this._graphKeyForModel(primaryResource);\n graph.data[primaryResourceKey] = {};\n\n this._addPrimaryModelToRequestedIncludesGraph(graph, primaryResource);\n } else if (this.isCollection(primaryResource)) {\n primaryResource.models.forEach(model => {\n let primaryResourceKey = this._graphKeyForModel(model);\n graph.data[primaryResourceKey] = {};\n\n this._addPrimaryModelToRequestedIncludesGraph(graph, model);\n });\n }\n\n // Hack :/ Need to think of a better palce to put this if\n // refactoring json:api serializer.\n this.request._includesGraph = graph;\n }\n\n _addPrimaryModelToRequestedIncludesGraph(graph, model) {\n if (this.hasQueryParamIncludes()) {\n let graphKey = this._graphKeyForModel(model);\n let queryParamIncludes = this.getQueryParamIncludes();\n\n queryParamIncludes.split(\",\").forEach(includesPath => {\n // includesPath is post.comments, for example\n graph.data[graphKey].relationships =\n graph.data[graphKey].relationships || {};\n\n let relationshipKeys = includesPath.split(\".\").map(dasherize);\n let relationshipKey = relationshipKeys[0];\n let graphRelationshipKey = relationshipKey;\n let normalizedRelationshipKey = camelize(relationshipKey);\n let hasAssociation = model.associationKeys.has(\n normalizedRelationshipKey\n );\n\n assert(\n hasAssociation,\n `You tried to include \"${relationshipKey}\" with ${model} but no association named \"${normalizedRelationshipKey}\" is defined on the model.`\n );\n\n let relationship = model[normalizedRelationshipKey];\n let relationshipData;\n\n if (this.isModel(relationship)) {\n relationshipData = this._graphKeyForModel(relationship);\n } else if (this.isCollection(relationship)) {\n relationshipData = relationship.models.map(this._graphKeyForModel);\n } else {\n relationshipData = null;\n }\n\n graph.data[graphKey].relationships[\n graphRelationshipKey\n ] = relationshipData;\n\n if (relationship) {\n this._addResourceToRequestedIncludesGraph(\n graph,\n relationship,\n relationshipKeys.slice(1)\n );\n }\n });\n }\n }\n\n _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) {\n graph.included = graph.included || {};\n\n let models = this.isCollection(resource) ? resource.models : [resource];\n\n models.forEach(model => {\n let collectionName = this._container.inflector.pluralize(model.modelName);\n graph.included[collectionName] = graph.included[collectionName] || {};\n\n this._addModelToRequestedIncludesGraph(graph, model, relationshipNames);\n });\n }\n\n _addModelToRequestedIncludesGraph(graph, model, relationshipNames) {\n let collectionName = this._container.inflector.pluralize(model.modelName);\n let resourceKey = this._graphKeyForModel(model);\n graph.included[collectionName][resourceKey] =\n graph.included[collectionName][resourceKey] || {};\n\n if (relationshipNames.length) {\n this._addResourceRelationshipsToRequestedIncludesGraph(\n graph,\n collectionName,\n resourceKey,\n model,\n relationshipNames\n );\n }\n }\n\n /*\n Lot of the same logic here from _addPrimaryModelToRequestedIncludesGraph, could refactor & share\n */\n _addResourceRelationshipsToRequestedIncludesGraph(\n graph,\n collectionName,\n resourceKey,\n model,\n relationshipNames\n ) {\n graph.included[collectionName][resourceKey].relationships =\n graph.included[collectionName][resourceKey].relationships || {};\n\n let relationshipName = relationshipNames[0];\n let relationship = model[camelize(relationshipName)];\n let relationshipData;\n\n if (this.isModel(relationship)) {\n relationshipData = this._graphKeyForModel(relationship);\n } else if (this.isCollection(relationship)) {\n relationshipData = relationship.models.map(this._graphKeyForModel);\n }\n graph.included[collectionName][resourceKey].relationships[\n relationshipName\n ] = relationshipData;\n\n if (relationship) {\n this._addResourceToRequestedIncludesGraph(\n graph,\n relationship,\n relationshipNames.slice(1)\n );\n }\n }\n\n _graphKeyForModel(model) {\n return `${model.modelName}:${model.id}`;\n }\n\n getQueryParamIncludes() {\n return get(this, \"request.queryParams.include\");\n }\n\n hasQueryParamIncludes() {\n return !!this.getQueryParamIncludes();\n }\n\n /**\n Used to customize the `type` field of the document. By default, pluralizes and dasherizes the model's `modelName`.\n\n For example, the JSON:API document for a `blogPost` model would be:\n\n ```js\n {\n data: {\n id: 1,\n type: 'blog-posts'\n }\n }\n ```\n\n @method typeKeyForModel\n @param {Model} model\n @return {String}\n @public\n */\n typeKeyForModel(model) {\n return dasherize(this._container.inflector.pluralize(model.modelName));\n }\n\n getCoalescedIds(request) {\n let ids = request.queryParams && request.queryParams[\"filter[id]\"];\n if (typeof ids === \"string\") {\n return ids.split(\",\");\n }\n return ids;\n }\n\n /**\n Allows for per-relationship inclusion of linkage data. Use this when `alwaysIncludeLinkageData` is not granular enough.\n\n ```js\n export default JSONAPISerializer.extend({\n shouldIncludeLinkageData(relationshipKey, model) {\n if (relationshipKey === 'author' || relationshipKey === 'ghostWriter') {\n return true;\n }\n return false;\n }\n });\n ```\n\n @method shouldIncludeLinkageData\n @param {String} relationshipKey\n @param {Model} model\n @return {Boolean}\n @public\n */\n shouldIncludeLinkageData(relationshipKey, model) {\n return false;\n }\n}\n\nJSONAPISerializer.prototype.alwaysIncludeLinkageData = false;\n\nexport default JSONAPISerializer;\n","import Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport PolymorphicCollection from \"./orm/polymorphic-collection\";\nimport Serializer from \"./serializer\";\nimport JsonApiSerializer from \"./serializers/json-api-serializer\";\nimport { camelize } from \"./utils/inflector\";\nimport assert from \"./assert\";\n\n/**\n * @hide\n */\nexport default class SerializerRegistry {\n constructor(schema, serializerMap = {}, server) {\n this.schema = schema;\n this._serializerMap = serializerMap;\n }\n\n normalize(payload, modelName) {\n return this.serializerFor(modelName).normalize(payload);\n }\n\n serialize(response, request) {\n this.request = request;\n\n if (this._isModelOrCollection(response)) {\n let serializer = this.serializerFor(response.modelName);\n\n return serializer.serialize(response, request);\n } else if (Array.isArray(response) && response.some(this._isCollection)) {\n return response.reduce((json, collection) => {\n let serializer = this.serializerFor(collection.modelName);\n\n if (serializer.embed) {\n json[\n this._container.inflector.pluralize(collection.modelName)\n ] = serializer.serialize(collection, request);\n } else {\n json = Object.assign(json, serializer.serialize(collection, request));\n }\n\n return json;\n }, {});\n } else {\n return response;\n }\n }\n\n serializerFor(type, { explicit = false } = {}) {\n let SerializerForResponse =\n type && this._serializerMap && this._serializerMap[camelize(type)];\n\n if (explicit) {\n assert(\n !!SerializerForResponse,\n `You passed in ${type} as an explicit serializer type but that serializer doesn't exist.`\n );\n } else {\n SerializerForResponse =\n SerializerForResponse || this._serializerMap.application || Serializer;\n\n assert(\n !SerializerForResponse ||\n SerializerForResponse.prototype.embed ||\n SerializerForResponse.prototype.root ||\n new SerializerForResponse() instanceof JsonApiSerializer,\n \"You cannot have a serializer that sideloads (embed: false) and disables the root (root: false).\"\n );\n }\n\n return new SerializerForResponse(this, type, this.request);\n }\n\n _isModel(object) {\n return object instanceof Model;\n }\n\n _isCollection(object) {\n return (\n object instanceof Collection || object instanceof PolymorphicCollection\n );\n }\n\n _isModelOrCollection(object) {\n return this._isModel(object) || this._isCollection(object);\n }\n\n registerSerializers(newSerializerMaps) {\n let currentSerializerMap = this._serializerMap || {};\n this._serializerMap = Object.assign(\n currentSerializerMap,\n newSerializerMaps\n );\n }\n\n getCoalescedIds(request, modelName) {\n return this.serializerFor(modelName).getCoalescedIds(request);\n }\n}\n","import { camelize, dasherize } from \"../utils/inflector\";\nimport Association from \"./associations/association\";\nimport Collection from \"./collection\";\nimport assert from \"../assert\";\nimport forIn from \"lodash.forin\";\n\nconst collectionNameCache = {};\nconst internalCollectionNameCache = {};\nconst modelNameCache = {};\n\n/**\n The primary use of the `Schema` class is to use it to find Models and Collections via the `Model` class methods.\n\n The `Schema` is most often accessed via the first parameter to a route handler:\n\n ```js\n this.get('posts', schema => {\n return schema.posts.where({ isAdmin: false });\n });\n ```\n\n It is also available from the `.schema` property of a `server` instance:\n\n ```js\n server.schema.users.create({ name: 'Yehuda' });\n ```\n\n To work with the Model or Collection returned from one of the methods below, refer to the instance methods in the API docs for the `Model` and `Collection` classes.\n\n @class Schema\n @constructor\n @public\n */\nexport default class Schema {\n constructor(db, modelsMap = {}) {\n assert(db, \"A schema requires a db\");\n\n /**\n Returns Mirage's database. See the `Db` docs for the db's API.\n\n @property db\n @type {Object}\n @public\n */\n this.db = db;\n this._registry = {};\n this._dependentAssociations = { polymorphic: [] };\n this.registerModels(modelsMap);\n this.isSaving = {}; // a hash of models that are being saved, used to avoid cycles\n }\n\n /**\n @method registerModels\n @param hash\n @public\n @hide\n */\n registerModels(hash = {}) {\n forIn(hash, (model, key) => {\n this.registerModel(key, hash[key]);\n });\n }\n\n /**\n @method registerModel\n @param type\n @param ModelClass\n @public\n @hide\n */\n registerModel(type, ModelClass) {\n let camelizedModelName = camelize(type);\n let modelName = dasherize(camelizedModelName);\n\n // Avoid mutating original class, because we may want to reuse it across many tests\n ModelClass = ModelClass.extend();\n\n // Store model & fks in registry\n // TODO: don't think this is needed anymore\n this._registry[camelizedModelName] = this._registry[camelizedModelName] || {\n class: null,\n foreignKeys: []\n }; // we may have created this key before, if another model added fks to it\n this._registry[camelizedModelName].class = ModelClass;\n\n // TODO: set here, remove from model#constructor\n ModelClass.prototype._schema = this;\n ModelClass.prototype.modelName = modelName;\n // Set up associations\n ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself\n ModelClass.prototype.hasManyAssociationFks = {}; // a lookup table to get the hasMany association by foreignKey\n ModelClass.prototype.belongsToAssociations = {}; // a registry of the model's belongsTo associations. Key is key from model definition, value is association instance itself\n ModelClass.prototype.belongsToAssociationFks = {}; // a lookup table to get the belongsTo association by foreignKey\n ModelClass.prototype.associationKeys = new Set(); // ex: address.user, user.addresses\n ModelClass.prototype.associationIdKeys = new Set(); // ex: address.user_id, user.address_ids\n ModelClass.prototype.dependentAssociations = []; // a registry of associations that depend on this model, needed for deletion cleanup.\n\n let fksAddedFromThisModel = {};\n for (let associationProperty in ModelClass.prototype) {\n if (ModelClass.prototype[associationProperty] instanceof Association) {\n let association = ModelClass.prototype[associationProperty];\n association.key = associationProperty;\n association.modelName =\n association.modelName || this.toModelName(associationProperty);\n association.ownerModelName = modelName;\n association.setSchema(this);\n\n // Update the registry with this association's foreign keys. This is\n // essentially our \"db migration\", since we must know about the fks.\n let [fkHolder, fk] = association.getForeignKeyArray();\n\n fksAddedFromThisModel[fkHolder] = fksAddedFromThisModel[fkHolder] || [];\n assert(\n !fksAddedFromThisModel[fkHolder].includes(fk),\n `Your '${type}' model definition has multiple possible inverse relationships of type '${fkHolder}'. Please use explicit inverses.`\n );\n fksAddedFromThisModel[fkHolder].push(fk);\n\n this._addForeignKeyToRegistry(fkHolder, fk);\n\n // Augment the Model's class with any methods added by this association\n association.addMethodsToModelClass(ModelClass, associationProperty);\n }\n }\n\n // Create a db collection for this model, if doesn't exist\n let collection = this.toCollectionName(modelName);\n if (!this.db[collection]) {\n this.db.createCollection(collection);\n }\n\n // Create the entity methods\n this[collection] = {\n camelizedModelName,\n new: attrs => this.new(camelizedModelName, attrs),\n create: attrs => this.create(camelizedModelName, attrs),\n all: attrs => this.all(camelizedModelName, attrs),\n find: attrs => this.find(camelizedModelName, attrs),\n findBy: attrs => this.findBy(camelizedModelName, attrs),\n findOrCreateBy: attrs => this.findOrCreateBy(camelizedModelName, attrs),\n where: attrs => this.where(camelizedModelName, attrs),\n none: attrs => this.none(camelizedModelName, attrs),\n first: attrs => this.first(camelizedModelName, attrs)\n };\n\n return this;\n }\n\n /**\n @method modelFor\n @param type\n @public\n @hide\n */\n modelFor(type) {\n return this._registry[type];\n }\n\n /**\n Create a new unsaved model instance with attributes *attrs*.\n\n ```js\n let post = blogPosts.new({ title: 'Lorem ipsum' });\n post.title; // Lorem ipsum\n post.id; // null\n post.isNew(); // true\n ```\n\n @method new\n @param type\n @param attrs\n @public\n */\n new(type, attrs) {\n return this._instantiateModel(dasherize(type), attrs);\n }\n\n /**\n Create a new model instance with attributes *attrs*, and insert it into the database.\n\n ```js\n let post = blogPosts.create({title: 'Lorem ipsum'});\n post.title; // Lorem ipsum\n post.id; // 1\n post.isNew(); // false\n ```\n\n @method create\n @param type\n @param attrs\n @public\n */\n create(type, attrs) {\n return this.new(type, attrs).save();\n }\n\n /**\n Return all models in the database.\n\n ```js\n let posts = blogPosts.all();\n // [post:1, post:2, ...]\n ```\n\n @method all\n @param type\n @public\n */\n all(type) {\n let collection = this.collectionForType(type);\n\n return this._hydrate(collection, dasherize(type));\n }\n\n /**\n Return an empty collection of type `type`.\n\n @method none\n @param type\n @public\n */\n none(type) {\n return this._hydrate([], dasherize(type));\n }\n\n /**\n Return one or many models in the database by id.\n\n ```js\n let post = blogPosts.find(1);\n let posts = blogPosts.find([1, 3, 4]);\n ```\n\n @method find\n @param type\n @param ids\n @public\n */\n find(type, ids) {\n let collection = this.collectionForType(type);\n let records = collection.find(ids);\n\n if (Array.isArray(ids)) {\n assert(\n records.length === ids.length,\n `Couldn't find all ${this._container.inflector.pluralize(\n type\n )} with ids: (${ids.join(\",\")}) (found ${\n records.length\n } results, but was looking for ${ids.length})`\n );\n }\n\n return this._hydrate(records, dasherize(type));\n }\n\n /**\n Returns the first model in the database that matches the key-value pairs in `attrs`. Note that a string comparison is used.\n\n ```js\n let post = blogPosts.findBy({ published: true });\n ```\n\n N.B. This will return `null` if the schema doesn't have any matching record.\n\n @method findBy\n @param type\n @param attributeName\n @public\n */\n findBy(type, query) {\n let collection = this.collectionForType(type);\n let record = collection.findBy(query);\n\n return this._hydrate(record, dasherize(type));\n }\n\n /**\n Returns the first model in the database that matches the key-value pairs in `attrs`, or creates a record with the attributes if one is not found.\n\n ```js\n // Find the first published blog post, or create a new one.\n let post = blogPosts.findOrCreateBy({ published: true });\n ```\n\n @method findOrCreateBy\n @param type\n @param attributeName\n @public\n */\n findOrCreateBy(type, attrs) {\n let collection = this.collectionForType(type);\n let record = collection.findBy(attrs);\n let model;\n\n if (!record) {\n model = this.create(type, attrs);\n } else {\n model = this._hydrate(record, dasherize(type));\n }\n\n return model;\n }\n\n /**\n Return an ORM/Collection, which represents an array of models from the database matching `query`.\n\n If `query` is an object, its key-value pairs will be compared against records using string comparison.\n\n `query` can also be a compare function.\n\n ```js\n let posts = blogPosts.where({ published: true });\n let posts = blogPosts.where(post => post.published === true);\n ```\n\n @method where\n @param type\n @param query\n @public\n */\n where(type, query) {\n let collection = this.collectionForType(type);\n let records = collection.where(query);\n\n return this._hydrate(records, dasherize(type));\n }\n\n /**\n Returns the first model in the database.\n\n ```js\n let post = blogPosts.first();\n ```\n\n N.B. This will return `null` if the schema doesn't contain any records.\n\n @method first\n @param type\n @public\n */\n first(type) {\n let collection = this.collectionForType(type);\n let record = collection[0];\n\n return this._hydrate(record, dasherize(type));\n }\n\n /**\n @method modelClassFor\n @param modelName\n @public\n @hide\n */\n modelClassFor(modelName) {\n let model = this._registry[camelize(modelName)];\n\n assert(model, `Model not registered: ${modelName}`);\n\n return model.class.prototype;\n }\n\n /*\n This method updates the dependentAssociations registry, which is used to\n keep track of which models depend on a given association. It's used when\n deleting models - their dependents need to be looked up and foreign keys\n updated.\n\n For example,\n\n schema = {\n post: Model.extend(),\n comment: Model.extend({\n post: belongsTo()\n })\n };\n\n comment1.post = post1;\n ...\n post1.destroy()\n\n Deleting this post should clear out comment1's foreign key.\n\n Polymorphic associations can have _any_ other model as a dependent, so we\n handle them separately.\n */\n addDependentAssociation(association, modelName) {\n if (association.isPolymorphic) {\n this._dependentAssociations.polymorphic.push(association);\n } else {\n this._dependentAssociations[modelName] =\n this._dependentAssociations[modelName] || [];\n this._dependentAssociations[modelName].push(association);\n }\n }\n\n dependentAssociationsFor(modelName) {\n let directDependents = this._dependentAssociations[modelName] || [];\n let polymorphicAssociations = this._dependentAssociations.polymorphic || [];\n\n return directDependents.concat(polymorphicAssociations);\n }\n\n associationsFor(modelName) {\n let modelClass = this.modelClassFor(modelName);\n\n return Object.assign(\n {},\n modelClass.belongsToAssociations,\n modelClass.hasManyAssociations\n );\n }\n\n hasModelForModelName(modelName) {\n return this.modelFor(camelize(modelName));\n }\n\n /*\n Private methods\n */\n\n /**\n @method collectionForType\n @param type\n @private\n @hide\n */\n collectionForType(type) {\n let collection = this.toCollectionName(type);\n assert(\n this.db[collection],\n `You're trying to find model(s) of type ${type} but this collection doesn't exist in the database.`\n );\n\n return this.db[collection];\n }\n\n toCollectionName(type) {\n if (typeof collectionNameCache[type] !== \"string\") {\n let modelName = dasherize(type);\n\n const collectionName = camelize(\n this._container.inflector.pluralize(modelName)\n );\n\n collectionNameCache[type] = collectionName;\n }\n\n return collectionNameCache[type];\n }\n\n // This is to get at the underlying Db collection. Poorly named... need to\n // refactor to DbTable or something.\n toInternalCollectionName(type) {\n if (typeof internalCollectionNameCache[type] !== \"string\") {\n const internalCollectionName = `_${this.toCollectionName(type)}`;\n\n internalCollectionNameCache[type] = internalCollectionName;\n }\n\n return internalCollectionNameCache[type];\n }\n\n toModelName(type) {\n if (typeof modelNameCache[type] !== \"string\") {\n let dasherized = dasherize(type);\n\n const modelName = this._container.inflector.singularize(dasherized);\n\n modelNameCache[type] = modelName;\n }\n\n return modelNameCache[type];\n }\n\n /**\n @method _addForeignKeyToRegistry\n @param type\n @param fk\n @private\n @hide\n */\n _addForeignKeyToRegistry(type, fk) {\n this._registry[type] = this._registry[type] || {\n class: null,\n foreignKeys: []\n };\n\n let fks = this._registry[type].foreignKeys;\n if (!fks.includes(fk)) {\n fks.push(fk);\n }\n }\n\n /**\n @method _instantiateModel\n @param modelName\n @param attrs\n @private\n @hide\n */\n _instantiateModel(modelName, attrs) {\n let ModelClass = this._modelFor(modelName);\n let fks = this._foreignKeysFor(modelName);\n\n return new ModelClass(this, modelName, attrs, fks);\n }\n\n /**\n @method _modelFor\n @param modelName\n @private\n @hide\n */\n _modelFor(modelName) {\n return this._registry[camelize(modelName)].class;\n }\n\n /**\n @method _foreignKeysFor\n @param modelName\n @private\n @hide\n */\n _foreignKeysFor(modelName) {\n return this._registry[camelize(modelName)].foreignKeys;\n }\n\n /**\n Takes a record and returns a model, or an array of records\n and returns a collection.\n *\n @method _hydrate\n @param records\n @param modelName\n @private\n @hide\n */\n _hydrate(records, modelName) {\n if (Array.isArray(records)) {\n let models = records.map(function(record) {\n return this._instantiateModel(modelName, record);\n }, this);\n return new Collection(modelName, models);\n } else if (records) {\n return this._instantiateModel(modelName, records);\n } else {\n return null;\n }\n }\n}\n","import { singularize, pluralize } from \"inflected\";\nimport Db from \"./db\";\nimport Association from \"./orm/associations/association\";\nimport RouteHandler from \"./route-handler\";\nimport BaseRouteHandler from \"./route-handlers/base\";\nimport Serializer from \"./serializer\";\nimport SerializerRegistry from \"./serializer-registry\";\nimport Schema from \"./orm/schema\";\n\nconst classes = {\n Db,\n Association,\n RouteHandler,\n BaseRouteHandler,\n Serializer,\n SerializerRegistry,\n Schema\n};\n\nlet defaultInflector = { singularize, pluralize };\n\n/**\n Lightweight DI container for customizable objects that are needed by\n deeply nested classes.\n\n @class Container\n @hide\n */\nclass Container {\n constructor() {\n this.inflector = defaultInflector;\n }\n\n register(key, value) {\n this[key] = value;\n }\n\n create(className, ...args) {\n let Class = classes[className];\n Class.prototype._container = this;\n\n return new Class(...args);\n }\n}\n\n/**\n These are side effects. We give each class a default container so it can be\n easily unit tested.\n\n We should remove these once we have test coverage and can refactor to a proper\n DI system.\n*/\nlet defaultContainer = new Container();\n\nDb.prototype._container = defaultContainer;\nAssociation.prototype._container = defaultContainer;\nBaseRouteHandler.prototype._container = defaultContainer;\nRouteHandler.prototype._container = defaultContainer;\nSerializer.prototype._container = defaultContainer;\nSerializerRegistry.prototype._container = defaultContainer;\nSchema.prototype._container = defaultContainer;\n\nexport default Container;\n","/* eslint no-console: 0 */\n\nimport \"@miragejs/pretender-node-polyfill/before\";\nimport Pretender from \"pretender\";\nimport \"@miragejs/pretender-node-polyfill/after\";\nimport { camelize } from \"./utils/inflector\";\nimport isAssociation from \"./utils/is-association\";\nimport assert from \"./assert\";\nimport BelongsTo from \"./orm/associations/belongs-to\";\nimport Container from \"./container\";\nimport { singularize, pluralize } from \"inflected\";\nimport pick from \"lodash.pick\";\nimport assign from \"lodash.assign\";\nimport find from \"lodash.find\";\nimport isPlainObject from \"lodash.isplainobject\";\nimport isInteger from \"lodash.isinteger\";\n\nconst isPluralForModelCache = {};\n\n/**\n * Creates a new Pretender instance.\n *\n * @method createPretender\n * @param {Server} server\n * @return {Object} A new Pretender instance.\n * @public\n */\nfunction createPretender(server) {\n if (typeof window !== \"undefined\") {\n return new Pretender(\n function() {\n this.passthroughRequest = function(verb, path, request) {\n if (server.shouldLog()) {\n console.log(\n `Mirage: Passthrough request for ${verb.toUpperCase()} ${\n request.url\n }`\n );\n }\n };\n\n this.handledRequest = function(verb, path, request) {\n if (server.shouldLog()) {\n console.groupCollapsed(\n `Mirage: [${request.status}] ${verb.toUpperCase()} ${request.url}`\n );\n let { requestBody, responseText } = request;\n let loggedRequest, loggedResponse;\n\n try {\n loggedRequest = JSON.parse(requestBody);\n } catch (e) {\n loggedRequest = requestBody;\n }\n\n try {\n loggedResponse = JSON.parse(responseText);\n } catch (e) {\n loggedResponse = responseText;\n }\n\n console.groupCollapsed(\"Response\");\n console.log(loggedResponse);\n console.groupEnd();\n\n console.groupCollapsed(\"Request (data)\");\n console.log(loggedRequest);\n console.groupEnd();\n\n console.groupCollapsed(\"Request (raw)\");\n console.log(request);\n console.groupEnd();\n\n console.groupEnd();\n }\n };\n\n let originalCheckPassthrough = this.checkPassthrough;\n this.checkPassthrough = function(request) {\n let shouldPassthrough = server.passthroughChecks.some(\n passthroughCheck => passthroughCheck(request)\n );\n\n if (shouldPassthrough) {\n let url = request.url.includes(\"?\")\n ? request.url.substr(0, request.url.indexOf(\"?\"))\n : request.url;\n\n this[request.method.toLowerCase()](url, this.passthrough);\n }\n\n return originalCheckPassthrough.apply(this, arguments);\n };\n\n this.unhandledRequest = function(verb, path) {\n path = decodeURI(path);\n assert(\n `Your app tried to ${verb} '${path}', but there was no route defined to handle this request. Define a route for this endpoint in your routes() config. Did you forget to define a namespace?`\n );\n };\n },\n { trackRequests: server.shouldTrackRequests() }\n );\n }\n}\n\nconst defaultRouteOptions = {\n coalesce: false,\n timing: undefined\n};\n\nconst defaultInflector = { singularize, pluralize };\n\n/**\n @hide\n*/\nconst defaultPassthroughs = [\n \"http://localhost:0/chromecheckurl\", // mobile chrome\n \"http://localhost:30820/socket.io\", // electron\n request => {\n return /.+\\.hot-update.json$/.test(request.url);\n }\n];\n\n/**\n @hide\n*/\nexport { defaultPassthroughs };\n\n/**\n * Determine if the object contains a valid option.\n *\n * @method isOption\n * @param {Object} option An object with one option value pair.\n * @return {Boolean} True if option is a valid option, false otherwise.\n * @private\n */\nfunction isOption(option) {\n if (!option || typeof option !== \"object\") {\n return false;\n }\n\n let allOptions = Object.keys(defaultRouteOptions);\n let optionKeys = Object.keys(option);\n for (let i = 0; i < optionKeys.length; i++) {\n let key = optionKeys[i];\n if (allOptions.indexOf(key) > -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Extract arguments for a route.\n *\n * @method extractRouteArguments\n * @param {Array} args Of the form [options], [object, code], [function, code]\n * [shorthand, options], [shorthand, code, options]\n * @return {Array} [handler (i.e. the function, object or shorthand), code,\n * options].\n * @private\n */\nfunction extractRouteArguments(args) {\n let [lastArg] = args.splice(-1);\n if (isOption(lastArg)) {\n lastArg = assign({}, defaultRouteOptions, lastArg);\n } else {\n args.push(lastArg);\n lastArg = defaultRouteOptions;\n }\n let t = 2 - args.length;\n while (t-- > 0) {\n args.push(undefined);\n }\n args.push(lastArg);\n return args;\n}\n\n/**\n The Mirage server.\n\n Note that `this` within your `routes` function refers to the server instance, which is the same instance that `server` refers to in your tests.\n\n @class Server\n @public\n*/\nexport default class Server {\n constructor(options = {}) {\n this._container = new Container();\n this.config(options);\n\n /**\n Returns the Mirage Db instance.\n\n @property db\n @return Db\n */\n this.db = this.db || undefined;\n\n /**\n Returns the Mirage Schema (ORM) instance.\n\n @property schema\n @return Schema\n */\n this.schema = this.schema || undefined;\n }\n\n config(config = {}) {\n this.passthroughChecks = this.passthroughChecks || [];\n\n let didOverrideConfig =\n config.environment &&\n (this.environment && this.environment !== config.environment);\n assert(\n !didOverrideConfig,\n \"You cannot modify Mirage's environment once the server is created\"\n );\n this.environment = config.environment || this.environment || \"development\";\n\n if (config.routes) {\n assert(\n !config.baseConfig,\n \"The routes option is an alias for the baseConfig option. You can't pass both options into your server definition.\"\n );\n config.baseConfig = config.routes;\n }\n\n if (config.seeds) {\n assert(\n !config.scenarios,\n \"The seeds option is an alias for the scenarios.default option. You can't pass both options into your server definition.\"\n );\n config.scenarios = { default: config.seeds };\n }\n\n this._config = config;\n\n /**\n Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`.\n\n For example,\n\n ```js\n new Server({\n routes() {\n this.namespace = '/api';\n\n // this route will handle the URL '/api/contacts'\n this.get('/contacts', 'contacts');\n }\n })\n ```\n\n Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace:\n\n ```js\n new Server({\n routes() {\n\n // this route handles /auth\n this.get('/auth', function() { ...});\n\n this.namespace = '/api';\n // this route will handle the URL '/api/contacts'\n this.get('/contacts', 'contacts');\n };\n })\n ```\n\n If your app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `localhost` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server).\n\n For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/miragejs/ember-cli-mirage/issues/497#issuecomment-183458721).\n\n @property namespace\n @type String\n @public\n */\n this.namespace = this.namespace || config.namespace || \"\";\n\n /**\n * Mirage needs an inflector ({ singularize, pluralize }) to be passed in constructor\n */\n this.inflector = config.inflector || defaultInflector;\n this._container.register(\"inflector\", this.inflector);\n\n /**\n Sets a string to prefix all route handler URLs with.\n\n Useful if your app makes API requests to a different port.\n\n ```js\n new Server({\n routes() {\n this.urlPrefix = 'http://localhost:8080'\n }\n })\n ```\n */\n this.urlPrefix = this.urlPrefix || config.urlPrefix || \"\";\n\n /**\n Set the number of milliseconds for the the Server's response time.\n\n By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast).\n\n ```js\n new Server({\n routes() {\n this.timing = 400; // default\n }\n })\n ```\n\n To set the timing for individual routes, see the `timing` option for route handlers.\n\n @property timing\n @type Number\n @public\n */\n this.timing = this.timing || config.timing || 400;\n\n /**\n Set to `true` or `false` to explicitly specify logging behavior.\n\n By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output.\n\n For example, to enable logging in tests, write the following:\n\n ```js\n test('I can view all users', function() {\n server.logging = true;\n server.create('user');\n\n visit('/users');\n // ...\n });\n ```\n\n You can also write a custom log message using the [Pretender server's `handledRequest` hook](https://github.com/pretenderjs/pretender#handled-requests). (You can access the pretender server from your Mirage server via `server.pretender`.)\n\n To override,\n\n ```js\n new Server({\n routes() {\n this.pretender.handledRequest = function(verb, path, request) {\n let { responseText } = request;\n // log request and response data\n }\n }\n })\n ```\n\n @property logging\n @return {Boolean}\n @public\n */\n this.logging = this.logging !== undefined ? this.logging : undefined;\n\n this.testConfig = this.testConfig || undefined;\n\n this.trackRequests = config.trackRequests;\n\n this._defineRouteHandlerHelpers();\n\n if (this.db) {\n this.db.registerIdentityManagers(config.identityManagers);\n } else {\n this.db = this._container.create(\n \"Db\",\n undefined,\n config.identityManagers\n );\n }\n\n if (this.schema) {\n this.schema.registerModels(config.models);\n this.serializerOrRegistry.registerSerializers(config.serializers || {});\n } else {\n this.schema = this._container.create(\"Schema\", this.db, config.models);\n this.serializerOrRegistry = this._container.create(\n \"SerializerRegistry\",\n this.schema,\n config.serializers\n );\n }\n\n let hasFactories = this._hasModulesOfType(config, \"factories\");\n let hasDefaultScenario =\n config.scenarios &&\n Object.prototype.hasOwnProperty.call(config.scenarios, \"default\");\n\n let didOverridePretenderConfig =\n config.trackRequests !== undefined && this.pretender;\n assert(\n !didOverridePretenderConfig,\n \"You cannot modify Pretender's request tracking once the server is created\"\n );\n\n /**\n Mirage uses [pretender.js](https://github.com/trek/pretender) as its xhttp interceptor. In your Mirage config, `this.pretender` refers to the actual Pretender instance, so any config options that work there will work here as well.\n\n ```js\n new Server({\n routes() {\n this.pretender.handledRequest = (verb, path, request) => {\n console.log(`Your server responded to ${path}`);\n }\n }\n })\n ```\n\n Refer to [Pretender's docs](https://github.com/pretenderjs/pretender) if you want to change any options on your Pretender instance.\n\n @property pretender\n @return {Object} The Pretender instance\n @public\n */\n this.pretender =\n this.pretender || config.pretender || createPretender(this);\n\n if (config.baseConfig) {\n this.loadConfig(config.baseConfig);\n }\n\n if (this.isTest()) {\n if (config.testConfig) {\n this.loadConfig(config.testConfig);\n }\n\n if (typeof window !== \"undefined\") {\n window.server = this; // TODO: Better way to inject server into test env\n }\n }\n\n if (this.isTest() && hasFactories) {\n this.loadFactories(config.factories);\n } else if (!this.isTest() && hasDefaultScenario) {\n this.loadFactories(config.factories);\n config.scenarios.default(this);\n } else {\n this.loadFixtures();\n }\n\n let useDefaultPassthroughs =\n typeof config.useDefaultPassthroughs !== \"undefined\"\n ? config.useDefaultPassthroughs\n : true;\n if (useDefaultPassthroughs) {\n this._configureDefaultPassthroughs();\n }\n }\n\n /**\n * Determines if the current environment is the testing environment.\n *\n * @method isTest\n * @return {Boolean} True if the environment is 'test', false otherwise.\n * @public\n * @hide\n */\n isTest() {\n return this.environment === \"test\";\n }\n\n /**\n Determines if the server should log.\n\n @method shouldLog\n @return The value of this.logging if defined, or false if in the testing environment,\n true otherwise.\n @public\n @hide\n */\n shouldLog() {\n return typeof this.logging !== \"undefined\" ? this.logging : !this.isTest();\n }\n\n /**\n * Determines if the server should track requests.\n *\n * @method shouldTrackRequests\n * @return The value of this.trackRequests if defined, false otherwise.\n * @public\n * @hide\n */\n shouldTrackRequests() {\n return Boolean(this.trackRequests);\n }\n\n /**\n * Load the configuration given, setting timing to 0 if in the test\n * environment.\n *\n * @method loadConfig\n * @param {Object} config The configuration to load.\n * @public\n * @hide\n */\n loadConfig(config) {\n config.call(this);\n this.timing = this.isTest() ? 0 : this.timing || 0;\n }\n\n /**\n By default, if your app makes a request that is not defined in your server config, Mirage will throw an error. You can use `passthrough` to whitelist requests, and allow them to pass through your Mirage server to the actual network layer.\n\n <aside>\n <p>Note: Put all passthrough config at the bottom of your routes, to give your route handlers precedence.</p>\n </aside>\n\n To ignore paths on your current host (as well as configured `namespace`), use a leading `/`:\n\n ```js\n this.passthrough('/addresses');\n ```\n\n You can also pass a list of paths, or call `passthrough` multiple times:\n\n ```js\n this.passthrough('/addresses', '/contacts');\n this.passthrough('/something');\n this.passthrough('/else');\n ```\n\n These lines will allow all HTTP verbs to pass through. If you want only certain verbs to pass through, pass an array as the last argument with the specified verbs:\n\n ```js\n this.passthrough('/addresses', ['post']);\n this.passthrough('/contacts', '/photos', ['get']);\n ```\n\n You can pass a function to `passthrough` to do a runtime check on whether or not the request should be handled by Mirage. If the function returns `true` Mirage will not handle the request and let it pass through.\n\n ```js\n this.passthrough(request => {\n return request.queryParams.skipMirage;\n });\n ```\n\n If you want all requests on the current domain to pass through, simply invoke the method with no arguments:\n\n ```js\n this.passthrough();\n ```\n\n Note again that the current namespace (i.e. any `namespace` property defined above this call) will be applied.\n\n You can also allow other-origin hosts to passthrough. If you use a fully-qualified domain name, the `namespace` property will be ignored. Use two * wildcards to match all requests under a path:\n\n ```js\n this.passthrough('http://api.foo.bar/**');\n this.passthrough('http://api.twitter.com/v1/cards/**');\n ```\n\n In versions of Pretender prior to 0.12, `passthrough` only worked with jQuery >= 2.x. As long as you're on Pretender@0.12 or higher, you should be all set.\n\n @method passthrough\n @param {String} [...paths] Any number of paths to whitelist\n @param {Array} options Unused\n @public\n */\n passthrough(...paths) {\n // this only works in browser-like environments for now. in node users will have to configure\n // their own interceptor if they are using one.\n if (typeof window !== \"undefined\") {\n let verbs = [\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"];\n let lastArg = paths[paths.length - 1];\n\n if (paths.length === 0) {\n paths = [\"/**\", \"/\"];\n } else if (Array.isArray(lastArg)) {\n verbs = paths.pop();\n }\n\n paths.forEach(path => {\n if (typeof path === \"function\") {\n this.passthroughChecks.push(path);\n } else {\n verbs.forEach(verb => {\n let fullPath = this._getFullPath(path);\n this.pretender[verb](fullPath, this.pretender.passthrough);\n });\n }\n });\n }\n }\n\n /**\n By default, `fixtures` will be loaded during testing if you don't have factories defined, and during development if you don't have `seeds` defined. You can use `loadFixtures()` to also load fixture files in either of these environments, in addition to using factories to seed your database.\n\n `server.loadFixtures()` loads all the files, and `server.loadFixtures(file1, file2...)` loads selective fixture files.\n\n For example, in a test you may want to start out with all your fixture data loaded:\n\n ```js\n test('I can view the photos', function() {\n server.loadFixtures();\n server.createList('photo', 10);\n\n visit('/');\n\n andThen(() => {\n equal( find('img').length, 10 );\n });\n });\n ```\n\n or in development, you may want to load a few reference fixture files, and use factories to define the rest of your data:\n\n ```js\n new Server({\n ...,\n seeds(server) {\n server.loadFixtures('countries', 'states');\n\n let author = server.create('author');\n server.createList('post', 10, {author_id: author.id});\n }\n })\n ```\n\n @method loadFixtures\n @param {String} [...args] The name of the fixture to load.\n @public\n */\n loadFixtures(...args) {\n let { fixtures } = this._config;\n\n if (args.length) {\n let camelizedArgs = args.map(camelize);\n\n let missingKeys = camelizedArgs.filter(key => !fixtures[key]);\n if (missingKeys.length) {\n throw new Error(`Fixtures not found: ${missingKeys.join(\", \")}`);\n }\n\n fixtures = pick(fixtures, ...camelizedArgs);\n }\n\n this.db.loadData(fixtures);\n }\n\n /*\n Factory methods\n */\n\n /**\n * Load factories into Mirage's database.\n *\n * @method loadFactories\n * @param {Object} factoryMap\n * @public\n * @hide\n */\n loadFactories(factoryMap = {}) {\n // Store a reference to the factories\n let currentFactoryMap = this._factoryMap || {};\n this._factoryMap = assign(currentFactoryMap, factoryMap);\n\n // Create a collection for each factory\n Object.keys(factoryMap).forEach(type => {\n let collectionName = this.schema.toCollectionName(type);\n this.db.createCollection(collectionName);\n });\n }\n\n /**\n * Get the factory for a given type.\n *\n * @method factoryFor\n * @param {String} type\n * @private\n * @hide\n */\n factoryFor(type) {\n let camelizedType = camelize(type);\n\n if (this._factoryMap && this._factoryMap[camelizedType]) {\n return this._factoryMap[camelizedType];\n }\n }\n\n build(type, ...traitsAndOverrides) {\n let traits = traitsAndOverrides.filter(\n arg => arg && typeof arg === \"string\"\n );\n let overrides = find(traitsAndOverrides, arg => isPlainObject(arg));\n let camelizedType = camelize(type);\n\n // Store sequence for factory type as instance variable\n this.factorySequences = this.factorySequences || {};\n this.factorySequences[camelizedType] =\n this.factorySequences[camelizedType] + 1 || 0;\n\n let OriginalFactory = this.factoryFor(type);\n if (OriginalFactory) {\n OriginalFactory = OriginalFactory.extend({});\n let attrs = OriginalFactory.attrs || {};\n this._validateTraits(traits, OriginalFactory, type);\n let mergedExtensions = this._mergeExtensions(attrs, traits, overrides);\n this._mapAssociationsFromAttributes(type, attrs, overrides);\n this._mapAssociationsFromAttributes(type, mergedExtensions);\n\n let Factory = OriginalFactory.extend(mergedExtensions);\n let factory = new Factory();\n\n let sequence = this.factorySequences[camelizedType];\n return factory.build(sequence);\n } else {\n return overrides;\n }\n }\n\n buildList(type, amount, ...traitsAndOverrides) {\n assert(\n isInteger(amount),\n `second argument has to be an integer, you passed: ${typeof amount}`\n );\n\n let list = [];\n\n const buildArgs = [type, ...traitsAndOverrides];\n for (let i = 0; i < amount; i++) {\n list.push(this.build.apply(this, buildArgs));\n }\n\n return list;\n }\n\n /**\n Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was\n added.\n\n ```js\n test(\"I can view a contact's details\", function() {\n let contact = server.create('contact');\n\n visit('/contacts/' + contact.id);\n\n andThen(() => {\n equal( find('h1').text(), 'The contact is Link');\n });\n });\n ```\n\n You can override the attributes from the factory definition with a\n hash passed in as the second parameter. For example, if we had this factory\n\n ```js\n export default Factory.extend({\n name: 'Link'\n });\n ```\n\n we could override the name like this:\n\n ```js\n test(\"I can view the contacts\", function() {\n server.create('contact', {name: 'Zelda'});\n\n visit('/');\n\n andThen(() => {\n equal( find('p').text(), 'Zelda' );\n });\n });\n ```\n\n @method create\n @param type the singularized type of the model\n @param traitsAndOverrides\n @public\n */\n create(type, ...options) {\n assert(\n this._modelOrFactoryExistsForType(type),\n `You called server.create('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`\n );\n\n // When there is a Model defined, we should return an instance\n // of it instead of returning the bare attributes.\n let traits = options.filter(arg => arg && typeof arg === \"string\");\n let overrides = find(options, arg => isPlainObject(arg));\n let collectionFromCreateList = find(\n options,\n arg => arg && Array.isArray(arg)\n );\n\n let attrs = this.build(type, ...traits, overrides);\n let modelOrRecord;\n\n if (this.schema && this.schema[this.schema.toCollectionName(type)]) {\n let modelClass = this.schema[this.schema.toCollectionName(type)];\n\n modelOrRecord = modelClass.create(attrs);\n } else {\n let collection, collectionName;\n\n if (collectionFromCreateList) {\n collection = collectionFromCreateList;\n } else {\n collectionName = this.schema\n ? this.schema.toInternalCollectionName(type)\n : `_${this.inflector.pluralize(type)}`;\n collection = this.db[collectionName];\n }\n\n assert(\n collection,\n `You called server.create('${type}') but no model or factory was found.`\n );\n modelOrRecord = collection.insert(attrs);\n }\n\n let OriginalFactory = this.factoryFor(type);\n if (OriginalFactory) {\n OriginalFactory.extractAfterCreateCallbacks({ traits }).forEach(\n afterCreate => {\n afterCreate(modelOrRecord, this);\n }\n );\n }\n\n return modelOrRecord;\n }\n\n /**\n Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*.\n\n Returns the array of records that were added to the database.\n\n Here's an example from a test:\n\n ```js\n test(\"I can view the contacts\", function() {\n server.createList('contact', 5);\n let youngContacts = server.createList('contact', 5, {age: 15});\n\n visit('/');\n\n andThen(function() {\n equal(currentRouteName(), 'index');\n equal( find('p').length, 10 );\n });\n });\n ```\n\n And one from setting up your development database:\n\n ```js\n new Server({\n seeds(server) {\n let contact = server.create('contact')\n\n server.createList('address', 5, { contact })\n }\n })\n ```\n\n @method createList\n @param type\n @param amount\n @param traitsAndOverrides\n @public\n */\n createList(type, amount, ...traitsAndOverrides) {\n assert(\n this._modelOrFactoryExistsForType(type),\n `You called server.createList('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`\n );\n assert(\n isInteger(amount),\n `second argument has to be an integer, you passed: ${typeof amount}`\n );\n\n let list = [];\n let collectionName = this.schema\n ? this.schema.toInternalCollectionName(type)\n : `_${this.inflector.pluralize(type)}`;\n let collection = this.db[collectionName];\n\n const createArguments = [type, ...traitsAndOverrides, collection];\n\n for (let i = 0; i < amount; i++) {\n list.push(this.create.apply(this, createArguments));\n }\n\n return list;\n }\n\n /**\n Shutdown the server and stop intercepting network requests.\n\n @method shutdown\n @public\n */\n shutdown() {\n if (typeof window !== \"undefined\") {\n this.pretender.shutdown();\n }\n\n if (typeof window !== \"undefined\" && this.environment === \"test\") {\n window.server = undefined;\n }\n }\n\n resource(resourceName, { only, except, path } = {}) {\n resourceName = this.inflector.pluralize(resourceName);\n path = path || `/${resourceName}`;\n only = only || [];\n except = except || [];\n\n if (only.length > 0 && except.length > 0) {\n throw \"cannot use both :only and :except options\";\n }\n\n let actionsMethodsAndsPathsMappings = {\n index: { methods: [\"get\"], path: `${path}` },\n show: { methods: [\"get\"], path: `${path}/:id` },\n create: { methods: [\"post\"], path: `${path}` },\n update: { methods: [\"put\", \"patch\"], path: `${path}/:id` },\n delete: { methods: [\"del\"], path: `${path}/:id` }\n };\n\n let allActions = Object.keys(actionsMethodsAndsPathsMappings);\n let actions =\n (only.length > 0 && only) ||\n (except.length > 0 &&\n allActions.filter(action => except.indexOf(action) === -1)) ||\n allActions;\n\n actions.forEach(action => {\n let methodsWithPath = actionsMethodsAndsPathsMappings[action];\n\n methodsWithPath.methods.forEach(method => {\n return path === resourceName\n ? this[method](methodsWithPath.path)\n : this[method](methodsWithPath.path, resourceName);\n });\n });\n }\n\n /**\n *\n * @private\n * @hide\n */\n _defineRouteHandlerHelpers() {\n [\n [\"get\"],\n [\"post\"],\n [\"put\"],\n [\"delete\", \"del\"],\n [\"patch\"],\n [\"head\"],\n [\"options\"]\n ].forEach(([verb, alias]) => {\n this[verb] = (path, ...args) => {\n let [rawHandler, customizedCode, options] = extractRouteArguments(args);\n return this._registerRouteHandler(\n verb,\n path,\n rawHandler,\n customizedCode,\n options\n );\n };\n\n if (alias) {\n this[alias] = this[verb];\n }\n });\n }\n\n _serialize(body) {\n if (typeof body === \"string\") {\n return body;\n } else {\n return JSON.stringify(body);\n }\n }\n\n _registerRouteHandler(verb, path, rawHandler, customizedCode, options) {\n let routeHandler = this._container.create(\"RouteHandler\", {\n schema: this.schema,\n verb,\n rawHandler,\n customizedCode,\n options,\n path,\n serializerOrRegistry: this.serializerOrRegistry\n });\n\n let fullPath = this._getFullPath(path);\n let timing =\n options.timing !== undefined ? options.timing : () => this.timing;\n\n if (this.pretender) {\n return this.pretender[verb](\n fullPath,\n request => {\n return routeHandler.handle(request).then(mirageResponse => {\n let [code, headers, response] = mirageResponse;\n\n return [code, headers, this._serialize(response)];\n });\n },\n timing\n );\n }\n }\n\n /**\n *\n * @private\n * @hide\n */\n _hasModulesOfType(modules, type) {\n let modulesOfType = modules[type];\n return modulesOfType ? Object.keys(modulesOfType).length > 0 : false;\n }\n\n /**\n * Builds a full path for Pretender to monitor based on the `path` and\n * configured options (`urlPrefix` and `namespace`).\n *\n * @private\n * @hide\n */\n _getFullPath(path) {\n path = path[0] === \"/\" ? path.slice(1) : path;\n let fullPath = \"\";\n let urlPrefix = this.urlPrefix ? this.urlPrefix.trim() : \"\";\n let namespace = \"\";\n\n // if there is a urlPrefix and a namespace\n if (this.urlPrefix && this.namespace) {\n if (\n this.namespace[0] === \"/\" &&\n this.namespace[this.namespace.length - 1] === \"/\"\n ) {\n namespace = this.namespace\n .substring(0, this.namespace.length - 1)\n .substring(1);\n }\n\n if (\n this.namespace[0] === \"/\" &&\n this.namespace[this.namespace.length - 1] !== \"/\"\n ) {\n namespace = this.namespace.substring(1);\n }\n\n if (\n this.namespace[0] !== \"/\" &&\n this.namespace[this.namespace.length - 1] === \"/\"\n ) {\n namespace = this.namespace.substring(0, this.namespace.length - 1);\n }\n\n if (\n this.namespace[0] !== \"/\" &&\n this.namespace[this.namespace.length - 1] !== \"/\"\n ) {\n namespace = this.namespace;\n }\n }\n\n // if there is a namespace and no urlPrefix\n if (this.namespace && !this.urlPrefix) {\n if (\n this.namespace[0] === \"/\" &&\n this.namespace[this.namespace.length - 1] === \"/\"\n ) {\n namespace = this.namespace.substring(0, this.namespace.length - 1);\n }\n\n if (\n this.namespace[0] === \"/\" &&\n this.namespace[this.namespace.length - 1] !== \"/\"\n ) {\n namespace = this.namespace;\n }\n\n if (\n this.namespace[0] !== \"/\" &&\n this.namespace[this.namespace.length - 1] === \"/\"\n ) {\n let namespaceSub = this.namespace.substring(\n 0,\n this.namespace.length - 1\n );\n namespace = `/${namespaceSub}`;\n }\n\n if (\n this.namespace[0] !== \"/\" &&\n this.namespace[this.namespace.length - 1] !== \"/\"\n ) {\n namespace = `/${this.namespace}`;\n }\n }\n\n // if no namespace\n if (!this.namespace) {\n namespace = \"\";\n }\n\n // check to see if path is a FQDN. if so, ignore any urlPrefix/namespace that was set\n if (/^https?:\\/\\//.test(path)) {\n fullPath += path;\n } else {\n // otherwise, if there is a urlPrefix, use that as the beginning of the path\n if (urlPrefix.length) {\n fullPath +=\n urlPrefix[urlPrefix.length - 1] === \"/\" ? urlPrefix : `${urlPrefix}/`;\n }\n\n // add the namespace to the path\n fullPath += namespace;\n\n // add a trailing slash to the path if it doesn't already contain one\n if (fullPath[fullPath.length - 1] !== \"/\") {\n fullPath += \"/\";\n }\n\n // finally add the configured path\n fullPath += path;\n\n // if we're making a same-origin request, ensure a / is prepended and\n // dedup any double slashes\n if (!/^https?:\\/\\//.test(fullPath)) {\n fullPath = `/${fullPath}`;\n fullPath = fullPath.replace(/\\/+/g, \"/\");\n }\n }\n\n return fullPath;\n }\n\n /**\n *\n * @private\n * @hide\n */\n _configureDefaultPassthroughs() {\n defaultPassthroughs.forEach(passthroughUrl => {\n this.passthrough(passthroughUrl);\n });\n }\n\n /**\n *\n * @private\n * @hide\n */\n _typeIsPluralForModel(typeOrCollectionName) {\n if (typeof isPluralForModelCache[typeOrCollectionName] !== \"boolean\") {\n let modelOrFactoryExists = this._modelOrFactoryExistsForTypeOrCollectionName(\n typeOrCollectionName\n );\n let isPlural =\n typeOrCollectionName === this.inflector.pluralize(typeOrCollectionName);\n let isUncountable =\n this.inflector.singularize(typeOrCollectionName) ===\n this.inflector.pluralize(typeOrCollectionName);\n\n const isPluralForModel =\n isPlural && !isUncountable && modelOrFactoryExists;\n\n isPluralForModelCache[typeOrCollectionName] = isPluralForModel;\n }\n\n return isPluralForModelCache[typeOrCollectionName];\n }\n\n /**\n *\n * @private\n * @hide\n */\n _modelOrFactoryExistsForType(type) {\n let modelExists = this.schema && this.schema.modelFor(camelize(type));\n let dbCollectionExists = this.db[\n this.schema.toInternalCollectionName(type)\n ];\n\n return (\n (modelExists || dbCollectionExists) && !this._typeIsPluralForModel(type)\n );\n }\n\n /**\n *\n * @private\n * @hide\n */\n _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) {\n let modelExists =\n this.schema && this.schema.modelFor(camelize(typeOrCollectionName));\n let dbCollectionExists = this.db[\n this.schema.toInternalCollectionName(typeOrCollectionName)\n ];\n\n return modelExists || dbCollectionExists;\n }\n\n /**\n *\n * @private\n * @hide\n */\n _validateTraits(traits, factory, type) {\n traits.forEach(traitName => {\n if (!factory.isTrait(traitName)) {\n throw new Error(\n `'${traitName}' trait is not registered in '${type}' factory`\n );\n }\n });\n }\n\n /**\n *\n * @private\n * @hide\n */\n _mergeExtensions(attrs, traits, overrides) {\n let allExtensions = traits.map(traitName => {\n return attrs[traitName].extension;\n });\n allExtensions.push(overrides || {});\n return allExtensions.reduce((accum, extension) => {\n return assign(accum, extension);\n }, {});\n }\n\n /**\n *\n * @private\n * @hide\n */\n _mapAssociationsFromAttributes(modelName, attributes, overrides = {}) {\n Object.keys(attributes || {})\n .filter(attr => {\n return isAssociation(attributes[attr]);\n })\n .forEach(attr => {\n let modelClass = this.schema.modelClassFor(modelName);\n let association = modelClass.associationFor(attr);\n\n assert(\n association && association instanceof BelongsTo,\n `You're using the \\`association\\` factory helper on the '${attr}' attribute of your ${modelName} factory, but that attribute is not a \\`belongsTo\\` association.`\n );\n\n let isSelfReferentialBelongsTo =\n association &&\n association instanceof BelongsTo &&\n association.modelName === modelName;\n\n assert(\n !isSelfReferentialBelongsTo,\n `You're using the association() helper on your ${modelName} factory for ${attr}, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively.`\n );\n\n let isPolymorphic =\n association && association.opts && association.opts.polymorphic;\n\n assert(\n !isPolymorphic,\n `You're using the association() helper on your ${modelName} factory for ${attr}, which is a polymorphic relationship. This is not currently supported.`\n );\n\n let factoryAssociation = attributes[attr];\n let foreignKey = `${camelize(attr)}Id`;\n if (!overrides[attr]) {\n attributes[foreignKey] = this.create(\n association.modelName,\n ...factoryAssociation.traitsAndOverrides\n ).id;\n }\n delete attributes[attr];\n });\n }\n}\n","import Serializer from \"../serializer\";\nimport { underscore, dasherize, camelize } from \"../utils/inflector\";\n\nexport default Serializer.extend({\n serializeIds: \"always\",\n normalizeIds: true,\n\n keyForModel(type) {\n return underscore(type);\n },\n\n keyForAttribute(attr) {\n return underscore(attr);\n },\n\n keyForRelationship(type) {\n return this._container.inflector.pluralize(underscore(type));\n },\n\n keyForEmbeddedRelationship(attributeName) {\n return underscore(attributeName);\n },\n\n keyForRelationshipIds(type) {\n return `${underscore(this._container.inflector.singularize(type))}_ids`;\n },\n\n keyForForeignKey(relationshipName) {\n return `${underscore(relationshipName)}_id`;\n },\n\n keyForPolymorphicForeignKeyId(relationshipName) {\n return `${underscore(relationshipName)}_id`;\n },\n\n keyForPolymorphicForeignKeyType(relationshipName) {\n return `${underscore(relationshipName)}_type`;\n },\n\n normalize(payload) {\n let type = Object.keys(payload)[0];\n let attrs = payload[type];\n let modelName = camelize(type);\n let modelClass = this.schema.modelClassFor(modelName);\n let { belongsToAssociations, hasManyAssociations } = modelClass;\n let belongsToKeys = Object.keys(belongsToAssociations);\n let hasManyKeys = Object.keys(hasManyAssociations);\n\n let jsonApiPayload = {\n data: {\n type: this._container.inflector.pluralize(type),\n attributes: {}\n }\n };\n if (attrs.id) {\n jsonApiPayload.data.id = attrs.id;\n }\n\n let relationships = {};\n\n Object.keys(attrs).forEach(key => {\n if (key !== \"id\") {\n if (this.normalizeIds) {\n if (belongsToKeys.includes(key)) {\n let association = belongsToAssociations[key];\n let associationModel = association.modelName;\n relationships[dasherize(key)] = {\n data: {\n type: associationModel,\n id: attrs[key]\n }\n };\n } else if (hasManyKeys.includes(key)) {\n let association = hasManyAssociations[key];\n let associationModel = association.modelName;\n let data = attrs[key].map(id => {\n return {\n type: associationModel,\n id\n };\n });\n relationships[dasherize(key)] = { data };\n } else {\n jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];\n }\n } else {\n jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];\n }\n }\n });\n if (Object.keys(relationships).length) {\n jsonApiPayload.data.relationships = relationships;\n }\n\n return jsonApiPayload;\n },\n\n getCoalescedIds(request) {\n return request.queryParams && request.queryParams.ids;\n }\n});\n","import ActiveModelSerializer from \"./active-model-serializer\";\nimport { camelize } from \"../utils/inflector\";\n\nexport default ActiveModelSerializer.extend({\n serializeIds: \"always\",\n\n keyForModel(type) {\n return camelize(type);\n },\n\n keyForAttribute(attr) {\n return camelize(attr);\n },\n\n keyForRelationship(type) {\n return camelize(this._container.inflector.pluralize(type));\n },\n\n keyForEmbeddedRelationship(attributeName) {\n return camelize(attributeName);\n },\n\n keyForRelationshipIds(type) {\n return camelize(this._container.inflector.pluralize(type));\n },\n\n keyForForeignKey(relationshipName) {\n return camelize(this._container.inflector.singularize(relationshipName));\n },\n\n getCoalescedIds(request) {\n return request.queryParams && request.queryParams.ids;\n }\n});\n","/**\n UUID generator\n\n @hide\n*/\nexport default function() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n let r = (Math.random() * 16) | 0;\n let v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import Factory from \"./factory\";\nimport IdentityManager from \"./identity-manager\";\nimport association from \"./association\";\nimport trait from \"./trait\";\nimport Response from \"./response\";\nimport Server, { defaultPassthroughs } from \"./server\";\nimport Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport Serializer from \"./serializer\";\nimport ActiveModelSerializer from \"./serializers/active-model-serializer\";\nimport JSONAPISerializer from \"./serializers/json-api-serializer\";\nimport RestSerializer from \"./serializers/rest-serializer\";\nimport HasMany from \"./orm/associations/has-many\";\nimport BelongsTo from \"./orm/associations/belongs-to\";\n\n/*\n These are solely for ember-cli-mirage, a \"privileged consumer\", and should be\n removed once those import paths are dropped.\n*/\nimport _assert from \"./assert\";\nimport _DbCollection from \"./db-collection\";\nimport _Db from \"./db\";\nimport _RouteHandler from \"./route-handler\";\nimport _SerializerRegistry from \"./serializer-registry\";\nimport _ormAssociationsAssociation from \"./orm/associations/association\";\nimport _ormAssociationsBelongsTo from \"./orm/associations/belongs-to\";\nimport _ormAssociationsHasMany from \"./orm/associations/has-many\";\nimport _ormPolymorphicCollection from \"./orm/polymorphic-collection\";\nimport _ormSchema from \"./orm/schema\";\nimport _routeHandlersShorthandsBase from \"./route-handlers/shorthands/base\";\nimport _routeHandlersShorthandsDelete from \"./route-handlers/shorthands/delete\";\nimport _routeHandlersShorthandsGet from \"./route-handlers/shorthands/get\";\nimport _routeHandlersShorthandsHead from \"./route-handlers/shorthands/head\";\nimport _routeHandlersShorthandsPost from \"./route-handlers/shorthands/post\";\nimport _routeHandlersShorthandsPut from \"./route-handlers/shorthands/put\";\nimport _routeHandlersBase from \"./route-handlers/base\";\nimport _routeHandlersFunction from \"./route-handlers/function\";\nimport _routeHandlersObject from \"./route-handlers/object\";\nimport _utilsExtend from \"./utils/extend\";\nimport {\n camelize as _utilsInflectorCamelize,\n dasherize as _utilsInflectorDasherize,\n underscore as _utilsInflectorUnderscore,\n capitalize as _utilsInflectorCapitalize\n} from \"./utils/inflector\";\nimport _utilsIsAssociation from \"./utils/is-association\";\nimport _utilsReferenceSort from \"./utils/reference-sort\";\nimport _utilsUuid from \"./utils/uuid\";\n\n/**\n @hide\n*/\nfunction hasMany(...args) {\n return new HasMany(...args);\n}\n\n/**\n @hide\n*/\nfunction belongsTo(...args) {\n return new BelongsTo(...args);\n}\n\nexport {\n association,\n trait,\n Model,\n Collection,\n Serializer,\n ActiveModelSerializer,\n JSONAPISerializer,\n RestSerializer,\n hasMany,\n belongsTo,\n defaultPassthroughs,\n Server,\n Factory,\n IdentityManager,\n Response,\n _assert,\n _DbCollection,\n _Db,\n _RouteHandler,\n _SerializerRegistry,\n _ormAssociationsAssociation,\n _ormAssociationsBelongsTo,\n _ormAssociationsHasMany,\n _ormPolymorphicCollection,\n _ormSchema,\n _routeHandlersShorthandsBase,\n _routeHandlersShorthandsDelete,\n _routeHandlersShorthandsGet,\n _routeHandlersShorthandsHead,\n _routeHandlersShorthandsPost,\n _routeHandlersShorthandsPut,\n _routeHandlersBase,\n _routeHandlersFunction,\n _routeHandlersObject,\n _utilsExtend,\n _utilsInflectorCamelize,\n _utilsInflectorDasherize,\n _utilsInflectorUnderscore,\n _utilsInflectorCapitalize,\n _utilsIsAssociation,\n _utilsReferenceSort,\n _utilsUuid\n};\n\nexport default {\n Factory,\n Response,\n hasMany,\n belongsTo\n};\n"],"names":["edges","nodes","uniq","flatten","cursor","length","sorted","Array","visited","i","visit","node","predecessors","indexOf","Error","JSON","stringify","outgoing","filter","edge","preds","concat","pair","child","reverse","Factory","build","sequence","object","topLevelAttrs","Object","assign","attrs","afterCreate","keys","forEach","attr","isTrait","call","sortAttrs","key","buildAttrs","buildSingleValue","mapValues","value","isArray","map","isPlainObject","isFunction","extend","newAttrs","Subclass","extractAfterCreateCallbacks","traits","afterCreateCallbacks","traitCandidates","push","extension","attrName","__isTrait__","Temp","obj","refs","property","defineProperty","constructor","prototype","get","set","newValue","enumerable","configurable","referenceSort","isNumber","n","toString","IdentityManager","_nextId","_ids","uniqueIdentifier","nextValue","id","inc","association","__isAssociation__","traitsAndOverrides","trait","warn","console","Response","code","headers","data","undefined","hasOwnProperty","camelizeCache","dasherizeCache","underscoreCache","capitalizeCache","camelize","word","camelizedWord","_camelize","underscore","camelized","split","lowerFirst","join","dasherize","dasherized","_dasherize","underscored","_underscore","capitalize","capitalized","_capitalize","errorProps","assert","bool","text","MirageError","replace","message","stack","tmp","idx","prop","create","Association","modelName","opts","ownerModelName","schema","isExplicitReflexive","inverse","isImplicitReflexive","polymorphic","identifierCache","BelongsTo","getForeignKey","foreignKey","ModelClass","modelPrototype","associationHash","belongsToAssociations","belongsToAssociationFks","addDependentAssociation","associationKeys","add","associationIdKeys","_tempAssociations","tempParent","isPolymorphic","type","toCollectionName","find","foreignKeyId","model","hasInverseFor","inverseFor","associate","parent","save","reload","owner","fk","dependents","where","potentialOwner","models","dependent","disassociate","identifier","duplicate","DbCollection","name","initialData","_records","identityManager","insert","_insertRecord","ids","records","_findRecords","Boolean","record","_findRecord","query","_findRecordBy","_findRecordsWhere","attributesForCreate","queryResult","mergedAttributes","createdRecord","target","changedRecords","oldRecord","_updateRecord","isEqual","reset","index","splice","defaultQueryFunction","every","String","queryFunction","fetch","targetId","currentId","Db","identityManagers","_collections","registerIdentityManagers","loadData","createCollection","cloneDeep","reduce","collection","all","identityManagerFor","newCollection","recordsCopy","method","arguments","collections","c","remove","_identityManagers","_container","inflector","singularize","application","Collection","args","invokeMap","match","m","some","f","filteredModels","sortedModels","sort","slicedModels","slice","PolymorphicCollection","HasMany","hasManyAssociations","hasManyAssociationFks","tempChildren","el","polymorphicIds","compact","children","currentIds","pathModelClassCache","BaseRouteHandler","fullPath","path","lastPath","segment","request","jsonApiDoc","params","body","requestBody","parse","serializerOrRegistry","normalize","json","_getJsonApiDocForRequest","_getIdForRequest","attributes","relationships","sum","relationshipName","relationship","modelClass","modelClassFor","associationFor","valueForRelationship","url","rel","urlEncodedParts","a","urlEncodedPart","decodeURIComponent","FunctionRouteHandler","userFunction","server","response","serializerType","serializer","serializerFor","explicit","serialize","requestHeaders","lowerCaseHeaders","header","toLowerCase","test","_getAttrsForFormRequest","getModelClassFromPath","hasModelForModelName","_getAttrsForRequest","ObjectRouteHandler","BaseShorthandRouteHandler","shorthand","options","handle","handleStringShorthand","modelClasses","handleArrayShorthand","GetShorthandRouteHandler","camelizedModelName","coalesce","getCoalescedIds","PostShorthandRouteHandler","PutShorthandRouteHandler","update","DeleteShorthandRouteHandler","destroy","childTypes","pluralize","HeadShorthandRouteHandler","queryParams","DEFAULT_CODES","put","post","createHandler","verb","rawHandler","handler","FunctionHandler","ObjectHandler","GetShorthandHandler","PostShorthandHandler","PutShorthandHandler","DeleteShorthandHandler","HeadShorthandHandler","RouteHandler","customizedCode","_getMirageResponseForRequest","then","mirageResponse","serializedMirageResponse","toRackResponse","result","setRequest","e","_toMirageResponse","Promise","resolve","reject","_getCodeForResponse","protoProps","staticProps","Child","has","Model","fks","_schema","_validateAttr","_setupAttr","_setupRelationship","toInternalCollectionName","isNew","db","_definePlainAttribute","isSaving","_saveAssociations","val","isSaved","_disassociateFromDependents","hasDbRecord","hasId","collectionName","associationsFor","_explicitInverseFor","_implicitInverseFor","_checkForMultipleExplicitInverses","associations","candidate","matchingPolymorphic","matchingInverse","candidateInverse","matchingExplicitInverses","modelMatches","inverseKeyMatches","values","candidateIsImplicitInverse","candidateIsExplicitInverse","candidateMatches","associatedModelOrCollection","includes","alreadyAssociatedWith","found","isAssociation","existingProperty","getOwnPropertyDescriptor","isFk","_validateForeignKeyExistsInDatabase","isNull","isCollection","isArrayOfModels","item","endsWith","isModelOrCollection","modelOrCollection","foreignKeyName","foreignKeys","foreignKeyLabel","_saveBelongsToAssociations","_saveHasManyAssociations","_disassociateFromOldInverses","_saveNewAssociates","_associateWithNewInverses","_disassociateFromHasManyInverses","_disassociateFromBelongsToInverse","tempAssociation","associateIds","associateId","_updateInDb","dependentAssociationsFor","disassociateAllDependentsFromTarget","tempAssociate","__isSavingNewChildren","equals","_syncTempAssociations","fkValue","_associateModelWithInverse","inverseFk","ownerId","newId","inverseCollection","currentIdsForInverse","newIdsForInverse","idLabel","findBelongsToAssociation","associationType","Serializer","registry","include","root","embed","serializeIds","primaryResource","buildPayload","toInclude","didSerialize","isEmpty","getHashForPrimaryResource","resourceHash","newIncludes","newDidSerialize","nextIncludedResource","shift","getHashForIncludedResource","newToInclude","resource","newJson","mergePayloads","getHashForResource","hash","addToIncludes","hashWithRoot","rootKey","keyForResource","newModels","keyForRelationship","removeForeignKeys","lookupSerializer","isModel","_hashForModel","modelSerializer","uniqBy","getKeysForIncluded","resourceHashKey","keyForModel","keyForCollection","_attrsForModel","associatedResource","associatedResourceHash","formattedKey","keyForEmbeddedRelationship","_maybeAddAssociationIds","memo","_formatAttributeKeys","newHash","keyForRelationshipIds","formattedTypeKey","keyForPolymorphicForeignKeyType","formattedIdKey","keyForPolymorphicForeignKeyId","keyForForeignKey","attributeName","formattedAttrs","keyForAttribute","JSONAPISerializer","alwaysIncludeLinkageData","_createRequestedIncludesGraph","getAddToIncludesForResource","included","hasQueryParamIncludes","getResourceObjectForModel","relationshipPaths","getAddToIncludesForResourceAndPaths","relationshipNames","getIncludesForResourceAndPath","names","nameForCurrentResource","modelsToAdd","typeKeyForModel","_maybeAddRelationshipsToResourceObjectForModel","relationshipKey","relationshipHash","hasLinksForRelationship","links","shouldIncludeLinkageData","_relationshipIsIncludedForModel","graph","_includesGraph","graphKey","_graphKeyForModel","graphResource","primaryResourceKey","_addPrimaryModelToRequestedIncludesGraph","queryParamIncludes","getQueryParamIncludes","includesPath","relationshipKeys","graphRelationshipKey","normalizedRelationshipKey","hasAssociation","relationshipData","_addResourceToRequestedIncludesGraph","_addModelToRequestedIncludesGraph","resourceKey","_addResourceRelationshipsToRequestedIncludesGraph","SerializerRegistry","serializerMap","_serializerMap","payload","_isModelOrCollection","_isCollection","SerializerForResponse","JsonApiSerializer","_isModel","newSerializerMaps","currentSerializerMap","collectionNameCache","internalCollectionNameCache","modelNameCache","Schema","modelsMap","_registry","_dependentAssociations","registerModels","forIn","registerModel","Set","dependentAssociations","fksAddedFromThisModel","associationProperty","toModelName","setSchema","getForeignKeyArray","fkHolder","_addForeignKeyToRegistry","addMethodsToModelClass","findBy","findOrCreateBy","none","first","_instantiateModel","collectionForType","_hydrate","directDependents","polymorphicAssociations","modelFor","internalCollectionName","_modelFor","_foreignKeysFor","classes","defaultInflector","Container","className","Class","defaultContainer","isPluralForModelCache","createPretender","window","Pretender","passthroughRequest","shouldLog","log","toUpperCase","handledRequest","groupCollapsed","status","responseText","loggedRequest","loggedResponse","groupEnd","originalCheckPassthrough","checkPassthrough","shouldPassthrough","passthroughChecks","passthroughCheck","substr","passthrough","apply","unhandledRequest","decodeURI","trackRequests","shouldTrackRequests","defaultRouteOptions","timing","defaultPassthroughs","isOption","option","allOptions","optionKeys","extractRouteArguments","lastArg","t","Server","config","didOverrideConfig","environment","routes","baseConfig","seeds","scenarios","_config","namespace","register","urlPrefix","logging","testConfig","_defineRouteHandlerHelpers","registerSerializers","serializers","hasFactories","_hasModulesOfType","hasDefaultScenario","didOverridePretenderConfig","pretender","loadConfig","isTest","loadFactories","factories","loadFixtures","useDefaultPassthroughs","_configureDefaultPassthroughs","paths","verbs","pop","_getFullPath","fixtures","camelizedArgs","missingKeys","pick","factoryMap","currentFactoryMap","_factoryMap","camelizedType","arg","overrides","factorySequences","OriginalFactory","factoryFor","_validateTraits","mergedExtensions","_mergeExtensions","_mapAssociationsFromAttributes","factory","amount","isInteger","list","buildArgs","_modelOrFactoryExistsForType","collectionFromCreateList","modelOrRecord","createArguments","shutdown","resourceName","only","except","actionsMethodsAndsPathsMappings","methods","show","allActions","actions","action","methodsWithPath","alias","_registerRouteHandler","routeHandler","_serialize","modules","modulesOfType","trim","substring","namespaceSub","passthroughUrl","typeOrCollectionName","modelOrFactoryExists","_modelOrFactoryExistsForTypeOrCollectionName","isPlural","isUncountable","isPluralForModel","modelExists","dbCollectionExists","_typeIsPluralForModel","traitName","allExtensions","accum","isSelfReferentialBelongsTo","factoryAssociation","normalizeIds","belongsToKeys","hasManyKeys","jsonApiPayload","associationModel","ActiveModelSerializer","r","Math","random","v","hasMany","belongsTo"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAGA;;;;AAGe,wBAASA,KAAT,EAAgB;AAC7B,MAAIC,KAAK,GAAGC,IAAI,CAACC,OAAO,CAACH,KAAD,CAAR,CAAhB;AACA,MAAII,MAAM,GAAGH,KAAK,CAACI,MAAnB;AACA,MAAIC,MAAM,GAAG,IAAIC,KAAJ,CAAUH,MAAV,CAAb;AACA,MAAII,OAAO,GAAG,EAAd;AACA,MAAIC,CAAC,GAAGL,MAAR;;AAEA,MAAIM,KAAK,GAAG,SAARA,KAAQ,CAASC,IAAT,EAAeF,CAAf,EAAkBG,YAAlB,EAAgC;AAC1C,QAAIA,YAAY,CAACC,OAAb,CAAqBF,IAArB,KAA8B,CAAlC,EAAqC;AACnC,YAAM,IAAIG,KAAJ,2CAC+BC,IAAI,CAACC,SAAL,CAAeJ,YAAf,CAD/B,EAAN;AAGD;;AAED,QAAIJ,OAAO,CAACC,CAAD,CAAX,EAAgB;AACd;AACD,KAFD,MAEO;AACLD,MAAAA,OAAO,CAACC,CAAD,CAAP,GAAa,IAAb;AACD;;AAED,QAAIQ,QAAQ,GAAGjB,KAAK,CAACkB,MAAN,CAAa,UAASC,IAAT,EAAe;AACzC,aAAOA,IAAI,IAAIA,IAAI,CAAC,CAAD,CAAJ,KAAYR,IAA3B;AACD,KAFc,CAAf;AAGAF,IAAAA,CAAC,GAAGQ,QAAQ,CAACZ,MAAb;;AACA,QAAII,CAAJ,EAAO;AACL,UAAIW,KAAK,GAAGR,YAAY,CAACS,MAAb,CAAoBV,IAApB,CAAZ;;AACA,SAAG;AACD,YAAIW,IAAI,GAAGL,QAAQ,CAAC,EAAER,CAAH,CAAnB;AACA,YAAIc,KAAK,GAAGD,IAAI,CAAC,CAAD,CAAhB;;AACA,YAAIC,KAAJ,EAAW;AACTb,UAAAA,KAAK,CAACa,KAAD,EAAQtB,KAAK,CAACY,OAAN,CAAcU,KAAd,CAAR,EAA8BH,KAA9B,CAAL;AACD;AACF,OAND,QAMSX,CANT;AAOD;;AAEDH,IAAAA,MAAM,CAAC,EAAEF,MAAH,CAAN,GAAmBO,IAAnB;AACD,GA7BD;;AA+BA,SAAOF,CAAC,EAAR,EAAY;AACV,QAAI,CAACD,OAAO,CAACC,CAAD,CAAZ,EAAiB;AACfC,MAAAA,KAAK,CAACT,KAAK,CAACQ,CAAD,CAAN,EAAWA,CAAX,EAAc,EAAd,CAAL;AACD;AACF;;AAED,SAAOH,MAAM,CAACkB,OAAP,EAAP;AACD;;AC9CD,IAAIC,OAAO,GAAG,SAAVA,OAAU,GAAW;AACvB,OAAKC,KAAL,GAAa,UAASC,QAAT,EAAmB;AAAA;;AAC9B,QAAIC,MAAM,GAAG,EAAb;AACA,QAAIC,aAAa,GAAGC,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB,KAAKC,KAAvB,CAApB;AACA,WAAOH,aAAa,CAACI,WAArB;AACAH,IAAAA,MAAM,CAACI,IAAP,CAAYL,aAAZ,EAA2BM,OAA3B,CAAmC,UAAAC,IAAI,EAAI;AACzC,UAAIX,OAAO,CAACY,OAAR,CAAgBC,IAAhB,CAAqB,KAArB,EAA2BF,IAA3B,CAAJ,EAAsC;AACpC,eAAOP,aAAa,CAACO,IAAD,CAApB;AACD;AACF,KAJD;AAKA,QAAIF,IAAI,GAAGK,SAAS,CAACV,aAAD,EAAgBF,QAAhB,CAApB;AAEAO,IAAAA,IAAI,CAACC,OAAL,CAAa,UAASK,GAAT,EAAc;AACzB,UAAIC,UAAJ,EAAgBC,iBAAhB;;AAEAD,MAAAA,UAAU,GAAG,oBAAST,KAAT,EAAgB;AAC3B,eAAOW,SAAS,CAACX,KAAD,EAAQU,iBAAR,CAAhB;AACD,OAFD;;AAIAA,MAAAA,iBAAgB,GAAG,0BAAAE,KAAK,EAAI;AAC1B,YAAIrC,KAAK,CAACsC,OAAN,CAAcD,KAAd,CAAJ,EAA0B;AACxB,iBAAOA,KAAK,CAACE,GAAN,CAAUJ,iBAAV,CAAP;AACD,SAFD,MAEO,IAAIK,aAAa,CAACH,KAAD,CAAjB,EAA0B;AAC/B,iBAAOH,UAAU,CAACG,KAAD,CAAjB;AACD,SAFM,MAEA,IAAII,UAAU,CAACJ,KAAD,CAAd,EAAuB;AAC5B,iBAAOA,KAAK,CAACN,IAAN,CAAWT,aAAX,EAA0BF,QAA1B,CAAP;AACD,SAFM,MAEA;AACL,iBAAOiB,KAAP;AACD;AACF,OAVD;;AAYA,UAAIA,KAAK,GAAGf,aAAa,CAACW,GAAD,CAAzB;;AACA,UAAIQ,UAAU,CAACJ,KAAD,CAAd,EAAuB;AACrBhB,QAAAA,MAAM,CAACY,GAAD,CAAN,GAAcI,KAAK,CAACN,IAAN,CAAWV,MAAX,EAAmBD,QAAnB,CAAd;AACD,OAFD,MAEO;AACLC,QAAAA,MAAM,CAACY,GAAD,CAAN,GAAcE,iBAAgB,CAACE,KAAD,CAA9B;AACD;AACF,KAzBD;AA2BA,WAAOhB,MAAP;AACD,GAvCD;AAwCD,CAzCD;;AA2CAH,OAAO,CAACwB,MAAR,GAAiB,UAASjB,KAAT,EAAgB;AAC/B;AACA,MAAIkB,QAAQ,GAAGpB,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB,KAAKC,KAAvB,EAA8BA,KAA9B,CAAf;;AAEA,MAAImB,QAAQ,GAAG,SAAXA,QAAW,GAAW;AACxB,SAAKnB,KAAL,GAAakB,QAAb;AACAzB,IAAAA,OAAO,CAACa,IAAR,CAAa,IAAb;AACD,GAHD,CAJ+B;;;AAU/Ba,EAAAA,QAAQ,CAACF,MAAT,GAAkBxB,OAAO,CAACwB,MAA1B;AACAE,EAAAA,QAAQ,CAACC,2BAAT,GAAuC3B,OAAO,CAAC2B,2BAA/C;AACAD,EAAAA,QAAQ,CAACd,OAAT,GAAmBZ,OAAO,CAACY,OAA3B,CAZ+B;;AAe/Bc,EAAAA,QAAQ,CAACnB,KAAT,GAAiBkB,QAAjB;AAEA,SAAOC,QAAP;AACD,CAlBD;;AAoBA1B,OAAO,CAAC2B,2BAAR,GAAsC,YAA0B;AAAA;;AAAA,iFAAJ,EAAI;AAAA,MAAfC,MAAe,QAAfA,MAAe;;AAC9D,MAAIC,oBAAoB,GAAG,EAA3B;AACA,MAAItB,KAAK,GAAG,KAAKA,KAAL,IAAc,EAA1B;AACA,MAAIuB,eAAJ;;AAEA,MAAIvB,KAAK,CAACC,WAAV,EAAuB;AACrBqB,IAAAA,oBAAoB,CAACE,IAArB,CAA0BxB,KAAK,CAACC,WAAhC;AACD;;AAED,MAAI1B,KAAK,CAACsC,OAAN,CAAcQ,MAAd,CAAJ,EAA2B;AACzBE,IAAAA,eAAe,GAAGF,MAAlB;AACD,GAFD,MAEO;AACLE,IAAAA,eAAe,GAAGzB,MAAM,CAACI,IAAP,CAAYF,KAAZ,CAAlB;AACD;;AAEDuB,EAAAA,eAAe,CACZrC,MADH,CACU,UAAAkB,IAAI,EAAI;AACd,WAAO,MAAI,CAACC,OAAL,CAAaD,IAAb,KAAsBJ,KAAK,CAACI,IAAD,CAAL,CAAYqB,SAAZ,CAAsBxB,WAAnD;AACD,GAHH,EAIGE,OAJH,CAIW,UAAAC,IAAI,EAAI;AACfkB,IAAAA,oBAAoB,CAACE,IAArB,CAA0BxB,KAAK,CAACI,IAAD,CAAL,CAAYqB,SAAZ,CAAsBxB,WAAhD;AACD,GANH;AAQA,SAAOqB,oBAAP;AACD,CAxBD;;AA0BA7B,OAAO,CAACY,OAAR,GAAkB,UAASqB,QAAT,EAAmB;AAAA,MAC7B1B,KAD6B,GACnB,IADmB,CAC7BA,KAD6B;AAEnC,SAAOe,aAAa,CAACf,KAAK,CAAC0B,QAAD,CAAN,CAAb,IAAkC1B,KAAK,CAAC0B,QAAD,CAAL,CAAgBC,WAAhB,KAAgC,IAAzE;AACD,CAHD;;AAKA,SAASpB,SAAT,CAAmBP,KAAnB,EAA0BL,QAA1B,EAAoC;AAClC,MAAIiC,IAAI,GAAG,SAAPA,IAAO,GAAW,EAAtB;;AACA,MAAIC,GAAG,GAAG,IAAID,IAAJ,EAAV;AACA,MAAIE,IAAI,GAAG,EAAX;AACA,MAAIC,QAAJ;AAEAjC,EAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAASK,GAAT,EAAc;AACvC,QAAII,KAAJ;AACAd,IAAAA,MAAM,CAACkC,cAAP,CAAsBH,GAAG,CAACI,WAAJ,CAAgBC,SAAtC,EAAiD1B,GAAjD,EAAsD;AACpD2B,MAAAA,GADoD,iBAC9C;AACJL,QAAAA,IAAI,CAACN,IAAL,CAAU,CAACO,QAAD,EAAWvB,GAAX,CAAV;AACA,eAAOI,KAAP;AACD,OAJmD;AAKpDwB,MAAAA,GALoD,eAKhDC,QALgD,EAKtC;AACZzB,QAAAA,KAAK,GAAGyB,QAAR;AACD,OAPmD;AAQpDC,MAAAA,UAAU,EAAE,KARwC;AASpDC,MAAAA,YAAY,EAAE;AATsC,KAAtD;AAWD,GAbD;AAeAzC,EAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAASK,GAAT,EAAc;AACvC,QAAII,KAAK,GAAGZ,KAAK,CAACQ,GAAD,CAAjB;;AACA,QAAI,OAAOI,KAAP,KAAiB,UAArB,EAAiC;AAC/BiB,MAAAA,GAAG,CAACrB,GAAD,CAAH,GAAWI,KAAX;AACD;AACF,GALD;AAOAd,EAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAASK,GAAT,EAAc;AACvC,QAAII,KAAK,GAAGZ,KAAK,CAACQ,GAAD,CAAjB;AACAuB,IAAAA,QAAQ,GAAGvB,GAAX;;AAEA,QAAI,OAAOI,KAAP,KAAiB,UAArB,EAAiC;AAC/BiB,MAAAA,GAAG,CAACrB,GAAD,CAAH,GAAWI,KAAK,CAACN,IAAN,CAAWuB,GAAX,EAAgBlC,QAAhB,CAAX;AACD;;AAEDmC,IAAAA,IAAI,CAACN,IAAL,CAAU,CAAChB,GAAD,CAAV;AACD,GATD;AAWA,SAAOgC,aAAa,CAACV,IAAD,CAApB;AACD;;AC3ID,SAASW,QAAT,CAAkBC,CAAlB,EAAqB;AACnB,SAAO,CAAC,CAACA,CAAF,EAAKC,QAAL,OAAoBD,CAAC,CAACC,QAAF,EAA3B;AACD;AAED;;;;;;;;;;;;;;;;;;;IAiBMC;;;AACJ,6BAAc;AAAA;;AACZ,SAAKC,OAAL,GAAe,CAAf;AACA,SAAKC,IAAL,GAAY,EAAZ;AACD;AAED;;;;;;;;;0BAKM;AACJ,aAAO,KAAKD,OAAZ;AACD;AAED;;;;;;;;;;wBASIE,kBAAkB;AACpB,UAAI,KAAKD,IAAL,CAAUC,gBAAV,CAAJ,EAAiC;AAC/B,cAAM,IAAIjE,KAAJ,oCACwBiE,gBADxB,kCAAN;AAGD;;AAED,UAAIN,QAAQ,CAACM,gBAAD,CAAR,IAA8B,CAACA,gBAAD,IAAqB,KAAKF,OAA5D,EAAqE;AACnE,aAAKA,OAAL,GAAe,CAACE,gBAAD,GAAoB,CAAnC;AACD;;AAED,WAAKD,IAAL,CAAUC,gBAAV,IAA8B,IAA9B;AACD;AAED;;;;;;;;0BAKM;AACJ,UAAIC,SAAS,GAAG,KAAKb,GAAL,KAAa,CAA7B;AAEA,WAAKU,OAAL,GAAeG,SAAf;AAEA,aAAOA,SAAP;AACD;AAED;;;;;;;;;4BAOQ;AACN,UAAIC,EAAE,GAAG,KAAKd,GAAL,EAAT;AAEA,WAAKW,IAAL,CAAUG,EAAV,IAAgB,IAAhB;AAEA,WAAKC,GAAL;AAEA,aAAOD,EAAE,CAACN,QAAH,EAAP;AACD;AAED;;;;;;;;4BAMQ;AACN,WAAKE,OAAL,GAAe,CAAf;AACA,WAAKC,IAAL,GAAY,EAAZ;AACD;;;;;;AClGH;;;AAGA,IAAIK,WAAW,GAAG,SAAdA,WAAc,GAAgC;AAChD,MAAIC,iBAAiB,GAAG,IAAxB;;AADgD,oCAApBC,kBAAoB;AAApBA,IAAAA,kBAAoB;AAAA;;AAGhD,SAAO;AACLD,IAAAA,iBAAiB,EAAjBA,iBADK;AAELC,IAAAA,kBAAkB,EAAlBA;AAFK,GAAP;AAID,CAPD;;ACHA,IAAIC,KAAK,GAAG,SAARA,KAAQ,CAAS7B,SAAT,EAAoB;AAC9B,MAAIE,WAAW,GAAG,IAAlB;AACA,SAAO;AACLF,IAAAA,SAAS,EAATA,SADK;AAELE,IAAAA,WAAW,EAAXA;AAFK,GAAP;AAID,CAND;;ACAA,IAAM4B,IAAI,GAAGC,OAAO,CAACD,IAArB;;AAEA;;;;;;;;;;;;;;IAaqBE;;;AACnB,oBAAYC,IAAZ,EAAsC;AAAA,QAApBC,OAAoB,uEAAV,EAAU;AAAA,QAANC,IAAM;;AAAA;;AACpC,SAAKF,IAAL,GAAYA,IAAZ;AACA,SAAKC,OAAL,GAAeA,OAAf,CAFoC;;AAKpC,QAAID,IAAI,KAAK,GAAb,EAAkB;AAChB,UAAIE,IAAI,KAAKC,SAAT,IAAsBD,IAAI,KAAK,EAAnC,EAAuC;AACrCL,QAAAA,IAAI,+QAAJ;AAMD,OAPD,MAOO;AACL,aAAKK,IAAL,GAAY,EAAZ;AACD,OAVe;;AAajB,KAbD,MAaO,IACL,CAACA,IAAI,KAAKC,SAAT,IAAsBD,IAAI,KAAK,EAAhC,KACA,CAAC9D,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CAAqC,KAAKqD,OAA1C,EAAmD,cAAnD,CAFI,EAGL;AACA,WAAKC,IAAL,GAAY,EAAZ;AACD,KALM,MAKA;AACL,WAAKA,IAAL,GAAYA,IAAZ;AACD,KAzBmC;;;AA4BpC,QACEF,IAAI,KAAK,GAAT,IACA,CAAC5D,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CAAqC,KAAKqD,OAA1C,EAAmD,cAAnD,CAFH,EAGE;AACA,WAAKA,OAAL,CAAa,cAAb,IAA+B,kBAA/B;AACD;AACF;;;;qCAEgB;AACf,aAAO,CAAC,KAAKD,IAAN,EAAY,KAAKC,OAAjB,EAA0B,KAAKC,IAA/B,CAAP;AACD;;;;;;AC9CH,IAAMG,aAAa,GAAG,EAAtB;AACA,IAAMC,cAAc,GAAG,EAAvB;AACA,IAAMC,eAAe,GAAG,EAAxB;AACA,IAAMC,eAAe,GAAG,EAAxB;AAEA;;;;;AAIA,AAAO,SAASC,QAAT,CAAkBC,IAAlB,EAAwB;AAC7B,MAAI,OAAOL,aAAa,CAACK,IAAD,CAApB,KAA+B,QAAnC,EAA6C;AAC3C,QAAIC,aAAa,GAAGC,UAAS,CAACC,UAAU,CAACH,IAAD,CAAX,EAAmB,KAAnB,CAA7B;AAEA;;;;;;;;;AASA,QAAMI,SAAS,GAAGH,aAAa,CAC5BI,KADe,CACT,GADS,EAEf3D,GAFe,CAEX4D,UAFW,EAGfC,IAHe,CAGV,GAHU,CAAlB;AAKAZ,IAAAA,aAAa,CAACK,IAAD,CAAb,GAAsBI,SAAtB;AACD;;AAED,SAAOT,aAAa,CAACK,IAAD,CAApB;AACD;AAED;;;;;AAIA,AAAO,SAASQ,SAAT,CAAmBR,IAAnB,EAAyB;AAC9B,MAAI,OAAOJ,cAAc,CAACI,IAAD,CAArB,KAAgC,QAApC,EAA8C;AAC5C,QAAMS,UAAU,GAAGC,WAAU,CAACP,UAAU,CAACH,IAAD,CAAX,CAA7B;;AAEAJ,IAAAA,cAAc,CAACI,IAAD,CAAd,GAAuBS,UAAvB;AACD;;AAED,SAAOb,cAAc,CAACI,IAAD,CAArB;AACD;AAED,AAAO,SAASG,UAAT,CAAoBH,IAApB,EAA0B;AAC/B,MAAI,OAAOH,eAAe,CAACG,IAAD,CAAtB,KAAiC,QAArC,EAA+C;AAC7C,QAAMW,WAAW,GAAGC,YAAW,CAACZ,IAAD,CAA/B;;AAEAH,IAAAA,eAAe,CAACG,IAAD,CAAf,GAAwBW,WAAxB;AACD;;AAED,SAAOd,eAAe,CAACG,IAAD,CAAtB;AACD;AAED,AAAO,SAASa,UAAT,CAAoBb,IAApB,EAA0B;AAC/B,MAAI,OAAOF,eAAe,CAACE,IAAD,CAAtB,KAAiC,QAArC,EAA+C;AAC7C,QAAMc,WAAW,GAAGC,YAAW,CAACf,IAAD,CAA/B;;AAEAF,IAAAA,eAAe,CAACE,IAAD,CAAf,GAAwBc,WAAxB;AACD;;AAED,SAAOhB,eAAe,CAACE,IAAD,CAAtB;AACD;;ACvED;;;;AAGA,AAAe,wBAASxE,MAAT,EAAiB;AAC9B,SAAOmB,aAAa,CAACnB,MAAD,CAAb,IAAyBA,MAAM,CAACwD,iBAAP,KAA6B,IAA7D;AACD;;ACPD;AACA,IAAIgC,UAAU,GAAG,CACf,aADe,EAEf,UAFe,EAGf,YAHe,EAIf,SAJe,EAKf,MALe,EAMf,QANe,EAOf,OAPe,CAAjB;AAUA;;;;AAGA,AAAe,SAASC,MAAT,CAAgBC,IAAhB,EAAsBC,IAAtB,EAA4B;AACzC,MAAI,OAAOD,IAAP,KAAgB,QAAhB,IAA4B,CAACC,IAAjC,EAAuC;AACrC;AACA,UAAM,IAAIC,WAAJ,CAAgBF,IAAhB,CAAN;AACD;;AAED,MAAI,CAACA,IAAL,EAAW;AACT;AACA,UAAM,IAAIE,WAAJ,CAAgBD,IAAI,CAACE,OAAL,CAAa,OAAb,EAAsB,EAAtB,KAA6B,kBAA7C,CAAN;AACD;AACF;AAED;;;;;;AAKA,AAAO,SAASD,WAAT,CAAqBE,OAArB,EAA8BC,KAA9B,EAAqC;AAC1C,MAAIC,GAAG,GAAG9G,KAAK,CAAC4G,OAAD,CAAf;;AAEA,MAAIC,KAAJ,EAAW;AACTC,IAAAA,GAAG,CAACD,KAAJ,GAAYA,KAAZ;AACD;;AAED,OAAK,IAAIE,GAAG,GAAG,CAAf,EAAkBA,GAAG,GAAGT,UAAU,CAAC/G,MAAnC,EAA2CwH,GAAG,EAA9C,EAAkD;AAChD,QAAIC,IAAI,GAAGV,UAAU,CAACS,GAAD,CAArB;;AAEA,QAAI,CAAC,aAAD,EAAgB,SAAhB,EAA2B,OAA3B,EAAoChH,OAApC,CAA4CiH,IAA5C,IAAoD,CAAC,CAAzD,EAA4D;AAC1D,WAAKA,IAAL,sBAAwBF,GAAG,CAACE,IAAD,CAA3B;AACD,KAFD,MAEO;AACL,WAAKA,IAAL,IAAaF,GAAG,CAACE,IAAD,CAAhB;AACD;AACF;AACF;AAEDN,WAAW,CAACtD,SAAZ,GAAwBpC,MAAM,CAACiG,MAAP,CAAcjH,KAAK,CAACoD,SAApB,CAAxB;;AC/CA;;;;;;;;IAOqB8D;;;AACnB,uBAAYC,SAAZ,EAAuBC,IAAvB,EAA6B;AAAA;;AAC3B,QAAI,QAAOD,SAAP,MAAqB,QAAzB,EAAmC;AACjC;AACA,WAAKA,SAAL,GAAiBpC,SAAjB;AACA,WAAKqC,IAAL,GAAYD,SAAZ;AACD,KAJD,MAIO;AACL;AACA;AACA,WAAKA,SAAL,GAAiBA,SAAS,GAAGrB,SAAS,CAACqB,SAAD,CAAZ,GAA0B,EAApD;AACA,WAAKC,IAAL,GAAYA,IAAI,IAAI,EAApB;AACD,KAV0B;;;AAa3B,SAAK1F,GAAL,GAAW,EAAX,CAb2B;;AAgB3B,SAAK2F,cAAL,GAAsB,EAAtB;AACD;AAED;;;;;;;;;;8BAOUC,QAAQ;AAChB,WAAKA,MAAL,GAAcA,MAAd;AACD;AAED;;;;;;;;;kCAOc;AACZ,UAAIC,mBAAmB,GAAG,CAAC,EACzB,KAAKJ,SAAL,KAAmB,KAAKE,cAAxB,IAA0C,KAAKD,IAAL,CAAUI,OAD3B,CAA3B;AAGA,UAAIC,mBAAmB,GAAG,CAAC,EACzB,KAAKL,IAAL,CAAUI,OAAV,KAAsBzC,SAAtB,IAAmC,KAAKsC,cAAL,KAAwB,KAAKF,SADvC,CAA3B;AAIA,aAAOI,mBAAmB,IAAIE,mBAA9B;AACD;;;wBAEmB;AAClB,aAAO,KAAKL,IAAL,CAAUM,WAAjB;AACD;AAED;;;;;;wBAGiB;AACf,YAAM,IAAI1H,KAAJ,CACJ,kEADI,CAAN;AAGD;;;;;;ACjEH,IAAM2H,eAAe,GAAG,EAAxB;AAEA;;;;;;;;;;IASqBC;;;;;;;;;;;;;;AAWnB;;;;;;yCAMqB;AACnB,aAAO,CAACvC,QAAQ,CAAC,KAAKgC,cAAN,CAAT,EAAgC,KAAKQ,aAAL,EAAhC,CAAP;AACD;AAED;;;;;;;;oCAKgB;AACd;AACA,UAAI,OAAOF,eAAe,CAAC,KAAKjG,GAAN,CAAtB,KAAqC,QAAzC,EAAmD;AACjD,YAAMoG,UAAU,aAAMzC,QAAQ,CAAC,KAAK3D,GAAN,CAAd,OAAhB;AAEAiG,QAAAA,eAAe,CAAC,KAAKjG,GAAN,CAAf,GAA4BoG,UAA5B;AACD;;AAED,aAAOH,eAAe,CAAC,KAAKjG,GAAN,CAAtB;AACD;AAED;;;;;;;;;;;;;2CAUuBqG,YAAYrG,KAAK;AACtC,UAAIsG,cAAc,GAAGD,UAAU,CAAC3E,SAAhC;AACA,UAAIiB,WAAW,GAAG,IAAlB;AACA,UAAIyD,UAAU,GAAG,KAAKD,aAAL,EAAjB;;AACA,UAAII,eAAe,uBAAMvG,GAAN,EAAY,IAAZ,CAAnB;;AAEAsG,MAAAA,cAAc,CAACE,qBAAf,GAAuClH,MAAM,CAACC,MAAP,CACrC+G,cAAc,CAACE,qBADsB,EAErCD,eAFqC,CAAvC,CANsC;;AAYtCjH,MAAAA,MAAM,CAACI,IAAP,CAAY4G,cAAc,CAACE,qBAA3B,EAAkD7G,OAAlD,CAA0D,UAAAK,GAAG,EAAI;AAC/D,YAAMI,KAAK,GAAGkG,cAAc,CAACE,qBAAf,CAAqCxG,GAArC,CAAd;AACAsG,QAAAA,cAAc,CAACG,uBAAf,CAAuCrG,KAAK,CAAC+F,aAAN,EAAvC,IAAgE/F,KAAhE;AACD,OAHD,EAZsC;;AAkBtC,WAAKwF,MAAL,CAAYc,uBAAZ,CAAoC,IAApC,EAA0C,KAAKjB,SAA/C,EAlBsC;AAqBtC;;AACAa,MAAAA,cAAc,CAACK,eAAf,CAA+BC,GAA/B,CAAmC5G,GAAnC;AACAsG,MAAAA,cAAc,CAACO,iBAAf,CAAiCD,GAAjC,CAAqCR,UAArC;AAEA9G,MAAAA,MAAM,CAACkC,cAAP,CAAsB8E,cAAtB,EAAsCF,UAAtC,EAAkD;AAChD;;;;AAIAzE,QAAAA,GALgD,iBAK1C;AACJ,eAAKmF,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AACA,cAAIC,UAAU,GAAG,KAAKD,iBAAL,CAAuB9G,GAAvB,CAAjB;AACA,cAAIyC,EAAJ;;AAEA,cAAIsE,UAAU,KAAK,IAAnB,EAAyB;AACvBtE,YAAAA,EAAE,GAAG,IAAL;AACD,WAFD,MAEO;AACL,gBAAIE,WAAW,CAACqE,aAAhB,EAA+B;AAC7B,kBAAID,UAAJ,EAAgB;AACdtE,gBAAAA,EAAE,GAAG;AAAEA,kBAAAA,EAAE,EAAEsE,UAAU,CAACtE,EAAjB;AAAqBwE,kBAAAA,IAAI,EAAEF,UAAU,CAACtB;AAAtC,iBAAL;AACD,eAFD,MAEO;AACLhD,gBAAAA,EAAE,GAAG,KAAKjD,KAAL,CAAW4G,UAAX,CAAL;AACD;AACF,aAND,MAMO;AACL,kBAAIW,UAAJ,EAAgB;AACdtE,gBAAAA,EAAE,GAAGsE,UAAU,CAACtE,EAAhB;AACD,eAFD,MAEO;AACLA,gBAAAA,EAAE,GAAG,KAAKjD,KAAL,CAAW4G,UAAX,CAAL;AACD;AACF;AACF;;AAED,iBAAO3D,EAAP;AACD,SA7B+C;;AA+BhD;;;;AAIAb,QAAAA,GAnCgD,eAmC5Ca,EAnC4C,EAmCxC;AACN,cAAIsE,UAAJ;;AAEA,cAAItE,EAAE,KAAK,IAAX,EAAiB;AACfsE,YAAAA,UAAU,GAAG,IAAb;AACD,WAFD,MAEO,IAAItE,EAAE,KAAKY,SAAX,EAAsB;AAC3B,gBAAIV,WAAW,CAACqE,aAAhB,EAA+B;AAC7BnC,cAAAA,MAAM,CACJ,QAAOpC,EAAP,MAAc,QADV,iEAEoDE,WAAW,CAAC3C,GAFhE,8FAAN;AAIA+G,cAAAA,UAAU,GAAGpE,WAAW,CAACiD,MAAZ,CACXjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCzE,EAAE,CAACwE,IAAvC,CADW,EAEXE,IAFW,CAEN1E,EAAE,CAACA,EAFG,CAAb;AAGD,aARD,MAQO;AACLsE,cAAAA,UAAU,GAAGpE,WAAW,CAACiD,MAAZ,CACXjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCvE,WAAW,CAAC8C,SAAhD,CADW,EAEX0B,IAFW,CAEN1E,EAFM,CAAb;AAGAoC,cAAAA,MAAM,CACJkC,UADI,0BAEapE,WAAW,CAAC8C,SAFzB,wBAEgDhD,EAFhD,EAAN;AAID;AACF;;AAED,eAAKzC,GAAL,IAAY+G,UAAZ;AACD;AA7D+C,OAAlD;AAgEAzH,MAAAA,MAAM,CAACkC,cAAP,CAAsB8E,cAAtB,EAAsCtG,GAAtC,EAA2C;AACzC;;;;AAIA2B,QAAAA,GALyC,iBAKnC;AACJ,eAAKmF,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AAEA,cAAIC,UAAU,GAAG,KAAKD,iBAAL,CAAuB9G,GAAvB,CAAjB;AACA,cAAIoH,YAAY,GAAG,KAAKhB,UAAL,CAAnB;AACA,cAAIiB,KAAK,GAAG,IAAZ;;AAEA,cAAIN,UAAJ,EAAgB;AACdM,YAAAA,KAAK,GAAGN,UAAR;AACD,WAFD,MAEO,IAAIK,YAAY,KAAK,IAArB,EAA2B;AAChC,gBAAIzE,WAAW,CAACqE,aAAhB,EAA+B;AAC7BK,cAAAA,KAAK,GAAG1E,WAAW,CAACiD,MAAZ,CACNjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCE,YAAY,CAACH,IAAjD,CADM,EAENE,IAFM,CAEDC,YAAY,CAAC3E,EAFZ,CAAR;AAGD,aAJD,MAIO;AACL4E,cAAAA,KAAK,GAAG1E,WAAW,CAACiD,MAAZ,CACNjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCvE,WAAW,CAAC8C,SAAhD,CADM,EAEN0B,IAFM,CAEDC,YAFC,CAAR;AAGD;AACF;;AAED,iBAAOC,KAAP;AACD,SA3BwC;;AA6BzC;;;;;;;;;;;;AAcAzF,QAAAA,GA3CyC,eA2CrCyF,KA3CqC,EA2C9B;AACT,eAAKP,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AACA,eAAKA,iBAAL,CAAuB9G,GAAvB,IAA8BqH,KAA9B;;AAEA,cAAIA,KAAK,IAAIA,KAAK,CAACC,aAAN,CAAoB3E,WAApB,CAAb,EAA+C;AAC7C,gBAAImD,OAAO,GAAGuB,KAAK,CAACE,UAAN,CAAiB5E,WAAjB,CAAd;AAEA0E,YAAAA,KAAK,CAACG,SAAN,CAAgB,IAAhB,EAAsB1B,OAAtB;AACD;AACF;AApDwC,OAA3C;AAuDA;;;;;;AAMAQ,MAAAA,cAAc,cAAO7B,UAAU,CAACzE,GAAD,CAAjB,EAAd,GAA0C,YAAkB;AAC1D,YAAIyF,SAAJ,EAAejG,KAAf;;AAEA,YAAImD,WAAW,CAACqE,aAAhB,EAA+B;AAC7BvB,UAAAA,SAAS,mDAAT;AACAjG,UAAAA,KAAK,mDAAL;AACD,SAHD,MAGO;AACLiG,UAAAA,SAAS,GAAG9C,WAAW,CAAC8C,SAAxB;AACAjG,UAAAA,KAAK,mDAAL;AACD;;AAED,YAAIiI,MAAM,GAAG9E,WAAW,CAACiD,MAAZ,CACXjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCzB,SAApC,CADW,SAEPjG,KAFO,CAAb;AAIA,aAAKQ,GAAL,IAAYyH,MAAZ;AAEA,eAAOA,MAAP;AACD,OAlBD;AAoBA;;;;;;;AAMAnB,MAAAA,cAAc,iBAAU7B,UAAU,CAACzE,GAAD,CAApB,EAAd,GAA6C,YAAkB;AAC7D,YAAIyF,SAAJ,EAAejG,KAAf;;AACA,YAAImD,WAAW,CAACqE,aAAhB,EAA+B;AAC7BvB,UAAAA,SAAS,mDAAT;AACAjG,UAAAA,KAAK,mDAAL;AACD,SAHD,MAGO;AACLiG,UAAAA,SAAS,GAAG9C,WAAW,CAAC8C,SAAxB;AACAjG,UAAAA,KAAK,mDAAL;AACD;;AAED,YAAIiI,MAAM,GAAG9E,WAAW,CAACiD,MAAZ,CACXjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCzB,SAApC,CADW,EAEXF,MAFW,CAEJ/F,KAFI,CAAb;AAIA,aAAKQ,GAAL,IAAYyH,MAAZ;AACA,aAAKC,IAAL;AAEA,eAAOD,MAAM,CAACE,MAAP,EAAP;AACD,OAlBD;AAmBD;AAED;;;;;;;;wDAKoCN,OAAO;AAAA;;AACzC,UAAIO,KAAK,GAAG,KAAKjC,cAAjB;AACA,UAAIkC,EAAJ;;AAEA,UAAI,KAAKb,aAAT,EAAwB;AACtBa,QAAAA,EAAE,GAAG;AAAEZ,UAAAA,IAAI,EAAEI,KAAK,CAAC5B,SAAd;AAAyBhD,UAAAA,EAAE,EAAE4E,KAAK,CAAC5E;AAAnC,SAAL;AACD,OAFD,MAEO;AACLoF,QAAAA,EAAE,GAAGR,KAAK,CAAC5E,EAAX;AACD;;AAED,UAAIqF,UAAU,GAAG,KAAKlC,MAAL,CAAY,KAAKA,MAAL,CAAYsB,gBAAZ,CAA6BU,KAA7B,CAAZ,EAAiDG,KAAjD,CACf,UAAAC,cAAc,EAAI;AAChB,YAAIvF,EAAE,GAAGuF,cAAc,CAAC,KAAI,CAAC7B,aAAL,EAAD,CAAvB;;AAEA,YAAI,CAAC1D,EAAL,EAAS;AACP,iBAAO,KAAP;AACD;;AAED,YAAI,QAAOA,EAAP,MAAc,QAAlB,EAA4B;AAC1B,iBAAOA,EAAE,CAACwE,IAAH,KAAYY,EAAE,CAACZ,IAAf,IAAuBxE,EAAE,CAACA,EAAH,KAAUoF,EAAE,CAACpF,EAA3C;AACD,SAFD,MAEO;AACL,iBAAOA,EAAE,KAAKoF,EAAd;AACD;AACF,OAbc,CAAjB;AAgBAC,MAAAA,UAAU,CAACG,MAAX,CAAkBtI,OAAlB,CAA0B,UAAAuI,SAAS,EAAI;AACrCA,QAAAA,SAAS,CAACC,YAAV,CAAuBd,KAAvB,EAA8B,KAA9B;AACAa,QAAAA,SAAS,CAACR,IAAV;AACD,OAHD;AAID;;;wBAtRgB;AACf,UAAI,OAAOzB,eAAe,CAAC,KAAKjG,GAAN,CAAtB,KAAqC,QAAzC,EAAmD;AACjD,YAAMoI,UAAU,aAAMzE,QAAQ,CAAC,KAAK3D,GAAN,CAAd,OAAhB;AAEAiG,QAAAA,eAAe,CAAC,KAAKjG,GAAN,CAAf,GAA4BoI,UAA5B;AACD;;AAED,aAAOnC,eAAe,CAAC,KAAKjG,GAAN,CAAtB;AACD;;;;EAToCwF;;ACZvC,SAAS6C,SAAT,CAAmBjF,IAAnB,EAAyB;AACvB,MAAIrF,KAAK,CAACsC,OAAN,CAAc+C,IAAd,CAAJ,EAAyB;AACvB,WAAOA,IAAI,CAAC9C,GAAL,CAAS+H,SAAT,CAAP;AACD,GAFD,MAEO;AACL,WAAO/I,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB6D,IAAlB,CAAP;AACD;AACF;AAED;;;;;;;;;;;;;;;;;;;;;;IAoBMkF;;;AACJ,wBAAYC,IAAZ,EAAkBC,WAAlB,EAA+BpG,eAA/B,EAAgD;AAAA;;AAC9C,SAAKmG,IAAL,GAAYA,IAAZ;AACA,SAAKE,QAAL,GAAgB,EAAhB;AACA,SAAKC,eAAL,GAAuB,IAAItG,eAAJ,EAAvB;;AAEA,QAAIoG,WAAJ,EAAiB;AACf,WAAKG,MAAL,CAAYH,WAAZ;AACD;AACF;AAED;;;;;;;;;;0BAMM;AACJ,aAAOH,SAAS,CAAC,KAAKI,QAAN,CAAhB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;2BAuBOrF,MAAM;AAAA;;AACX,UAAI,CAACrF,KAAK,CAACsC,OAAN,CAAc+C,IAAd,CAAL,EAA0B;AACxB,eAAO,KAAKwF,aAAL,CAAmBxF,IAAnB,CAAP;AACD,OAFD,MAEO;AACL,eAAO9C,GAAG,CAAC8C,IAAD,EAAO,UAAA5D,KAAK;AAAA,iBAAI,KAAI,CAACoJ,aAAL,CAAmBpJ,KAAnB,CAAJ;AAAA,SAAZ,CAAV;AACD;AACF;AAED;;;;;;;;;;;;;;;;;yBAiBKqJ,KAAK;AACR,UAAI9K,KAAK,CAACsC,OAAN,CAAcwI,GAAd,CAAJ,EAAwB;AACtB,YAAIC,OAAO,GAAG,KAAKC,YAAL,CAAkBF,GAAlB,EACXnK,MADW,CACJsK,OADI,EAEX1I,GAFW,CAEP+H,SAFO,CAAd,CADsB;;;AAKtB,eAAOS,OAAP;AACD,OAND,MAMO;AACL,YAAIG,MAAM,GAAG,KAAKC,WAAL,CAAiBL,GAAjB,CAAb;;AACA,YAAI,CAACI,MAAL,EAAa;AACX,iBAAO,IAAP;AACD,SAJI;;;AAOL,eAAOZ,SAAS,CAACY,MAAD,CAAhB;AACD;AACF;AAED;;;;;;;;;;;;;;;2BAcOE,OAAO;AACZ,UAAIF,MAAM,GAAG,KAAKG,aAAL,CAAmBD,KAAnB,CAAb;;AACA,UAAI,CAACF,MAAL,EAAa;AACX,eAAO,IAAP;AACD,OAJW;;;AAOZ,aAAOZ,SAAS,CAACY,MAAD,CAAhB;AACD;AAED;;;;;;;;;;;;;;;0BAeME,OAAO;AACX,aAAO,KAAKE,iBAAL,CAAuBF,KAAvB,EAA8B7I,GAA9B,CAAkC+H,SAAlC,CAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAyCcc,OAAiC;AAAA,UAA1BG,mBAA0B,uEAAJ,EAAI;AAC7C,UAAIC,WAAW,GAAG,KAAKxB,KAAL,CAAWoB,KAAX,CAAlB;;AAD6C,wCAE9BI,WAF8B;AAAA,UAExCN,MAFwC;;AAI7C,UAAIA,MAAJ,EAAY;AACV,eAAOA,MAAP;AACD,OAFD,MAEO;AACL,YAAIO,gBAAgB,GAAGlK,MAAM,CAACC,MAAP,CAAc+J,mBAAd,EAAmCH,KAAnC,CAAvB;AACA,YAAIM,aAAa,GAAG,KAAKd,MAAL,CAAYa,gBAAZ,CAApB;AAEA,eAAOC,aAAP;AACD;AACF;AAED;;;;;;;;;;;;;;;;;;;;;;2BAyBOC,QAAQlK,OAAO;AAAA;;AACpB,UAAIsJ,OAAJ;;AAEA,UAAI,OAAOtJ,KAAP,KAAiB,WAArB,EAAkC;AAChCA,QAAAA,KAAK,GAAGkK,MAAR;AACA,YAAIC,cAAc,GAAG,EAArB;;AAEA,aAAKlB,QAAL,CAAc9I,OAAd,CAAsB,UAAAsJ,MAAM,EAAI;AAC9B,cAAIW,SAAS,GAAGtK,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB0J,MAAlB,CAAhB;;AAEA,UAAA,MAAI,CAACY,aAAL,CAAmBZ,MAAnB,EAA2BzJ,KAA3B;;AAEA,cAAI,CAACsK,OAAO,CAACF,SAAD,EAAYX,MAAZ,CAAZ,EAAiC;AAC/BU,YAAAA,cAAc,CAAC3I,IAAf,CAAoBiI,MAApB;AACD;AACF,SARD;;AAUA,eAAOU,cAAP;AACD,OAfD,MAeO,IAAI,OAAOD,MAAP,KAAkB,QAAlB,IAA8B,OAAOA,MAAP,KAAkB,QAApD,EAA8D;AACnE,YAAIjH,EAAE,GAAGiH,MAAT;;AACA,YAAIT,MAAM,GAAG,KAAKC,WAAL,CAAiBzG,EAAjB,CAAb;;AAEA,aAAKoH,aAAL,CAAmBZ,MAAnB,EAA2BzJ,KAA3B;;AAEA,eAAOyJ,MAAP;AACD,OAPM,MAOA,IAAIlL,KAAK,CAACsC,OAAN,CAAcqJ,MAAd,CAAJ,EAA2B;AAChC,YAAIb,GAAG,GAAGa,MAAV;AACAZ,QAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBF,GAAlB,CAAV;AAEAC,QAAAA,OAAO,CAACnJ,OAAR,CAAgB,UAAAsJ,MAAM,EAAI;AACxB,UAAA,MAAI,CAACY,aAAL,CAAmBZ,MAAnB,EAA2BzJ,KAA3B;AACD,SAFD;AAIA,eAAOsJ,OAAP;AACD,OATM,MASA,IAAI,QAAOY,MAAP,MAAkB,QAAtB,EAAgC;AACrC,YAAIP,KAAK,GAAGO,MAAZ;AACAZ,QAAAA,OAAO,GAAG,KAAKO,iBAAL,CAAuBF,KAAvB,CAAV;AAEAL,QAAAA,OAAO,CAACnJ,OAAR,CAAgB,UAAAsJ,MAAM,EAAI;AACxB,UAAA,MAAI,CAACY,aAAL,CAAmBZ,MAAnB,EAA2BzJ,KAA3B;AACD,SAFD;AAIA,eAAOsJ,OAAP;AACD;AACF;AAED;;;;;;;;;;;;;;;;;;;2BAoBOY,QAAQ;AAAA;;AACb,UAAIZ,OAAJ;;AAEA,UAAI,OAAOY,MAAP,KAAkB,WAAtB,EAAmC;AACjC,aAAKjB,QAAL,GAAgB,EAAhB;AACA,aAAKC,eAAL,CAAqBqB,KAArB;AACD,OAHD,MAGO,IAAI,OAAOL,MAAP,KAAkB,QAAlB,IAA8B,OAAOA,MAAP,KAAkB,QAApD,EAA8D;AACnE,YAAIT,MAAM,GAAG,KAAKC,WAAL,CAAiBQ,MAAjB,CAAb;;AACA,YAAIM,KAAK,GAAG,KAAKvB,QAAL,CAAcpK,OAAd,CAAsB4K,MAAtB,CAAZ;;AACA,aAAKR,QAAL,CAAcwB,MAAd,CAAqBD,KAArB,EAA4B,CAA5B;AACD,OAJM,MAIA,IAAIjM,KAAK,CAACsC,OAAN,CAAcqJ,MAAd,CAAJ,EAA2B;AAChCZ,QAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBW,MAAlB,CAAV;AACAZ,QAAAA,OAAO,CAACnJ,OAAR,CAAgB,UAAAsJ,MAAM,EAAI;AACxB,cAAIe,KAAK,GAAG,MAAI,CAACvB,QAAL,CAAcpK,OAAd,CAAsB4K,MAAtB,CAAZ;;AACA,UAAA,MAAI,CAACR,QAAL,CAAcwB,MAAd,CAAqBD,KAArB,EAA4B,CAA5B;AACD,SAHD;AAID,OANM,MAMA,IAAI,QAAON,MAAP,MAAkB,QAAtB,EAAgC;AACrCZ,QAAAA,OAAO,GAAG,KAAKO,iBAAL,CAAuBK,MAAvB,CAAV;AACAZ,QAAAA,OAAO,CAACnJ,OAAR,CAAgB,UAAAsJ,MAAM,EAAI;AACxB,cAAIe,KAAK,GAAG,MAAI,CAACvB,QAAL,CAAcpK,OAAd,CAAsB4K,MAAtB,CAAZ;;AACA,UAAA,MAAI,CAACR,QAAL,CAAcwB,MAAd,CAAqBD,KAArB,EAA4B,CAA5B;AACD,SAHD;AAID;AACF;AAED;;;;;;AAOA;;;;;;;;;gCAMYvH,IAAI;AACdA,MAAAA,EAAE,GAAGA,EAAE,CAACN,QAAH,EAAL;AAEA,aAAO,KAAKsG,QAAL,CAActB,IAAd,CAAmB,UAAA9F,GAAG;AAAA,eAAIA,GAAG,CAACoB,EAAJ,KAAWA,EAAf;AAAA,OAAtB,CAAP;AACD;AAED;;;;;;;;;kCAMc0G,OAAO;AACnB,aAAO,KAAKE,iBAAL,CAAuBF,KAAvB,EAA8B,CAA9B,CAAP;AACD;AAED;;;;;;;;;iCAMaN,KAAK;AAChB,aAAOA,GAAG,CAACvI,GAAJ,CAAQ,KAAK4I,WAAb,EAA0B,IAA1B,CAAP;AACD;AAED;;;;;;;;;sCAMkBC,OAAO;AACvB,UAAIL,OAAO,GAAG,KAAKL,QAAnB;;AAEA,eAASyB,oBAAT,CAA8BjB,MAA9B,EAAsC;AACpC,YAAIvJ,IAAI,GAAGJ,MAAM,CAACI,IAAP,CAAYyJ,KAAZ,CAAX;AAEA,eAAOzJ,IAAI,CAACyK,KAAL,CAAW,UAASnK,GAAT,EAAc;AAC9B,iBAAOoK,MAAM,CAACnB,MAAM,CAACjJ,GAAD,CAAP,CAAN,KAAwBoK,MAAM,CAACjB,KAAK,CAACnJ,GAAD,CAAN,CAArC;AACD,SAFM,CAAP;AAGD;;AAED,UAAIqK,aAAa,GACf,QAAOlB,KAAP,MAAiB,QAAjB,GAA4Be,oBAA5B,GAAmDf,KADrD;AAGA,aAAOL,OAAO,CAACpK,MAAR,CAAe2L,aAAf,CAAP;AACD;AAED;;;;;;;;;kCAMcjH,MAAM;AAClB,UAAI5D,KAAK,GAAG6I,SAAS,CAACjF,IAAD,CAArB;;AAEA,UAAI5D,KAAK,KAAKA,KAAK,CAACiD,EAAN,KAAaY,SAAb,IAA0B7D,KAAK,CAACiD,EAAN,KAAa,IAA5C,CAAT,EAA4D;AAC1DjD,QAAAA,KAAK,CAACiD,EAAN,GAAW,KAAKiG,eAAL,CAAqB4B,KAArB,CAA2B9K,KAA3B,CAAX;AACD,OAFD,MAEO;AACLA,QAAAA,KAAK,CAACiD,EAAN,GAAWjD,KAAK,CAACiD,EAAN,CAASN,QAAT,EAAX;AAEA,aAAKuG,eAAL,CAAqB9G,GAArB,CAAyBpC,KAAK,CAACiD,EAA/B;AACD;;AAED,WAAKgG,QAAL,CAAczH,IAAd,CAAmBxB,KAAnB;;AAEA,aAAO6I,SAAS,CAAC7I,KAAD,CAAhB;AACD;AAED;;;;;;;;;;kCAOcyJ,QAAQzJ,OAAO;AAC3B,UAAI+K,QAAQ,GACV/K,KAAK,IAAIF,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CAAqCN,KAArC,EAA4C,IAA5C,CAAT,GACIA,KAAK,CAACiD,EAAN,CAASN,QAAT,EADJ,GAEI,IAHN;AAIA,UAAIqI,SAAS,GAAGvB,MAAM,CAACxG,EAAvB;;AAEA,UAAI8H,QAAQ,IAAIC,SAAS,KAAKD,QAA9B,EAAwC;AACtC,cAAM,IAAIjM,KAAJ,CAAU,8CAAV,CAAN;AACD;;AAED,WAAK,IAAIsB,IAAT,IAAiBJ,KAAjB,EAAwB;AACtB,YAAII,IAAI,KAAK,IAAb,EAAmB;AACjB;AACD;;AAEDqJ,QAAAA,MAAM,CAACrJ,IAAD,CAAN,GAAeJ,KAAK,CAACI,IAAD,CAApB;AACD;AACF;;;;;;ACrbH;;;;;;;;;;;;;;;;IAeM6K;;;AACJ,cAAYjC,WAAZ,EAAyBkC,gBAAzB,EAA2C;AAAA;;AACzC,SAAKC,YAAL,GAAoB,EAApB;AAEA,SAAKC,wBAAL,CAA8BF,gBAA9B;;AAEA,QAAIlC,WAAJ,EAAiB;AACf,WAAKqC,QAAL,CAAcrC,WAAd;AACD;AACF;AAED;;;;;;;;;;;;;;;;;;;;6BAoBSpF,MAAM;AACb,WAAK,IAAIpD,GAAT,IAAgBoD,IAAhB,EAAsB;AACpB,aAAK0H,gBAAL,CAAsB9K,GAAtB,EAA2B+K,SAAS,CAAC3H,IAAI,CAACpD,GAAD,CAAL,CAApC;AACD;AACF;AAED;;;;;;;;;;;2BAUO;AACL,aAAO,KAAK2K,YAAL,CAAkBK,MAAlB,CAAyB,UAAC5H,IAAD,EAAO6H,UAAP,EAAsB;AACpD7H,QAAAA,IAAI,CAAC6H,UAAU,CAAC1C,IAAZ,CAAJ,GAAwB0C,UAAU,CAACC,GAAX,EAAxB;AAEA,eAAO9H,IAAP;AACD,OAJM,EAIJ,EAJI,CAAP;AAKD;AAED;;;;;;;;;;qCAQiBmF,MAAMC,aAAa;AAClC,UAAI,CAAC,KAAKD,IAAL,CAAL,EAAiB;AACf,YAAInG,gBAAe,GAAG,KAAK+I,kBAAL,CAAwB5C,IAAxB,CAAtB;;AACA,YAAI6C,aAAa,GAAG,IAAI9C,YAAJ,CAAiBC,IAAjB,EAAuBC,WAAvB,EAAoCpG,gBAApC,CAApB,CAFe;AAKf;;AACA9C,QAAAA,MAAM,CAACkC,cAAP,CAAsB,IAAtB,EAA4B+G,IAA5B,EAAkC;AAChC5G,UAAAA,GADgC,iBAC1B;AACJ,gBAAI0J,WAAW,GAAGD,aAAa,CAACF,GAAd,EAAlB;AAEA,aACE,QADF,EAEE,MAFF,EAGE,QAHF,EAIE,OAJF,EAKE,QALF,EAME,QANF,EAOE,eAPF,EAQEvL,OARF,CAQU,UAAS2L,MAAT,EAAiB;AACzBD,cAAAA,WAAW,CAACC,MAAD,CAAX,GAAsB,YAAW;AAC/B,uBAAOF,aAAa,CAACE,MAAD,CAAb,OAAAF,aAAa,EAAYG,SAAZ,CAApB;AACD,eAFD;AAGD,aAZD;AAcA,mBAAOF,WAAP;AACD;AAnB+B,SAAlC,EANe;AA6Bf;AACA;;AACA/L,QAAAA,MAAM,CAACkC,cAAP,CAAsB,IAAtB,aAAgC+G,IAAhC,GAAwC;AACtC5G,UAAAA,GADsC,iBAChC;AACJ,gBAAI0J,WAAW,GAAG,EAAlB;AAEA,aACE,QADF,EAEE,MAFF,EAGE,QAHF,EAIE,OAJF,EAKE,QALF,EAME,QANF,EAOE,eAPF,EAQE1L,OARF,CAQU,UAAS2L,MAAT,EAAiB;AACzBD,cAAAA,WAAW,CAACC,MAAD,CAAX,GAAsB,YAAW;AAC/B,uBAAOF,aAAa,CAACE,MAAD,CAAb,OAAAF,aAAa,EAAYG,SAAZ,CAApB;AACD,eAFD;AAGD,aAZD;AAcA,mBAAOF,WAAP;AACD;AAnBqC,SAAxC;;AAsBA,aAAKV,YAAL,CAAkB3J,IAAlB,CAAuBoK,aAAvB;AACD,OAtDD,MAsDO,IAAI5C,WAAJ,EAAiB;AACtB,aAAKD,IAAL,EAAWI,MAAX,CAAkBH,WAAlB;AACD;;AAED,aAAO,IAAP;AACD;AAED;;;;;;;;;wCAMkC;AAAA;;AAAA,wCAAbgD,WAAa;AAAbA,QAAAA,WAAa;AAAA;;AAChCA,MAAAA,WAAW,CAAC7L,OAAZ,CAAoB,UAAA8L,CAAC;AAAA,eAAI,KAAI,CAACX,gBAAL,CAAsBW,CAAtB,CAAJ;AAAA,OAArB;AACD;AAED;;;;;;;;gCAMY;AACV,WAAKd,YAAL,CAAkBhL,OAAlB,CAA0B,UAAA8L,CAAC;AAAA,eAAIA,CAAC,CAACC,MAAF,EAAJ;AAAA,OAA3B;AACD;AAED;;;;;;;;;uCAMmBnD,MAAM;AACvB,aACE,KAAKoD,iBAAL,CAAuB,KAAKC,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsCvD,IAAtC,CAAvB,KACA,KAAKoD,iBAAL,CAAuBI,WADvB,IAEA3J,eAHF;AAKD;AAED;;;;;;;;6CAKyBsI,kBAAkB;AACzC,WAAKiB,iBAAL,GAAyBjB,gBAAgB,IAAI,EAA7C;AACD;;;;;;ACtLH;;;;;;;;;;;;;;;;;IAgBqBsB;;;AACnB,sBAAYvG,SAAZ,EAAoC;AAAA,QAAbwC,MAAa,uEAAJ,EAAI;;AAAA;;AAClCpD,IAAAA,MAAM,CACJY,SAAS,IAAI,OAAOA,SAAP,KAAqB,QAD9B,EAEJ,+CAFI,CAAN;AAKA;;;;;;;;;;;;AAeA,SAAKA,SAAL,GAAiBA,SAAjB;AAEA;;;;;;;;;;;;;;;;;;;AAwBA,SAAKwC,MAAL,GAAcA,MAAd;AACD;AAED;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;6BAegB;AAAA,wCAANgE,IAAM;AAANA,QAAAA,IAAM;AAAA;;AACdC,MAAAA,SAAS,MAAT,UAAU,KAAKjE,MAAf,EAAuB,QAAvB,SAAoCgE,IAApC;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;2BAeO;AACLC,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,MAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;6BAeS;AACPiE,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,QAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;8BAaU;AACRiE,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,SAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;;wBAgBIZ,OAAO;AACT,WAAKY,MAAL,CAAYjH,IAAZ,CAAiBqG,KAAjB;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;2BAkBOA,OAAO;AACZ,UAAI8E,KAAK,GAAG,KAAKlE,MAAL,CAAYd,IAAZ,CAAiB,UAAAiF,CAAC;AAAA,eAAIA,CAAC,CAACjK,QAAF,OAAiBkF,KAAK,CAAClF,QAAN,EAArB;AAAA,OAAlB,CAAZ;;AACA,UAAIgK,KAAJ,EAAW;AACT,YAAIlO,CAAC,GAAG,KAAKgK,MAAL,CAAY5J,OAAZ,CAAoB8N,KAApB,CAAR;AACA,aAAKlE,MAAL,CAAYgC,MAAZ,CAAmBhM,CAAnB,EAAsB,CAAtB;AACD;;AAED,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;6BA0BSoJ,OAAO;AACd,aAAO,KAAKY,MAAL,CAAYoE,IAAZ,CAAiB,UAAAD,CAAC;AAAA,eAAIA,CAAC,CAACjK,QAAF,OAAiBkF,KAAK,CAAClF,QAAN,EAArB;AAAA,OAAlB,CAAP;AACD;AAED;;;;;;;;;;;;;2BAWOmK,GAAG;AACR,UAAIC,cAAc,GAAG,KAAKtE,MAAL,CAAYvJ,MAAZ,CAAmB4N,CAAnB,CAArB;AAEA,aAAO,IAAIN,UAAJ,CAAe,KAAKvG,SAApB,EAA+B8G,cAA/B,CAAP;AACD;AAED;;;;;;;;;;;;;;;yBAcKD,GAAG;AACN,UAAIE,YAAY,GAAG,KAAKvE,MAAL,CAAYpJ,MAAZ,GAAqB4N,IAArB,CAA0BH,CAA1B,CAAnB;AAEA,aAAO,IAAIN,UAAJ,CAAe,KAAKvG,SAApB,EAA+B+G,YAA/B,CAAP;AACD;AAED;;;;;;;;;;;;;;4BAae;AAAA;;AACb,UAAIE,YAAY,GAAG,qBAAKzE,MAAL,EAAY0E,KAAZ,+BAAnB;;AAEA,aAAO,IAAIX,UAAJ,CAAe,KAAKvG,SAApB,EAA+BiH,YAA/B,CAAP;AACD;AAED;;;;;;;;;;;;;;oCAagBzB,YAAY;AAC1B,WAAKhD,MAAL,GAAc,KAAKA,MAAL,CAAYpJ,MAAZ,CAAmBoM,UAAU,CAAChD,MAA9B,CAAd;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;+BAWW;AACT,kCAAqB,KAAKxC,SAA1B,cAAuC,KAAKwC,MAAL,CACpC3H,GADoC,CAChC,UAAA8L,CAAC;AAAA,eAAIA,CAAC,CAAC3J,EAAN;AAAA,OAD+B,EAEpC0B,IAFoC,CAE/B,GAF+B,CAAvC;AAGD;;;wBAhQY;AACX,aAAO,KAAK8D,MAAL,CAAYpK,MAAnB;AACD;;;;;;AChFH;;;;;;;;;;;;;;IAaqB+O;;;AACnB,mCAAyB;AAAA,QAAb3E,MAAa,uEAAJ,EAAI;;AAAA;;AACvB,SAAKA,MAAL,GAAcA,MAAd;AACD;AAED;;;;;;;;;;;;AAWA;;;;;;;;6BAQgB;AAAA,wCAANgE,IAAM;AAANA,QAAAA,IAAM;AAAA;;AACdC,MAAAA,SAAS,MAAT,UAAU,KAAKjE,MAAf,EAAuB,QAAvB,SAAoCgE,IAApC;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;8BAMU;AACRC,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,SAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;2BAMO;AACLiE,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,MAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;6BAMS;AACPiE,MAAAA,SAAS,CAAC,KAAKjE,MAAN,EAAc,QAAd,CAAT;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;wBAOIZ,OAAO;AACT,WAAKY,MAAL,CAAYjH,IAAZ,CAAiBqG,KAAjB;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;2BAOOA,OAAO;AACZ,UAAI8E,KAAK,GAAG,KAAKlE,MAAL,CAAYd,IAAZ,CAAiB,UAAAiF,CAAC;AAAA,eAAItC,OAAO,CAACsC,CAAC,CAAC5M,KAAH,EAAU6H,KAAK,CAAC7H,KAAhB,CAAX;AAAA,OAAlB,CAAZ;;AACA,UAAI2M,KAAJ,EAAW;AACT,YAAIlO,CAAC,GAAG,KAAKgK,MAAL,CAAY5J,OAAZ,CAAoB8N,KAApB,CAAR;AACA,aAAKlE,MAAL,CAAYgC,MAAZ,CAAmBhM,CAAnB,EAAsB,CAAtB;AACD;;AAED,aAAO,IAAP;AACD;AAED;;;;;;;;;;6BAOSoJ,OAAO;AACd,aAAO,KAAKY,MAAL,CAAYoE,IAAZ,CAAiB,UAAAD,CAAC;AAAA,eAAItC,OAAO,CAACsC,CAAC,CAAC5M,KAAH,EAAU6H,KAAK,CAAC7H,KAAhB,CAAX;AAAA,OAAlB,CAAP;AACD;AAED;;;;;;;;;2BAMO8M,GAAG;AACR,UAAIC,cAAc,GAAG,KAAKtE,MAAL,CAAYvJ,MAAZ,CAAmB4N,CAAnB,CAArB;AAEA,aAAO,IAAIM,qBAAJ,CAA0BL,cAA1B,CAAP;AACD;AAED;;;;;;;;;yBAMKD,GAAG;AACN,UAAIE,YAAY,GAAG,KAAKvE,MAAL,CAAYpJ,MAAZ,GAAqB4N,IAArB,CAA0BH,CAA1B,CAAnB;AAEA,aAAO,IAAIM,qBAAJ,CAA0BJ,YAA1B,CAAP;AACD;AAED;;;;;;;;;;4BAOe;AAAA;;AACb,UAAIE,YAAY,GAAG,qBAAKzE,MAAL,EAAY0E,KAAZ,+BAAnB;;AAEA,aAAO,IAAIC,qBAAJ,CAA0BF,YAA1B,CAAP;AACD;AAED;;;;;;;;;oCAMgBzB,YAAY;AAC1B,WAAKhD,MAAL,GAAc,KAAKA,MAAL,CAAYpJ,MAAZ,CAAmBoM,UAAU,CAAChD,MAA9B,CAAd;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;+BAMW;AACT,kCAAqB,KAAKxC,SAA1B,cAAuC,KAAKwC,MAAL,CACpC3H,GADoC,CAChC,UAAA8L,CAAC;AAAA,eAAIA,CAAC,CAAC3J,EAAN;AAAA,OAD+B,EAEpC0B,IAFoC,CAE/B,GAF+B,CAAvC;AAGD;;;wBA1JY;AACX,aAAO,KAAK8D,MAAL,CAAYpK,MAAnB;AACD;;;;;;ACvBH,IAAMoI,iBAAe,GAAG,EAAxB;AAEA;;;;;;;;IAOqB4G;;;;;;;;;;;;;;AAanB;;;;;;yCAMqB;AACnB,aAAO,CAAClJ,QAAQ,CAAC,KAAKgC,cAAN,CAAT,EAAgC,KAAKQ,aAAL,EAAhC,CAAP;AACD;AAED;;;;;;;;oCAKgB;AACd;AACA,UAAI,OAAOF,iBAAe,CAAC,KAAKjG,GAAN,CAAtB,KAAqC,QAAzC,EAAmD;AACjD,YAAMoG,UAAU,aAAM,KAAKwF,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CACpBnI,QAAQ,CAAC,KAAK3D,GAAN,CADY,CAAN,QAAhB;AAIAiG,QAAAA,iBAAe,CAAC,KAAKjG,GAAN,CAAf,GAA4BoG,UAA5B;AACD;;AAED,aAAOH,iBAAe,CAAC,KAAKjG,GAAN,CAAtB;AACD;AAED;;;;;;;;;;;;;2CAUuBqG,YAAYrG,KAAK;AACtC,UAAIsG,cAAc,GAAGD,UAAU,CAAC3E,SAAhC;AACA,UAAIiB,WAAW,GAAG,IAAlB;AACA,UAAIyD,UAAU,GAAG,KAAKD,aAAL,EAAjB;;AACA,UAAII,eAAe,uBAAMvG,GAAN,EAAY,IAAZ,CAAnB;;AAEAsG,MAAAA,cAAc,CAACwG,mBAAf,GAAqCxN,MAAM,CAACC,MAAP,CACnC+G,cAAc,CAACwG,mBADoB,EAEnCvG,eAFmC,CAArC,CANsC;;AAYtCjH,MAAAA,MAAM,CAACI,IAAP,CAAY4G,cAAc,CAACwG,mBAA3B,EAAgDnN,OAAhD,CAAwD,UAAAK,GAAG,EAAI;AAC7D,YAAMI,KAAK,GAAGkG,cAAc,CAACwG,mBAAf,CAAmC9M,GAAnC,CAAd;AACAsG,QAAAA,cAAc,CAACyG,qBAAf,CAAqC3M,KAAK,CAAC+F,aAAN,EAArC,IAA8D/F,KAA9D;AACD,OAHD,EAZsC;;AAkBtC,WAAKwF,MAAL,CAAYc,uBAAZ,CAAoC,IAApC,EAA0C,KAAKjB,SAA/C,EAlBsC;AAqBtC;;AACAa,MAAAA,cAAc,CAACK,eAAf,CAA+BC,GAA/B,CAAmC5G,GAAnC;AACAsG,MAAAA,cAAc,CAACO,iBAAf,CAAiCD,GAAjC,CAAqCR,UAArC;AAEA9G,MAAAA,MAAM,CAACkC,cAAP,CAAsB8E,cAAtB,EAAsCF,UAAtC,EAAkD;AAChD;;;;AAIAzE,QAAAA,GALgD,iBAK1C;AACJ,eAAKmF,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AACA,cAAIkG,YAAY,GAAG,KAAKlG,iBAAL,CAAuB9G,GAAvB,CAAnB;AACA,cAAI6I,GAAG,GAAG,EAAV;;AAEA,cAAImE,YAAJ,EAAkB;AAChB,gBAAIrK,WAAW,CAACqE,aAAhB,EAA+B;AAC7B6B,cAAAA,GAAG,GAAGmE,YAAY,CAAC/E,MAAb,CAAoB3H,GAApB,CAAwB,UAAA+G,KAAK;AAAA,uBAAK;AACtCJ,kBAAAA,IAAI,EAAEI,KAAK,CAAC5B,SAD0B;AAEtChD,kBAAAA,EAAE,EAAE4E,KAAK,CAAC5E;AAF4B,iBAAL;AAAA,eAA7B,CAAN;AAID,aALD,MAKO;AACLoG,cAAAA,GAAG,GAAGmE,YAAY,CAAC/E,MAAb,CAAoB3H,GAApB,CAAwB,UAAA+G,KAAK;AAAA,uBAAIA,KAAK,CAAC5E,EAAV;AAAA,eAA7B,CAAN;AACD;AACF,WATD,MASO;AACLoG,YAAAA,GAAG,GAAG,KAAKrJ,KAAL,CAAW4G,UAAX,KAA0B,EAAhC;AACD;;AAED,iBAAOyC,GAAP;AACD,SAxB+C;;AA0BhD;;;;AAIAjH,QAAAA,GA9BgD,eA8B5CiH,GA9B4C,EA8BvC;AACP,cAAImE,YAAJ;;AAEA,cAAInE,GAAG,KAAK,IAAZ,EAAkB;AAChBmE,YAAAA,YAAY,GAAG,EAAf;AACD,WAFD,MAEO,IAAInE,GAAG,KAAKxF,SAAZ,EAAuB;AAC5BwB,YAAAA,MAAM,CACJ9G,KAAK,CAACsC,OAAN,CAAcwI,GAAd,CADI,mDAEsCzC,UAFtC,iBAEuD,IAFvD,EAAN;;AAKA,gBAAIzD,WAAW,CAACqE,aAAhB,EAA+B;AAC7BnC,cAAAA,MAAM,CACJgE,GAAG,CAACsB,KAAJ,CAAU,UAAA8C,EAAE,EAAI;AACd,uBACE,QAAOA,EAAP,MAAc,QAAd,IACA,QAAOA,EAAE,CAAChG,IAAV,MAAmB5D,SADnB,IAEA,QAAO4J,EAAE,CAACxK,EAAV,MAAiBY,SAHnB;AAKD,eAND,CADI,8GAQiG+C,UARjG,iBAQkH,IARlH,EAAN;AAWA,kBAAI6B,MAAM,GAAGY,GAAG,CAACvI,GAAJ,CAAQ,gBAAkB;AAAA,oBAAf2G,IAAe,QAAfA,IAAe;AAAA,oBAATxE,EAAS,QAATA,EAAS;AACrC,uBAAOE,WAAW,CAACiD,MAAZ,CACLjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCD,IAApC,CADK,EAELE,IAFK,CAEA1E,EAFA,CAAP;AAGD,eAJY,CAAb;AAKAuK,cAAAA,YAAY,GAAG,IAAIJ,qBAAJ,CAA0B3E,MAA1B,CAAf;AACD,aAlBD,MAkBO;AACL+E,cAAAA,YAAY,GAAGrK,WAAW,CAACiD,MAAZ,CACbjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCvE,WAAW,CAAC8C,SAAhD,CADa,EAEb0B,IAFa,CAER0B,GAFQ,CAAf;AAGD;AACF;;AAED,eAAK7I,GAAL,IAAYgN,YAAZ;AACD;AAnE+C,OAAlD;AAsEA1N,MAAAA,MAAM,CAACkC,cAAP,CAAsB8E,cAAtB,EAAsCtG,GAAtC,EAA2C;AACzC;;;;AAIA2B,QAAAA,GALyC,iBAKnC;AACJ,eAAKmF,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AACA,cAAImE,UAAU,GAAG,IAAjB;;AAEA,cAAI,KAAKnE,iBAAL,CAAuB9G,GAAvB,CAAJ,EAAiC;AAC/BiL,YAAAA,UAAU,GAAG,KAAKnE,iBAAL,CAAuB9G,GAAvB,CAAb;AACD,WAFD,MAEO;AACL,gBAAI2C,WAAW,CAACqE,aAAhB,EAA+B;AAC7B,kBAAI,KAAKZ,UAAL,CAAJ,EAAsB;AACpB,oBAAI8G,cAAc,GAAG,KAAK9G,UAAL,CAArB;AACA,oBAAI6B,MAAM,GAAGiF,cAAc,CAAC5M,GAAf,CAAmB,iBAAkB;AAAA,sBAAf2G,IAAe,SAAfA,IAAe;AAAA,sBAATxE,EAAS,SAATA,EAAS;AAChD,yBAAOE,WAAW,CAACiD,MAAZ,CACLjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCD,IAApC,CADK,EAELE,IAFK,CAEA1E,EAFA,CAAP;AAGD,iBAJY,CAAb;AAMAwI,gBAAAA,UAAU,GAAG,IAAI2B,qBAAJ,CAA0B3E,MAA1B,CAAb;AACD,eATD,MASO;AACLgD,gBAAAA,UAAU,GAAG,IAAI2B,qBAAJ,CAA0BjK,WAAW,CAAC8C,SAAtC,CAAb;AACD;AACF,aAbD,MAaO;AACL,kBAAI,KAAKW,UAAL,CAAJ,EAAsB;AACpB6E,gBAAAA,UAAU,GAAGtI,WAAW,CAACiD,MAAZ,CACXjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCvE,WAAW,CAAC8C,SAAhD,CADW,EAEX0B,IAFW,CAEN,KAAKf,UAAL,CAFM,CAAb;AAGD,eAJD,MAIO;AACL6E,gBAAAA,UAAU,GAAG,IAAIe,UAAJ,CAAerJ,WAAW,CAAC8C,SAA3B,CAAb;AACD;AACF;;AAED,iBAAKqB,iBAAL,CAAuB9G,GAAvB,IAA8BiL,UAA9B;AACD;;AAED,iBAAOA,UAAP;AACD,SAvCwC;;AAyCzC;;;;AAIArJ,QAAAA,GA7CyC,eA6CrCqG,MA7CqC,EA6C7B;AAAA;;AACV,cACEA,MAAM,YAAY+D,UAAlB,IACA/D,MAAM,YAAY2E,qBAFpB,EAGE;AACA3E,YAAAA,MAAM,GAAGA,MAAM,CAACA,MAAhB;AACD;;AAEDA,UAAAA,MAAM,GAAGA,MAAM,GAAGkF,OAAO,CAAClF,MAAD,CAAV,GAAqB,EAApC;AACA,eAAKnB,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AAEA,cAAImE,UAAJ;;AACA,cAAItI,WAAW,CAACqE,aAAhB,EAA+B;AAC7BiE,YAAAA,UAAU,GAAG,IAAI2B,qBAAJ,CAA0B3E,MAA1B,CAAb;AACD,WAFD,MAEO;AACLgD,YAAAA,UAAU,GAAG,IAAIe,UAAJ,CAAerJ,WAAW,CAAC8C,SAA3B,EAAsCwC,MAAtC,CAAb;AACD;;AACD,eAAKnB,iBAAL,CAAuB9G,GAAvB,IAA8BiL,UAA9B;AAEAhD,UAAAA,MAAM,CAACtI,OAAP,CAAe,UAAA0H,KAAK,EAAI;AACtB,gBAAIA,KAAK,CAACC,aAAN,CAAoB3E,WAApB,CAAJ,EAAsC;AACpC,kBAAImD,OAAO,GAAGuB,KAAK,CAACE,UAAN,CAAiB5E,WAAjB,CAAd;AAEA0E,cAAAA,KAAK,CAACG,SAAN,CAAgB,KAAhB,EAAsB1B,OAAtB;AACD;AACF,WAND;AAOD;AAvEwC,OAA3C;AA0EA;;;;;AAIAQ,MAAAA,cAAc,cACN7B,UAAU,CACdd,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsCnJ,WAAW,CAAC3C,GAAlD,CAAD,CADM,CADJ,EAAd,GAII,YAAkB;AACpB,YAAIyF,SAAJ,EAAejG,KAAf;;AACA,YAAImD,WAAW,CAACqE,aAAhB,EAA+B;AAC7BvB,UAAAA,SAAS,mDAAT;AACAjG,UAAAA,KAAK,mDAAL;AACD,SAHD,MAGO;AACLiG,UAAAA,SAAS,GAAG9C,WAAW,CAAC8C,SAAxB;AACAjG,UAAAA,KAAK,mDAAL;AACD;;AAED,YAAIT,KAAK,GAAG4D,WAAW,CAACiD,MAAZ,CACVjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCzB,SAApC,CADU,SAENjG,KAFM,CAAZ;AAGA,YAAI4N,QAAQ,GAAG,KAAKpN,GAAL,EAAUiI,MAAzB;AAEAmF,QAAAA,QAAQ,CAACpM,IAAT,CAAcjC,KAAd;AACA,aAAKiB,GAAL,IAAYoN,QAAZ;AAEA,eAAOrO,KAAP;AACD,OAvBD;AAyBA;;;;;;;;;AAQAuH,MAAAA,cAAc,iBACH7B,UAAU,CACjBd,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsCnJ,WAAW,CAAC3C,GAAlD,CAAD,CADS,CADP,EAAd,GAII,YAAkB;AACpB,YAAIyF,SAAJ,EAAejG,KAAf;;AACA,YAAImD,WAAW,CAACqE,aAAhB,EAA+B;AAC7BvB,UAAAA,SAAS,mDAAT;AACAjG,UAAAA,KAAK,mDAAL;AACD,SAHD,MAGO;AACLiG,UAAAA,SAAS,GAAG9C,WAAW,CAAC8C,SAAxB;AACAjG,UAAAA,KAAK,mDAAL;AACD;;AAED,YAAIT,KAAK,GAAG4D,WAAW,CAACiD,MAAZ,CACVjD,WAAW,CAACiD,MAAZ,CAAmBsB,gBAAnB,CAAoCzB,SAApC,CADU,EAEVF,MAFU,CAEH/F,KAFG,CAAZ;AAGA,YAAI4N,QAAQ,GAAG,KAAKpN,GAAL,EAAUiI,MAAzB;AAEAmF,QAAAA,QAAQ,CAACpM,IAAT,CAAcjC,KAAd;AACA,aAAKiB,GAAL,IAAYoN,QAAZ;AAEA,aAAK1F,IAAL;AAEA,eAAO3I,KAAK,CAAC4I,MAAN,EAAP;AACD,OAzBD;AA0BD;AAED;;;;;;;;wDAKoCN,OAAO;AAAA;;AACzC,UAAIO,KAAK,GAAG,KAAKjC,cAAjB;AACA,UAAIkC,EAAJ;;AAEA,UAAI,KAAKb,aAAT,EAAwB;AACtBa,QAAAA,EAAE,GAAG;AAAEZ,UAAAA,IAAI,EAAEI,KAAK,CAAC5B,SAAd;AAAyBhD,UAAAA,EAAE,EAAE4E,KAAK,CAAC5E;AAAnC,SAAL;AACD,OAFD,MAEO;AACLoF,QAAAA,EAAE,GAAGR,KAAK,CAAC5E,EAAX;AACD;;AAED,UAAIqF,UAAU,GAAG,KAAKlC,MAAL,CAAY,KAAKA,MAAL,CAAYsB,gBAAZ,CAA6BU,KAA7B,CAAZ,EAAiDG,KAAjD,CACf,UAAAC,cAAc,EAAI;AAChB,YAAIqF,UAAU,GAAGrF,cAAc,CAAC,MAAI,CAAC7B,aAAL,EAAD,CAA/B,CADgB;;;AAIhB,eACEkH,UAAU,IACVA,UAAU,CAAClG,IAAX,CAAgB,UAAA1E,EAAE,EAAI;AACpB,cAAI,QAAOA,EAAP,MAAc,QAAlB,EAA4B;AAC1B,mBAAOA,EAAE,CAACwE,IAAH,KAAYY,EAAE,CAACZ,IAAf,IAAuBxE,EAAE,CAACA,EAAH,KAAUoF,EAAE,CAACpF,EAA3C;AACD,WAFD,MAEO;AACL,mBAAOA,EAAE,KAAKoF,EAAd;AACD;AACF,SAND,CAFF;AAUD,OAfc,CAAjB;AAkBAC,MAAAA,UAAU,CAACG,MAAX,CAAkBtI,OAAlB,CAA0B,UAAAuI,SAAS,EAAI;AACrCA,QAAAA,SAAS,CAACC,YAAV,CAAuBd,KAAvB,EAA8B,MAA9B;AACAa,QAAAA,SAAS,CAACR,IAAV;AACD,OAHD;AAID;;;wBAjUgB;AACf,UAAI,OAAOzB,iBAAe,CAAC,KAAKjG,GAAN,CAAtB,KAAqC,QAAzC,EAAmD;AACjD,YAAMoI,UAAU,aAAMzE,QAAQ,CAC5B,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC,KAAK9L,GAA3C,CAD4B,CAAd,QAAhB;AAIAiG,QAAAA,iBAAe,CAAC,KAAKjG,GAAN,CAAf,GAA4BoI,UAA5B;AACD;;AAED,aAAOnC,iBAAe,CAAC,KAAKjG,GAAN,CAAtB;AACD;;;;EAXkCwF;;ACZrC,IAAM8H,mBAAmB,GAAG,EAA5B;AAEA;;;;IAGqBC;;;;;;;;;0CACGC,UAAU;AAC9B,UAAI,CAACA,QAAL,EAAe;AACb;AACD;;AAED,UAAI,OAAOF,mBAAmB,CAACE,QAAD,CAA1B,KAAyC,QAA7C,EAAuD;AACrD,YAAIC,IAAI,GAAGD,QAAQ,CAACvJ,KAAT,CAAe,GAAf,CAAX;AACA,YAAIyJ,QAAJ;;AAEA,aAAK,IAAIzP,CAAC,GAAGwP,IAAI,CAAC5P,MAAL,GAAc,CAA3B,EAA8BI,CAAC,IAAI,CAAnC,EAAsCA,CAAC,EAAvC,EAA2C;AACzC,cAAM0P,OAAO,GAAGF,IAAI,CAACxP,CAAD,CAApB;;AACA,cAAI0P,OAAO,CAAC9P,MAAR,IAAkB8P,OAAO,CAAC,CAAD,CAAP,KAAe,GAArC,EAA0C;AACxCD,YAAAA,QAAQ,GAAGC,OAAX;AACA;AACD;AACF;;AAEDL,QAAAA,mBAAmB,CAACE,QAAD,CAAnB,GAAgCpJ,SAAS,CACvCT,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC4B,QAAtC,CAAD,CAD+B,CAAzC;AAGD;;AAED,aAAOJ,mBAAmB,CAACE,QAAD,CAA1B;AACD;;;qCAEgBI,SAASC,YAAY;AACpC,UAAIpL,EAAJ;;AACA,UAAImL,OAAO,IAAIA,OAAO,CAACE,MAAnB,IAA6BF,OAAO,CAACE,MAAR,CAAerL,EAAhD,EAAoD;AAClDA,QAAAA,EAAE,GAAGmL,OAAO,CAACE,MAAR,CAAerL,EAApB;AACD,OAFD,MAEO,IAAIoL,UAAU,IAAIA,UAAU,CAACzK,IAAzB,IAAiCyK,UAAU,CAACzK,IAAX,CAAgBX,EAArD,EAAyD;AAC9DA,QAAAA,EAAE,GAAGoL,UAAU,CAACzK,IAAX,CAAgBX,EAArB;AACD;;AACD,aAAOA,EAAP;AACD;;;6CAEwBmL,SAASnI,WAAW;AAC3C,UAAIsI,IAAJ;;AACA,UAAIH,OAAO,IAAIA,OAAO,CAACI,WAAvB,EAAoC;AAClCD,QAAAA,IAAI,GAAGxP,IAAI,CAAC0P,KAAL,CAAWL,OAAO,CAACI,WAAnB,CAAP;AACD;;AACD,aAAO,KAAKE,oBAAL,CAA0BC,SAA1B,CAAoCJ,IAApC,EAA0CtI,SAA1C,CAAP;AACD;;;wCAEmBmI,SAASnI,WAAW;AAAA;;AACtC,UAAI2I,IAAI,GAAG,KAAKC,wBAAL,CAA8BT,OAA9B,EAAuCnI,SAAvC,CAAX;;AACA,UAAIhD,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,EAA+BQ,IAA/B,CAAT;;AACA,UAAI5O,KAAK,GAAG,EAAZ;AAEAqF,MAAAA,MAAM,CACJuJ,IAAI,CAAChL,IAAL,KACGgL,IAAI,CAAChL,IAAL,CAAUmL,UAAV,IAAwBH,IAAI,CAAChL,IAAL,CAAU6D,IAAlC,IAA0CmH,IAAI,CAAChL,IAAL,CAAUoL,aADvD,CADI,6MAAN;;AAMA,UAAIJ,IAAI,CAAChL,IAAL,CAAUmL,UAAd,EAA0B;AACxB/O,QAAAA,KAAK,GAAGF,MAAM,CAACI,IAAP,CAAY0O,IAAI,CAAChL,IAAL,CAAUmL,UAAtB,EAAkCvD,MAAlC,CAAyC,UAACyD,GAAD,EAAMzO,GAAN,EAAc;AAC7DyO,UAAAA,GAAG,CAAC9K,QAAQ,CAAC3D,GAAD,CAAT,CAAH,GAAqBoO,IAAI,CAAChL,IAAL,CAAUmL,UAAV,CAAqBvO,GAArB,CAArB;AACA,iBAAOyO,GAAP;AACD,SAHO,EAGL,EAHK,CAAR;AAID;;AAED,UAAIL,IAAI,CAAChL,IAAL,CAAUoL,aAAd,EAA6B;AAC3BlP,QAAAA,MAAM,CAACI,IAAP,CAAY0O,IAAI,CAAChL,IAAL,CAAUoL,aAAtB,EAAqC7O,OAArC,CAA6C,UAAA+O,gBAAgB,EAAI;AAC/D,cAAIC,YAAY,GAAGP,IAAI,CAAChL,IAAL,CAAUoL,aAAV,CAAwBE,gBAAxB,CAAnB;;AACA,cAAIE,UAAU,GAAG,KAAI,CAAChJ,MAAL,CAAYiJ,aAAZ,CAA0BpJ,SAA1B,CAAjB;;AACA,cAAI9C,WAAW,GAAGiM,UAAU,CAACE,cAAX,CAA0BnL,QAAQ,CAAC+K,gBAAD,CAAlC,CAAlB;AACA,cAAIK,oBAAJ;AAEAlK,UAAAA,MAAM,CACJlC,WADI,6CAEgC+L,gBAFhC,uBAE6DjJ,SAF7D,2BAEuFmI,OAAO,CAACtC,MAF/F,kBAE6GsC,OAAO,CAACoB,GAFrH,4CAE0JN,gBAF1J,mCAEmMjJ,SAFnM,cAAN;;AAKA,cAAI9C,WAAW,CAACqE,aAAhB,EAA+B;AAC7B+H,YAAAA,oBAAoB,GAAGJ,YAAY,CAACvL,IAApC;AACD,WAFD,MAEO,IAAIT,WAAW,YAAYkK,OAA3B,EAAoC;AACzCkC,YAAAA,oBAAoB,GAClBJ,YAAY,CAACvL,IAAb,IAAqBuL,YAAY,CAACvL,IAAb,CAAkB9C,GAAlB,CAAsB,UAAA2O,GAAG;AAAA,qBAAIA,GAAG,CAACxM,EAAR;AAAA,aAAzB,CADvB;AAED,WAHM,MAGA;AACLsM,YAAAA,oBAAoB,GAAGJ,YAAY,CAACvL,IAAb,IAAqBuL,YAAY,CAACvL,IAAb,CAAkBX,EAA9D;AACD;;AAEDjD,UAAAA,KAAK,CAACmD,WAAW,CAACyF,UAAb,CAAL,GAAgC2G,oBAAhC;AACD,SArBD,EAqBG,EArBH;AAsBD;;AAED,UAAItM,EAAJ,EAAQ;AACNjD,QAAAA,KAAK,CAACiD,EAAN,GAAWA,EAAX;AACD;;AAED,aAAOjD,KAAP;AACD;;;kDAEwC;AAAA,UAAfwO,WAAe,QAAfA,WAAe;AACvC,UAAIxO,KAAJ;AACA,UAAI0P,eAAe,GAAG,EAAtB;AAEArK,MAAAA,MAAM,CACJmJ,WAAW,IAAI,OAAOA,WAAP,KAAuB,QADlC,yHAAN;AAKAkB,MAAAA,eAAe,GAAGlB,WAAW,CAAC/J,KAAZ,CAAkB,GAAlB,CAAlB;AAEAzE,MAAAA,KAAK,GAAG0P,eAAe,CAAClE,MAAhB,CAAuB,UAACmE,CAAD,EAAIC,cAAJ,EAAuB;AAAA,oCACjCA,cAAc,CAACnL,KAAf,CAAqB,GAArB,CADiC;AAAA;AAAA,YAC/CjE,GAD+C;AAAA,YAC1CI,KAD0C;;AAEpD+O,QAAAA,CAAC,CAACnP,GAAD,CAAD,GAASqP,kBAAkB,CAACjP,KAAK,CAAC6E,OAAN,CAAc,KAAd,EAAqB,GAArB,CAAD,CAA3B;AACA,eAAOkK,CAAP;AACD,OAJO,EAIL,EAJK,CAAR;AAMA,aAAO3P,KAAP;AACD;;;;;;ACrHH;;;;IAGqB8P;;;;;AACnB,gCAAY1J,MAAZ,EAAoBsI,oBAApB,EAA0CqB,YAA1C,EAAwD9B,IAAxD,EAA8D+B,MAA9D,EAAsE;AAAA;;AAAA;;AACpE,8FAAMA,MAAN;AACA,UAAK5J,MAAL,GAAcA,MAAd;AACA,UAAKsI,oBAAL,GAA4BA,oBAA5B;AACA,UAAKqB,YAAL,GAAoBA,YAApB;AACA,UAAK9B,IAAL,GAAYA,IAAZ;AALoE;AAMrE;;;;2BAEMG,SAAS;AACd,aAAO,KAAK2B,YAAL,CAAkB,KAAK3J,MAAvB,EAA+BgI,OAA/B,CAAP;AACD;;;+BAEUA,SAAS;AAClB,WAAKA,OAAL,GAAeA,OAAf;AACD;;;8BAES6B,UAAUC,gBAAgB;AAClC,UAAIC,UAAJ;;AAEA,UAAID,cAAJ,EAAoB;AAClBC,QAAAA,UAAU,GAAG,KAAKzB,oBAAL,CAA0B0B,aAA1B,CAAwCF,cAAxC,EAAwD;AACnEG,UAAAA,QAAQ,EAAE;AADyD,SAAxD,CAAb;AAGD,OAJD,MAIO;AACLF,QAAAA,UAAU,GAAG,KAAKzB,oBAAlB;AACD;;AAED,aAAOyB,UAAU,CAACG,SAAX,CAAqBL,QAArB,EAA+B,KAAK7B,OAApC,CAAP;AACD;;;6CAEwC;AAAA,UAAlBnI,SAAkB,uEAAN,IAAM;AAAA,UAErCgI,IAFqC,GAKnC,IALmC,CAErCA,IAFqC;AAAA,UAGrCG,OAHqC,GAKnC,IALmC,CAGrCA,OAHqC;AAAA,UAI1BmC,cAJ0B,GAKnC,IALmC,CAIrCnC,OAJqC,CAI1BmC,cAJ0B;AAMvC,UAAIvQ,KAAJ;AAEA,UAAIwQ,gBAAgB,GAAG,EAAvB;;AACA,WAAK,IAAIC,MAAT,IAAmBF,cAAnB,EAAmC;AACjCC,QAAAA,gBAAgB,CAACC,MAAM,CAACC,WAAP,EAAD,CAAhB,GAAyCH,cAAc,CAACE,MAAD,CAAvD;AACD;;AACD,UAAI,wBAAwBE,IAAxB,CAA6BH,gBAAgB,CAAC,cAAD,CAA7C,CAAJ,EAAoE;AAClExQ,QAAAA,KAAK,GAAG,KAAK4Q,uBAAL,CAA6BxC,OAA7B,CAAR;AACD,OAFD,MAEO;AACL,YAAInI,SAAJ,EAAe;AACbZ,UAAAA,MAAM,CACJT,SAAS,CAACqB,SAAD,CAAT,KAAyBA,SADrB,+CAEkCA,SAFlC,iKAEkMrB,SAAS,CAC7MqB,SAD6M,CAF3M,SAAN;AAMD,SAPD,MAOO;AACLA,UAAAA,SAAS,GAAG,KAAK4K,qBAAL,CAA2B5C,IAA3B,CAAZ;AACD;;AAED5I,QAAAA,MAAM,CACJ,KAAKe,MAAL,CAAY0K,oBAAZ,CAAiC7K,SAAjC,CADI,sGAEyFA,SAFzF,yHAAN;AAKAjG,QAAAA,KAAK,GAAG,KAAK+Q,mBAAL,CAAyB3C,OAAzB,EAAkCnI,SAAlC,CAAR;AACD;;AAED,aAAOjG,KAAP;AACD;;;;EAlE+C+N;;ACPlD;;;IAGqBiD;;;AACnB,8BAAY5K,MAAZ,EAAoBsI,oBAApB,EAA0C9O,MAA1C,EAAkD;AAAA;;AAChD,SAAKwG,MAAL,GAAcA,MAAd;AACA,SAAKsI,oBAAL,GAA4BA,oBAA5B;AACA,SAAK9O,MAAL,GAAcA,MAAd;AACD;;;;;AAEM;AAAe;AACpB,aAAO,KAAKA,MAAZ;AACD;;;;;;ACVH;;;;IAGqBqR;;;;;AACnB,qCAAY7K,MAAZ,EAAoBsI,oBAApB,EAA0CwC,SAA1C,EAAqDjD,IAArD,EAAyE;AAAA;;AAAA,QAAdkD,OAAc,uEAAJ,EAAI;;AAAA;;AACvE;AACAD,IAAAA,SAAS,GAAGA,SAAS,IAAI,MAAKL,qBAAL,CAA2B5C,IAA3B,CAAzB;AACA,UAAK7H,MAAL,GAAcA,MAAd;AACA,UAAKsI,oBAAL,GAA4BA,oBAA5B;AACA,UAAKwC,SAAL,GAAiBA,SAAjB;AACA,UAAKC,OAAL,GAAeA,OAAf;AAEA,QAAI1J,IAAI,GAAGlJ,KAAK,CAACsC,OAAN,CAAcqQ,SAAd,IAA2B,OAA3B,WAA4CA,SAA5C,CAAX;;AACA,QAAIzJ,IAAI,KAAK,QAAb,EAAuB;AACrB,UAAI2H,UAAU,GAAG,MAAKhJ,MAAL,CAAY,MAAKA,MAAL,CAAYsB,gBAAZ,CAA6BwJ,SAA7B,CAAZ,CAAjB;;AACA,YAAKE,MAAL,GAAc,UAAAhD,OAAO,EAAI;AACvB,eAAO,MAAKiD,qBAAL,CAA2BjD,OAA3B,EAAoCgB,UAApC,CAAP;AACD,OAFD;AAGD,KALD,MAKO,IAAI3H,IAAI,KAAK,OAAb,EAAsB;AAC3B,UAAI6J,YAAY,GAAGJ,SAAS,CAACpQ,GAAV,CACjB,UAAAmF,SAAS;AAAA,eAAI,MAAKG,MAAL,CAAY,MAAKA,MAAL,CAAYsB,gBAAZ,CAA6BzB,SAA7B,CAAZ,CAAJ;AAAA,OADQ,CAAnB;;AAGA,YAAKmL,MAAL,GAAc,UAAAhD,OAAO,EAAI;AACvB,eAAO,MAAKmD,oBAAL,CAA0BnD,OAA1B,EAAmCkD,YAAnC,CAAP;AACD,OAFD;AAGD;;AArBsE;AAsBxE;AAGD;AACA;AACA;AACA;AACA;AACA;;;;EA/BqDvD;;ACAvD;;;;IAGqByD;;;;;;;;;;;;;;AACnB;;;;;;0CAOsBpD,SAASgB,YAAY;AACzC,UAAInJ,SAAS,GAAG,KAAKiL,SAArB;AACA,UAAIO,kBAAkB,GAAGtN,QAAQ,CAAC8B,SAAD,CAAjC;AAEAZ,MAAAA,MAAM,CACJ+J,UADI,kCAEqBhB,OAAO,CAACoB,GAF7B,sCAE4DiC,kBAF5D,2CAAN;;AAKA,UAAIxO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;;AACA,UAAInL,EAAJ,EAAQ;AACN,YAAI4E,KAAK,GAAGuH,UAAU,CAACzH,IAAX,CAAgB1E,EAAhB,CAAZ;;AACA,YAAI,CAAC4E,KAAL,EAAY;AACV,iBAAO,IAAIpE,QAAJ,CAAa,GAAb,CAAP;AACD,SAFD,MAEO;AACL,iBAAOoE,KAAP;AACD;AACF,OAPD,MAOO,IAAI,KAAKsJ,OAAL,CAAaO,QAAjB,EAA2B;AAChC,YAAIrI,GAAG,GAAG,KAAKqF,oBAAL,CAA0BiD,eAA1B,CACRvD,OADQ,EAERqD,kBAFQ,CAAV;;AAIA,YAAIpI,GAAJ,EAAS;AACP,iBAAO+F,UAAU,CAACzH,IAAX,CAAgB0B,GAAhB,CAAP;AACD;AACF;;AACD,aAAO+F,UAAU,CAAC1D,GAAX,EAAP;AACD;AAED;;;;;;;yCAKqB0C,SAASkD,cAAc;AAC1C,UAAIpR,IAAI,GAAG,KAAKgR,SAAhB;;AACA,UAAIjO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;AAEA;;;;;;;;;AAOA/I,MAAAA,MAAM,CACJ,CAACpC,EAAD,IAAO,KAAKmJ,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsCpM,IAAI,CAAC,CAAD,CAA1C,MAAmDA,IAAI,CAAC,CAAD,CAD1D,gZAAN;AAUA,aAAOoR,YAAY,CAACxQ,GAAb,CAAiB,UAAAsO,UAAU;AAAA,eAAIA,UAAU,CAAC1D,GAAX,EAAJ;AAAA,OAA3B,CAAP;AACD;;;;EAhEmDuF;;ACJtD;;;;IAGqBW;;;;;;;;;;;;;;AACnB;;;;;0CAOsBxD,SAASgB,YAAY;AACzC,UAAInJ,SAAS,GAAG,KAAKiL,SAArB;AACA,UAAIO,kBAAkB,GAAGtN,QAAQ,CAAC8B,SAAD,CAAjC;AACAZ,MAAAA,MAAM,CACJ+J,UADI,kCAEqBhB,OAAO,CAACoB,GAF7B,sCAE4DiC,kBAF5D,2CAAN;;AAKA,UAAIzR,KAAK,GAAG,KAAK+Q,mBAAL,CACV3C,OADU,EAEVgB,UAAU,CAACqC,kBAFD,CAAZ;;AAIA,aAAOrC,UAAU,CAACrJ,MAAX,CAAkB/F,KAAlB,CAAP;AACD;;;;EArBoDiR;;ACFvD;;;;IAGqBY;;;;;;;;;;;;;;AACnB;;;;0CAKsBzD,SAASgB,YAAY;AACzC,UAAInJ,SAAS,GAAG,KAAKiL,SAArB;AACA,UAAIO,kBAAkB,GAAGtN,QAAQ,CAAC8B,SAAD,CAAjC;AAEAZ,MAAAA,MAAM,CACJ+J,UADI,kCAEqBhB,OAAO,CAACoB,GAF7B,sCAE4DiC,kBAF5D,2CAAN;;AAKA,UAAIxO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;;AAEA,UAAIvG,KAAK,GAAGuH,UAAU,CAACzH,IAAX,CAAgB1E,EAAhB,CAAZ;;AACA,UAAI,CAAC4E,KAAL,EAAY;AACV,eAAO,IAAIpE,QAAJ,CAAa,GAAb,CAAP;AACD;;AAED,UAAIzD,KAAK,GAAG,KAAK+Q,mBAAL,CACV3C,OADU,EAEVgB,UAAU,CAACqC,kBAFD,CAAZ;;AAKA,aAAO5J,KAAK,CAACiK,MAAN,CAAa9R,KAAb,CAAP;AACD;;;;EA5BmDiR;;ACHtD;;;;IAGqBc;;;;;;;;;;;;;;AACnB;;;;;0CAMsB3D,SAASgB,YAAY;AACzC,UAAInJ,SAAS,GAAG,KAAKiL,SAArB;AACA,UAAIO,kBAAkB,GAAGtN,QAAQ,CAAC8B,SAAD,CAAjC;AACAZ,MAAAA,MAAM,CACJ+J,UADI,kCAEqBhB,OAAO,CAACoB,GAF7B,sCAE4DiC,kBAF5D,2CAAN;;AAKA,UAAIxO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;;AACA,UAAIvG,KAAK,GAAGuH,UAAU,CAACzH,IAAX,CAAgB1E,EAAhB,CAAZ;;AACA,UAAI,CAAC4E,KAAL,EAAY;AACV,eAAO,IAAIpE,QAAJ,CAAa,GAAb,CAAP;AACD;;AAEDoE,MAAAA,KAAK,CAACmK,OAAN;AACD;AAED;;;;;;;;;yCAOqB5D,SAASkD,cAAc;AAAA;;AAC1C,UAAIrO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;;AAEA,UAAInG,MAAM,GAAGqJ,YAAY,CAAC,CAAD,CAAZ,CAAgB3J,IAAhB,CAAqB1E,EAArB,CAAb;AACA,UAAIgP,UAAU,GAAGX,YAAY,CAC1BnE,KADc,CACR,CADQ,EAEdrM,GAFc,CAEV,UAAAsO,UAAU;AAAA,eACb,KAAI,CAAChD,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoC9C,UAAU,CAACqC,kBAA/C,CADa;AAAA,OAFA,CAAjB,CAJ0C;;AAW1CQ,MAAAA,UAAU,CAAC9R,OAAX,CAAmB,UAAAsH,IAAI;AAAA,eAAIQ,MAAM,CAACR,IAAD,CAAN,CAAauK,OAAb,EAAJ;AAAA,OAAvB;AACA/J,MAAAA,MAAM,CAAC+J,OAAP;AACD;;;;EA5CsDf;;ACHzD;;;;IAGqBkB;;;;;;;;;;;;;;AACnB;;;;;;0CAOsB/D,SAASgB,YAAY;AACzC,UAAInJ,SAAS,GAAG,KAAKiL,SAArB;AACA,UAAIO,kBAAkB,GAAGtN,QAAQ,CAAC8B,SAAD,CAAjC;AAEAZ,MAAAA,MAAM,CACJ+J,UADI,kCAEqBhB,OAAO,CAACoB,GAF7B,sCAE4DiC,kBAF5D,2CAAN;;AAKA,UAAIxO,EAAE,GAAG,KAAK6L,gBAAL,CAAsBV,OAAtB,CAAT;;AACA,UAAInL,EAAJ,EAAQ;AACN,YAAI4E,KAAK,GAAGuH,UAAU,CAACzH,IAAX,CAAgB1E,EAAhB,CAAZ;;AACA,YAAI,CAAC4E,KAAL,EAAY;AACV,iBAAO,IAAIpE,QAAJ,CAAa,GAAb,CAAP;AACD,SAFD,MAEO;AACL,iBAAO,IAAIA,QAAJ,CAAa,GAAb,CAAP;AACD;AACF,OAPD,MAOO,IACL,KAAK0N,OAAL,CAAaO,QAAb,IACAtD,OAAO,CAACgE,WADR,IAEAhE,OAAO,CAACgE,WAAR,CAAoB/I,GAHf,EAIL;AACA,YAAIxB,MAAK,GAAGuH,UAAU,CAACzH,IAAX,CAAgByG,OAAO,CAACgE,WAAR,CAAoB/I,GAApC,CAAZ;;AAEA,YAAI,CAACxB,MAAL,EAAY;AACV,iBAAO,IAAIpE,QAAJ,CAAa,GAAb,CAAP;AACD,SAFD,MAEO;AACL,iBAAO,IAAIA,QAAJ,CAAa,GAAb,CAAP;AACD;AACF,OAZM,MAYA;AACL,eAAO,IAAIA,QAAJ,CAAa,GAAb,CAAP;AACD;AACF;;;;EAxCoDwN;;ACEvD,IAAMoB,aAAa,GAAG;AAAElQ,EAAAA,GAAG,EAAE,GAAP;AAAYmQ,EAAAA,GAAG,EAAE,GAAjB;AAAsBC,EAAAA,IAAI,EAAE,GAA5B;AAAiC,YAAQ;AAAzC,CAAtB;;AAEA,SAASC,aAAT,OAOG;AAAA,MANDC,IAMC,QANDA,IAMC;AAAA,MALDrM,MAKC,QALDA,MAKC;AAAA,MAJDsI,oBAIC,QAJDA,oBAIC;AAAA,MAHDT,IAGC,QAHDA,IAGC;AAAA,MAFDyE,UAEC,QAFDA,UAEC;AAAA,MADDvB,OACC,QADDA,OACC;AACD,MAAIwB,OAAJ;AACA,MAAIlG,IAAI,GAAG,CAACrG,MAAD,EAASsI,oBAAT,EAA+BgE,UAA/B,EAA2CzE,IAA3C,EAAiDkD,OAAjD,CAAX;;AACA,MAAI1J,IAAI,WAAUiL,UAAV,CAAR;;AAEA,MAAIjL,IAAI,KAAK,UAAb,EAAyB;AACvBkL,IAAAA,OAAO,cAAOC,oBAAP,EAA0BnG,IAA1B,CAAP;AACD,GAFD,MAEO,IAAIhF,IAAI,KAAK,QAAT,IAAqBiL,UAAzB,EAAqC;AAC1CC,IAAAA,OAAO,cAAOE,kBAAP,EAAwBpG,IAAxB,CAAP;AACD,GAFM,MAEA,IAAIgG,IAAI,KAAK,KAAb,EAAoB;AACzBE,IAAAA,OAAO,cAAOG,wBAAP,EAA8BrG,IAA9B,CAAP;AACD,GAFM,MAEA,IAAIgG,IAAI,KAAK,MAAb,EAAqB;AAC1BE,IAAAA,OAAO,cAAOI,yBAAP,EAA+BtG,IAA/B,CAAP;AACD,GAFM,MAEA,IAAIgG,IAAI,KAAK,KAAT,IAAkBA,IAAI,KAAK,OAA/B,EAAwC;AAC7CE,IAAAA,OAAO,cAAOK,wBAAP,EAA8BvG,IAA9B,CAAP;AACD,GAFM,MAEA,IAAIgG,IAAI,KAAK,QAAb,EAAuB;AAC5BE,IAAAA,OAAO,cAAOM,2BAAP,EAAiCxG,IAAjC,CAAP;AACD,GAFM,MAEA,IAAIgG,IAAI,KAAK,MAAb,EAAqB;AAC1BE,IAAAA,OAAO,cAAOO,yBAAP,EAA+BzG,IAA/B,CAAP;AACD;;AACD,SAAOkG,OAAP;AACD;AAED;;;;;IAGqBQ;;;AACnB,+BAQG;AAAA,QAPD/M,MAOC,SAPDA,MAOC;AAAA,QANDqM,IAMC,SANDA,IAMC;AAAA,QALDC,UAKC,SALDA,UAKC;AAAA,QAJDU,cAIC,SAJDA,cAIC;AAAA,QAHDjC,OAGC,SAHDA,OAGC;AAAA,QAFDlD,IAEC,SAFDA,IAEC;AAAA,QADDS,oBACC,SADDA,oBACC;;AAAA;;AACD,SAAK+D,IAAL,GAAYA,IAAZ;AACA,SAAKW,cAAL,GAAsBA,cAAtB;AACA,SAAK1E,oBAAL,GAA4BA,oBAA5B;AACA,SAAKiE,OAAL,GAAeH,aAAa,CAAC;AAC3BC,MAAAA,IAAI,EAAJA,IAD2B;AAE3BrM,MAAAA,MAAM,EAANA,MAF2B;AAG3B6H,MAAAA,IAAI,EAAJA,IAH2B;AAI3BS,MAAAA,oBAAoB,EAApBA,oBAJ2B;AAK3BgE,MAAAA,UAAU,EAAVA,UAL2B;AAM3BvB,MAAAA,OAAO,EAAPA;AAN2B,KAAD,CAA5B;AAQD;;;;2BAEM/C,SAAS;AAAA;;AACd,aAAO,KAAKiF,4BAAL,CAAkCjF,OAAlC,EACJkF,IADI,CACC,UAAAC,cAAc;AAAA,eAAI,KAAI,CAACjD,SAAL,CAAeiD,cAAf,EAA+BnF,OAA/B,CAAJ;AAAA,OADf,EAEJkF,IAFI,CAEC,UAAAE,wBAAwB,EAAI;AAChC,eAAOA,wBAAwB,CAACC,cAAzB,EAAP;AACD,OAJI,CAAP;AAKD;;;iDAE4BrF,SAAS;AACpC,UAAIsF,MAAJ;;AACA,UAAI;AACF;;;;AAIA,YAAI,KAAKf,OAAL,YAAwBC,oBAA5B,EAA6C;AAC3C,eAAKD,OAAL,CAAagB,UAAb,CAAwBvF,OAAxB;AACD;;AAEDsF,QAAAA,MAAM,GAAG,KAAKf,OAAL,CAAavB,MAAb,CAAoBhD,OAApB,CAAT;AACD,OAVD,CAUE,OAAOwF,CAAP,EAAU;AACV,YAAIA,CAAC,YAAYpO,WAAjB,EAA8B;AAC5BkO,UAAAA,MAAM,GAAG,IAAIjQ,QAAJ,CAAa,GAAb,EAAkB,EAAlB,EAAsBmQ,CAAtB,CAAT;AACD,SAFD,MAEO;AACL,cAAIlO,OAAO,GAAGkO,CAAC,CAAClO,OAAF,IAAakO,CAA3B;AAEAF,UAAAA,MAAM,GAAG,IAAIjQ,QAAJ,CACP,GADO,EAEP,EAFO,EAGP;AACEiC,YAAAA,OAAO,EAAPA,OADF;AAEEC,YAAAA,KAAK,yBAAkByI,OAAO,CAACtC,MAA1B,kCACHsC,OAAO,CAACoB,GADL,iCAEkBoE,CAAC,CAACjO,KAAF,IAAWiO,CAF7B;AAFP,WAHO,CAAT;AAUD;AACF;;AAED,aAAO,KAAKC,iBAAL,CAAuBH,MAAvB,CAAP;AACD;;;sCAEiBA,QAAQ;AAAA;;AACxB,UAAIH,cAAJ;AAEA,aAAO,IAAIO,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACtCF,QAAAA,OAAO,CAACC,OAAR,CAAgBL,MAAhB,EACGJ,IADH,CACQ,UAAArD,QAAQ,EAAI;AAChB,cAAIA,QAAQ,YAAYxM,QAAxB,EAAkC;AAChC8P,YAAAA,cAAc,GAAGG,MAAjB;AACD,WAFD,MAEO;AACL,gBAAIhQ,IAAI,GAAG,MAAI,CAACuQ,mBAAL,CAAyBhE,QAAzB,CAAX;;AACAsD,YAAAA,cAAc,GAAG,IAAI9P,QAAJ,CAAaC,IAAb,EAAmB,EAAnB,EAAuBuM,QAAvB,CAAjB;AACD;;AACD8D,UAAAA,OAAO,CAACR,cAAD,CAAP;AACD,SATH,WAUSS,MAVT;AAWD,OAZM,CAAP;AAaD;;;wCAEmB/D,UAAU;AAC5B,UAAIvM,IAAJ;;AACA,UAAI,KAAK0P,cAAT,EAAyB;AACvB1P,QAAAA,IAAI,GAAG,KAAK0P,cAAZ;AACD,OAFD,MAEO;AACL1P,QAAAA,IAAI,GAAG2O,aAAa,CAAC,KAAKI,IAAN,CAApB,CADK;;AAGL,YAAI/O,IAAI,KAAK,GAAT,IAAgBuM,QAAQ,KAAKpM,SAA7B,IAA0CoM,QAAQ,KAAK,EAA3D,EAA+D;AAC7DvM,UAAAA,IAAI,GAAG,GAAP;AACD;AACF;;AACD,aAAOA,IAAP;AACD;;;8BAES6P,gBAAgBnF,SAAS;AACjCmF,MAAAA,cAAc,CAAC3P,IAAf,GAAsB,KAAK8K,oBAAL,CAA0B4B,SAA1B,CACpBiD,cAAc,CAAC3P,IADK,EAEpBwK,OAFoB,CAAtB;AAKA,aAAOmF,cAAP;AACD;;;;;;ACnJH;;;;AAGA,AAAe,SAAStS,MAAT,CAAgBiT,UAAhB,EAA4BC,WAA5B,EAAyC;AAAA,MAChDC,KADgD;AAAA;AAAA;AAAA;;AAEpD,qBAAqB;AAAA;;AAAA;;AAAA;;AAAA,wCAAN3H,IAAM;AAANA,QAAAA,IAAM;AAAA;;AACnB,uIAASA,IAAT,IADmB;AAGnB;;AACA,UAAIyH,UAAU,IAAIG,GAAG,CAACH,UAAD,EAAa,aAAb,CAArB,EAAkD;AAAA;;AAChD,iCAAAA,UAAU,CAACjS,WAAX,EAAuB3B,IAAvB,sEAAqCmM,IAArC;AACD;;AANkB;AAOpB;;AATmD;AAAA,IAClC,IADkC;;;AActD3M,EAAAA,MAAM,CAACC,MAAP,CAAcqU,KAAd,EAAqB,IAArB,EAA2BD,WAA3B,EAdsD;AAiBtD;;AACA,MAAID,UAAJ,EAAgB;AACdpU,IAAAA,MAAM,CAACC,MAAP,CAAcqU,KAAK,CAAClS,SAApB,EAA+BgS,UAA/B;AACD;;AAED,SAAOE,KAAP;AACD;;ACnBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CME;;;AACJ;;AACA;;;;;;AAOA,iBAAYlO,MAAZ,EAAoBH,SAApB,EAA+BjG,KAA/B,EAAsCuU,GAAtC,EAA2C;AAAA;;AAAA;;AACzClP,IAAAA,MAAM,CAACe,MAAD,EAAS,2BAAT,CAAN;AACAf,IAAAA,MAAM,CAACY,SAAD,EAAY,8BAAZ,CAAN;AAEA,SAAKuO,OAAL,GAAepO,MAAf;AACA,SAAKH,SAAL,GAAiBA,SAAjB;AACA,SAAKsO,GAAL,GAAWA,GAAG,IAAI,EAAlB;AAEA;;;;;;;;;;;AAaA,SAAKvU,KAAL,GAAa,EAAb;AAEAA,IAAAA,KAAK,GAAGA,KAAK,IAAI,EAAjB,CAvByC;;AA0BzC,SAAKuU,GAAL,CAASpU,OAAT,CAAiB,UAAAkI,EAAE,EAAI;AACrB,MAAA,KAAI,CAACrI,KAAL,CAAWqI,EAAX,IAAiBrI,KAAK,CAACqI,EAAD,CAAL,KAAcxE,SAAd,GAA0B7D,KAAK,CAACqI,EAAD,CAA/B,GAAsC,IAAvD;AACD,KAFD;AAIAvI,IAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAAA4I,IAAI,EAAI;AACjC,UAAMnI,KAAK,GAAGZ,KAAK,CAAC+I,IAAD,CAAnB;;AAEA,MAAA,KAAI,CAAC0L,aAAL,CAAmB1L,IAAnB,EAAyBnI,KAAzB;;AACA,MAAA,KAAI,CAAC8T,UAAL,CAAgB3L,IAAhB,EAAsBnI,KAAtB;;AACA,MAAA,KAAI,CAAC+T,kBAAL,CAAwB5L,IAAxB,EAA8BnI,KAA9B;AACD,KAND;AAQA,WAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;;2BAkBO;AACL,UAAI6K,UAAU,GAAG,KAAK+I,OAAL,CAAaI,wBAAb,CAAsC,KAAK3O,SAA3C,CAAjB;;AAEA,UAAI,KAAK4O,KAAL,EAAJ,EAAkB;AAChB;AACA,aAAK7U,KAAL,GAAa,KAAKwU,OAAL,CAAaM,EAAb,CAAgBrJ,UAAhB,EAA4BtC,MAA5B,CAAmC,KAAKnJ,KAAxC,CAAb,CAFgB;;AAKhB,aAAK+U,qBAAL,CAA2B,IAA3B;AACD,OAND,MAMO;AACL,aAAKP,OAAL,CAAaQ,QAAb,CAAsB,KAAKrS,QAAL,EAAtB,IAAyC,IAAzC;;AACA,aAAK6R,OAAL,CAAaM,EAAb,CAAgBrJ,UAAhB,EAA4BqG,MAA5B,CAAmC,KAAK9R,KAAL,CAAWiD,EAA9C,EAAkD,KAAKjD,KAAvD;AACD;;AAED,WAAKiV,iBAAL;;AAEA,WAAKT,OAAL,CAAaQ,QAAb,CAAsB,KAAKrS,QAAL,EAAtB,IAAyC,KAAzC;AACA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;2BAkBOnC,KAAK0U,KAAK;AACf,UAAIlV,KAAJ;;AACA,UAAIQ,GAAG,IAAI,IAAX,EAAiB;AACf,eAAO,IAAP;AACD;;AAED,UAAI,QAAOA,GAAP,MAAe,QAAnB,EAA6B;AAC3BR,QAAAA,KAAK,GAAGQ,GAAR;AACD,OAFD,MAEO;AACL,SAACR,KAAK,GAAG,EAAT,EAAaQ,GAAb,IAAoB0U,GAApB;AACD;;AAEDpV,MAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAASC,IAAT,EAAe;AACxC,YACE,CAAC,KAAK+G,eAAL,CAAqBkN,GAArB,CAAyBjU,IAAzB,CAAD,IACA,CAAC,KAAKiH,iBAAL,CAAuBgN,GAAvB,CAA2BjU,IAA3B,CAFH,EAGE;AACA,eAAK2U,qBAAL,CAA2B3U,IAA3B;AACD;;AACD,aAAKA,IAAL,IAAaJ,KAAK,CAACI,IAAD,CAAlB;AACD,OARD,EAQG,IARH;AAUA,WAAK8H,IAAL;AAEA,aAAO,IAAP;AACD;AAED;;;;;;;;;;;;8BAWU;AACR,UAAI,KAAKiN,OAAL,EAAJ,EAAoB;AAClB,aAAKC,2BAAL;;AAEA,YAAI3J,UAAU,GAAG,KAAK+I,OAAL,CAAaI,wBAAb,CAAsC,KAAK3O,SAA3C,CAAjB;;AACA,aAAKuO,OAAL,CAAaM,EAAb,CAAgBrJ,UAAhB,EAA4BS,MAA5B,CAAmC,KAAKlM,KAAL,CAAWiD,EAA9C;AACD;AACF;AAED;;;;;;;;;;;;;;;;;4BAiBQ;AACN,UAAIoS,WAAW,GAAG,KAAlB;AACA,UAAIC,KAAK,GAAG,KAAKtV,KAAL,CAAWiD,EAAX,KAAkBY,SAAlB,IAA+B,KAAK7D,KAAL,CAAWiD,EAAX,KAAkB,IAA7D;;AAEA,UAAIqS,KAAJ,EAAW;AACT,YAAIC,cAAc,GAAG,KAAKf,OAAL,CAAaI,wBAAb,CACnB,KAAK3O,SADc,CAArB;;AAGA,YAAIwD,MAAM,GAAG,KAAK+K,OAAL,CAAaM,EAAb,CAAgBS,cAAhB,EAAgC5N,IAAhC,CAAqC,KAAK3H,KAAL,CAAWiD,EAAhD,CAAb;;AAEA,YAAIwG,MAAJ,EAAY;AACV4L,UAAAA,WAAW,GAAG,IAAd;AACD;AACF;;AAED,aAAO,CAACA,WAAR;AACD;AAED;;;;;;;;;8BAOU;AACR,aAAO,CAAC,KAAKR,KAAL,EAAR;AACD;AAED;;;;;;;;;;;;;;;;;6BAkBS;AACP,UAAI,KAAK5R,EAAT,EAAa;AACX,YAAIwI,UAAU,GAAG,KAAK+I,OAAL,CAAaI,wBAAb,CAAsC,KAAK3O,SAA3C,CAAjB;;AACA,YAAIjG,KAAK,GAAG,KAAKwU,OAAL,CAAaM,EAAb,CAAgBrJ,UAAhB,EAA4B9D,IAA5B,CAAiC,KAAK1E,EAAtC,CAAZ;;AAEAnD,QAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EACGd,MADH,CACU,UAASkB,IAAT,EAAe;AACrB,iBAAOA,IAAI,KAAK,IAAhB;AACD,SAHH,EAIGD,OAJH,CAIW,UAASC,IAAT,EAAe;AACtB,eAAKJ,KAAL,CAAWI,IAAX,IAAmBJ,KAAK,CAACI,IAAD,CAAxB;AACD,SANH,EAMK,IANL;AAOD,OAZM;;;AAeP,WAAKkH,iBAAL,GAAyB,EAAzB;AAEA,aAAO,IAAP;AACD;;;6BAEQ;AACP,aAAO,KAAKtH,KAAZ;AACD;AAED;;;;;;;;;;mCAQeQ,KAAK;AAClB,aAAO,KAAKgU,OAAL,CAAagB,eAAb,CAA6B,KAAKvP,SAAlC,EAA6CzF,GAA7C,CAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAyCW2C,aAAa;AACtB,aACE,KAAKsS,mBAAL,CAAyBtS,WAAzB,KACA,KAAKuS,mBAAL,CAAyBvS,WAAzB,CAFF;AAID;AAED;;;;;;;;wCAMoBA,aAAa;AAC/B,WAAKwS,iCAAL,CAAuCxS,WAAvC;;AAEA,UAAIyS,YAAY,GAAG,KAAKpB,OAAL,CAAagB,eAAb,CAA6B,KAAKvP,SAAlC,CAAnB;;AACA,UAAIK,OAAO,GAAGnD,WAAW,CAAC+C,IAAZ,CAAiBI,OAA/B;AACA,UAAIuP,SAAS,GAAGvP,OAAO,GAAGsP,YAAY,CAACtP,OAAD,CAAf,GAA2B,IAAlD;AACA,UAAIwP,mBAAmB,GAAGD,SAAS,IAAIA,SAAS,CAACrO,aAAjD;AACA,UAAIuO,eAAe,GACjBF,SAAS,IAAIA,SAAS,CAAC5P,SAAV,KAAwB9C,WAAW,CAACgD,cADnD;AAEA,UAAI6P,gBAAgB,GAAGH,SAAS,IAAIA,SAAS,CAAC3P,IAAV,CAAeI,OAAnD;;AAEA,UAAI0P,gBAAgB,IAAIH,SAAS,CAAC3P,IAAV,CAAeI,OAAf,KAA2BnD,WAAW,CAAC3C,GAA/D,EAAoE;AAClE6E,QAAAA,MAAM,CACJ,KADI,wCAE2BiB,OAF3B,kBAE0CnD,WAAW,CAAC3C,GAFtD,qCAEoFqV,SAAS,CAAC5P,SAF9F,cAE2G4P,SAAS,CAACrV,GAFrH,gBAAN;AAID;;AAED,aAAOsV,mBAAmB,IAAIC,eAAvB,GAAyCF,SAAzC,GAAqD,IAA5D;AACD;AAED;;;;;;;;;;sDASkC1S,aAAa;AAC7C,UAAIyS,YAAY,GAAG,KAAKpB,OAAL,CAAagB,eAAb,CAA6B,KAAKvP,SAAlC,CAAnB;;AACA,UAAIgQ,wBAAwB,GAAGnW,MAAM,CAACI,IAAP,CAAY0V,YAAZ,EAA0B1W,MAA1B,CAAiC,UAAAsB,GAAG,EAAI;AACrE,YAAIqV,SAAS,GAAGD,YAAY,CAACpV,GAAD,CAA5B;AACA,YAAI0V,YAAY,GAAG/S,WAAW,CAACgD,cAAZ,KAA+B0P,SAAS,CAAC5P,SAA5D;AACA,YAAIkQ,iBAAiB,GAAGhT,WAAW,CAAC3C,GAAZ,KAAoBqV,SAAS,CAAC3P,IAAV,CAAeI,OAA3D;AAEA,eAAO4P,YAAY,IAAIC,iBAAvB;AACD,OAN8B,CAA/B;AAOA9Q,MAAAA,MAAM,CACJ4Q,wBAAwB,CAAC5X,MAAzB,IAAmC,CAD/B,gBAEG,KAAK4H,SAFR,+EAEsF9C,WAAW,CAACgD,cAFlG,cAEoHhD,WAAW,CAAC3C,GAFhI,mBAAN;AAID;AAED;;;;;;;;;wCAOoB2C,aAAa;AAAA;;AAC/B,UAAIyS,YAAY,GAAG,KAAKpB,OAAL,CAAagB,eAAb,CAA6B,KAAKvP,SAAlC,CAAnB;;AACA,UAAIA,SAAS,GAAG9C,WAAW,CAACgD,cAA5B;AAEA,aAAOiQ,MAAM,CAACR,YAAD,CAAN,CACJ1W,MADI,CACG,UAAA2W,SAAS;AAAA,eAAIA,SAAS,CAAC5P,SAAV,KAAwBA,SAA5B;AAAA,OADZ,EAEJuF,MAFI,CAEG,UAAClF,OAAD,EAAUuP,SAAV,EAAwB;AAC9B,YAAIG,gBAAgB,GAAGH,SAAS,CAAC3P,IAAV,CAAeI,OAAtC;AACA,YAAI+P,0BAA0B,GAAGL,gBAAgB,KAAKnS,SAAtD;AACA,YAAIyS,0BAA0B,GAAGN,gBAAgB,KAAK7S,WAAW,CAAC3C,GAAlE;AAEA,YAAI+V,gBAAgB,GAClBF,0BAA0B,IAAIC,0BADhC;;AAGA,YAAIC,gBAAJ,EAAsB;AACpB;AACAlR,UAAAA,MAAM,CACJ,CAACiB,OADG,gBAEG,MAAI,CAACL,SAFR,uEAE8E9C,WAAW,CAACgD,cAF1F,cAE4GhD,WAAW,CAAC3C,GAFxH,mBAAN;AAIA8F,UAAAA,OAAO,GAAGuP,SAAV;AACD;;AAED,eAAOvP,OAAP;AACD,OApBI,EAoBF,IApBE,CAAP;AAqBD;AAED;;;;;;;;;;;;;kCAWcnD,aAAa;AACzB,aAAO,CAAC,CAAC,KAAK4E,UAAL,CAAgB5E,WAAhB,CAAT;AACD;AAED;;;;;;;;;0CAOsB0E,OAAO1E,aAAa;AAAA,UAClC3C,GADkC,GAC1B2C,WAD0B,CAClC3C,GADkC;AAExC,UAAIgW,2BAA2B,GAAG,KAAKhW,GAAL,CAAlC;;AAEA,UAAIgW,2BAA2B,IAAI3O,KAAnC,EAA0C;AACxC,YAAI2O,2BAA2B,YAAYlC,KAA3C,EAAkD;AAChD,cAAIkC,2BAA2B,CAACrB,OAA5B,MAAyCtN,KAAK,CAACsN,OAAN,EAA7C,EAA8D;AAC5D,mBAAOqB,2BAA2B,CAAC7T,QAA5B,OAA2CkF,KAAK,CAAClF,QAAN,EAAlD;AACD,WAFD,MAEO;AACL,mBAAO6T,2BAA2B,KAAK3O,KAAvC;AACD;AACF,SAND,MAMO;AACL,iBAAO2O,2BAA2B,CAACC,QAA5B,CAAqC5O,KAArC,CAAP;AACD;AACF;AACF;;;8BAESA,OAAO1E,aAAa;AAC5B,UAAI,KAAKuT,qBAAL,CAA2B7O,KAA3B,EAAkC1E,WAAlC,CAAJ,EAAoD;AAClD;AACD;;AAH2B,UAKtB3C,GALsB,GAKd2C,WALc,CAKtB3C,GALsB;;AAO5B,UAAI2C,WAAW,YAAYkK,OAA3B,EAAoC;AAClC,YAAI,CAAC,KAAK7M,GAAL,EAAUiW,QAAV,CAAmB5O,KAAnB,CAAL,EAAgC;AAC9B,eAAKrH,GAAL,EAAU4G,GAAV,CAAcS,KAAd;AACD;AACF,OAJD,MAIO;AACL,aAAKrH,GAAL,IAAYqH,KAAZ;AACD;AACF;;;iCAEYA,OAAO1E,aAAa;AAC/B,UAAIkF,EAAE,GAAGlF,WAAW,CAACwD,aAAZ,EAAT;;AAEA,UAAIxD,WAAW,YAAYkK,OAA3B,EAAoC;AAClC,YAAI5O,CAAJ;;AACA,YAAI0E,WAAW,CAACqE,aAAhB,EAA+B;AAC7B,cAAImP,KAAK,GAAG,KAAKtO,EAAL,EAASV,IAAT,CACV;AAAA,gBAAGF,IAAH,QAAGA,IAAH;AAAA,gBAASxE,EAAT,QAASA,EAAT;AAAA,mBAAkBwE,IAAI,KAAKI,KAAK,CAAC5B,SAAf,IAA4BhD,EAAE,KAAK4E,KAAK,CAAC5E,EAA3D;AAAA,WADU,CAAZ;AAGAxE,UAAAA,CAAC,GAAGkY,KAAK,IAAI,KAAKtO,EAAL,EAASxJ,OAAT,CAAiB8X,KAAjB,CAAb;AACD,SALD,MAKO;AACLlY,UAAAA,CAAC,GAAG,KAAK4J,EAAL,EAASvH,GAAT,CAAa,UAAAN,GAAG;AAAA,mBAAIA,GAAG,CAACmC,QAAJ,EAAJ;AAAA,WAAhB,EAAoC9D,OAApC,CAA4CgJ,KAAK,CAAC5E,EAAN,CAASN,QAAT,EAA5C,CAAJ;AACD;;AAED,YAAIlE,CAAC,GAAG,CAAC,CAAT,EAAY;AACV,eAAKuB,KAAL,CAAWqI,EAAX,EAAeoC,MAAf,CAAsBhM,CAAtB,EAAyB,CAAzB;AACD;AACF,OAdD,MAcO;AACL,aAAKuB,KAAL,CAAWqI,EAAX,IAAiB,IAAjB;AACD;AACF;AAED;;;;;;AAOA;;AACA;;;;;;;;;+BASWjI,MAAMQ,OAAO;AACtB,UAAMgW,aAAa,GACjB,KAAKzP,eAAL,CAAqBkN,GAArB,CAAyBjU,IAAzB,KAAkC,KAAKiH,iBAAL,CAAuBgN,GAAvB,CAA2BjU,IAA3B,CADpC;;AAGA,UAAI,CAACwW,aAAL,EAAoB;AAClB,aAAK5W,KAAL,CAAWI,IAAX,IAAmBQ,KAAnB,CADkB;;AAGlB,aAAKmU,qBAAL,CAA2B3U,IAA3B;AACD;AACF;AAED;;;;;;;;;;0CAOsBA,MAAM;AAC1B;AACA,UAAIyW,gBAAgB,GAAG/W,MAAM,CAACgX,wBAAP,CAAgC,IAAhC,EAAsC1W,IAAtC,CAAvB;;AACA,UAAIyW,gBAAgB,IAAIA,gBAAgB,CAAC1U,GAAzC,EAA8C;AAC5C;AACD,OALyB;;;AAQ1B,UAAI,CAACrC,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CAAqC,KAAKN,KAA1C,EAAiDI,IAAjD,CAAL,EAA6D;AAC3D,aAAKJ,KAAL,CAAWI,IAAX,IAAmB,IAAnB;AACD,OAVyB;;;AAa1BN,MAAAA,MAAM,CAACkC,cAAP,CAAsB,IAAtB,EAA4B5B,IAA5B,EAAkC;AAChC+B,QAAAA,GADgC,iBAC1B;AACJ,iBAAO,KAAKnC,KAAL,CAAWI,IAAX,CAAP;AACD,SAH+B;AAIhCgC,QAAAA,GAJgC,eAI5B8S,GAJ4B,EAIvB;AACP,eAAKlV,KAAL,CAAWI,IAAX,IAAmB8U,GAAnB;AACA,iBAAO,IAAP;AACD;AAP+B,OAAlC;AASD;AAED;;;;;;;;;;;;;;;uCAYmB9U,MAAMQ,OAAO;AAC9B,UAAMmW,IAAI,GAAG,KAAK1P,iBAAL,CAAuBgN,GAAvB,CAA2BjU,IAA3B,KAAoC,KAAKmU,GAAL,CAASkC,QAAT,CAAkBrW,IAAlB,CAAjD;AACA,UAAMwW,aAAa,GAAG,KAAKzP,eAAL,CAAqBkN,GAArB,CAAyBjU,IAAzB,CAAtB;;AAEA,UAAI2W,IAAJ,EAAU;AACR,YAAInW,KAAK,KAAKiD,SAAV,IAAuBjD,KAAK,KAAK,IAArC,EAA2C;AACzC,eAAKoW,mCAAL,CAAyC5W,IAAzC,EAA+CQ,KAA/C;AACD;;AACD,aAAKZ,KAAL,CAAWI,IAAX,IAAmBQ,KAAnB;AACD;;AACD,UAAIgW,aAAJ,EAAmB;AACjB,aAAKxW,IAAL,IAAaQ,KAAb;AACD;AACF;AAED;;;;;;;;kCAKcJ,KAAKI,OAAO;AACxB;AACA;AACE,YAAI,KAAKuG,eAAL,CAAqBkN,GAArB,CAAyB7T,GAAzB,CAAJ,EAAmC;AACjC,cAAI2C,WAAW,GAAG,KAAKmM,cAAL,CAAoB9O,GAApB,CAAlB;AACA,cAAIyW,MAAM,GAAGrW,KAAK,KAAK,IAAvB;;AAEA,cAAIuC,WAAW,YAAYkK,OAA3B,EAAoC;AAClC,gBAAI6J,YAAY,GACdtW,KAAK,YAAY4L,UAAjB,IACA5L,KAAK,YAAYwM,qBAFnB;AAGA,gBAAI+J,eAAe,GACjB5Y,KAAK,CAACsC,OAAN,CAAcD,KAAd,KAAwBA,KAAK,CAAC+J,KAAN,CAAY,UAAAyM,IAAI;AAAA,qBAAIA,IAAI,YAAY9C,KAApB;AAAA,aAAhB,CAD1B;AAGAjP,YAAAA,MAAM,CACJ6R,YAAY,IAAIC,eAAhB,IAAmCF,MAD/B,sCAEyB,KAAKhR,SAF9B,wCAEoErF,KAFpE,0BAEwFJ,GAFxF,mIAAN;AAID,WAXD,MAWO,IAAI2C,WAAW,YAAYuD,SAA3B,EAAsC;AAC3CrB,YAAAA,MAAM,CACJzE,KAAK,YAAY0T,KAAjB,IAA0B2C,MADtB,sCAEyB,KAAKhR,SAF9B,wCAEoErF,KAFpE,0BAEwFJ,GAFxF,uFAAN;AAID;AACF;AACF,OAzBuB;;AA4BxB;AACE,YAAI,KAAK6G,iBAAL,CAAuBgN,GAAvB,CAA2B7T,GAA3B,CAAJ,EAAqC;AACnC,cAAIA,GAAG,CAAC6W,QAAJ,CAAa,KAAb,CAAJ,EAAyB;AACvB,gBAAIxW,OAAO,GAAGtC,KAAK,CAACsC,OAAN,CAAcD,KAAd,CAAd;;AACA,gBAAIqW,OAAM,GAAGrW,KAAK,KAAK,IAAvB;;AACAyE,YAAAA,MAAM,CACJxE,OAAO,IAAIoW,OADP,sCAEyB,KAAKhR,SAF9B,wCAEoErF,KAFpE,0BAEwFJ,GAFxF,+GAAN;AAID;AACF;AACF,OAvCuB;;AA0CxB;AACE,YAAI8W,mBAAmB,GACrB1W,KAAK,YAAY0T,KAAjB,IACA1T,KAAK,YAAY4L,UADjB,IAEA5L,KAAK,YAAYwM,qBAHnB;;AAIA,YAAI+J,gBAAe,GACjB5Y,KAAK,CAACsC,OAAN,CAAcD,KAAd,KACAA,KAAK,CAACvC,MADN,IAEAuC,KAAK,CAAC+J,KAAN,CAAY,UAAAyM,IAAI;AAAA,iBAAIA,IAAI,YAAY9C,KAApB;AAAA,SAAhB,CAHF;;AAKA,YAAIgD,mBAAmB,IAAIH,gBAA3B,EAA4C;AAC1C,cAAII,iBAAiB,GAAG3W,KAAxB;AAEAyE,UAAAA,MAAM,CACJ,KAAK8B,eAAL,CAAqBkN,GAArB,CAAyB7T,GAAzB,CADI,sCAGF,KAAKyF,SAHH,wCAI0BsR,iBAAiB,CAAC5U,QAAlB,EAJ1B,wBAIoEnC,GAJpE,6EAAN;AAMD;AACF;AACF;AAED;;;;;;;;;;;;wDASoCgX,gBAAgBC,aAAa;AAAA;;AAC/D,UAAIlZ,KAAK,CAACsC,OAAN,CAAc4W,WAAd,CAAJ,EAAgC;AAC9B,YAAItU,WAAW,GAAG,KAAKoK,qBAAL,CAA2BiK,cAA3B,CAAlB;AAEA,YAAIb,KAAJ;;AACA,YAAIxT,WAAW,CAACqE,aAAhB,EAA+B;AAC7BmP,UAAAA,KAAK,GAAGc,WAAW,CAAC3W,GAAZ,CAAgB,iBAAkB;AAAA,gBAAf2G,IAAe,SAAfA,IAAe;AAAA,gBAATxE,EAAS,SAATA,EAAS;AACxC,mBAAO,MAAI,CAACuR,OAAL,CAAaM,EAAb,CACL,MAAI,CAACN,OAAL,CAAaI,wBAAb,CAAsCnN,IAAtC,CADK,EAELE,IAFK,CAEA1E,EAFA,CAAP;AAGD,WAJO,CAAR;AAKA0T,UAAAA,KAAK,GAAGhJ,OAAO,CAACgJ,KAAD,CAAf;AACD,SAPD,MAOO;AACLA,UAAAA,KAAK,GAAG,KAAKnC,OAAL,CAAaM,EAAb,CACN,KAAKN,OAAL,CAAaI,wBAAb,CAAsCzR,WAAW,CAAC8C,SAAlD,CADM,EAEN0B,IAFM,CAED8P,WAFC,CAAR;AAGD;;AAED,YAAIC,eAAe,GAAGvU,WAAW,CAACqE,aAAZ,GAClBiQ,WAAW,CAAC3W,GAAZ,CAAgB,UAAAuH,EAAE;AAAA,2BAAOA,EAAE,CAACZ,IAAV,cAAkBY,EAAE,CAACpF,EAArB;AAAA,SAAlB,EAA6C0B,IAA7C,CAAkD,GAAlD,CADkB,GAElB8S,WAFJ;AAGApS,QAAAA,MAAM,CACJsR,KAAK,CAACtY,MAAN,KAAiBoZ,WAAW,CAACpZ,MADzB,mCAEsB,KAAK4H,SAF3B,yBAEmDuR,cAFnD,iBAEwEE,eAFxE,8DAAN;AAID,OAxBD,MAwBO;AACL,YAAIvU,YAAW,GAAG,KAAK8D,uBAAL,CAA6BuQ,cAA7B,CAAlB;;AAEA,YAAIb,MAAJ;;AACA,YAAIxT,YAAW,CAACqE,aAAhB,EAA+B;AAC7BmP,UAAAA,MAAK,GAAG,KAAKnC,OAAL,CAAaM,EAAb,CACN,KAAKN,OAAL,CAAaI,wBAAb,CAAsC6C,WAAW,CAAChQ,IAAlD,CADM,EAENE,IAFM,CAED8P,WAAW,CAACxU,EAFX,CAAR;AAGD,SAJD,MAIO;AACL0T,UAAAA,MAAK,GAAG,KAAKnC,OAAL,CAAaM,EAAb,CACN,KAAKN,OAAL,CAAaI,wBAAb,CAAsCzR,YAAW,CAAC8C,SAAlD,CADM,EAEN0B,IAFM,CAED8P,WAFC,CAAR;AAGD;;AAED,YAAIC,gBAAe,GAAGvU,YAAW,CAACqE,aAAZ,aACfiQ,WAAW,CAAChQ,IADG,cACKgQ,WAAW,CAACxU,EADjB,IAElBwU,WAFJ;;AAGApS,QAAAA,MAAM,CACJsR,MADI,mCAEsB,KAAK1Q,SAF3B,yBAEmDuR,cAFnD,iBAEwEE,gBAFxE,sDAAN;AAID;AACF;AAED;;;;;;;;;;wCAOoB;AAClB,WAAKC,0BAAL;;AACA,WAAKC,wBAAL;AACD;;;iDAE4B;AAAA;;AAC3BxB,MAAAA,MAAM,CAAC,KAAKpP,qBAAN,CAAN,CAAmC7G,OAAnC,CAA2C,UAAAgD,WAAW,EAAI;AACxD,QAAA,MAAI,CAAC0U,4BAAL,CAAkC1U,WAAlC;;AACA,QAAA,MAAI,CAAC2U,kBAAL,CAAwB3U,WAAxB;;AACA,QAAA,MAAI,CAAC4U,yBAAL,CAA+B5U,WAA/B;AACD,OAJD;AAKD;;;+CAE0B;AAAA;;AACzBiT,MAAAA,MAAM,CAAC,KAAK9I,mBAAN,CAAN,CAAiCnN,OAAjC,CAAyC,UAAAgD,WAAW,EAAI;AACtD,QAAA,MAAI,CAAC0U,4BAAL,CAAkC1U,WAAlC;;AACA,QAAA,MAAI,CAAC2U,kBAAL,CAAwB3U,WAAxB;;AACA,QAAA,MAAI,CAAC4U,yBAAL,CAA+B5U,WAA/B;AACD,OAJD;AAKD;;;iDAE4BA,aAAa;AACxC,UAAIA,WAAW,YAAYkK,OAA3B,EAAoC;AAClC,aAAK2K,gCAAL,CAAsC7U,WAAtC;AACD,OAFD,MAEO,IAAIA,WAAW,YAAYuD,SAA3B,EAAsC;AAC3C,aAAKuR,iCAAL,CAAuC9U,WAAvC;AACD;AACF;;;;qDAGgCA,aAAa;AAAA;;AAAA,UACtC3C,GADsC,GAC9B2C,WAD8B,CACtC3C,GADsC;AAE5C,UAAI6H,EAAE,GAAGlF,WAAW,CAACwD,aAAZ,EAAT;AACA,UAAIuR,eAAe,GAAG,KAAK5Q,iBAAL,IAA0B,KAAKA,iBAAL,CAAuB9G,GAAvB,CAAhD;AACA,UAAI2X,YAAY,GAAG,KAAKnY,KAAL,CAAWqI,EAAX,CAAnB;;AAEA,UAAI6P,eAAe,IAAIC,YAAvB,EAAqC;AACnC,YAAI1P,MAAJ;;AACA,YAAItF,WAAW,CAACqE,aAAhB,EAA+B;AAC7BiB,UAAAA,MAAM,GAAG0P,YAAY,CAACrX,GAAb,CAAiB,iBAAkB;AAAA,gBAAf2G,IAAe,SAAfA,IAAe;AAAA,gBAATxE,EAAS,SAATA,EAAS;AAC1C,mBAAO,MAAI,CAACuR,OAAL,CAAa,MAAI,CAACA,OAAL,CAAa9M,gBAAb,CAA8BD,IAA9B,CAAb,EAAkDE,IAAlD,CAAuD1E,EAAvD,CAAP;AACD,WAFQ,CAAT;AAGD,SAJD,MAIO;AACL;AACAwF,UAAAA,MAAM,GAAG,KAAK+L,OAAL,CACP,KAAKA,OAAL,CAAa9M,gBAAb,CAA8BvE,WAAW,CAAC8C,SAA1C,CADO,EAEP0B,IAFO,CAEFwQ,YAAY,IAAI,EAFd,EAEkB1P,MAF3B;AAGD;;AAEDA,QAAAA,MAAM,CACHvJ,MADH,CAEI,UAAA8I,SAAS;AAAA;AAEP,aAACA,SAAS,CAACgN,QAAX;AAEA,aAACkD,eAAe,CAACzB,QAAhB,CAAyBzO,SAAzB,CAFD,IAGAA,SAAS,CAACF,aAAV,CAAwB3E,WAAxB;AALO;AAAA,SAFb,EASGhD,OATH,CASW,UAAA6H,SAAS,EAAI;AACpB,cAAI1B,OAAO,GAAG0B,SAAS,CAACD,UAAV,CAAqB5E,WAArB,CAAd;AAEA6E,UAAAA,SAAS,CAACW,YAAV,CAAuB,MAAvB,EAA6BrC,OAA7B;AACA0B,UAAAA,SAAS,CAACE,IAAV;AACD,SAdH;AAeD;AACF;AAED;;;;;;;;;;;;;;;;sDAiBkC/E,aAAa;AAAA,UACvC3C,GADuC,GAC/B2C,WAD+B,CACvC3C,GADuC;AAE7C,UAAI6H,EAAE,GAAGlF,WAAW,CAACwD,aAAZ,EAAT;AACA,UAAIuR,eAAe,GAAG,KAAK5Q,iBAAL,IAA0B,KAAKA,iBAAL,CAAuB9G,GAAvB,CAAhD;AACA,UAAI4X,WAAW,GAAG,KAAKpY,KAAL,CAAWqI,EAAX,CAAlB;;AAEA,UAAI6P,eAAe,KAAKrU,SAApB,IAAiCuU,WAArC,EAAkD;AAChD,YAAIpQ,SAAJ;;AACA,YAAI7E,WAAW,CAACqE,aAAhB,EAA+B;AAC7BQ,UAAAA,SAAS,GAAG,KAAKwM,OAAL,CACV,KAAKA,OAAL,CAAa9M,gBAAb,CAA8B0Q,WAAW,CAAC3Q,IAA1C,CADU,EAEVE,IAFU,CAELyQ,WAAW,CAACnV,EAFP,CAAZ;AAGD,SAJD,MAIO;AACL+E,UAAAA,SAAS,GAAG,KAAKwM,OAAL,CACV,KAAKA,OAAL,CAAa9M,gBAAb,CAA8BvE,WAAW,CAAC8C,SAA1C,CADU,EAEV0B,IAFU,CAELyQ,WAFK,CAAZ;AAGD;;AAED,YAAIpQ,SAAS,CAACF,aAAV,CAAwB3E,WAAxB,CAAJ,EAA0C;AACxC,cAAImD,OAAO,GAAG0B,SAAS,CAACD,UAAV,CAAqB5E,WAArB,CAAd;AAEA6E,UAAAA,SAAS,CAACW,YAAV,CAAuB,IAAvB,EAA6BrC,OAA7B;;AACA0B,UAAAA,SAAS,CAACqQ,WAAV,CAAsBrQ,SAAS,CAAChI,KAAhC;AACD;AACF;AACF;;;;kDAG6B;AAAA;;AAC5B,WAAKwU,OAAL,CACG8D,wBADH,CAC4B,KAAKrS,SADjC,EAEG9F,OAFH,CAEW,UAAAgD,WAAW,EAAI;AACtBA,QAAAA,WAAW,CAACoV,mCAAZ,CAAgD,MAAhD;AACD,OAJH;AAKD;;;uCAEkBpV,aAAa;AAAA,UACxB3C,GADwB,GAChB2C,WADgB,CACxB3C,GADwB;AAE9B,UAAI6H,EAAE,GAAGlF,WAAW,CAACwD,aAAZ,EAAT;AACA,UAAI6R,aAAa,GAAG,KAAKlR,iBAAL,IAA0B,KAAKA,iBAAL,CAAuB9G,GAAvB,CAA9C;;AAEA,UAAIgY,aAAa,KAAK3U,SAAtB,EAAiC;AAC/B,aAAK4U,qBAAL,GAA6B,IAA7B;AACA,eAAO,KAAKnR,iBAAL,CAAuB9G,GAAvB,CAAP;;AAEA,YAAIgY,aAAa,YAAYhM,UAA7B,EAAyC;AACvCgM,UAAAA,aAAa,CAAC/P,MAAd,CACGvJ,MADH,CACU,UAAA2I,KAAK;AAAA,mBAAI,CAACA,KAAK,CAACmN,QAAX;AAAA,WADf,EAEG7U,OAFH,CAEW,UAAAZ,KAAK,EAAI;AAChBA,YAAAA,KAAK,CAAC2I,IAAN;AACD,WAJH;;AAMA,eAAKmQ,WAAL,qBAAoBhQ,EAApB,EAAyBmQ,aAAa,CAAC/P,MAAd,CAAqB3H,GAArB,CAAyB,UAAAvB,KAAK;AAAA,mBAAIA,KAAK,CAAC0D,EAAV;AAAA,WAA9B,CAAzB;AACD,SARD,MAQO,IAAIuV,aAAa,YAAYpL,qBAA7B,EAAoD;AACzDoL,UAAAA,aAAa,CAAC/P,MAAd,CACGvJ,MADH,CACU,UAAA2I,KAAK;AAAA,mBAAI,CAACA,KAAK,CAACmN,QAAX;AAAA,WADf,EAEG7U,OAFH,CAEW,UAAAZ,KAAK,EAAI;AAChBA,YAAAA,KAAK,CAAC2I,IAAN;AACD,WAJH;;AAMA,eAAKmQ,WAAL,qBACGhQ,EADH,EACQmQ,aAAa,CAAC/P,MAAd,CAAqB3H,GAArB,CAAyB,UAAAvB,KAAK,EAAI;AACtC,mBAAO;AAAEkI,cAAAA,IAAI,EAAElI,KAAK,CAAC0G,SAAd;AAAyBhD,cAAAA,EAAE,EAAE1D,KAAK,CAAC0D;AAAnC,aAAP;AACD,WAFK,CADR;AAKD,SAZM,MAYA;AACL;AACA,cAAIuV,aAAa,KAAK,IAAtB,EAA4B;AAC1B,iBAAKH,WAAL,qBAAoBhQ,EAApB,EAAyB,IAAzB,GAD0B;;AAI3B,WAJD,MAIO,IAAI,KAAKqQ,MAAL,CAAYF,aAAZ,CAAJ,EAAgC;AACrC,iBAAKH,WAAL,qBAAoBhQ,EAApB,EAAyB,KAAKpF,EAA9B,GADqC;;AAItC,WAJM,MAIA,IAAI,CAACuV,aAAa,CAACxD,QAAnB,EAA6B;AAClC;AACAwD,YAAAA,aAAa,CAACtQ,IAAd;;AACA,iBAAKyQ,qBAAL,CAA2BH,aAA3B;;AAEA,gBAAII,OAAJ;;AACA,gBAAIzV,WAAW,CAACqE,aAAhB,EAA+B;AAC7BoR,cAAAA,OAAO,GAAG;AAAE3V,gBAAAA,EAAE,EAAEuV,aAAa,CAACvV,EAApB;AAAwBwE,gBAAAA,IAAI,EAAE+Q,aAAa,CAACvS;AAA5C,eAAV;AACD,aAFD,MAEO;AACL2S,cAAAA,OAAO,GAAGJ,aAAa,CAACvV,EAAxB;AACD;;AAED,iBAAKoV,WAAL,qBAAoBhQ,EAApB,EAAyBuQ,OAAzB;AACD;AACF;;AAED,aAAKH,qBAAL,GAA6B,KAA7B;AACD;AACF;AAED;;;;;;;;;;;;;;8CAe0BtV,aAAa;AAAA;;AACrC,UAAI,CAAC,KAAKsV,qBAAV,EAAiC;AAC/B,YAAIlB,iBAAiB,GAAG,KAAKpU,WAAW,CAAC3C,GAAjB,CAAxB;;AAEA,YAAI+W,iBAAiB,YAAYjD,KAAjC,EAAwC;AACtC,eAAKuE,0BAAL,CAAgCtB,iBAAhC,EAAmDpU,WAAnD;AACD,SAFD,MAEO,IACLoU,iBAAiB,YAAY/K,UAA7B,IACA+K,iBAAiB,YAAYnK,qBAFxB,EAGL;AACAmK,UAAAA,iBAAiB,CAAC9O,MAAlB,CAAyBtI,OAAzB,CAAiC,UAAA0H,KAAK,EAAI;AACxC,YAAA,MAAI,CAACgR,0BAAL,CAAgChR,KAAhC,EAAuC1E,WAAvC;AACD,WAFD;AAGD;;AAED,eAAO,KAAKmE,iBAAL,CAAuBnE,WAAW,CAAC3C,GAAnC,CAAP;AACD;AACF;;;+CAE0BqH,OAAO1E,aAAa;AAAA;;AAC7C,UAAI0E,KAAK,CAACC,aAAN,CAAoB3E,WAApB,CAAJ,EAAsC;AACpC,YAAImD,OAAO,GAAGuB,KAAK,CAACE,UAAN,CAAiB5E,WAAjB,CAAd;AACA,YAAI2V,SAAS,GAAGxS,OAAO,CAACK,aAAR,EAAhB;AAEA,YAAIoS,OAAO,GAAG,KAAK9V,EAAnB;;AACA,YAAIqD,OAAO,YAAYI,SAAvB,EAAkC;AAChC,cAAIsS,KAAJ;;AACA,cAAI1S,OAAO,CAACkB,aAAZ,EAA2B;AACzBwR,YAAAA,KAAK,GAAG;AAAEvR,cAAAA,IAAI,EAAE,KAAKxB,SAAb;AAAwBhD,cAAAA,EAAE,EAAE8V;AAA5B,aAAR;AACD,WAFD,MAEO;AACLC,YAAAA,KAAK,GAAGD,OAAR;AACD;;AACD,eAAKvE,OAAL,CAAaM,EAAb,CACE,KAAKN,OAAL,CAAaI,wBAAb,CAAsC/M,KAAK,CAAC5B,SAA5C,CADF,EAEE6L,MAFF,CAESjK,KAAK,CAAC5E,EAFf,sBAEsB6V,SAFtB,EAEkCE,KAFlC;AAGD,SAVD,MAUO;AACL,cAAIC,iBAAiB,GAAG,KAAKzE,OAAL,CAAaM,EAAb,CACtB,KAAKN,OAAL,CAAaI,wBAAb,CAAsC/M,KAAK,CAAC5B,SAA5C,CADsB,CAAxB;;AAGA,cAAIiT,oBAAoB,GACtBD,iBAAiB,CAACtR,IAAlB,CAAuBE,KAAK,CAAC5E,EAA7B,EAAiCqD,OAAO,CAACK,aAAR,EAAjC,KAA6D,EAD/D;AAEA,cAAIwS,gBAAgB,GAAGrZ,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBmZ,oBAAlB,CAAvB;;AACA,cAAIF,MAAJ,EAAWtC,qBAAX;;AAEA,cAAIpQ,OAAO,CAACkB,aAAZ,EAA2B;AACzBwR,YAAAA,MAAK,GAAG;AAAEvR,cAAAA,IAAI,EAAE,KAAKxB,SAAb;AAAwBhD,cAAAA,EAAE,EAAE8V;AAA5B,aAAR;AACArC,YAAAA,qBAAqB,GAAGyC,gBAAgB,CAACtM,IAAjB,CACtB,UAAArM,GAAG;AAAA,qBAAIA,GAAG,CAACiH,IAAJ,IAAY,MAAI,CAACxB,SAAjB,IAA8BzF,GAAG,CAACyC,EAAJ,IAAU8V,OAA5C;AAAA,aADmB,CAAxB;AAGD,WALD,MAKO;AACLC,YAAAA,MAAK,GAAGD,OAAR;AACArC,YAAAA,qBAAqB,GAAGyC,gBAAgB,CAAC1C,QAAjB,CAA0BsC,OAA1B,CAAxB;AACD;;AAED,cAAI,CAACrC,qBAAL,EAA4B;AAC1ByC,YAAAA,gBAAgB,CAAC3X,IAAjB,CAAsBwX,MAAtB;AACD;;AAEDC,UAAAA,iBAAiB,CAACnH,MAAlB,CAAyBjK,KAAK,CAAC5E,EAA/B,sBAAsC6V,SAAtC,EAAkDK,gBAAlD;AACD;AACF;AACF;AAGD;;;;gCACYnZ,OAAO;AACjB,WAAKA,KAAL,GAAa,KAAKwU,OAAL,CAAaM,EAAb,CACX,KAAKN,OAAL,CAAaI,wBAAb,CAAsC,KAAK3O,SAA3C,CADW,EAEX6L,MAFW,CAEJ,KAAK9R,KAAL,CAAWiD,EAFP,EAEWjD,KAFX,CAAb;AAGD;AAED;;;;;;;;;;;0CAUsBwY,eAAe;AAAA;;AACnC1Y,MAAAA,MAAM,CAACI,IAAP,CAAY,KAAKoH,iBAAjB,EAAoCnH,OAApC,CAA4C,UAAAK,GAAG,EAAI;AACjD,YACE,OAAI,CAAC8G,iBAAL,CAAuB9G,GAAvB,KACA,OAAI,CAAC8G,iBAAL,CAAuB9G,GAAvB,EAA4BmC,QAA5B,OAA2C6V,aAAa,CAAC7V,QAAd,EAF7C,EAGE;AACA,UAAA,OAAI,CAAC2E,iBAAL,CAAuB9G,GAAvB,IAA8BgY,aAA9B;AACD;AACF,OAPD;AAQD;AAED;;;;;;;;;;;;;+BAYW;AACT,UAAIY,OAAO,GAAG,KAAKnW,EAAL,cAAc,KAAKA,EAAnB,SAA2B,EAAzC;AAEA,6BAAgB,KAAKgD,SAArB,SAAiCmT,OAAjC;AACD;AAED;;;;;;;;;;;2BAQOvR,OAAO;AACZ,aAAO,KAAKlF,QAAL,OAAoBkF,KAAK,CAAClF,QAAN,EAA3B;AACD;;;wBAphBc;AACb,aAAO,KAAK6R,OAAL,CAAaQ,QAAb,CAAsB,KAAKrS,QAAL,EAAtB,CAAP;AACD;;;;;;AAqhBH2R,KAAK,CAACrT,MAAN,GAAeA,MAAf;;AACAqT,KAAK,CAAC+E,wBAAN,GAAiC,UAASC,eAAT,EAA0B;AACzD,SAAO,KAAKpX,SAAL,CAAe8E,qBAAf,CAAqCsS,eAArC,CAAP;AACD,CAFD;;AClhCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2FMC;;;AACJ,sBAAYC,QAAZ,EAAsB/R,IAAtB,EAA0C;AAAA,QAAd2G,OAAc,uEAAJ,EAAI;;AAAA;;AACxC,SAAKoL,QAAL,GAAgBA,QAAhB;AACA,SAAK/R,IAAL,GAAYA,IAAZ;AACA,SAAK2G,OAAL,GAAeA,OAAf;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAKpO,KAAL,GAAa,KAAKA,KAAL,IAAc6D,SAA3B,CAvCwC;;AAyCxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,SAAK4V,OAAL,GAAe,KAAKA,OAAL,IAAgB,EAA/B,CA7HwC;;AA+HxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,SAAKC,IAAL,GAAY,KAAKA,IAAL,IAAa7V,SAAzB,CAvKwC;;AAyKxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,SAAK8V,KAAL,GAAa,KAAKA,KAAL,IAAc9V,SAA3B,CAzNwC;;AA2NxC;;;;;;;;;;AAYA,SAAK+V,YAAL,GAAoB,KAAKA,YAAL,IAAqB/V,SAAzC,CAvOwC;AAwOzC;AAED;;;;;;;;;;;;;;;;;;;;8BAsBUgW;AAAgB;MAAiB;AACzC,aAAO,KAAKC,YAAL,CAAkBD,eAAlB,CAAP;AACD;AAED;;;;;;;;;;;8BAWUjL,MAAM;AACd,aAAOA,IAAP;AACD;;;iCAEYiL,iBAAiBE,WAAWC,cAAcpL,MAAM;AAC3D,UAAI,CAACiL,eAAD,IAAoBI,OAAO,CAACF,SAAD,CAA/B,EAA4C;AAC1C,eAAOnL,IAAP;AACD,OAFD,MAEO,IAAIiL,eAAJ,EAAqB;AAAA,oCACQ,KAAKK,yBAAL,CAChCL,eADgC,CADR;AAAA;AAAA,YACrBM,YADqB;AAAA,YACPC,WADO;;AAI1B,YAAIC,eAAe,GAAG,KAAKnD,YAAL,CAAkB2C,eAAlB,IAClBA,eAAe,CAACpR,MADE,GAElB,CAACoR,eAAD,CAFJ;AAIA,eAAO,KAAKC,YAAL,CACLjW,SADK,EAELuW,WAFK,EAGLC,eAHK,EAILF,YAJK,CAAP;AAMD,OAdM,MAcA;AACL,YAAIG,oBAAoB,GAAGP,SAAS,CAACQ,KAAV,EAA3B;;AADK,oCAE6B,KAAKC,0BAAL,CAChCF,oBADgC,CAF7B;AAAA;AAAA,YAEAH,aAFA;AAAA,YAEcC,YAFd;;AAML,YAAIK,YAAY,GAAGL,YAAW,CAC3Blb,MADgB,CACT,UAAAwb,QAAQ,EAAI;AAClB,iBAAO,CAACV,YAAY,CACjBlZ,GADK,CACD,UAAA8L,CAAC;AAAA,mBAAIA,CAAC,CAACjK,QAAF,EAAJ;AAAA,WADA,EAEL8T,QAFK,CAEIiE,QAAQ,CAAC/X,QAAT,EAFJ,CAAR;AAGD,SALgB,EAMhBtD,MANgB,CAMT0a,SANS,CAAnB;;AAOA,YAAIM,gBAAe,GAAG,CAAC,KAAKnD,YAAL,CAAkBoD,oBAAlB,IACnBA,oBAAoB,CAAC7R,MADF,GAEnB,CAAC6R,oBAAD,CAFkB,EAGpBjb,MAHoB,CAGb2a,YAHa,CAAtB;;AAIA,YAAIW,OAAO,GAAG,KAAKC,aAAL,CAAmBhM,IAAnB,EAAyBuL,aAAzB,CAAd;AAEA,eAAO,KAAKL,YAAL,CACLjW,SADK,EAEL4W,YAFK,EAGLJ,gBAHK,EAILM,OAJK,CAAP;AAMD;AACF;;;8CAEyBD,UAAU;AAAA,kCACN,KAAKG,kBAAL,CAAwBH,QAAxB,CADM;AAAA;AAAA,UAC7BI,IAD6B;AAAA,UACvBC,aADuB;;AAElC,UAAIC,YAAJ;;AAEA,UAAI,KAAKtB,IAAT,EAAe;AACbrU,QAAAA,MAAM,CACJ,EAAEqV,QAAQ,YAAYtN,qBAAtB,CADI,+IAAN;AAKA,YAAI+C,UAAU,GAAG,KAAKC,aAAL,CAAmBsK,QAAQ,CAACzU,SAA5B,CAAjB;AACA,YAAIgV,OAAO,GAAG9K,UAAU,CAAC+K,cAAX,CAA0BR,QAA1B,CAAd;AACAM,QAAAA,YAAY,uBAAMC,OAAN,EAAgBH,IAAhB,CAAZ;AACD,OATD,MASO;AACLE,QAAAA,YAAY,GAAGF,IAAf;AACD;;AAED,aAAO,CAACE,YAAD,EAAeD,aAAf,CAAP;AACD;;;+CAE0BL,UAAU;AACnC,UAAIM,YAAJ,EAAkBD,aAAlB;;AAEA,UAAIL,QAAQ,YAAYtN,qBAAxB,EAA+C;AAC7C4N,QAAAA,YAAY,GAAG,EAAf;AACAD,QAAAA,aAAa,GAAGL,QAAQ,CAACjS,MAAzB;AACD,OAHD,MAGO;AACL,YAAI0H,UAAU,GAAG,KAAKC,aAAL,CAAmBsK,QAAQ,CAACzU,SAA5B,CAAjB;;AADK,oCAEmBkK,UAAU,CAAC0K,kBAAX,CAA8BH,QAA9B,CAFnB;AAAA;AAAA,YAEAI,IAFA;AAAA,YAEMK,SAFN;;;AAKL,YAAIF,OAAO,GAAG9K,UAAU,CAACiL,kBAAX,CAA8BV,QAAQ,CAACzU,SAAvC,CAAd;AACA+U,QAAAA,YAAY,GAAGzc,KAAK,CAACsC,OAAN,CAAcia,IAAd,wBACRG,OADQ,EACEH,IADF,wBAERG,OAFQ,EAEE,CAACH,IAAD,CAFF,CAAf;AAGAC,QAAAA,aAAa,GAAGI,SAAhB;AACD;;AAED,aAAO,CAACH,YAAD,EAAeD,aAAf,CAAP;AACD;;;uCAGCL,UAIA;AAAA;;AAAA,UAHAW,iBAGA,uEAHoB,KAGpB;AAAA,UAFArB,YAEA,uEAFe,EAEf;AAAA,UADAsB,gBACA,uEADmB,KACnB;AACA,UAAIR,IAAJ,EAAU3K,UAAV;;AAEA,UAAI,CAACmL,gBAAL,EAAuB;AACrBnL,QAAAA,UAAU,GAAG,IAAb,CADqB;AAEtB,OALD;AAQA;;;AACA,UAAImL,gBAAgB,IAAIZ,QAAQ,CAACzU,SAAjC,EAA4C;AAC1CkK,QAAAA,UAAU,GAAG,KAAKC,aAAL,CAAmBsK,QAAQ,CAACzU,SAA5B,CAAb;AACD;;AAED,UAAI,KAAKsV,OAAL,CAAab,QAAb,CAAJ,EAA4B;AAC1BI,QAAAA,IAAI,GAAG3K,UAAU,CAACqL,aAAX,CACLd,QADK,EAELW,iBAFK,EAGLrB,YAHK,CAAP;AAKD,OAND,MAMO;AACLc,QAAAA,IAAI,GAAGJ,QAAQ,CAACjS,MAAT,CAAgB3H,GAAhB,CAAoB,UAAA8L,CAAC,EAAI;AAC9B,cAAI6O,eAAe,GAAGtL,UAAtB;;AAEA,cAAI,CAACsL,eAAL,EAAsB;AACpB;AACAA,YAAAA,eAAe,GAAG,KAAI,CAACrL,aAAL,CAAmBxD,CAAC,CAAC3G,SAArB,CAAlB;AACD;;AAED,iBAAOwV,eAAe,CAACD,aAAhB,CACL5O,CADK,EAELyO,iBAFK,EAGLrB,YAHK,CAAP;AAKD,SAbM,CAAP;AAcD;;AAED,UAAI,KAAKL,KAAT,EAAgB;AACd,eAAO,CAACmB,IAAD,EAAO,EAAP,CAAP;AACD,OAFD,MAEO;AACL,YAAIC,aAAa,GAAGW,MAAM,CACxB/N,OAAO,CACLxP,OAAO,CACLgS,UAAU,CAACwL,kBAAX,GAAgC7a,GAAhC,CAAoC,UAAAN,GAAG,EAAI;AACzC,cAAI,KAAI,CAAC0W,YAAL,CAAkBwD,QAAlB,CAAJ,EAAiC;AAC/B,mBAAOA,QAAQ,CAACjS,MAAT,CAAgB3H,GAAhB,CAAoB,UAAA8L,CAAC;AAAA,qBAAIA,CAAC,CAACpM,GAAD,CAAL;AAAA,aAArB,CAAP;AACD,WAFD,MAEO;AACL,mBAAOka,QAAQ,CAACla,GAAD,CAAf;AACD;AACF,SAND,CADK,CADF,CADiB,EAYxB,UAAAoM,CAAC;AAAA,iBAAIA,CAAC,CAACjK,QAAF,EAAJ;AAAA,SAZuB,CAA1B;AAcA,eAAO,CAACmY,IAAD,EAAOC,aAAP,CAAP;AACD;AACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA8BcnM,MAAMuL,cAAc;AAChC,UAAIQ,OAAJ;;AADgC,yBAER7a,MAAM,CAACI,IAAP,CAAYia,YAAZ,CAFQ;AAAA;AAAA,UAE3ByB,eAF2B;;AAIhC,UAAIhN,IAAI,CAACgN,eAAD,CAAR,EAA2B;AACzBjB,QAAAA,OAAO,GAAG/L,IAAV;AACA+L,QAAAA,OAAO,CAACiB,eAAD,CAAP,GAA2BhN,IAAI,CAACgN,eAAD,CAAJ,CAAsBvc,MAAtB,CACzB8a,YAAY,CAACyB,eAAD,CADa,CAA3B;AAGD,OALD,MAKO;AACLjB,QAAAA,OAAO,GAAG7a,MAAM,CAACC,MAAP,CAAc6O,IAAd,EAAoBuL,YAApB,CAAV;AACD;;AAED,aAAOQ,OAAP;AACD;;;mCAEcD,UAAU;AAAA,UACjBzU,SADiB,GACHyU,QADG,CACjBzU,SADiB;AAEvB,aAAO,KAAKsV,OAAL,CAAab,QAAb,IACH,KAAKmB,WAAL,CAAiB5V,SAAjB,CADG,GAEH,KAAK6V,gBAAL,CAAsB7V,SAAtB,CAFJ;AAGD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAwCYA,WAAW;AACrB,aAAO9B,QAAQ,CAAC8B,SAAD,CAAf;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAgDiBA,WAAW;AAC1B,aAAO,KAAKmG,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoC,KAAK2J,WAAL,CAAiB5V,SAAjB,CAApC,CAAP;AACD;;;kCAEa4B,OAAOwT,mBAAsC;AAAA;;AAAA,UAAnBrB,YAAmB,uEAAJ,EAAI;;AACzD,UAAIha,KAAK,GAAG,KAAK+b,cAAL,CAAoBlU,KAApB,CAAZ;;AAEA,UAAIwT,iBAAJ,EAAuB;AACrBxT,QAAAA,KAAK,CAAC0M,GAAN,CAAUpU,OAAV,CAAkB,UAAAkI,EAAE,EAAI;AACtB,iBAAOrI,KAAK,CAACqI,EAAD,CAAZ;AACD,SAFD;AAGD;;AAED,UAAI,KAAKsR,KAAT,EAAgB;AACd,YAAIU,eAAe,GAAGva,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBia,YAAlB,CAAtB;AACAK,QAAAA,eAAe,CAACxS,KAAK,CAAC5B,SAAP,CAAf,GAAmCoU,eAAe,CAACxS,KAAK,CAAC5B,SAAP,CAAf,IAAoC,EAAvE;AACAoU,QAAAA,eAAe,CAACxS,KAAK,CAAC5B,SAAP,CAAf,CAAiC4B,KAAK,CAAC5E,EAAvC,IAA6C,IAA7C;AAEA,aAAK0Y,kBAAL,GAA0Bxb,OAA1B,CAAkC,UAAAK,GAAG,EAAI;AACvC,cAAIwb,kBAAkB,GAAGnU,KAAK,CAACrH,GAAD,CAA9B;;AACA,cACEwb,kBAAkB,IAClB,CAAC7Z,GAAG,CACFkY,eADE,YAEC2B,kBAAkB,CAAC/V,SAFpB,cAEiC+V,kBAAkB,CAAC/Y,EAFpD,EAFN,EAME;AAAA,wCAC+B,MAAI,CAAC4X,kBAAL,CAC7BmB,kBAD6B,EAE7B,IAF6B,EAG7B3B,eAH6B,EAI7B,IAJ6B,CAD/B;AAAA;AAAA,gBACK4B,sBADL;;AAOA,gBAAIC,YAAY,GAAG,MAAI,CAACC,0BAAL,CAAgC3b,GAAhC,CAAnB;;AACAR,YAAAA,KAAK,CAACkc,YAAD,CAAL,GAAsBD,sBAAtB;;AAEA,gBAAI,MAAI,CAACV,OAAL,CAAaS,kBAAb,CAAJ,EAAsC;AACpC,kBAAI3T,EAAE,aAAMlE,QAAQ,CAAC3D,GAAD,CAAd,OAAN;AACA,qBAAOR,KAAK,CAACqI,EAAD,CAAZ;AACD;AACF;AACF,SAvBD;AAyBA,eAAOrI,KAAP;AACD,OA/BD,MA+BO;AACL,eAAO,KAAKoc,uBAAL,CAA6BvU,KAA7B,EAAoC7H,KAApC,CAAP;AACD;AACF;AAED;;;;;;;;;mCAMe6H,OAAO;AACpB,UAAI7H,KAAK,GAAG,EAAZ;;AAEA,UAAI,KAAKA,KAAT,EAAgB;AACdA,QAAAA,KAAK,GAAG,KAAKA,KAAL,CAAWwL,MAAX,CAAkB,UAAC6Q,IAAD,EAAOjc,IAAP,EAAgB;AACxCic,UAAAA,IAAI,CAACjc,IAAD,CAAJ,GAAayH,KAAK,CAACzH,IAAD,CAAlB;AACA,iBAAOic,IAAP;AACD,SAHO,EAGL,EAHK,CAAR;AAID,OALD,MAKO;AACLrc,QAAAA,KAAK,GAAGF,MAAM,CAACC,MAAP,CAAcC,KAAd,EAAqB6H,KAAK,CAAC7H,KAA3B,CAAR;AACD,OAVmB;;;AAapB6H,MAAAA,KAAK,CAAC0M,GAAN,CAAUpU,OAAV,CAAkB,UAAAK,GAAG;AAAA,eAAI,OAAOR,KAAK,CAACQ,GAAD,CAAhB;AAAA,OAArB;AAEA,aAAO,KAAK8b,oBAAL,CAA0Btc,KAA1B,CAAP;AACD;AAED;;;;;;;;;;4CAOwB6H,OAAO7H,OAAO;AAAA;;AACpC,UAAIuc,OAAO,GAAGzc,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBC,KAAlB,CAAd;;AAEA,UAAI,KAAK4Z,YAAL,KAAsB,QAA1B,EAAoC;AAClC/R,QAAAA,KAAK,CAACV,eAAN,CAAsBhH,OAAtB,CAA8B,UAAAK,GAAG,EAAI;AACnC,cAAIka,QAAQ,GAAG7S,KAAK,CAACrH,GAAD,CAApB;AACA,cAAI2C,WAAW,GAAG0E,KAAK,CAACyH,cAAN,CAAqB9O,GAArB,CAAlB;;AAEA,cAAI,MAAI,CAAC0W,YAAL,CAAkBwD,QAAlB,CAAJ,EAAiC;AAC/B,gBAAIwB,YAAY,GAAG,MAAI,CAACM,qBAAL,CAA2Bhc,GAA3B,CAAnB;;AACA+b,YAAAA,OAAO,CAACL,YAAD,CAAP,GACErU,KAAK,WAAI,MAAI,CAACuE,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC9L,GAAtC,CAAJ,SADP;AAED,WAJD,MAIO,IAAI,MAAI,CAAC+a,OAAL,CAAab,QAAb,KAA0BvX,WAAW,CAACqE,aAA1C,EAAyD;AAC9D,gBAAIiV,gBAAgB,GAAG,MAAI,CAACC,+BAAL,CAAqClc,GAArC,CAAvB;;AACA,gBAAImc,cAAc,GAAG,MAAI,CAACC,6BAAL,CAAmCpc,GAAnC,CAArB;;AAEA+b,YAAAA,OAAO,CAACE,gBAAD,CAAP,GAA4B5U,KAAK,WAAIrH,GAAJ,QAAL,CAAkBiH,IAA9C;AACA8U,YAAAA,OAAO,CAACI,cAAD,CAAP,GAA0B9U,KAAK,WAAIrH,GAAJ,QAAL,CAAkByC,EAA5C;AACD,WANM,MAMA,IAAIyX,QAAJ,EAAc;AACnB,gBAAIwB,aAAY,GAAG,MAAI,CAACW,gBAAL,CAAsBrc,GAAtB,CAAnB;;AACA+b,YAAAA,OAAO,CAACL,aAAD,CAAP,GAAwBrU,KAAK,WAAIrH,GAAJ,QAA7B;AACD;AACF,SAlBD;AAmBD,OApBD,MAoBO,IAAI,KAAKoZ,YAAL,KAAsB,UAA1B,EAAsC;AAC3C,aAAK+B,kBAAL,GAA0Bxb,OAA1B,CAAkC,UAAAK,GAAG,EAAI;AACvC,cAAIka,QAAQ,GAAG7S,KAAK,CAACrH,GAAD,CAApB;AACA,cAAI2C,WAAW,GAAG0E,KAAK,CAACyH,cAAN,CAAqB9O,GAArB,CAAlB;;AAEA,cAAI,MAAI,CAAC0W,YAAL,CAAkBwD,QAAlB,CAAJ,EAAiC;AAC/B,gBAAIwB,YAAY,GAAG,MAAI,CAACM,qBAAL,CAA2Bhc,GAA3B,CAAnB;;AAEA+b,YAAAA,OAAO,CAACL,YAAD,CAAP,GACErU,KAAK,WAAI,MAAI,CAACuE,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC9L,GAAtC,CAAJ,SADP;AAED,WALD,MAKO,IAAI,MAAI,CAAC+a,OAAL,CAAab,QAAb,KAA0BvX,WAAW,CAACqE,aAA1C,EAAyD;AAC9D,gBAAIiV,gBAAgB,GAAG,MAAI,CAACC,+BAAL,CAAqClc,GAArC,CAAvB;;AACA,gBAAImc,cAAc,GAAG,MAAI,CAACC,6BAAL,CAAmCpc,GAAnC,CAArB;;AAEA+b,YAAAA,OAAO,CAACE,gBAAD,CAAP,GAA4B5U,KAAK,WAAIrH,GAAJ,QAAL,CAAkBiH,IAA9C;AACA8U,YAAAA,OAAO,CAACI,cAAD,CAAP,GAA0B9U,KAAK,WAAIrH,GAAJ,QAAL,CAAkByC,EAA5C;AACD,WANM,MAMA,IAAI,MAAI,CAACsY,OAAL,CAAab,QAAb,CAAJ,EAA4B;AACjC,gBAAIwB,cAAY,GAAG,MAAI,CAACW,gBAAL,CAAsBrc,GAAtB,CAAnB;;AAEA+b,YAAAA,OAAO,CAACL,cAAD,CAAP,GAAwBrU,KAAK,WAAIrH,GAAJ,QAA7B;AACD;AACF,SApBD;AAqBD;;AAED,aAAO+b,OAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA0CgBnc,MAAM;AACpB,aAAOA,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAqCmB6F,WAAW;AAC5B,aAAO9B,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCjM,SAApC,CAAD,CAAf;AACD;AAED;;;;;;;;;+CAO2B6W,eAAe;AACxC,aAAO3Y,QAAQ,CAAC2Y,aAAD,CAAf;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CA4CsB5N,kBAAkB;AACtC,uBAAU,KAAK9C,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CACRnI,QAAQ,CAAC+K,gBAAD,CADA,CAAV;AAGD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA2CiBA,kBAAkB;AACjC,uBAAU/K,QAAQ,CAAC+K,gBAAD,CAAlB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA+B8BA,kBAAkB;AAC9C,uBAAU/K,QAAQ,CAAC+K,gBAAD,CAAlB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA+BgCA,kBAAkB;AAChD,uBAAU/K,QAAQ,CAAC+K,gBAAD,CAAlB;AACD;AAED;;;;;;;;;;4BAOQtP,QAAQ;AACd,aAAOA,MAAM,YAAY0U,KAAzB;AACD;AAED;;;;;;;;;;iCAOa1U,QAAQ;AACnB,aACEA,MAAM,YAAY4M,UAAlB,IAAgC5M,MAAM,YAAYwN,qBADpD;AAGD;AAED;;;;;;;;;;wCAOoBxN,QAAQ;AAC1B,aAAO,KAAK2b,OAAL,CAAa3b,MAAb,KAAwB,KAAKsX,YAAL,CAAkBtX,MAAlB,CAA/B;AACD;AAED;;;;;;;;;kCAMc6H,MAAM;AAClB,aAAO,KAAK+R,QAAL,CAAcpJ,aAAd,CAA4B3I,IAA5B,CAAP;AACD;;;yCAEoB;AACnB,aAAOzG,UAAU,CAAC,KAAKyY,OAAN,CAAV,GAA2B,KAAKA,OAAL,CAAa,KAAKrL,OAAlB,CAA3B,GAAwD,KAAKqL,OAApE;AACD;AAED;;;;;;;;;;AAWA;;;;;;yCAMqBzZ,OAAO;AAC1B,UAAI+c,cAAc,GAAG,EAArB;;AAEA,WAAK,IAAIvc,GAAT,IAAgBR,KAAhB,EAAuB;AACrB,YAAIkc,YAAY,GAAG,KAAKc,eAAL,CAAqBxc,GAArB,CAAnB;AACAuc,QAAAA,cAAc,CAACb,YAAD,CAAd,GAA+Blc,KAAK,CAACQ,GAAD,CAApC;AACD;;AAED,aAAOuc,cAAP;AACD;;;;AAEe;AAAe;;;wBArBlB;AACX,aAAO,KAAKvD,QAAL,CAAcpT,MAArB;AACD;;;;;;;AAuBHmT,UAAU,CAACrX,SAAX,CAAqBuX,OAArB,GAA+B,EAA/B;AACAF,UAAU,CAACrX,SAAX,CAAqBwX,IAArB,GAA4B,IAA5B;AACAH,UAAU,CAACrX,SAAX,CAAqByX,KAArB,GAA6B,KAA7B;AACAJ,UAAU,CAACrX,SAAX,CAAqB0X,YAArB,GAAoC,UAApC;;AAEAL,UAAU,CAACtY,MAAX,GAAoBA,MAApB;;AC1nCA;;;;;;;;IAOMgc;;;;;AACJ,+BAAc;AAAA;;AAAA;;AACZ,4FAASlR,SAAT;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EA,UAAKmR,wBAAL,GAAgC,MAAKA,wBAAL,IAAiCrZ,SAAjE,CA7EY;;AAAA;AA8Eb;;;;;gCAGWoC,WAAW;AACrB,aAAOrB,SAAS,CAACqB,SAAD,CAAhB;AACD;;;;qCAGgBA,WAAW;AAC1B,aAAOrB,SAAS,CAACqB,SAAD,CAAhB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;oCAsBgB7F,MAAM;AACpB,aAAOwE,SAAS,CAACxE,IAAD,CAAhB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA2BmBI,KAAK;AACtB,aAAOoE,SAAS,CAACpE,GAAD,CAAhB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;4BAuBQ;;;8CAEkBka,UAAU;AAClC,WAAKyC,6BAAL,CAAmCzC,QAAnC;;AAEA,UAAIP,YAAY,GAAG,KAAKU,kBAAL,CAAwBH,QAAxB,CAAnB;AACA,UAAIM,YAAY,GAAG;AAAEpX,QAAAA,IAAI,EAAEuW;AAAR,OAAnB;AACA,UAAIY,aAAa,GAAG,KAAKqC,2BAAL,CAAiC1C,QAAjC,CAApB;AAEA,aAAO,CAACM,YAAD,EAAeD,aAAf,CAAP;AACD;;;+CAE0BL,UAAU;AACnC,UAAIvK,UAAU,GAAG,KAAKC,aAAL,CAAmBsK,QAAQ,CAACzU,SAA5B,CAAjB;AACA,UAAI6U,IAAI,GAAG3K,UAAU,CAAC0K,kBAAX,CAA8BH,QAA9B,CAAX;AACA,UAAIM,YAAY,GAAG;AAAEqC,QAAAA,QAAQ,EAAE,KAAK9B,OAAL,CAAab,QAAb,IAAyB,CAACI,IAAD,CAAzB,GAAkCA;AAA9C,OAAnB;AACA,UAAIC,aAAa,GAAG,EAApB;;AAEA,UAAI,CAAC,KAAKuC,qBAAL,EAAL,EAAmC;AACjCvC,QAAAA,aAAa,GAAG,KAAKqC,2BAAL,CAAiC1C,QAAjC,CAAhB;AACD;;AAED,aAAO,CAACM,YAAD,EAAeD,aAAf,CAAP;AACD;;;uCAEkBL,UAAU;AAAA;;AAC3B,UAAII,IAAJ;;AAEA,UAAI,KAAKS,OAAL,CAAab,QAAb,CAAJ,EAA4B;AAC1BI,QAAAA,IAAI,GAAG,KAAKyC,yBAAL,CAA+B7C,QAA/B,CAAP;AACD,OAFD,MAEO;AACLI,QAAAA,IAAI,GAAGJ,QAAQ,CAACjS,MAAT,CAAgB3H,GAAhB,CAAoB,UAAA8L,CAAC;AAAA,iBAAI,MAAI,CAAC2Q,yBAAL,CAA+B3Q,CAA/B,CAAJ;AAAA,SAArB,CAAP;AACD;;AAED,aAAOkO,IAAP;AACD;AAED;;;;;;gDAG4BJ,UAAU;AACpC,UAAI8C,iBAAJ;;AAEA,UAAI,KAAKF,qBAAL,EAAJ,EAAkC;AAChCE,QAAAA,iBAAiB,GAAG,KAAKpP,OAAL,CAAagE,WAAb,CAAyBqH,OAAzB,CAAiChV,KAAjC,CAAuC,GAAvC,CAApB;AACD,OAFD,MAEO;AACL,YAAI0L,UAAU,GAAG,KAAKC,aAAL,CAAmBsK,QAAQ,CAACzU,SAA5B,CAAjB;AACAuX,QAAAA,iBAAiB,GAAGrN,UAAU,CAACwL,kBAAX,EAApB;AACD;;AAED,aAAO,KAAK8B,mCAAL,CACL/C,QADK,EAEL8C,iBAFK,CAAP;AAID;;;wDAEmC9C,UAAU8C,mBAAmB;AAAA;;AAC/D,UAAI/G,QAAQ,GAAG,EAAf;AAEA+G,MAAAA,iBAAiB,CAACrd,OAAlB,CAA0B,UAAA8N,IAAI,EAAI;AAChC,YAAIyP,iBAAiB,GAAGzP,IAAI,CAACxJ,KAAL,CAAW,GAAX,CAAxB;;AACA,YAAI2V,WAAW,GAAG,MAAI,CAACuD,6BAAL,OAAA,MAAI,GACpBjD,QADoB,4BAEjBgD,iBAFiB,GAAtB;;AAIAjH,QAAAA,QAAQ,CAACjV,IAAT,CAAc4Y,WAAd;AACD,OAPD;AASA,aAAOsB,MAAM,CAAC/N,OAAO,CAACxP,OAAO,CAACsY,QAAD,CAAR,CAAR,EAA6B,UAAA7J,CAAC;AAAA,eAAIA,CAAC,CAACjK,QAAF,EAAJ;AAAA,OAA9B,CAAb;AACD;;;kDAE6B+X,UAAoB;AAAA;;AAAA,wCAAPkD,KAAO;AAAPA,QAAAA,KAAO;AAAA;;AAChD,UAAIC,sBAAsB,GAAG1Z,QAAQ,CAACyZ,KAAK,CAACrD,KAAN,EAAD,CAArC;AACA,UAAI9D,QAAQ,GAAG,EAAf;AACA,UAAIqH,WAAW,GAAG,EAAlB;;AAEA,UAAI,KAAKvC,OAAL,CAAab,QAAb,CAAJ,EAA4B;AAC1B,YAAIvL,YAAY,GAAGuL,QAAQ,CAACmD,sBAAD,CAA3B;;AAEA,YAAI,KAAKtC,OAAL,CAAapM,YAAb,CAAJ,EAAgC;AAC9B2O,UAAAA,WAAW,GAAG,CAAC3O,YAAD,CAAd;AACD,SAFD,MAEO,IAAI,KAAK+H,YAAL,CAAkB/H,YAAlB,CAAJ,EAAqC;AAC1C2O,UAAAA,WAAW,GAAG3O,YAAY,CAAC1G,MAA3B;AACD;AACF,OARD,MAQO;AACLiS,QAAAA,QAAQ,CAACjS,MAAT,CAAgBtI,OAAhB,CAAwB,UAAA0H,KAAK,EAAI;AAC/B,cAAIsH,YAAY,GAAGtH,KAAK,CAACgW,sBAAD,CAAxB;;AAEA,cAAI,MAAI,CAACtC,OAAL,CAAapM,YAAb,CAAJ,EAAgC;AAC9B2O,YAAAA,WAAW,CAACtc,IAAZ,CAAiB2N,YAAjB;AACD,WAFD,MAEO,IAAI,MAAI,CAAC+H,YAAL,CAAkB/H,YAAlB,CAAJ,EAAqC;AAC1C2O,YAAAA,WAAW,GAAGA,WAAW,CAACze,MAAZ,CAAmB8P,YAAY,CAAC1G,MAAhC,CAAd;AACD;AACF,SARD;AASD;;AAEDgO,MAAAA,QAAQ,GAAGA,QAAQ,CAACpX,MAAT,CAAgBye,WAAhB,CAAX;;AAEA,UAAIF,KAAK,CAACvf,MAAV,EAAkB;AAChByf,QAAAA,WAAW,CAAC3d,OAAZ,CAAoB,UAAA0H,KAAK,EAAI;AAC3B4O,UAAAA,QAAQ,GAAGA,QAAQ,CAACpX,MAAT,CACT,MAAI,CAACse,6BAAL,OAAA,MAAI,GAA+B9V,KAA/B,SAAyC+V,KAAzC,EADK,CAAX;AAGD,SAJD;AAKD;;AAED,aAAOnH,QAAP;AACD;;;8CAEyB5O,OAAO;AAC/B,UAAI7H,KAAK,GAAG,KAAK+b,cAAL,CAAoBlU,KAApB,EAA2B,IAA3B,CAAZ;;AACA,aAAO7H,KAAK,CAACiD,EAAb;AAEA,UAAI6X,IAAI,GAAG;AACTrT,QAAAA,IAAI,EAAE,KAAKsW,eAAL,CAAqBlW,KAArB,CADG;AAET5E,QAAAA,EAAE,EAAE4E,KAAK,CAAC5E,EAFD;AAGT8L,QAAAA,UAAU,EAAE/O;AAHH,OAAX;AAMA,aAAO,KAAKge,8CAAL,CAAoDlD,IAApD,EAA0DjT,KAA1D,CAAP;AACD;;;mEAE8CiT,MAAMjT,OAAO;AAAA;;AAC1D,UAAMmH,aAAa,GAAG,EAAtB;AAEAnH,MAAAA,KAAK,CAACV,eAAN,CAAsBhH,OAAtB,CAA8B,UAAAK,GAAG,EAAI;AACnC,YAAI2O,YAAY,GAAGtH,KAAK,CAACrH,GAAD,CAAxB;;AACA,YAAIyd,eAAe,GAAG,MAAI,CAAC7C,kBAAL,CAAwB5a,GAAxB,CAAtB;;AACA,YAAI0d,gBAAgB,GAAG,EAAvB;;AAEA,YAAI,MAAI,CAACC,uBAAL,CAA6BtW,KAA7B,EAAoCrH,GAApC,CAAJ,EAA8C;AAC5C,cAAI2P,UAAU,GAAG,MAAI,CAACC,aAAL,CAAmBvI,KAAK,CAAC5B,SAAzB,CAAjB;;AACA,cAAImY,KAAK,GAAGjO,UAAU,CAACiO,KAAX,CAAiBvW,KAAjB,CAAZ;AACAqW,UAAAA,gBAAgB,CAACE,KAAjB,GAAyBA,KAAK,CAAC5d,GAAD,CAA9B;AACD;;AAED,YACE,MAAI,CAAC0c,wBAAL,IACA,MAAI,CAACmB,wBAAL,CAA8B7d,GAA9B,EAAmCqH,KAAnC,CADA,IAEA,MAAI,CAACyW,+BAAL,CAAqC9d,GAArC,EAA0CqH,KAA1C,CAHF,EAIE;AACA,cAAIjE,IAAI,GAAG,IAAX;;AACA,cAAI,MAAI,CAAC2X,OAAL,CAAapM,YAAb,CAAJ,EAAgC;AAC9BvL,YAAAA,IAAI,GAAG;AACL6D,cAAAA,IAAI,EAAE,MAAI,CAACsW,eAAL,CAAqB5O,YAArB,CADD;AAELlM,cAAAA,EAAE,EAAEkM,YAAY,CAAClM;AAFZ,aAAP;AAID,WALD,MAKO,IAAI,MAAI,CAACiU,YAAL,CAAkB/H,YAAlB,CAAJ,EAAqC;AAC1CvL,YAAAA,IAAI,GAAGuL,YAAY,CAAC1G,MAAb,CAAoB3H,GAApB,CAAwB,UAAA+G,KAAK,EAAI;AACtC,qBAAO;AACLJ,gBAAAA,IAAI,EAAE,MAAI,CAACsW,eAAL,CAAqBlW,KAArB,CADD;AAEL5E,gBAAAA,EAAE,EAAE4E,KAAK,CAAC5E;AAFL,eAAP;AAID,aALM,CAAP;AAMD;;AACDib,UAAAA,gBAAgB,CAACta,IAAjB,GAAwBA,IAAxB;AACD;;AAED,YAAI,CAACqW,OAAO,CAACiE,gBAAD,CAAZ,EAAgC;AAC9BlP,UAAAA,aAAa,CAACiP,eAAD,CAAb,GAAiCC,gBAAjC;AACD;AACF,OApCD;;AAsCA,UAAI,CAACjE,OAAO,CAACjL,aAAD,CAAZ,EAA6B;AAC3B8L,QAAAA,IAAI,CAAC9L,aAAL,GAAqBA,aAArB;AACD;;AAED,aAAO8L,IAAP;AACD;;;4CAEuBjT,OAAOoW,iBAAiB;AAC9C,UAAI9N,UAAU,GAAG,KAAKC,aAAL,CAAmBvI,KAAK,CAAC5B,SAAzB,CAAjB;AACA,UAAImY,KAAK,GAAGjO,UAAU,CAACiO,KAAX,IAAoBjO,UAAU,CAACiO,KAAX,CAAiBvW,KAAjB,CAAhC;AAEA,aAAOuW,KAAK,IAAIA,KAAK,CAACH,eAAD,CAAL,IAA0B,IAA1C;AACD;AAED;;;;;;;oDAIgCA,iBAAiBpW,OAAO;AACtD,UAAI,KAAKyV,qBAAL,EAAJ,EAAkC;AAChC,YAAIiB,KAAK,GAAG,KAAKnQ,OAAL,CAAaoQ,cAAzB;;AACA,YAAIC,QAAQ,GAAG,KAAKC,iBAAL,CAAuB7W,KAAvB,CAAf,CAFgC;;;AAKhC,YAAI8W,aAAJ,CALgC;;AAQhC,YAAIJ,KAAK,CAAC3a,IAAN,CAAW6a,QAAX,CAAJ,EAA0B;AACxBE,UAAAA,aAAa,GAAGJ,KAAK,CAAC3a,IAAN,CAAW6a,QAAX,CAAhB,CADwB;AAIzB,SAJD,MAIO,IACLF,KAAK,CAAClB,QAAN,CAAe,KAAKjR,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCrK,KAAK,CAAC5B,SAA1C,CAAf,CADK,EAEL;AACA0Y,UAAAA,aAAa,GACXJ,KAAK,CAAClB,QAAN,CAAe,KAAKjR,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCrK,KAAK,CAAC5B,SAA1C,CAAf,EACEwY,QADF,CADF;AAID,SAnB+B;;;AAsBhC,eACEE,aAAa,IACbA,aAAa,CAAC3P,aADd,IAEAlP,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CACEqe,aAAa,CAAC3P,aADhB,EAEEpK,SAAS,CAACqZ,eAAD,CAFX,CAHF;AAQD,OA9BD,MA8BO;AACL,YAAIT,iBAAiB,GAAG,KAAK7B,kBAAL,EAAxB;AAEA,eAAO6B,iBAAiB,CAAC/G,QAAlB,CAA2BwH,eAA3B,CAAP;AACD;AACF;AAED;;;;;;;;;kDAO8BpE,iBAA2C;AAAA;AACvE,UAAI0E,KAAK,GAAG;AACV3a,QAAAA,IAAI,EAAE;AADI,OAAZ;;AAIA,UAAI,KAAK2X,OAAL,CAAa1B,eAAb,CAAJ,EAAmC;AACjC,YAAI+E,kBAAkB,GAAG,KAAKF,iBAAL,CAAuB7E,eAAvB,CAAzB;;AACA0E,QAAAA,KAAK,CAAC3a,IAAN,CAAWgb,kBAAX,IAAiC,EAAjC;;AAEA,aAAKC,wCAAL,CAA8CN,KAA9C,EAAqD1E,eAArD;AACD,OALD,MAKO,IAAI,KAAK3C,YAAL,CAAkB2C,eAAlB,CAAJ,EAAwC;AAC7CA,QAAAA,eAAe,CAACpR,MAAhB,CAAuBtI,OAAvB,CAA+B,UAAA0H,KAAK,EAAI;AACtC,cAAI+W,kBAAkB,GAAG,MAAI,CAACF,iBAAL,CAAuB7W,KAAvB,CAAzB;;AACA0W,UAAAA,KAAK,CAAC3a,IAAN,CAAWgb,kBAAX,IAAiC,EAAjC;;AAEA,UAAA,MAAI,CAACC,wCAAL,CAA8CN,KAA9C,EAAqD1W,KAArD;AACD,SALD;AAMD,OAjBsE;AAoBvE;;;AACA,WAAKuG,OAAL,CAAaoQ,cAAb,GAA8BD,KAA9B;AACD;;;6DAEwCA,OAAO1W,OAAO;AAAA;;AACrD,UAAI,KAAKyV,qBAAL,EAAJ,EAAkC;AAChC,YAAImB,QAAQ,GAAG,KAAKC,iBAAL,CAAuB7W,KAAvB,CAAf;;AACA,YAAIiX,kBAAkB,GAAG,KAAKC,qBAAL,EAAzB;AAEAD,QAAAA,kBAAkB,CAACra,KAAnB,CAAyB,GAAzB,EAA8BtE,OAA9B,CAAsC,UAAA6e,YAAY,EAAI;AACpD;AACAT,UAAAA,KAAK,CAAC3a,IAAN,CAAW6a,QAAX,EAAqBzP,aAArB,GACEuP,KAAK,CAAC3a,IAAN,CAAW6a,QAAX,EAAqBzP,aAArB,IAAsC,EADxC;AAGA,cAAIiQ,gBAAgB,GAAGD,YAAY,CAACva,KAAb,CAAmB,GAAnB,EAAwB3D,GAAxB,CAA4B8D,SAA5B,CAAvB;AACA,cAAIqZ,eAAe,GAAGgB,gBAAgB,CAAC,CAAD,CAAtC;AACA,cAAIC,oBAAoB,GAAGjB,eAA3B;AACA,cAAIkB,yBAAyB,GAAGhb,QAAQ,CAAC8Z,eAAD,CAAxC;AACA,cAAImB,cAAc,GAAGvX,KAAK,CAACV,eAAN,CAAsBkN,GAAtB,CACnB8K,yBADmB,CAArB;AAIA9Z,UAAAA,MAAM,CACJ+Z,cADI,mCAEqBnB,eAFrB,qBAE8CpW,KAF9C,yCAEiFsX,yBAFjF,iCAAN;AAKA,cAAIhQ,YAAY,GAAGtH,KAAK,CAACsX,yBAAD,CAAxB;AACA,cAAIE,gBAAJ;;AAEA,cAAI,MAAI,CAAC9D,OAAL,CAAapM,YAAb,CAAJ,EAAgC;AAC9BkQ,YAAAA,gBAAgB,GAAG,MAAI,CAACX,iBAAL,CAAuBvP,YAAvB,CAAnB;AACD,WAFD,MAEO,IAAI,MAAI,CAAC+H,YAAL,CAAkB/H,YAAlB,CAAJ,EAAqC;AAC1CkQ,YAAAA,gBAAgB,GAAGlQ,YAAY,CAAC1G,MAAb,CAAoB3H,GAApB,CAAwB,MAAI,CAAC4d,iBAA7B,CAAnB;AACD,WAFM,MAEA;AACLW,YAAAA,gBAAgB,GAAG,IAAnB;AACD;;AAEDd,UAAAA,KAAK,CAAC3a,IAAN,CAAW6a,QAAX,EAAqBzP,aAArB,CACEkQ,oBADF,IAEIG,gBAFJ;;AAIA,cAAIlQ,YAAJ,EAAkB;AAChB,YAAA,MAAI,CAACmQ,oCAAL,CACEf,KADF,EAEEpP,YAFF,EAGE8P,gBAAgB,CAAC9R,KAAjB,CAAuB,CAAvB,CAHF;AAKD;AACF,SAxCD;AAyCD;AACF;;;yDAEoCoR,OAAO7D,UAAUgD,mBAAmB;AAAA;;AACvEa,MAAAA,KAAK,CAAClB,QAAN,GAAiBkB,KAAK,CAAClB,QAAN,IAAkB,EAAnC;AAEA,UAAI5U,MAAM,GAAG,KAAKyO,YAAL,CAAkBwD,QAAlB,IAA8BA,QAAQ,CAACjS,MAAvC,GAAgD,CAACiS,QAAD,CAA7D;AAEAjS,MAAAA,MAAM,CAACtI,OAAP,CAAe,UAAA0H,KAAK,EAAI;AACtB,YAAI0N,cAAc,GAAG,MAAI,CAACnJ,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCrK,KAAK,CAAC5B,SAA1C,CAArB;;AACAsY,QAAAA,KAAK,CAAClB,QAAN,CAAe9H,cAAf,IAAiCgJ,KAAK,CAAClB,QAAN,CAAe9H,cAAf,KAAkC,EAAnE;;AAEA,QAAA,MAAI,CAACgK,iCAAL,CAAuChB,KAAvC,EAA8C1W,KAA9C,EAAqD6V,iBAArD;AACD,OALD;AAMD;;;sDAEiCa,OAAO1W,OAAO6V,mBAAmB;AACjE,UAAInI,cAAc,GAAG,KAAKnJ,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCrK,KAAK,CAAC5B,SAA1C,CAArB;;AACA,UAAIuZ,WAAW,GAAG,KAAKd,iBAAL,CAAuB7W,KAAvB,CAAlB;;AACA0W,MAAAA,KAAK,CAAClB,QAAN,CAAe9H,cAAf,EAA+BiK,WAA/B,IACEjB,KAAK,CAAClB,QAAN,CAAe9H,cAAf,EAA+BiK,WAA/B,KAA+C,EADjD;;AAGA,UAAI9B,iBAAiB,CAACrf,MAAtB,EAA8B;AAC5B,aAAKohB,iDAAL,CACElB,KADF,EAEEhJ,cAFF,EAGEiK,WAHF,EAIE3X,KAJF,EAKE6V,iBALF;AAOD;AACF;AAED;;;;;;sEAIEa,OACAhJ,gBACAiK,aACA3X,OACA6V,mBACA;AACAa,MAAAA,KAAK,CAAClB,QAAN,CAAe9H,cAAf,EAA+BiK,WAA/B,EAA4CxQ,aAA5C,GACEuP,KAAK,CAAClB,QAAN,CAAe9H,cAAf,EAA+BiK,WAA/B,EAA4CxQ,aAA5C,IAA6D,EAD/D;AAGA,UAAIE,gBAAgB,GAAGwO,iBAAiB,CAAC,CAAD,CAAxC;AACA,UAAIvO,YAAY,GAAGtH,KAAK,CAAC1D,QAAQ,CAAC+K,gBAAD,CAAT,CAAxB;AACA,UAAImQ,gBAAJ;;AAEA,UAAI,KAAK9D,OAAL,CAAapM,YAAb,CAAJ,EAAgC;AAC9BkQ,QAAAA,gBAAgB,GAAG,KAAKX,iBAAL,CAAuBvP,YAAvB,CAAnB;AACD,OAFD,MAEO,IAAI,KAAK+H,YAAL,CAAkB/H,YAAlB,CAAJ,EAAqC;AAC1CkQ,QAAAA,gBAAgB,GAAGlQ,YAAY,CAAC1G,MAAb,CAAoB3H,GAApB,CAAwB,KAAK4d,iBAA7B,CAAnB;AACD;;AACDH,MAAAA,KAAK,CAAClB,QAAN,CAAe9H,cAAf,EAA+BiK,WAA/B,EAA4CxQ,aAA5C,CACEE,gBADF,IAEImQ,gBAFJ;;AAIA,UAAIlQ,YAAJ,EAAkB;AAChB,aAAKmQ,oCAAL,CACEf,KADF,EAEEpP,YAFF,EAGEuO,iBAAiB,CAACvQ,KAAlB,CAAwB,CAAxB,CAHF;AAKD;AACF;;;sCAEiBtF,OAAO;AACvB,uBAAUA,KAAK,CAAC5B,SAAhB,cAA6B4B,KAAK,CAAC5E,EAAnC;AACD;;;4CAEuB;AACtB,aAAOd,GAAG,CAAC,IAAD,EAAO,6BAAP,CAAV;AACD;;;4CAEuB;AACtB,aAAO,CAAC,CAAC,KAAK4c,qBAAL,EAAT;AACD;AAED;;;;;;;;;;;;;;;;;;;oCAmBgBlX,OAAO;AACrB,aAAOjD,SAAS,CAAC,KAAKwH,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCrK,KAAK,CAAC5B,SAA1C,CAAD,CAAhB;AACD;;;oCAEemI,SAAS;AACvB,UAAI/E,GAAG,GAAG+E,OAAO,CAACgE,WAAR,IAAuBhE,OAAO,CAACgE,WAAR,CAAoB,YAApB,CAAjC;;AACA,UAAI,OAAO/I,GAAP,KAAe,QAAnB,EAA6B;AAC3B,eAAOA,GAAG,CAAC5E,KAAJ,CAAU,GAAV,CAAP;AACD;;AACD,aAAO4E,GAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;6CAoByB4U,iBAAiBpW,OAAO;AAC/C,aAAO,KAAP;AACD;;;;EAxlB6B0R;;AA2lBhC0D,iBAAiB,CAAC/a,SAAlB,CAA4Bgb,wBAA5B,GAAuD,KAAvD;;AClmBA;;;;IAGqBwC;;;AACnB,8BAAYtZ,MAAZ,EAAgD;AAAA,QAA5BuZ,aAA4B,uEAAZ,EAAY;AAAA;AAAA;;AAC9C,SAAKvZ,MAAL,GAAcA,MAAd;AACA,SAAKwZ,cAAL,GAAsBD,aAAtB;AACD;;;;8BAESE,SAAS5Z,WAAW;AAC5B,aAAO,KAAKmK,aAAL,CAAmBnK,SAAnB,EAA8B0I,SAA9B,CAAwCkR,OAAxC,CAAP;AACD;;;8BAES5P,UAAU7B,SAAS;AAAA;;AAC3B,WAAKA,OAAL,GAAeA,OAAf;;AAEA,UAAI,KAAK0R,oBAAL,CAA0B7P,QAA1B,CAAJ,EAAyC;AACvC,YAAIE,UAAU,GAAG,KAAKC,aAAL,CAAmBH,QAAQ,CAAChK,SAA5B,CAAjB;AAEA,eAAOkK,UAAU,CAACG,SAAX,CAAqBL,QAArB,EAA+B7B,OAA/B,CAAP;AACD,OAJD,MAIO,IAAI7P,KAAK,CAACsC,OAAN,CAAcoP,QAAd,KAA2BA,QAAQ,CAACpD,IAAT,CAAc,KAAKkT,aAAnB,CAA/B,EAAkE;AACvE,eAAO9P,QAAQ,CAACzE,MAAT,CAAgB,UAACoD,IAAD,EAAOnD,UAAP,EAAsB;AAC3C,cAAI0E,UAAU,GAAG,KAAI,CAACC,aAAL,CAAmB3E,UAAU,CAACxF,SAA9B,CAAjB;;AAEA,cAAIkK,UAAU,CAACwJ,KAAf,EAAsB;AACpB/K,YAAAA,IAAI,CACF,KAAI,CAACxC,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCzG,UAAU,CAACxF,SAA/C,CADE,CAAJ,GAEIkK,UAAU,CAACG,SAAX,CAAqB7E,UAArB,EAAiC2C,OAAjC,CAFJ;AAGD,WAJD,MAIO;AACLQ,YAAAA,IAAI,GAAG9O,MAAM,CAACC,MAAP,CAAc6O,IAAd,EAAoBuB,UAAU,CAACG,SAAX,CAAqB7E,UAArB,EAAiC2C,OAAjC,CAApB,CAAP;AACD;;AAED,iBAAOQ,IAAP;AACD,SAZM,EAYJ,EAZI,CAAP;AAaD,OAdM,MAcA;AACL,eAAOqB,QAAP;AACD;AACF;;;kCAEaxI,MAAiC;AAAA,qFAAJ,EAAI;AAAA,+BAAzB4I,QAAyB;AAAA,UAAzBA,QAAyB,8BAAd,KAAc;;AAC7C,UAAI2P,qBAAqB,GACvBvY,IAAI,IAAI,KAAKmY,cAAb,IAA+B,KAAKA,cAAL,CAAoBzb,QAAQ,CAACsD,IAAD,CAA5B,CADjC;;AAGA,UAAI4I,QAAJ,EAAc;AACZhL,QAAAA,MAAM,CACJ,CAAC,CAAC2a,qBADE,0BAEavY,IAFb,wEAAN;AAID,OALD,MAKO;AACLuY,QAAAA,qBAAqB,GACnBA,qBAAqB,IAAI,KAAKJ,cAAL,CAAoBrT,WAA7C,IAA4DgN,UAD9D;AAGAlU,QAAAA,MAAM,CACJ,CAAC2a,qBAAD,IACEA,qBAAqB,CAAC9d,SAAtB,CAAgCyX,KADlC,IAEEqG,qBAAqB,CAAC9d,SAAtB,CAAgCwX,IAFlC,IAGE,IAAIsG,qBAAJ,cAAuCC,iBAJrC,EAKJ,iGALI,CAAN;AAOD;;AAED,aAAO,IAAID,qBAAJ,CAA0B,IAA1B,EAAgCvY,IAAhC,EAAsC,KAAK2G,OAA3C,CAAP;AACD;;;6BAEQxO,QAAQ;AACf,aAAOA,MAAM,YAAY0U,KAAzB;AACD;;;kCAEa1U,QAAQ;AACpB,aACEA,MAAM,YAAY4M,UAAlB,IAAgC5M,MAAM,YAAYwN,qBADpD;AAGD;;;yCAEoBxN,QAAQ;AAC3B,aAAO,KAAKsgB,QAAL,CAActgB,MAAd,KAAyB,KAAKmgB,aAAL,CAAmBngB,MAAnB,CAAhC;AACD;;;wCAEmBugB,mBAAmB;AACrC,UAAIC,oBAAoB,GAAG,KAAKR,cAAL,IAAuB,EAAlD;AACA,WAAKA,cAAL,GAAsB9f,MAAM,CAACC,MAAP,CACpBqgB,oBADoB,EAEpBD,iBAFoB,CAAtB;AAID;;;oCAEe/R,SAASnI,WAAW;AAClC,aAAO,KAAKmK,aAAL,CAAmBnK,SAAnB,EAA8B0L,eAA9B,CAA8CvD,OAA9C,CAAP;AACD;;;;;;AC1FH,IAAMiS,mBAAmB,GAAG,EAA5B;AACA,IAAMC,2BAA2B,GAAG,EAApC;AACA,IAAMC,cAAc,GAAG,EAAvB;AAEA;;;;;;;;;;;;;;;;;;;;;;;;IAuBqBC;;;AACnB,kBAAY1L,EAAZ,EAAgC;AAAA,QAAhB2L,SAAgB,uEAAJ,EAAI;;AAAA;;AAC9Bpb,IAAAA,MAAM,CAACyP,EAAD,EAAK,wBAAL,CAAN;AAEA;;;;;;;AAOA,SAAKA,EAAL,GAAUA,EAAV;AACA,SAAK4L,SAAL,GAAiB,EAAjB;AACA,SAAKC,sBAAL,GAA8B;AAAEna,MAAAA,WAAW,EAAE;AAAf,KAA9B;AACA,SAAKoa,cAAL,CAAoBH,SAApB;AACA,SAAKzL,QAAL,GAAgB,EAAhB,CAd8B;AAe/B;AAED;;;;;;;;;;qCAM0B;AAAA;;AAAA,UAAX8F,IAAW,uEAAJ,EAAI;AACxB+F,MAAAA,KAAK,CAAC/F,IAAD,EAAO,UAACjT,KAAD,EAAQrH,GAAR,EAAgB;AAC1B,QAAA,KAAI,CAACsgB,aAAL,CAAmBtgB,GAAnB,EAAwBsa,IAAI,CAACta,GAAD,CAA5B;AACD,OAFI,CAAL;AAGD;AAED;;;;;;;;;;kCAOciH,MAAMZ,YAAY;AAAA;;AAC9B,UAAI4K,kBAAkB,GAAGtN,QAAQ,CAACsD,IAAD,CAAjC;AACA,UAAIxB,SAAS,GAAGrB,SAAS,CAAC6M,kBAAD,CAAzB,CAF8B;;AAK9B5K,MAAAA,UAAU,GAAGA,UAAU,CAAC5F,MAAX,EAAb,CAL8B;AAQ9B;;AACA,WAAKyf,SAAL,CAAejP,kBAAf,IAAqC,KAAKiP,SAAL,CAAejP,kBAAf,KAAsC;AACzE,iBAAO,IADkE;AAEzEgG,QAAAA,WAAW,EAAE;AAF4D,OAA3E,CAT8B;;AAa9B,WAAKiJ,SAAL,CAAejP,kBAAf,aAA2C5K,UAA3C,CAb8B;;AAgB9BA,MAAAA,UAAU,CAAC3E,SAAX,CAAqBsS,OAArB,GAA+B,IAA/B;AACA3N,MAAAA,UAAU,CAAC3E,SAAX,CAAqB+D,SAArB,GAAiCA,SAAjC,CAjB8B;;AAmB9BY,MAAAA,UAAU,CAAC3E,SAAX,CAAqBoL,mBAArB,GAA2C,EAA3C,CAnB8B;;AAoB9BzG,MAAAA,UAAU,CAAC3E,SAAX,CAAqBqL,qBAArB,GAA6C,EAA7C,CApB8B;;AAqB9B1G,MAAAA,UAAU,CAAC3E,SAAX,CAAqB8E,qBAArB,GAA6C,EAA7C,CArB8B;;AAsB9BH,MAAAA,UAAU,CAAC3E,SAAX,CAAqB+E,uBAArB,GAA+C,EAA/C,CAtB8B;;AAuB9BJ,MAAAA,UAAU,CAAC3E,SAAX,CAAqBiF,eAArB,GAAuC,IAAI4Z,GAAJ,EAAvC,CAvB8B;;AAwB9Bla,MAAAA,UAAU,CAAC3E,SAAX,CAAqBmF,iBAArB,GAAyC,IAAI0Z,GAAJ,EAAzC,CAxB8B;;AAyB9Bla,MAAAA,UAAU,CAAC3E,SAAX,CAAqB8e,qBAArB,GAA6C,EAA7C,CAzB8B;;AA2B9B,UAAIC,qBAAqB,GAAG,EAA5B;;AACA,WAAK,IAAIC,mBAAT,IAAgCra,UAAU,CAAC3E,SAA3C,EAAsD;AACpD,YAAI2E,UAAU,CAAC3E,SAAX,CAAqBgf,mBAArB,aAAqDlb,WAAzD,EAAsE;AACpE,cAAI7C,WAAW,GAAG0D,UAAU,CAAC3E,SAAX,CAAqBgf,mBAArB,CAAlB;AACA/d,UAAAA,WAAW,CAAC3C,GAAZ,GAAkB0gB,mBAAlB;AACA/d,UAAAA,WAAW,CAAC8C,SAAZ,GACE9C,WAAW,CAAC8C,SAAZ,IAAyB,KAAKkb,WAAL,CAAiBD,mBAAjB,CAD3B;AAEA/d,UAAAA,WAAW,CAACgD,cAAZ,GAA6BF,SAA7B;AACA9C,UAAAA,WAAW,CAACie,SAAZ,CAAsB,IAAtB,EANoE;AASpE;;AAToE,sCAU/Cje,WAAW,CAACke,kBAAZ,EAV+C;AAAA;AAAA,cAU/DC,QAV+D;AAAA,cAUrDjZ,EAVqD;;AAYpE4Y,UAAAA,qBAAqB,CAACK,QAAD,CAArB,GAAkCL,qBAAqB,CAACK,QAAD,CAArB,IAAmC,EAArE;AACAjc,UAAAA,MAAM,CACJ,CAAC4b,qBAAqB,CAACK,QAAD,CAArB,CAAgC7K,QAAhC,CAAyCpO,EAAzC,CADG,kBAEKZ,IAFL,qFAEoF6Z,QAFpF,sCAAN;AAIAL,UAAAA,qBAAqB,CAACK,QAAD,CAArB,CAAgC9f,IAAhC,CAAqC6G,EAArC;;AAEA,eAAKkZ,wBAAL,CAA8BD,QAA9B,EAAwCjZ,EAAxC,EAnBoE;;;AAsBpElF,UAAAA,WAAW,CAACqe,sBAAZ,CAAmC3a,UAAnC,EAA+Cqa,mBAA/C;AACD;AACF,OArD6B;;;AAwD9B,UAAIzV,UAAU,GAAG,KAAK/D,gBAAL,CAAsBzB,SAAtB,CAAjB;;AACA,UAAI,CAAC,KAAK6O,EAAL,CAAQrJ,UAAR,CAAL,EAA0B;AACxB,aAAKqJ,EAAL,CAAQxJ,gBAAR,CAAyBG,UAAzB;AACD,OA3D6B;;;AA8D9B,WAAKA,UAAL,IAAmB;AACjBgG,QAAAA,kBAAkB,EAAlBA,kBADiB;AAEjB,eAAK,cAAAzR,KAAK;AAAA,iBAAI,MAAI,OAAJ,CAASyR,kBAAT,EAA6BzR,KAA7B,CAAJ;AAAA,SAFO;AAGjB+F,QAAAA,MAAM,EAAE,gBAAA/F,KAAK;AAAA,iBAAI,MAAI,CAAC+F,MAAL,CAAY0L,kBAAZ,EAAgCzR,KAAhC,CAAJ;AAAA,SAHI;AAIjB0L,QAAAA,GAAG,EAAE,aAAA1L,KAAK;AAAA,iBAAI,MAAI,CAAC0L,GAAL,CAAS+F,kBAAT,EAA6BzR,KAA7B,CAAJ;AAAA,SAJO;AAKjB2H,QAAAA,IAAI,EAAE,cAAA3H,KAAK;AAAA,iBAAI,MAAI,CAAC2H,IAAL,CAAU8J,kBAAV,EAA8BzR,KAA9B,CAAJ;AAAA,SALM;AAMjByhB,QAAAA,MAAM,EAAE,gBAAAzhB,KAAK;AAAA,iBAAI,MAAI,CAACyhB,MAAL,CAAYhQ,kBAAZ,EAAgCzR,KAAhC,CAAJ;AAAA,SANI;AAOjB0hB,QAAAA,cAAc,EAAE,wBAAA1hB,KAAK;AAAA,iBAAI,MAAI,CAAC0hB,cAAL,CAAoBjQ,kBAApB,EAAwCzR,KAAxC,CAAJ;AAAA,SAPJ;AAQjBuI,QAAAA,KAAK,EAAE,eAAAvI,KAAK;AAAA,iBAAI,MAAI,CAACuI,KAAL,CAAWkJ,kBAAX,EAA+BzR,KAA/B,CAAJ;AAAA,SARK;AASjB2hB,QAAAA,IAAI,EAAE,cAAA3hB,KAAK;AAAA,iBAAI,MAAI,CAAC2hB,IAAL,CAAUlQ,kBAAV,EAA8BzR,KAA9B,CAAJ;AAAA,SATM;AAUjB4hB,QAAAA,KAAK,EAAE,eAAA5hB,KAAK;AAAA,iBAAI,MAAI,CAAC4hB,KAAL,CAAWnQ,kBAAX,EAA+BzR,KAA/B,CAAJ;AAAA;AAVK,OAAnB;AAaA,aAAO,IAAP;AACD;AAED;;;;;;;;;6BAMSyH,MAAM;AACb,aAAO,KAAKiZ,SAAL,CAAejZ,IAAf,CAAP;AACD;AAED;;;;;;;;;;;;;;;;yBAeIA,MAAMzH,OAAO;AACf,aAAO,KAAK6hB,iBAAL,CAAuBjd,SAAS,CAAC6C,IAAD,CAAhC,EAAwCzH,KAAxC,CAAP;AACD;AAED;;;;;;;;;;;;;;;;2BAeOyH,MAAMzH,OAAO;AAClB,aAAO,YAASyH,IAAT,EAAezH,KAAf,EAAsBkI,IAAtB,EAAP;AACD;AAED;;;;;;;;;;;;;wBAYIT,MAAM;AACR,UAAIgE,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AAEA,aAAO,KAAKsa,QAAL,CAActW,UAAd,EAA0B7G,SAAS,CAAC6C,IAAD,CAAnC,CAAP;AACD;AAED;;;;;;;;;yBAOKA,MAAM;AACT,aAAO,KAAKsa,QAAL,CAAc,EAAd,EAAkBnd,SAAS,CAAC6C,IAAD,CAA3B,CAAP;AACD;AAED;;;;;;;;;;;;;;yBAaKA,MAAM4B,KAAK;AACd,UAAIoC,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AACA,UAAI6B,OAAO,GAAGmC,UAAU,CAAC9D,IAAX,CAAgB0B,GAAhB,CAAd;;AAEA,UAAI9K,KAAK,CAACsC,OAAN,CAAcwI,GAAd,CAAJ,EAAwB;AACtBhE,QAAAA,MAAM,CACJiE,OAAO,CAACjL,MAAR,KAAmBgL,GAAG,CAAChL,MADnB,8BAEiB,KAAK+N,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CACnBzK,IADmB,CAFjB,yBAIY4B,GAAG,CAAC1E,IAAJ,CAAS,GAAT,CAJZ,sBAKF2E,OAAO,CAACjL,MALN,2CAM6BgL,GAAG,CAAChL,MANjC,OAAN;AAQD;;AAED,aAAO,KAAK0jB,QAAL,CAAczY,OAAd,EAAuB1E,SAAS,CAAC6C,IAAD,CAAhC,CAAP;AACD;AAED;;;;;;;;;;;;;;2BAcOA,MAAMkC,OAAO;AAClB,UAAI8B,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AACA,UAAIgC,MAAM,GAAGgC,UAAU,CAACgW,MAAX,CAAkB9X,KAAlB,CAAb;AAEA,aAAO,KAAKoY,QAAL,CAActY,MAAd,EAAsB7E,SAAS,CAAC6C,IAAD,CAA/B,CAAP;AACD;AAED;;;;;;;;;;;;;;mCAaeA,MAAMzH,OAAO;AAC1B,UAAIyL,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AACA,UAAIgC,MAAM,GAAGgC,UAAU,CAACgW,MAAX,CAAkBzhB,KAAlB,CAAb;AACA,UAAI6H,KAAJ;;AAEA,UAAI,CAAC4B,MAAL,EAAa;AACX5B,QAAAA,KAAK,GAAG,KAAK9B,MAAL,CAAY0B,IAAZ,EAAkBzH,KAAlB,CAAR;AACD,OAFD,MAEO;AACL6H,QAAAA,KAAK,GAAG,KAAKka,QAAL,CAActY,MAAd,EAAsB7E,SAAS,CAAC6C,IAAD,CAA/B,CAAR;AACD;;AAED,aAAOI,KAAP;AACD;AAED;;;;;;;;;;;;;;;;0BAiBMJ,MAAMkC,OAAO;AACjB,UAAI8B,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AACA,UAAI6B,OAAO,GAAGmC,UAAU,CAAClD,KAAX,CAAiBoB,KAAjB,CAAd;AAEA,aAAO,KAAKoY,QAAL,CAAczY,OAAd,EAAuB1E,SAAS,CAAC6C,IAAD,CAAhC,CAAP;AACD;AAED;;;;;;;;;;;;;0BAaMA,MAAM;AACV,UAAIgE,UAAU,GAAG,KAAKqW,iBAAL,CAAuBra,IAAvB,CAAjB;AACA,UAAIgC,MAAM,GAAGgC,UAAU,CAAC,CAAD,CAAvB;AAEA,aAAO,KAAKsW,QAAL,CAActY,MAAd,EAAsB7E,SAAS,CAAC6C,IAAD,CAA/B,CAAP;AACD;AAED;;;;;;;;;kCAMcxB,WAAW;AACvB,UAAI4B,KAAK,GAAG,KAAK6Y,SAAL,CAAevc,QAAQ,CAAC8B,SAAD,CAAvB,CAAZ;;AAEAZ,MAAAA,MAAM,CAACwC,KAAD,kCAAiC5B,SAAjC,EAAN;AAEA,aAAO4B,KAAK,SAAL,CAAY3F,SAAnB;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;4CAwBwBiB,aAAa8C,WAAW;AAC9C,UAAI9C,WAAW,CAACqE,aAAhB,EAA+B;AAC7B,aAAKmZ,sBAAL,CAA4Bna,WAA5B,CAAwChF,IAAxC,CAA6C2B,WAA7C;AACD,OAFD,MAEO;AACL,aAAKwd,sBAAL,CAA4B1a,SAA5B,IACE,KAAK0a,sBAAL,CAA4B1a,SAA5B,KAA0C,EAD5C;;AAEA,aAAK0a,sBAAL,CAA4B1a,SAA5B,EAAuCzE,IAAvC,CAA4C2B,WAA5C;AACD;AACF;;;6CAEwB8C,WAAW;AAClC,UAAI+b,gBAAgB,GAAG,KAAKrB,sBAAL,CAA4B1a,SAA5B,KAA0C,EAAjE;AACA,UAAIgc,uBAAuB,GAAG,KAAKtB,sBAAL,CAA4Bna,WAA5B,IAA2C,EAAzE;AAEA,aAAOwb,gBAAgB,CAAC3iB,MAAjB,CAAwB4iB,uBAAxB,CAAP;AACD;;;oCAEehc,WAAW;AACzB,UAAImJ,UAAU,GAAG,KAAKC,aAAL,CAAmBpJ,SAAnB,CAAjB;AAEA,aAAOnG,MAAM,CAACC,MAAP,CACL,EADK,EAELqP,UAAU,CAACpI,qBAFN,EAGLoI,UAAU,CAAC9B,mBAHN,CAAP;AAKD;;;yCAEoBrH,WAAW;AAC9B,aAAO,KAAKic,QAAL,CAAc/d,QAAQ,CAAC8B,SAAD,CAAtB,CAAP;AACD;AAED;;;;AAIA;;;;;;;;;sCAMkBwB,MAAM;AACtB,UAAIgE,UAAU,GAAG,KAAK/D,gBAAL,CAAsBD,IAAtB,CAAjB;AACApC,MAAAA,MAAM,CACJ,KAAKyP,EAAL,CAAQrJ,UAAR,CADI,mDAEsChE,IAFtC,yDAAN;AAKA,aAAO,KAAKqN,EAAL,CAAQrJ,UAAR,CAAP;AACD;;;qCAEgBhE,MAAM;AACrB,UAAI,OAAO4Y,mBAAmB,CAAC5Y,IAAD,CAA1B,KAAqC,QAAzC,EAAmD;AACjD,YAAIxB,SAAS,GAAGrB,SAAS,CAAC6C,IAAD,CAAzB;AAEA,YAAM8N,cAAc,GAAGpR,QAAQ,CAC7B,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCjM,SAApC,CAD6B,CAA/B;AAIAoa,QAAAA,mBAAmB,CAAC5Y,IAAD,CAAnB,GAA4B8N,cAA5B;AACD;;AAED,aAAO8K,mBAAmB,CAAC5Y,IAAD,CAA1B;AACD;AAGD;;;;6CACyBA,MAAM;AAC7B,UAAI,OAAO6Y,2BAA2B,CAAC7Y,IAAD,CAAlC,KAA6C,QAAjD,EAA2D;AACzD,YAAM0a,sBAAsB,cAAO,KAAKza,gBAAL,CAAsBD,IAAtB,CAAP,CAA5B;AAEA6Y,QAAAA,2BAA2B,CAAC7Y,IAAD,CAA3B,GAAoC0a,sBAApC;AACD;;AAED,aAAO7B,2BAA2B,CAAC7Y,IAAD,CAAlC;AACD;;;gCAEWA,MAAM;AAChB,UAAI,OAAO8Y,cAAc,CAAC9Y,IAAD,CAArB,KAAgC,QAApC,EAA8C;AAC5C,YAAI5C,UAAU,GAAGD,SAAS,CAAC6C,IAAD,CAA1B;;AAEA,YAAMxB,SAAS,GAAG,KAAKmG,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsCzH,UAAtC,CAAlB;;AAEA0b,QAAAA,cAAc,CAAC9Y,IAAD,CAAd,GAAuBxB,SAAvB;AACD;;AAED,aAAOsa,cAAc,CAAC9Y,IAAD,CAArB;AACD;AAED;;;;;;;;;;6CAOyBA,MAAMY,IAAI;AACjC,WAAKqY,SAAL,CAAejZ,IAAf,IAAuB,KAAKiZ,SAAL,CAAejZ,IAAf,KAAwB;AAC7C,iBAAO,IADsC;AAE7CgQ,QAAAA,WAAW,EAAE;AAFgC,OAA/C;AAKA,UAAIlD,GAAG,GAAG,KAAKmM,SAAL,CAAejZ,IAAf,EAAqBgQ,WAA/B;;AACA,UAAI,CAAClD,GAAG,CAACkC,QAAJ,CAAapO,EAAb,CAAL,EAAuB;AACrBkM,QAAAA,GAAG,CAAC/S,IAAJ,CAAS6G,EAAT;AACD;AACF;AAED;;;;;;;;;;sCAOkBpC,WAAWjG,OAAO;AAClC,UAAI6G,UAAU,GAAG,KAAKub,SAAL,CAAenc,SAAf,CAAjB;;AACA,UAAIsO,GAAG,GAAG,KAAK8N,eAAL,CAAqBpc,SAArB,CAAV;;AAEA,aAAO,IAAIY,UAAJ,CAAe,IAAf,EAAqBZ,SAArB,EAAgCjG,KAAhC,EAAuCuU,GAAvC,CAAP;AACD;AAED;;;;;;;;;8BAMUtO,WAAW;AACnB,aAAO,KAAKya,SAAL,CAAevc,QAAQ,CAAC8B,SAAD,CAAvB,UAAP;AACD;AAED;;;;;;;;;oCAMgBA,WAAW;AACzB,aAAO,KAAKya,SAAL,CAAevc,QAAQ,CAAC8B,SAAD,CAAvB,EAAoCwR,WAA3C;AACD;AAED;;;;;;;;;;;;;6BAUSnO,SAASrD,WAAW;AAC3B,UAAI1H,KAAK,CAACsC,OAAN,CAAcyI,OAAd,CAAJ,EAA4B;AAC1B,YAAIb,MAAM,GAAGa,OAAO,CAACxI,GAAR,CAAY,UAAS2I,MAAT,EAAiB;AACxC,iBAAO,KAAKoY,iBAAL,CAAuB5b,SAAvB,EAAkCwD,MAAlC,CAAP;AACD,SAFY,EAEV,IAFU,CAAb;AAGA,eAAO,IAAI+C,UAAJ,CAAevG,SAAf,EAA0BwC,MAA1B,CAAP;AACD,OALD,MAKO,IAAIa,OAAJ,EAAa;AAClB,eAAO,KAAKuY,iBAAL,CAAuB5b,SAAvB,EAAkCqD,OAAlC,CAAP;AACD,OAFM,MAEA;AACL,eAAO,IAAP;AACD;AACF;;;;;;AC5hBH,IAAMgZ,OAAO,GAAG;AACdrX,EAAAA,EAAE,EAAFA,EADc;AAEdjF,EAAAA,WAAW,EAAXA,WAFc;AAGdmN,EAAAA,YAAY,EAAZA,YAHc;AAIdpF,EAAAA,gBAAgB,EAAhBA,gBAJc;AAKdwL,EAAAA,UAAU,EAAVA,UALc;AAMdmG,EAAAA,kBAAkB,EAAlBA,kBANc;AAOdc,EAAAA,MAAM,EAANA;AAPc,CAAhB;AAUA,IAAI+B,gBAAgB,GAAG;AAAEjW,EAAAA,WAAW,EAAXA,WAAF;AAAe4F,EAAAA,SAAS,EAATA;AAAf,CAAvB;AAEA;;;;;;;;IAOMsQ;;;AACJ,uBAAc;AAAA;;AACZ,SAAKnW,SAAL,GAAiBkW,gBAAjB;AACD;;;;6BAEQ/hB,KAAKI,OAAO;AACnB,WAAKJ,GAAL,IAAYI,KAAZ;AACD;;;2BAEM6hB,WAAoB;AACzB,UAAIC,KAAK,GAAGJ,OAAO,CAACG,SAAD,CAAnB;AACAC,MAAAA,KAAK,CAACxgB,SAAN,CAAgBkK,UAAhB,GAA6B,IAA7B;;AAFyB,wCAANK,IAAM;AAANA,QAAAA,IAAM;AAAA;;AAIzB,wBAAWiW,KAAX,EAAoBjW,IAApB;AACD;;;;;AAGH;;;;;;;;;AAOA,IAAIkW,gBAAgB,GAAG,IAAIH,SAAJ,EAAvB;AAEAvX,EAAE,CAAC/I,SAAH,CAAakK,UAAb,GAA0BuW,gBAA1B;AACA3c,WAAW,CAAC9D,SAAZ,CAAsBkK,UAAtB,GAAmCuW,gBAAnC;AACA5U,gBAAgB,CAAC7L,SAAjB,CAA2BkK,UAA3B,GAAwCuW,gBAAxC;AACAxP,YAAY,CAACjR,SAAb,CAAuBkK,UAAvB,GAAoCuW,gBAApC;AACApJ,UAAU,CAACrX,SAAX,CAAqBkK,UAArB,GAAkCuW,gBAAlC;AACAjD,kBAAkB,CAACxd,SAAnB,CAA6BkK,UAA7B,GAA0CuW,gBAA1C;AACAnC,MAAM,CAACte,SAAP,CAAiBkK,UAAjB,GAA8BuW,gBAA9B;;AC3CA,IAAMC,qBAAqB,GAAG,EAA9B;AAEA;;;;;;;;;AAQA,SAASC,eAAT,CAAyB7S,MAAzB,EAAiC;AAC/B,MAAI,OAAO8S,MAAP,KAAkB,WAAtB,EAAmC;AACjC,WAAO,IAAIC,SAAJ,CACL,YAAW;AACT,WAAKC,kBAAL,GAA0B,UAASvQ,IAAT,EAAexE,IAAf,EAAqBG,OAArB,EAA8B;AACtD,YAAI4B,MAAM,CAACiT,SAAP,EAAJ,EAAwB;AACtBzf,UAAAA,OAAO,CAAC0f,GAAR,2CACqCzQ,IAAI,CAAC0Q,WAAL,EADrC,cAEI/U,OAAO,CAACoB,GAFZ;AAKD;AACF,OARD;;AAUA,WAAK4T,cAAL,GAAsB,UAAS3Q,IAAT,EAAexE,IAAf,EAAqBG,OAArB,EAA8B;AAClD,YAAI4B,MAAM,CAACiT,SAAP,EAAJ,EAAwB;AACtBzf,UAAAA,OAAO,CAAC6f,cAAR,oBACcjV,OAAO,CAACkV,MADtB,eACiC7Q,IAAI,CAAC0Q,WAAL,EADjC,cACuD/U,OAAO,CAACoB,GAD/D;AADsB,cAIhBhB,WAJgB,GAIcJ,OAJd,CAIhBI,WAJgB;AAAA,cAIH+U,YAJG,GAIcnV,OAJd,CAIHmV,YAJG;AAKtB,cAAIC,aAAJ,EAAmBC,cAAnB;;AAEA,cAAI;AACFD,YAAAA,aAAa,GAAGzkB,IAAI,CAAC0P,KAAL,CAAWD,WAAX,CAAhB;AACD,WAFD,CAEE,OAAOoF,CAAP,EAAU;AACV4P,YAAAA,aAAa,GAAGhV,WAAhB;AACD;;AAED,cAAI;AACFiV,YAAAA,cAAc,GAAG1kB,IAAI,CAAC0P,KAAL,CAAW8U,YAAX,CAAjB;AACD,WAFD,CAEE,OAAO3P,CAAP,EAAU;AACV6P,YAAAA,cAAc,GAAGF,YAAjB;AACD;;AAED/f,UAAAA,OAAO,CAAC6f,cAAR,CAAuB,UAAvB;AACA7f,UAAAA,OAAO,CAAC0f,GAAR,CAAYO,cAAZ;AACAjgB,UAAAA,OAAO,CAACkgB,QAAR;AAEAlgB,UAAAA,OAAO,CAAC6f,cAAR,CAAuB,gBAAvB;AACA7f,UAAAA,OAAO,CAAC0f,GAAR,CAAYM,aAAZ;AACAhgB,UAAAA,OAAO,CAACkgB,QAAR;AAEAlgB,UAAAA,OAAO,CAAC6f,cAAR,CAAuB,eAAvB;AACA7f,UAAAA,OAAO,CAAC0f,GAAR,CAAY9U,OAAZ;AACA5K,UAAAA,OAAO,CAACkgB,QAAR;AAEAlgB,UAAAA,OAAO,CAACkgB,QAAR;AACD;AACF,OAlCD;;AAoCA,UAAIC,wBAAwB,GAAG,KAAKC,gBAApC;;AACA,WAAKA,gBAAL,GAAwB,UAASxV,OAAT,EAAkB;AACxC,YAAIyV,iBAAiB,GAAG7T,MAAM,CAAC8T,iBAAP,CAAyBjX,IAAzB,CACtB,UAAAkX,gBAAgB;AAAA,iBAAIA,gBAAgB,CAAC3V,OAAD,CAApB;AAAA,SADM,CAAxB;;AAIA,YAAIyV,iBAAJ,EAAuB;AACrB,cAAIrU,GAAG,GAAGpB,OAAO,CAACoB,GAAR,CAAYiH,QAAZ,CAAqB,GAArB,IACNrI,OAAO,CAACoB,GAAR,CAAYwU,MAAZ,CAAmB,CAAnB,EAAsB5V,OAAO,CAACoB,GAAR,CAAY3Q,OAAZ,CAAoB,GAApB,CAAtB,CADM,GAENuP,OAAO,CAACoB,GAFZ;AAIA,eAAKpB,OAAO,CAACtC,MAAR,CAAe4E,WAAf,EAAL,EAAmClB,GAAnC,EAAwC,KAAKyU,WAA7C;AACD;;AAED,eAAON,wBAAwB,CAACO,KAAzB,CAA+B,IAA/B,EAAqCnY,SAArC,CAAP;AACD,OAdD;;AAgBA,WAAKoY,gBAAL,GAAwB,UAAS1R,IAAT,EAAexE,IAAf,EAAqB;AAC3CA,QAAAA,IAAI,GAAGmW,SAAS,CAACnW,IAAD,CAAhB;AACA5I,QAAAA,MAAM,6BACiBoN,IADjB,eAC0BxE,IAD1B,+JAAN;AAGD,OALD;AAMD,KAvEI,EAwEL;AAAEoW,MAAAA,aAAa,EAAErU,MAAM,CAACsU,mBAAP;AAAjB,KAxEK,CAAP;AA0ED;AACF;;AAED,IAAMC,mBAAmB,GAAG;AAC1B7S,EAAAA,QAAQ,EAAE,KADgB;AAE1B8S,EAAAA,MAAM,EAAE3gB;AAFkB,CAA5B;AAKA,IAAM0e,kBAAgB,GAAG;AAAEjW,EAAAA,WAAW,EAAXA,WAAF;AAAe4F,EAAAA,SAAS,EAATA;AAAf,CAAzB;AAEA;;;;AAGA,IAAMuS,mBAAmB,GAAG,CAC1B,mCAD0B;AAE1B,kCAF0B;AAG1B,UAAArW,OAAO,EAAI;AACT,SAAO,uBAAuBuC,IAAvB,CAA4BvC,OAAO,CAACoB,GAApC,CAAP;AACD,CALyB,CAA5B;AAQA,AAKA;;;;;;;;;AAQA,SAASkV,QAAT,CAAkBC,MAAlB,EAA0B;AACxB,MAAI,CAACA,MAAD,IAAW,QAAOA,MAAP,MAAkB,QAAjC,EAA2C;AACzC,WAAO,KAAP;AACD;;AAED,MAAIC,UAAU,GAAG9kB,MAAM,CAACI,IAAP,CAAYqkB,mBAAZ,CAAjB;AACA,MAAIM,UAAU,GAAG/kB,MAAM,CAACI,IAAP,CAAYykB,MAAZ,CAAjB;;AACA,OAAK,IAAIlmB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGomB,UAAU,CAACxmB,MAA/B,EAAuCI,CAAC,EAAxC,EAA4C;AAC1C,QAAI+B,GAAG,GAAGqkB,UAAU,CAACpmB,CAAD,CAApB;;AACA,QAAImmB,UAAU,CAAC/lB,OAAX,CAAmB2B,GAAnB,IAA0B,CAAC,CAA/B,EAAkC;AAChC,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD;AAED;;;;;;;;;;;;AAUA,SAASskB,qBAAT,CAA+BrY,IAA/B,EAAqC;AAAA,qBACnBA,IAAI,CAAChC,MAAL,CAAY,CAAC,CAAb,CADmB;AAAA;AAAA,MAC9Bsa,OAD8B;;AAEnC,MAAIL,QAAQ,CAACK,OAAD,CAAZ,EAAuB;AACrBA,IAAAA,OAAO,GAAGhlB,MAAM,CAAC,EAAD,EAAKwkB,mBAAL,EAA0BQ,OAA1B,CAAhB;AACD,GAFD,MAEO;AACLtY,IAAAA,IAAI,CAACjL,IAAL,CAAUujB,OAAV;AACAA,IAAAA,OAAO,GAAGR,mBAAV;AACD;;AACD,MAAIS,CAAC,GAAG,IAAIvY,IAAI,CAACpO,MAAjB;;AACA,SAAO2mB,CAAC,KAAK,CAAb,EAAgB;AACdvY,IAAAA,IAAI,CAACjL,IAAL,CAAUqC,SAAV;AACD;;AACD4I,EAAAA,IAAI,CAACjL,IAAL,CAAUujB,OAAV;AACA,SAAOtY,IAAP;AACD;AAED;;;;;;;;;;IAQqBwY;;;AACnB,oBAA0B;AAAA,QAAd9T,OAAc,uEAAJ,EAAI;;AAAA;;AACxB,SAAK/E,UAAL,GAAkB,IAAIoW,SAAJ,EAAlB;AACA,SAAK0C,MAAL,CAAY/T,OAAZ;AAEA;;;;;;AAMA,SAAK2D,EAAL,GAAU,KAAKA,EAAL,IAAWjR,SAArB;AAEA;;;;;;AAMA,SAAKuC,MAAL,GAAc,KAAKA,MAAL,IAAevC,SAA7B;AACD;;;;6BAEmB;AAAA,UAAbqhB,OAAa,uEAAJ,EAAI;;AAClB,WAAKpB,iBAAL,GAAyB,KAAKA,iBAAL,IAA0B,EAAnD;AAEA,UAAIqB,iBAAiB,GACnBD,OAAM,CAACE,WAAP,IACC,KAAKA,WAAL,IAAoB,KAAKA,WAAL,KAAqBF,OAAM,CAACE,WAFnD;AAGA/f,MAAAA,MAAM,CACJ,CAAC8f,iBADG,EAEJ,mEAFI,CAAN;AAIA,WAAKC,WAAL,GAAmBF,OAAM,CAACE,WAAP,IAAsB,KAAKA,WAA3B,IAA0C,aAA7D;;AAEA,UAAIF,OAAM,CAACG,MAAX,EAAmB;AACjBhgB,QAAAA,MAAM,CACJ,CAAC6f,OAAM,CAACI,UADJ,EAEJ,mHAFI,CAAN;AAIAJ,QAAAA,OAAM,CAACI,UAAP,GAAoBJ,OAAM,CAACG,MAA3B;AACD;;AAED,UAAIH,OAAM,CAACK,KAAX,EAAkB;AAChBlgB,QAAAA,MAAM,CACJ,CAAC6f,OAAM,CAACM,SADJ,EAEJ,yHAFI,CAAN;AAIAN,QAAAA,OAAM,CAACM,SAAP,GAAmB;AAAE,qBAASN,OAAM,CAACK;AAAlB,SAAnB;AACD;;AAED,WAAKE,OAAL,GAAeP,OAAf;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,WAAKQ,SAAL,GAAiB,KAAKA,SAAL,IAAkBR,OAAM,CAACQ,SAAzB,IAAsC,EAAvD;AAEA;;;;AAGA,WAAKrZ,SAAL,GAAiB6Y,OAAM,CAAC7Y,SAAP,IAAoBkW,kBAArC;;AACA,WAAKnW,UAAL,CAAgBuZ,QAAhB,CAAyB,WAAzB,EAAsC,KAAKtZ,SAA3C;AAEA;;;;;;;;;;;;;AAaA,WAAKuZ,SAAL,GAAiB,KAAKA,SAAL,IAAkBV,OAAM,CAACU,SAAzB,IAAsC,EAAvD;AAEA;;;;;;;;;;;;;;;;AAmBA,WAAKpB,MAAL,GAAc,KAAKA,MAAL,IAAeU,OAAM,CAACV,MAAtB,IAAgC,GAA9C;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,WAAKqB,OAAL,GAAe,KAAKA,OAAL,KAAiBhiB,SAAjB,GAA6B,KAAKgiB,OAAlC,GAA4ChiB,SAA3D;AAEA,WAAKiiB,UAAL,GAAkB,KAAKA,UAAL,IAAmBjiB,SAArC;AAEA,WAAKwgB,aAAL,GAAqBa,OAAM,CAACb,aAA5B;;AAEA,WAAK0B,0BAAL;;AAEA,UAAI,KAAKjR,EAAT,EAAa;AACX,aAAKA,EAAL,CAAQ1J,wBAAR,CAAiC8Z,OAAM,CAACha,gBAAxC;AACD,OAFD,MAEO;AACL,aAAK4J,EAAL,GAAU,KAAK1I,UAAL,CAAgBrG,MAAhB,CACR,IADQ,EAERlC,SAFQ,EAGRqhB,OAAM,CAACha,gBAHC,CAAV;AAKD;;AAED,UAAI,KAAK9E,MAAT,EAAiB;AACf,aAAKA,MAAL,CAAYwa,cAAZ,CAA2BsE,OAAM,CAACzc,MAAlC;AACA,aAAKiG,oBAAL,CAA0BsX,mBAA1B,CAA8Cd,OAAM,CAACe,WAAP,IAAsB,EAApE;AACD,OAHD,MAGO;AACL,aAAK7f,MAAL,GAAc,KAAKgG,UAAL,CAAgBrG,MAAhB,CAAuB,QAAvB,EAAiC,KAAK+O,EAAtC,EAA0CoQ,OAAM,CAACzc,MAAjD,CAAd;AACA,aAAKiG,oBAAL,GAA4B,KAAKtC,UAAL,CAAgBrG,MAAhB,CAC1B,oBAD0B,EAE1B,KAAKK,MAFqB,EAG1B8e,OAAM,CAACe,WAHmB,CAA5B;AAKD;;AAED,UAAIC,YAAY,GAAG,KAAKC,iBAAL,CAAuBjB,OAAvB,EAA+B,WAA/B,CAAnB;;AACA,UAAIkB,kBAAkB,GACpBlB,OAAM,CAACM,SAAP,IACA1lB,MAAM,CAACoC,SAAP,CAAiB4B,cAAjB,CAAgCxD,IAAhC,CAAqC4kB,OAAM,CAACM,SAA5C,EAAuD,SAAvD,CAFF;AAIA,UAAIa,0BAA0B,GAC5BnB,OAAM,CAACb,aAAP,KAAyBxgB,SAAzB,IAAsC,KAAKyiB,SAD7C;AAEAjhB,MAAAA,MAAM,CACJ,CAACghB,0BADG,EAEJ,2EAFI,CAAN;AAKA;;;;;;;;;;;;;;;;;AAmBA,WAAKC,SAAL,GACE,KAAKA,SAAL,IAAkBpB,OAAM,CAACoB,SAAzB,IAAsCzD,eAAe,CAAC,IAAD,CADvD;;AAGA,UAAIqC,OAAM,CAACI,UAAX,EAAuB;AACrB,aAAKiB,UAAL,CAAgBrB,OAAM,CAACI,UAAvB;AACD;;AAED,UAAI,KAAKkB,MAAL,EAAJ,EAAmB;AACjB,YAAItB,OAAM,CAACY,UAAX,EAAuB;AACrB,eAAKS,UAAL,CAAgBrB,OAAM,CAACY,UAAvB;AACD;;AAED,YAAI,OAAOhD,MAAP,KAAkB,WAAtB,EAAmC;AACjCA,UAAAA,MAAM,CAAC9S,MAAP,GAAgB,IAAhB,CADiC;AAElC;AACF;;AAED,UAAI,KAAKwW,MAAL,MAAiBN,YAArB,EAAmC;AACjC,aAAKO,aAAL,CAAmBvB,OAAM,CAACwB,SAA1B;AACD,OAFD,MAEO,IAAI,CAAC,KAAKF,MAAL,EAAD,IAAkBJ,kBAAtB,EAA0C;AAC/C,aAAKK,aAAL,CAAmBvB,OAAM,CAACwB,SAA1B;;AACAxB,QAAAA,OAAM,CAACM,SAAP,YAAyB,IAAzB;AACD,OAHM,MAGA;AACL,aAAKmB,YAAL;AACD;;AAED,UAAIC,sBAAsB,GACxB,OAAO1B,OAAM,CAAC0B,sBAAd,KAAyC,WAAzC,GACI1B,OAAM,CAAC0B,sBADX,GAEI,IAHN;;AAIA,UAAIA,sBAAJ,EAA4B;AAC1B,aAAKC,6BAAL;AACD;AACF;AAED;;;;;;;;;;;6BAQS;AACP,aAAO,KAAKzB,WAAL,KAAqB,MAA5B;AACD;AAED;;;;;;;;;;;gCASY;AACV,aAAO,OAAO,KAAKS,OAAZ,KAAwB,WAAxB,GAAsC,KAAKA,OAA3C,GAAqD,CAAC,KAAKW,MAAL,EAA7D;AACD;AAED;;;;;;;;;;;0CAQsB;AACpB,aAAOhd,OAAO,CAAC,KAAK6a,aAAN,CAAd;AACD;AAED;;;;;;;;;;;;+BASWa,QAAQ;AACjBA,MAAAA,MAAM,CAAC5kB,IAAP,CAAY,IAAZ;AACA,WAAKkkB,MAAL,GAAc,KAAKgC,MAAL,KAAgB,CAAhB,GAAoB,KAAKhC,MAAL,IAAe,CAAjD;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA0DsB;AAAA;;AAAA,wCAAPsC,KAAO;AAAPA,QAAAA,KAAO;AAAA;;AACpB;AACA;AACA,UAAI,OAAOhE,MAAP,KAAkB,WAAtB,EAAmC;AACjC,YAAIiE,KAAK,GAAG,CAAC,KAAD,EAAQ,MAAR,EAAgB,KAAhB,EAAuB,QAAvB,EAAiC,OAAjC,EAA0C,SAA1C,EAAqD,MAArD,CAAZ;AACA,YAAIhC,OAAO,GAAG+B,KAAK,CAACA,KAAK,CAACzoB,MAAN,GAAe,CAAhB,CAAnB;;AAEA,YAAIyoB,KAAK,CAACzoB,MAAN,KAAiB,CAArB,EAAwB;AACtByoB,UAAAA,KAAK,GAAG,CAAC,KAAD,EAAQ,GAAR,CAAR;AACD,SAFD,MAEO,IAAIvoB,KAAK,CAACsC,OAAN,CAAckkB,OAAd,CAAJ,EAA4B;AACjCgC,UAAAA,KAAK,GAAGD,KAAK,CAACE,GAAN,EAAR;AACD;;AAEDF,QAAAA,KAAK,CAAC3mB,OAAN,CAAc,UAAA8N,IAAI,EAAI;AACpB,cAAI,OAAOA,IAAP,KAAgB,UAApB,EAAgC;AAC9B,YAAA,KAAI,CAAC6V,iBAAL,CAAuBtiB,IAAvB,CAA4ByM,IAA5B;AACD,WAFD,MAEO;AACL8Y,YAAAA,KAAK,CAAC5mB,OAAN,CAAc,UAAAsS,IAAI,EAAI;AACpB,kBAAIzE,QAAQ,GAAG,KAAI,CAACiZ,YAAL,CAAkBhZ,IAAlB,CAAf;;AACA,cAAA,KAAI,CAACqY,SAAL,CAAe7T,IAAf,EAAqBzE,QAArB,EAA+B,KAAI,CAACsY,SAAL,CAAerC,WAA9C;AACD,aAHD;AAID;AACF,SATD;AAUD;AACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAsCsB;AAAA,UACdiD,QADc,GACD,KAAKzB,OADJ,CACdyB,QADc;;AAAA,yCAANza,IAAM;AAANA,QAAAA,IAAM;AAAA;;AAGpB,UAAIA,IAAI,CAACpO,MAAT,EAAiB;AACf,YAAI8oB,aAAa,GAAG1a,IAAI,CAAC3L,GAAL,CAASqD,QAAT,CAApB;AAEA,YAAIijB,WAAW,GAAGD,aAAa,CAACjoB,MAAd,CAAqB,UAAAsB,GAAG;AAAA,iBAAI,CAAC0mB,QAAQ,CAAC1mB,GAAD,CAAb;AAAA,SAAxB,CAAlB;;AACA,YAAI4mB,WAAW,CAAC/oB,MAAhB,EAAwB;AACtB,gBAAM,IAAIS,KAAJ,+BAAiCsoB,WAAW,CAACziB,IAAZ,CAAiB,IAAjB,CAAjC,EAAN;AACD;;AAEDuiB,QAAAA,QAAQ,GAAGG,IAAI,MAAJ,UAAKH,QAAL,4BAAkBC,aAAlB,GAAX;AACD;;AAED,WAAKrS,EAAL,CAAQzJ,QAAR,CAAiB6b,QAAjB;AACD;AAED;;;;AAIA;;;;;;;;;;;oCAQ+B;AAAA;;AAAA,UAAjBI,UAAiB,uEAAJ,EAAI;AAC7B;AACA,UAAIC,iBAAiB,GAAG,KAAKC,WAAL,IAAoB,EAA5C;AACA,WAAKA,WAAL,GAAmBznB,MAAM,CAACwnB,iBAAD,EAAoBD,UAApB,CAAzB,CAH6B;;AAM7BxnB,MAAAA,MAAM,CAACI,IAAP,CAAYonB,UAAZ,EAAwBnnB,OAAxB,CAAgC,UAAAsH,IAAI,EAAI;AACtC,YAAI8N,cAAc,GAAG,MAAI,CAACnP,MAAL,CAAYsB,gBAAZ,CAA6BD,IAA7B,CAArB;;AACA,QAAA,MAAI,CAACqN,EAAL,CAAQxJ,gBAAR,CAAyBiK,cAAzB;AACD,OAHD;AAID;AAED;;;;;;;;;;;+BAQW9N,MAAM;AACf,UAAIggB,aAAa,GAAGtjB,QAAQ,CAACsD,IAAD,CAA5B;;AAEA,UAAI,KAAK+f,WAAL,IAAoB,KAAKA,WAAL,CAAiBC,aAAjB,CAAxB,EAAyD;AACvD,eAAO,KAAKD,WAAL,CAAiBC,aAAjB,CAAP;AACD;AACF;;;0BAEKhgB,MAA6B;AAAA,yCAApBpE,kBAAoB;AAApBA,QAAAA,kBAAoB;AAAA;;AACjC,UAAIhC,MAAM,GAAGgC,kBAAkB,CAACnE,MAAnB,CACX,UAAAwoB,GAAG;AAAA,eAAIA,GAAG,IAAI,OAAOA,GAAP,KAAe,QAA1B;AAAA,OADQ,CAAb;AAGA,UAAIC,SAAS,GAAGhgB,IAAI,CAACtE,kBAAD,EAAqB,UAAAqkB,GAAG;AAAA,eAAI3mB,aAAa,CAAC2mB,GAAD,CAAjB;AAAA,OAAxB,CAApB;AACA,UAAID,aAAa,GAAGtjB,QAAQ,CAACsD,IAAD,CAA5B,CALiC;;AAQjC,WAAKmgB,gBAAL,GAAwB,KAAKA,gBAAL,IAAyB,EAAjD;AACA,WAAKA,gBAAL,CAAsBH,aAAtB,IACE,KAAKG,gBAAL,CAAsBH,aAAtB,IAAuC,CAAvC,IAA4C,CAD9C;AAGA,UAAII,eAAe,GAAG,KAAKC,UAAL,CAAgBrgB,IAAhB,CAAtB;;AACA,UAAIogB,eAAJ,EAAqB;AACnBA,QAAAA,eAAe,GAAGA,eAAe,CAAC5mB,MAAhB,CAAuB,EAAvB,CAAlB;AACA,YAAIjB,KAAK,GAAG6nB,eAAe,CAAC7nB,KAAhB,IAAyB,EAArC;;AACA,aAAK+nB,eAAL,CAAqB1mB,MAArB,EAA6BwmB,eAA7B,EAA8CpgB,IAA9C;;AACA,YAAIugB,gBAAgB,GAAG,KAAKC,gBAAL,CAAsBjoB,KAAtB,EAA6BqB,MAA7B,EAAqCsmB,SAArC,CAAvB;;AACA,aAAKO,8BAAL,CAAoCzgB,IAApC,EAA0CzH,KAA1C,EAAiD2nB,SAAjD;;AACA,aAAKO,8BAAL,CAAoCzgB,IAApC,EAA0CugB,gBAA1C;;AAEA,YAAIvoB,OAAO,GAAGooB,eAAe,CAAC5mB,MAAhB,CAAuB+mB,gBAAvB,CAAd;AACA,YAAIG,OAAO,GAAG,IAAI1oB,OAAJ,EAAd;AAEA,YAAIE,QAAQ,GAAG,KAAKioB,gBAAL,CAAsBH,aAAtB,CAAf;AACA,eAAOU,OAAO,CAACzoB,KAAR,CAAcC,QAAd,CAAP;AACD,OAbD,MAaO;AACL,eAAOgoB,SAAP;AACD;AACF;;;8BAESlgB,MAAM2gB,QAA+B;AAC7C/iB,MAAAA,MAAM,CACJgjB,SAAS,CAACD,MAAD,CADL,sEAEwDA,MAFxD,GAAN;AAKA,UAAIE,IAAI,GAAG,EAAX;;AAN6C,yCAApBjlB,kBAAoB;AAApBA,QAAAA,kBAAoB;AAAA;;AAQ7C,UAAMklB,SAAS,IAAI9gB,IAAJ,SAAapE,kBAAb,CAAf;;AACA,WAAK,IAAI5E,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG2pB,MAApB,EAA4B3pB,CAAC,EAA7B,EAAiC;AAC/B6pB,QAAAA,IAAI,CAAC9mB,IAAL,CAAU,KAAK9B,KAAL,CAAWwkB,KAAX,CAAiB,IAAjB,EAAuBqE,SAAvB,CAAV;AACD;;AAED,aAAOD,IAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA4CO7gB,MAAkB;AAAA;;AACvBpC,MAAAA,MAAM,CACJ,KAAKmjB,4BAAL,CAAkC/gB,IAAlC,CADI,sCAEyBA,IAFzB,8HAAN,CADuB;AAOvB;;AAPuB,yCAAT0J,OAAS;AAATA,QAAAA,OAAS;AAAA;;AAQvB,UAAI9P,MAAM,GAAG8P,OAAO,CAACjS,MAAR,CAAe,UAAAwoB,GAAG;AAAA,eAAIA,GAAG,IAAI,OAAOA,GAAP,KAAe,QAA1B;AAAA,OAAlB,CAAb;AACA,UAAIC,SAAS,GAAGhgB,IAAI,CAACwJ,OAAD,EAAU,UAAAuW,GAAG;AAAA,eAAI3mB,aAAa,CAAC2mB,GAAD,CAAjB;AAAA,OAAb,CAApB;AACA,UAAIe,wBAAwB,GAAG9gB,IAAI,CACjCwJ,OADiC,EAEjC,UAAAuW,GAAG;AAAA,eAAIA,GAAG,IAAInpB,KAAK,CAACsC,OAAN,CAAc6mB,GAAd,CAAX;AAAA,OAF8B,CAAnC;AAKA,UAAI1nB,KAAK,GAAG,KAAKN,KAAL,cAAW+H,IAAX,4BAAoBpG,MAApB,IAA4BsmB,SAA5B,GAAZ;AACA,UAAIe,aAAJ;;AAEA,UAAI,KAAKtiB,MAAL,IAAe,KAAKA,MAAL,CAAY,KAAKA,MAAL,CAAYsB,gBAAZ,CAA6BD,IAA7B,CAAZ,CAAnB,EAAoE;AAClE,YAAI2H,UAAU,GAAG,KAAKhJ,MAAL,CAAY,KAAKA,MAAL,CAAYsB,gBAAZ,CAA6BD,IAA7B,CAAZ,CAAjB;AAEAihB,QAAAA,aAAa,GAAGtZ,UAAU,CAACrJ,MAAX,CAAkB/F,KAAlB,CAAhB;AACD,OAJD,MAIO;AACL,YAAIyL,UAAJ,EAAgB8J,cAAhB;;AAEA,YAAIkT,wBAAJ,EAA8B;AAC5Bhd,UAAAA,UAAU,GAAGgd,wBAAb;AACD,SAFD,MAEO;AACLlT,UAAAA,cAAc,GAAG,KAAKnP,MAAL,GACb,KAAKA,MAAL,CAAYwO,wBAAZ,CAAqCnN,IAArC,CADa,cAET,KAAK4E,SAAL,CAAe6F,SAAf,CAAyBzK,IAAzB,CAFS,CAAjB;AAGAgE,UAAAA,UAAU,GAAG,KAAKqJ,EAAL,CAAQS,cAAR,CAAb;AACD;;AAEDlQ,QAAAA,MAAM,CACJoG,UADI,sCAEyBhE,IAFzB,2CAAN;AAIAihB,QAAAA,aAAa,GAAGjd,UAAU,CAACtC,MAAX,CAAkBnJ,KAAlB,CAAhB;AACD;;AAED,UAAI6nB,eAAe,GAAG,KAAKC,UAAL,CAAgBrgB,IAAhB,CAAtB;;AACA,UAAIogB,eAAJ,EAAqB;AACnBA,QAAAA,eAAe,CAACzmB,2BAAhB,CAA4C;AAAEC,UAAAA,MAAM,EAANA;AAAF,SAA5C,EAAwDlB,OAAxD,CACE,UAAAF,WAAW,EAAI;AACbA,UAAAA,WAAW,CAACyoB,aAAD,EAAgB,MAAhB,CAAX;AACD,SAHH;AAKD;;AAED,aAAOA,aAAP;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAuCWjhB,MAAM2gB,QAA+B;AAC9C/iB,MAAAA,MAAM,CACJ,KAAKmjB,4BAAL,CAAkC/gB,IAAlC,CADI,0CAE6BA,IAF7B,8HAAN;AAIApC,MAAAA,MAAM,CACJgjB,SAAS,CAACD,MAAD,CADL,sEAEwDA,MAFxD,GAAN;AAKA,UAAIE,IAAI,GAAG,EAAX;AACA,UAAI/S,cAAc,GAAG,KAAKnP,MAAL,GACjB,KAAKA,MAAL,CAAYwO,wBAAZ,CAAqCnN,IAArC,CADiB,cAEb,KAAK4E,SAAL,CAAe6F,SAAf,CAAyBzK,IAAzB,CAFa,CAArB;AAGA,UAAIgE,UAAU,GAAG,KAAKqJ,EAAL,CAAQS,cAAR,CAAjB;;AAd8C,yCAApBlS,kBAAoB;AAApBA,QAAAA,kBAAoB;AAAA;;AAgB9C,UAAMslB,eAAe,IAAIlhB,IAAJ,SAAapE,kBAAb,GAAiCoI,UAAjC,EAArB;;AAEA,WAAK,IAAIhN,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG2pB,MAApB,EAA4B3pB,CAAC,EAA7B,EAAiC;AAC/B6pB,QAAAA,IAAI,CAAC9mB,IAAL,CAAU,KAAKuE,MAAL,CAAYme,KAAZ,CAAkB,IAAlB,EAAwByE,eAAxB,CAAV;AACD;;AAED,aAAOL,IAAP;AACD;AAED;;;;;;;;+BAMW;AACT,UAAI,OAAOxF,MAAP,KAAkB,WAAtB,EAAmC;AACjC,aAAKwD,SAAL,CAAesC,QAAf;AACD;;AAED,UAAI,OAAO9F,MAAP,KAAkB,WAAlB,IAAiC,KAAKsC,WAAL,KAAqB,MAA1D,EAAkE;AAChEtC,QAAAA,MAAM,CAAC9S,MAAP,GAAgBnM,SAAhB;AACD;AACF;;;6BAEQglB,cAA2C;AAAA;;AAAA,qFAAJ,EAAI;AAAA,UAA3BC,IAA2B,QAA3BA,IAA2B;AAAA,UAArBC,MAAqB,QAArBA,MAAqB;AAAA,UAAb9a,IAAa,QAAbA,IAAa;;AAClD4a,MAAAA,YAAY,GAAG,KAAKxc,SAAL,CAAe6F,SAAf,CAAyB2W,YAAzB,CAAf;AACA5a,MAAAA,IAAI,GAAGA,IAAI,eAAQ4a,YAAR,CAAX;AACAC,MAAAA,IAAI,GAAGA,IAAI,IAAI,EAAf;AACAC,MAAAA,MAAM,GAAGA,MAAM,IAAI,EAAnB;;AAEA,UAAID,IAAI,CAACzqB,MAAL,GAAc,CAAd,IAAmB0qB,MAAM,CAAC1qB,MAAP,GAAgB,CAAvC,EAA0C;AACxC,cAAM,2CAAN;AACD;;AAED,UAAI2qB,+BAA+B,GAAG;AACpCxe,QAAAA,KAAK,EAAE;AAAEye,UAAAA,OAAO,EAAE,CAAC,KAAD,CAAX;AAAoBhb,UAAAA,IAAI,YAAKA,IAAL;AAAxB,SAD6B;AAEpCib,QAAAA,IAAI,EAAE;AAAED,UAAAA,OAAO,EAAE,CAAC,KAAD,CAAX;AAAoBhb,UAAAA,IAAI,YAAKA,IAAL;AAAxB,SAF8B;AAGpClI,QAAAA,MAAM,EAAE;AAAEkjB,UAAAA,OAAO,EAAE,CAAC,MAAD,CAAX;AAAqBhb,UAAAA,IAAI,YAAKA,IAAL;AAAzB,SAH4B;AAIpC6D,QAAAA,MAAM,EAAE;AAAEmX,UAAAA,OAAO,EAAE,CAAC,KAAD,EAAQ,OAAR,CAAX;AAA6Bhb,UAAAA,IAAI,YAAKA,IAAL;AAAjC,SAJ4B;AAKpC,kBAAQ;AAAEgb,UAAAA,OAAO,EAAE,CAAC,KAAD,CAAX;AAAoBhb,UAAAA,IAAI,YAAKA,IAAL;AAAxB;AAL4B,OAAtC;AAQA,UAAIkb,UAAU,GAAGrpB,MAAM,CAACI,IAAP,CAAY8oB,+BAAZ,CAAjB;AACA,UAAII,OAAO,GACRN,IAAI,CAACzqB,MAAL,GAAc,CAAd,IAAmByqB,IAApB,IACCC,MAAM,CAAC1qB,MAAP,GAAgB,CAAhB,IACC8qB,UAAU,CAACjqB,MAAX,CAAkB,UAAAmqB,MAAM;AAAA,eAAIN,MAAM,CAAClqB,OAAP,CAAewqB,MAAf,MAA2B,CAAC,CAAhC;AAAA,OAAxB,CAFF,IAGAF,UAJF;AAMAC,MAAAA,OAAO,CAACjpB,OAAR,CAAgB,UAAAkpB,MAAM,EAAI;AACxB,YAAIC,eAAe,GAAGN,+BAA+B,CAACK,MAAD,CAArD;AAEAC,QAAAA,eAAe,CAACL,OAAhB,CAAwB9oB,OAAxB,CAAgC,UAAA2L,MAAM,EAAI;AACxC,iBAAOmC,IAAI,KAAK4a,YAAT,GACH,MAAI,CAAC/c,MAAD,CAAJ,CAAawd,eAAe,CAACrb,IAA7B,CADG,GAEH,MAAI,CAACnC,MAAD,CAAJ,CAAawd,eAAe,CAACrb,IAA7B,EAAmC4a,YAAnC,CAFJ;AAGD,SAJD;AAKD,OARD;AASD;AAED;;;;;;;;iDAK6B;AAAA;;AAC3B,OACE,CAAC,KAAD,CADF,EAEE,CAAC,MAAD,CAFF,EAGE,CAAC,KAAD,CAHF,EAIE,CAAC,QAAD,EAAW,KAAX,CAJF,EAKE,CAAC,OAAD,CALF,EAME,CAAC,MAAD,CANF,EAOE,CAAC,SAAD,CAPF,EAQE1oB,OARF,CAQU,iBAAmB;AAAA;AAAA,YAAjBsS,IAAiB;AAAA,YAAX8W,KAAW;;AAC3B,QAAA,MAAI,CAAC9W,IAAD,CAAJ,GAAa,UAACxE,IAAD,EAAmB;AAAA,6CAATxB,IAAS;AAATA,YAAAA,IAAS;AAAA;;AAAA,sCACcqY,qBAAqB,CAACrY,IAAD,CADnC;AAAA;AAAA,cACzBiG,UADyB;AAAA,cACbU,cADa;AAAA,cACGjC,OADH;;AAE9B,iBAAO,MAAI,CAACqY,qBAAL,CACL/W,IADK,EAELxE,IAFK,EAGLyE,UAHK,EAILU,cAJK,EAKLjC,OALK,CAAP;AAOD,SATD;;AAWA,YAAIoY,KAAJ,EAAW;AACT,UAAA,MAAI,CAACA,KAAD,CAAJ,GAAc,MAAI,CAAC9W,IAAD,CAAlB;AACD;AACF,OAvBD;AAwBD;;;+BAEUlE,MAAM;AACf,UAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;AAC5B,eAAOA,IAAP;AACD,OAFD,MAEO;AACL,eAAOxP,IAAI,CAACC,SAAL,CAAeuP,IAAf,CAAP;AACD;AACF;;;0CAEqBkE,MAAMxE,MAAMyE,YAAYU,gBAAgBjC,SAAS;AAAA;;AACrE,UAAIsY,YAAY,GAAG,KAAKrd,UAAL,CAAgBrG,MAAhB,CAAuB,cAAvB,EAAuC;AACxDK,QAAAA,MAAM,EAAE,KAAKA,MAD2C;AAExDqM,QAAAA,IAAI,EAAJA,IAFwD;AAGxDC,QAAAA,UAAU,EAAVA,UAHwD;AAIxDU,QAAAA,cAAc,EAAdA,cAJwD;AAKxDjC,QAAAA,OAAO,EAAPA,OALwD;AAMxDlD,QAAAA,IAAI,EAAJA,IANwD;AAOxDS,QAAAA,oBAAoB,EAAE,KAAKA;AAP6B,OAAvC,CAAnB;;AAUA,UAAIV,QAAQ,GAAG,KAAKiZ,YAAL,CAAkBhZ,IAAlB,CAAf;;AACA,UAAIuW,MAAM,GACRrT,OAAO,CAACqT,MAAR,KAAmB3gB,SAAnB,GAA+BsN,OAAO,CAACqT,MAAvC,GAAgD;AAAA,eAAM,MAAI,CAACA,MAAX;AAAA,OADlD;;AAGA,UAAI,KAAK8B,SAAT,EAAoB;AAClB,eAAO,KAAKA,SAAL,CAAe7T,IAAf,EACLzE,QADK,EAEL,UAAAI,OAAO,EAAI;AACT,iBAAOqb,YAAY,CAACrY,MAAb,CAAoBhD,OAApB,EAA6BkF,IAA7B,CAAkC,UAAAC,cAAc,EAAI;AAAA,iDACzBA,cADyB;AAAA,gBACpD7P,IADoD;AAAA,gBAC9CC,OAD8C;AAAA,gBACrCsM,QADqC;;AAGzD,mBAAO,CAACvM,IAAD,EAAOC,OAAP,EAAgB,MAAI,CAAC+lB,UAAL,CAAgBzZ,QAAhB,CAAhB,CAAP;AACD,WAJM,CAAP;AAKD,SARI,EASLuU,MATK,CAAP;AAWD;AACF;AAED;;;;;;;;sCAKkBmF,SAASliB,MAAM;AAC/B,UAAImiB,aAAa,GAAGD,OAAO,CAACliB,IAAD,CAA3B;AACA,aAAOmiB,aAAa,GAAG9pB,MAAM,CAACI,IAAP,CAAY0pB,aAAZ,EAA2BvrB,MAA3B,GAAoC,CAAvC,GAA2C,KAA/D;AACD;AAED;;;;;;;;;;iCAOa4P,MAAM;AACjBA,MAAAA,IAAI,GAAGA,IAAI,CAAC,CAAD,CAAJ,KAAY,GAAZ,GAAkBA,IAAI,CAACd,KAAL,CAAW,CAAX,CAAlB,GAAkCc,IAAzC;AACA,UAAID,QAAQ,GAAG,EAAf;AACA,UAAI4X,SAAS,GAAG,KAAKA,SAAL,GAAiB,KAAKA,SAAL,CAAeiE,IAAf,EAAjB,GAAyC,EAAzD;AACA,UAAInE,SAAS,GAAG,EAAhB,CAJiB;;AAOjB,UAAI,KAAKE,SAAL,IAAkB,KAAKF,SAA3B,EAAsC;AACpC,YACE,KAAKA,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAL,CACToE,SADS,CACC,CADD,EACI,KAAKpE,SAAL,CAAernB,MAAf,GAAwB,CAD5B,EAETyrB,SAFS,CAEC,CAFD,CAAZ;AAGD;;AAED,YACE,KAAKpE,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAL,CAAeoE,SAAf,CAAyB,CAAzB,CAAZ;AACD;;AAED,YACE,KAAKpE,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAL,CAAeoE,SAAf,CAAyB,CAAzB,EAA4B,KAAKpE,SAAL,CAAernB,MAAf,GAAwB,CAApD,CAAZ;AACD;;AAED,YACE,KAAKqnB,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAjB;AACD;AACF,OArCgB;;;AAwCjB,UAAI,KAAKA,SAAL,IAAkB,CAAC,KAAKE,SAA5B,EAAuC;AACrC,YACE,KAAKF,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAL,CAAeoE,SAAf,CAAyB,CAAzB,EAA4B,KAAKpE,SAAL,CAAernB,MAAf,GAAwB,CAApD,CAAZ;AACD;;AAED,YACE,KAAKqnB,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,GAAG,KAAKA,SAAjB;AACD;;AAED,YACE,KAAKA,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACA,cAAI0rB,YAAY,GAAG,KAAKrE,SAAL,CAAeoE,SAAf,CACjB,CADiB,EAEjB,KAAKpE,SAAL,CAAernB,MAAf,GAAwB,CAFP,CAAnB;AAIAqnB,UAAAA,SAAS,cAAOqE,YAAP,CAAT;AACD;;AAED,YACE,KAAKrE,SAAL,CAAe,CAAf,MAAsB,GAAtB,IACA,KAAKA,SAAL,CAAe,KAAKA,SAAL,CAAernB,MAAf,GAAwB,CAAvC,MAA8C,GAFhD,EAGE;AACAqnB,UAAAA,SAAS,cAAO,KAAKA,SAAZ,CAAT;AACD;AACF,OAxEgB;;;AA2EjB,UAAI,CAAC,KAAKA,SAAV,EAAqB;AACnBA,QAAAA,SAAS,GAAG,EAAZ;AACD,OA7EgB;;;AAgFjB,UAAI,eAAe/U,IAAf,CAAoB1C,IAApB,CAAJ,EAA+B;AAC7BD,QAAAA,QAAQ,IAAIC,IAAZ;AACD,OAFD,MAEO;AACL;AACA,YAAI2X,SAAS,CAACvnB,MAAd,EAAsB;AACpB2P,UAAAA,QAAQ,IACN4X,SAAS,CAACA,SAAS,CAACvnB,MAAV,GAAmB,CAApB,CAAT,KAAoC,GAApC,GAA0CunB,SAA1C,aAAyDA,SAAzD,MADF;AAED,SALI;;;AAQL5X,QAAAA,QAAQ,IAAI0X,SAAZ,CARK;;AAWL,YAAI1X,QAAQ,CAACA,QAAQ,CAAC3P,MAAT,GAAkB,CAAnB,CAAR,KAAkC,GAAtC,EAA2C;AACzC2P,UAAAA,QAAQ,IAAI,GAAZ;AACD,SAbI;;;AAgBLA,QAAAA,QAAQ,IAAIC,IAAZ,CAhBK;AAmBL;;AACA,YAAI,CAAC,eAAe0C,IAAf,CAAoB3C,QAApB,CAAL,EAAoC;AAClCA,UAAAA,QAAQ,cAAOA,QAAP,CAAR;AACAA,UAAAA,QAAQ,GAAGA,QAAQ,CAACvI,OAAT,CAAiB,MAAjB,EAAyB,GAAzB,CAAX;AACD;AACF;;AAED,aAAOuI,QAAP;AACD;AAED;;;;;;;;oDAKgC;AAAA;;AAC9ByW,MAAAA,mBAAmB,CAACtkB,OAApB,CAA4B,UAAA6pB,cAAc,EAAI;AAC5C,QAAA,MAAI,CAAC/F,WAAL,CAAiB+F,cAAjB;AACD,OAFD;AAGD;AAED;;;;;;;;0CAKsBC,sBAAsB;AAC1C,UAAI,OAAOrH,qBAAqB,CAACqH,oBAAD,CAA5B,KAAuD,SAA3D,EAAsE;AACpE,YAAIC,oBAAoB,GAAG,KAAKC,4CAAL,CACzBF,oBADyB,CAA3B;;AAGA,YAAIG,QAAQ,GACVH,oBAAoB,KAAK,KAAK5d,SAAL,CAAe6F,SAAf,CAAyB+X,oBAAzB,CAD3B;AAEA,YAAII,aAAa,GACf,KAAKhe,SAAL,CAAeC,WAAf,CAA2B2d,oBAA3B,MACA,KAAK5d,SAAL,CAAe6F,SAAf,CAAyB+X,oBAAzB,CAFF;AAIA,YAAMK,gBAAgB,GACpBF,QAAQ,IAAI,CAACC,aAAb,IAA8BH,oBADhC;AAGAtH,QAAAA,qBAAqB,CAACqH,oBAAD,CAArB,GAA8CK,gBAA9C;AACD;;AAED,aAAO1H,qBAAqB,CAACqH,oBAAD,CAA5B;AACD;AAED;;;;;;;;iDAK6BxiB,MAAM;AACjC,UAAI8iB,WAAW,GAAG,KAAKnkB,MAAL,IAAe,KAAKA,MAAL,CAAY8b,QAAZ,CAAqB/d,QAAQ,CAACsD,IAAD,CAA7B,CAAjC;AACA,UAAI+iB,kBAAkB,GAAG,KAAK1V,EAAL,CACvB,KAAK1O,MAAL,CAAYwO,wBAAZ,CAAqCnN,IAArC,CADuB,CAAzB;AAIA,aACE,CAAC8iB,WAAW,IAAIC,kBAAhB,KAAuC,CAAC,KAAKC,qBAAL,CAA2BhjB,IAA3B,CAD1C;AAGD;AAED;;;;;;;;iEAK6CwiB,sBAAsB;AACjE,UAAIM,WAAW,GACb,KAAKnkB,MAAL,IAAe,KAAKA,MAAL,CAAY8b,QAAZ,CAAqB/d,QAAQ,CAAC8lB,oBAAD,CAA7B,CADjB;AAEA,UAAIO,kBAAkB,GAAG,KAAK1V,EAAL,CACvB,KAAK1O,MAAL,CAAYwO,wBAAZ,CAAqCqV,oBAArC,CADuB,CAAzB;AAIA,aAAOM,WAAW,IAAIC,kBAAtB;AACD;AAED;;;;;;;;oCAKgBnpB,QAAQ8mB,SAAS1gB,MAAM;AACrCpG,MAAAA,MAAM,CAAClB,OAAP,CAAe,UAAAuqB,SAAS,EAAI;AAC1B,YAAI,CAACvC,OAAO,CAAC9nB,OAAR,CAAgBqqB,SAAhB,CAAL,EAAiC;AAC/B,gBAAM,IAAI5rB,KAAJ,YACA4rB,SADA,2CAC0CjjB,IAD1C,eAAN;AAGD;AACF,OAND;AAOD;AAED;;;;;;;;qCAKiBzH,OAAOqB,QAAQsmB,WAAW;AACzC,UAAIgD,aAAa,GAAGtpB,MAAM,CAACP,GAAP,CAAW,UAAA4pB,SAAS,EAAI;AAC1C,eAAO1qB,KAAK,CAAC0qB,SAAD,CAAL,CAAiBjpB,SAAxB;AACD,OAFmB,CAApB;AAGAkpB,MAAAA,aAAa,CAACnpB,IAAd,CAAmBmmB,SAAS,IAAI,EAAhC;AACA,aAAOgD,aAAa,CAACnf,MAAd,CAAqB,UAACof,KAAD,EAAQnpB,SAAR,EAAsB;AAChD,eAAO1B,MAAM,CAAC6qB,KAAD,EAAQnpB,SAAR,CAAb;AACD,OAFM,EAEJ,EAFI,CAAP;AAGD;AAED;;;;;;;;mDAK+BwE,WAAW8I,YAA4B;AAAA;;AAAA,UAAhB4Y,SAAgB,uEAAJ,EAAI;AACpE7nB,MAAAA,MAAM,CAACI,IAAP,CAAY6O,UAAU,IAAI,EAA1B,EACG7P,MADH,CACU,UAAAkB,IAAI,EAAI;AACd,eAAOwW,aAAa,CAAC7H,UAAU,CAAC3O,IAAD,CAAX,CAApB;AACD,OAHH,EAIGD,OAJH,CAIW,UAAAC,IAAI,EAAI;AACf,YAAIgP,UAAU,GAAG,MAAI,CAAChJ,MAAL,CAAYiJ,aAAZ,CAA0BpJ,SAA1B,CAAjB;;AACA,YAAI9C,WAAW,GAAGiM,UAAU,CAACE,cAAX,CAA0BlP,IAA1B,CAAlB;AAEAiF,QAAAA,MAAM,CACJlC,WAAW,IAAIA,WAAW,YAAYuD,SADlC,kEAEuDtG,IAFvD,iCAEkF6F,SAFlF,oEAAN;AAKA,YAAI4kB,0BAA0B,GAC5B1nB,WAAW,IACXA,WAAW,YAAYuD,SADvB,IAEAvD,WAAW,CAAC8C,SAAZ,KAA0BA,SAH5B;AAKAZ,QAAAA,MAAM,CACJ,CAACwlB,0BADG,0DAE6C5kB,SAF7C,0BAEsE7F,IAFtE,sLAAN;AAKA,YAAIoH,aAAa,GACfrE,WAAW,IAAIA,WAAW,CAAC+C,IAA3B,IAAmC/C,WAAW,CAAC+C,IAAZ,CAAiBM,WADtD;AAGAnB,QAAAA,MAAM,CACJ,CAACmC,aADG,0DAE6CvB,SAF7C,0BAEsE7F,IAFtE,6EAAN;AAKA,YAAI0qB,kBAAkB,GAAG/b,UAAU,CAAC3O,IAAD,CAAnC;AACA,YAAIwG,UAAU,aAAMzC,QAAQ,CAAC/D,IAAD,CAAd,OAAd;;AACA,YAAI,CAACunB,SAAS,CAACvnB,IAAD,CAAd,EAAsB;AACpB2O,UAAAA,UAAU,CAACnI,UAAD,CAAV,GAAyB,MAAI,CAACb,MAAL,OAAA,MAAI,GAC3B5C,WAAW,CAAC8C,SADe,4BAExB6kB,kBAAkB,CAACznB,kBAFK,GAAJ,CAGvBJ,EAHF;AAID;;AACD,eAAO8L,UAAU,CAAC3O,IAAD,CAAjB;AACD,OAxCH;AAyCD;;;;;;ACpwCH,4BAAemZ,UAAU,CAACtY,MAAX,CAAkB;AAC/B2Y,EAAAA,YAAY,EAAE,QADiB;AAE/BmR,EAAAA,YAAY,EAAE,IAFiB;AAI/BlP,EAAAA,WAJ+B,uBAInBpU,IAJmB,EAIb;AAChB,WAAOlD,UAAU,CAACkD,IAAD,CAAjB;AACD,GAN8B;AAQ/BuV,EAAAA,eAR+B,2BAQf5c,IARe,EAQT;AACpB,WAAOmE,UAAU,CAACnE,IAAD,CAAjB;AACD,GAV8B;AAY/Bgb,EAAAA,kBAZ+B,8BAYZ3T,IAZY,EAYN;AACvB,WAAO,KAAK2E,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoC3N,UAAU,CAACkD,IAAD,CAA9C,CAAP;AACD,GAd8B;AAgB/B0U,EAAAA,0BAhB+B,sCAgBJW,aAhBI,EAgBW;AACxC,WAAOvY,UAAU,CAACuY,aAAD,CAAjB;AACD,GAlB8B;AAoB/BN,EAAAA,qBApB+B,iCAoBT/U,IApBS,EAoBH;AAC1B,qBAAUlD,UAAU,CAAC,KAAK6H,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC7E,IAAtC,CAAD,CAApB;AACD,GAtB8B;AAwB/BoV,EAAAA,gBAxB+B,4BAwBd3N,gBAxBc,EAwBI;AACjC,qBAAU3K,UAAU,CAAC2K,gBAAD,CAApB;AACD,GA1B8B;AA4B/B0N,EAAAA,6BA5B+B,yCA4BD1N,gBA5BC,EA4BiB;AAC9C,qBAAU3K,UAAU,CAAC2K,gBAAD,CAApB;AACD,GA9B8B;AAgC/BwN,EAAAA,+BAhC+B,2CAgCCxN,gBAhCD,EAgCmB;AAChD,qBAAU3K,UAAU,CAAC2K,gBAAD,CAApB;AACD,GAlC8B;AAoC/BP,EAAAA,SApC+B,qBAoCrBkR,OApCqB,EAoCZ;AAAA;;AACjB,QAAIpY,IAAI,GAAG3H,MAAM,CAACI,IAAP,CAAY2f,OAAZ,EAAqB,CAArB,CAAX;AACA,QAAI7f,KAAK,GAAG6f,OAAO,CAACpY,IAAD,CAAnB;AACA,QAAIxB,SAAS,GAAG9B,QAAQ,CAACsD,IAAD,CAAxB;AACA,QAAI2H,UAAU,GAAG,KAAKhJ,MAAL,CAAYiJ,aAAZ,CAA0BpJ,SAA1B,CAAjB;AAJiB,QAKXe,qBALW,GAKoCoI,UALpC,CAKXpI,qBALW;AAAA,QAKYsG,mBALZ,GAKoC8B,UALpC,CAKY9B,mBALZ;AAMjB,QAAI0d,aAAa,GAAGlrB,MAAM,CAACI,IAAP,CAAY8G,qBAAZ,CAApB;AACA,QAAIikB,WAAW,GAAGnrB,MAAM,CAACI,IAAP,CAAYoN,mBAAZ,CAAlB;AAEA,QAAI4d,cAAc,GAAG;AACnBtnB,MAAAA,IAAI,EAAE;AACJ6D,QAAAA,IAAI,EAAE,KAAK2E,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCzK,IAApC,CADF;AAEJsH,QAAAA,UAAU,EAAE;AAFR;AADa,KAArB;;AAMA,QAAI/O,KAAK,CAACiD,EAAV,EAAc;AACZioB,MAAAA,cAAc,CAACtnB,IAAf,CAAoBX,EAApB,GAAyBjD,KAAK,CAACiD,EAA/B;AACD;;AAED,QAAI+L,aAAa,GAAG,EAApB;AAEAlP,IAAAA,MAAM,CAACI,IAAP,CAAYF,KAAZ,EAAmBG,OAAnB,CAA2B,UAAAK,GAAG,EAAI;AAChC,UAAIA,GAAG,KAAK,IAAZ,EAAkB;AAChB,YAAI,KAAI,CAACuqB,YAAT,EAAuB;AACrB,cAAIC,aAAa,CAACvU,QAAd,CAAuBjW,GAAvB,CAAJ,EAAiC;AAC/B,gBAAI2C,WAAW,GAAG6D,qBAAqB,CAACxG,GAAD,CAAvC;AACA,gBAAI2qB,gBAAgB,GAAGhoB,WAAW,CAAC8C,SAAnC;AACA+I,YAAAA,aAAa,CAACpK,SAAS,CAACpE,GAAD,CAAV,CAAb,GAAgC;AAC9BoD,cAAAA,IAAI,EAAE;AACJ6D,gBAAAA,IAAI,EAAE0jB,gBADF;AAEJloB,gBAAAA,EAAE,EAAEjD,KAAK,CAACQ,GAAD;AAFL;AADwB,aAAhC;AAMD,WATD,MASO,IAAIyqB,WAAW,CAACxU,QAAZ,CAAqBjW,GAArB,CAAJ,EAA+B;AACpC,gBAAI2C,YAAW,GAAGmK,mBAAmB,CAAC9M,GAAD,CAArC;AACA,gBAAI2qB,iBAAgB,GAAGhoB,YAAW,CAAC8C,SAAnC;AACA,gBAAIrC,IAAI,GAAG5D,KAAK,CAACQ,GAAD,CAAL,CAAWM,GAAX,CAAe,UAAAmC,EAAE,EAAI;AAC9B,qBAAO;AACLwE,gBAAAA,IAAI,EAAE0jB,iBADD;AAELloB,gBAAAA,EAAE,EAAFA;AAFK,eAAP;AAID,aALU,CAAX;AAMA+L,YAAAA,aAAa,CAACpK,SAAS,CAACpE,GAAD,CAAV,CAAb,GAAgC;AAAEoD,cAAAA,IAAI,EAAJA;AAAF,aAAhC;AACD,WAVM,MAUA;AACLsnB,YAAAA,cAAc,CAACtnB,IAAf,CAAoBmL,UAApB,CAA+BnK,SAAS,CAACpE,GAAD,CAAxC,IAAiDR,KAAK,CAACQ,GAAD,CAAtD;AACD;AACF,SAvBD,MAuBO;AACL0qB,UAAAA,cAAc,CAACtnB,IAAf,CAAoBmL,UAApB,CAA+BnK,SAAS,CAACpE,GAAD,CAAxC,IAAiDR,KAAK,CAACQ,GAAD,CAAtD;AACD;AACF;AACF,KA7BD;;AA8BA,QAAIV,MAAM,CAACI,IAAP,CAAY8O,aAAZ,EAA2B3Q,MAA/B,EAAuC;AACrC6sB,MAAAA,cAAc,CAACtnB,IAAf,CAAoBoL,aAApB,GAAoCA,aAApC;AACD;;AAED,WAAOkc,cAAP;AACD,GA5F8B;AA8F/BvZ,EAAAA,eA9F+B,2BA8FfvD,OA9Fe,EA8FN;AACvB,WAAOA,OAAO,CAACgE,WAAR,IAAuBhE,OAAO,CAACgE,WAAR,CAAoB/I,GAAlD;AACD;AAhG8B,CAAlB,CAAf;;ACAA,qBAAe+hB,qBAAqB,CAACnqB,MAAtB,CAA6B;AAC1C2Y,EAAAA,YAAY,EAAE,QAD4B;AAG1CiC,EAAAA,WAH0C,uBAG9BpU,IAH8B,EAGxB;AAChB,WAAOtD,QAAQ,CAACsD,IAAD,CAAf;AACD,GALyC;AAO1CuV,EAAAA,eAP0C,2BAO1B5c,IAP0B,EAOpB;AACpB,WAAO+D,QAAQ,CAAC/D,IAAD,CAAf;AACD,GATyC;AAW1Cgb,EAAAA,kBAX0C,8BAWvB3T,IAXuB,EAWjB;AACvB,WAAOtD,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCzK,IAApC,CAAD,CAAf;AACD,GAbyC;AAe1C0U,EAAAA,0BAf0C,sCAefW,aAfe,EAeA;AACxC,WAAO3Y,QAAQ,CAAC2Y,aAAD,CAAf;AACD,GAjByC;AAmB1CN,EAAAA,qBAnB0C,iCAmBpB/U,IAnBoB,EAmBd;AAC1B,WAAOtD,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0B6F,SAA1B,CAAoCzK,IAApC,CAAD,CAAf;AACD,GArByC;AAuB1CoV,EAAAA,gBAvB0C,4BAuBzB3N,gBAvByB,EAuBP;AACjC,WAAO/K,QAAQ,CAAC,KAAKiI,UAAL,CAAgBC,SAAhB,CAA0BC,WAA1B,CAAsC4C,gBAAtC,CAAD,CAAf;AACD,GAzByC;AA2B1CyC,EAAAA,eA3B0C,2BA2B1BvD,OA3B0B,EA2BjB;AACvB,WAAOA,OAAO,CAACgE,WAAR,IAAuBhE,OAAO,CAACgE,WAAR,CAAoB/I,GAAlD;AACD;AA7ByC,CAA7B,CAAf;;ACHA;;;;;AAKA,AAAe,iBAAW;AACxB,SAAO,uCAAuC5D,OAAvC,CAA+C,OAA/C,EAAwD,UAASwG,CAAT,EAAY;AACzE,QAAIof,CAAC,GAAIC,IAAI,CAACC,MAAL,KAAgB,EAAjB,GAAuB,CAA/B;AACA,QAAIC,CAAC,GAAGvf,CAAC,KAAK,GAAN,GAAYof,CAAZ,GAAiBA,CAAC,GAAG,GAAL,GAAY,GAApC;AACA,WAAOG,CAAC,CAAC7oB,QAAF,CAAW,EAAX,CAAP;AACD,GAJM,CAAP;AAKD;;ACsCD;;;;AAGA,SAAS8oB,OAAT,GAA0B;AAAA,oCAANhf,IAAM;AAANA,IAAAA,IAAM;AAAA;;AACxB,oBAAWY,OAAX,EAAsBZ,IAAtB;AACD;AAED;;;;;AAGA,SAASif,SAAT,GAA4B;AAAA,qCAANjf,IAAM;AAANA,IAAAA,IAAM;AAAA;;AAC1B,oBAAW/F,SAAX,EAAwB+F,IAAxB;AACD;AA+CD,YAAe;AACbhN,EAAAA,OAAO,EAAPA,OADa;AAEbgE,EAAAA,QAAQ,EAARA,QAFa;AAGbgoB,EAAAA,OAAO,EAAPA,OAHa;AAIbC,EAAAA,SAAS,EAATA;AAJa,CAAf;;;;;"}
\No newline at end of file