Warning, /frameworks/syntax-highlighting/autotests/reference/test.swift.ref is written in an unsupported language. File is not indexed.
0001 <Comment>//</Comment><br/> 0002 <Comment>// Arguments.swift</Comment><br/> 0003 <Comment>// SwiftFormat</Comment><br/> 0004 <Comment>//</Comment><br/> 0005 <Comment>// Created by Nick Lockwood on 07/08/2018.</Comment><br/> 0006 <Comment>// Copyright © 2018 Nick Lockwood.</Comment><br/> 0007 <Comment>//</Comment><br/> 0008 <Comment>// Distributed under the permissive MIT license</Comment><br/> 0009 <Comment>// Get the latest version from here:</Comment><br/> 0010 <Comment>//</Comment><br/> 0011 <Comment>// https://github.com/nicklockwood/SwiftFormat</Comment><br/> 0012 <Comment>//</Comment><br/> 0013 <Comment>// Permission is hereby granted, free of charge, to any person obtaining a copy</Comment><br/> 0014 <Comment>// of this software and associated documentation files (the "Software"), to deal</Comment><br/> 0015 <Comment>// in the Software without restriction, including without limitation the rights</Comment><br/> 0016 <Comment>// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</Comment><br/> 0017 <Comment>// copies of the Software, and to permit persons to whom the Software is</Comment><br/> 0018 <Comment>// furnished to do so, subject to the following conditions:</Comment><br/> 0019 <Comment>//</Comment><br/> 0020 <Comment>// The above copyright notice and this permission notice shall be included in all</Comment><br/> 0021 <Comment>// copies or substantial portions of the Software.</Comment><br/> 0022 <Comment>//</Comment><br/> 0023 <Comment>// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</Comment><br/> 0024 <Comment>// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</Comment><br/> 0025 <Comment>// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</Comment><br/> 0026 <Comment>// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</Comment><br/> 0027 <Comment>// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</Comment><br/> 0028 <Comment>// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</Comment><br/> 0029 <Comment>// SOFTWARE.</Comment><br/> 0030 <Comment>//</Comment><br/> 0031 <Normal Text></Normal Text><br/> 0032 <Keyword>import</Keyword><Normal Text> </Normal Text><Imports>Foundation</Imports><br/> 0033 <Normal Text></Normal Text><br/> 0034 <Keyword>extension</Keyword><Normal Text> Options </Normal Text><Symbol>{</Symbol><br/> 0035 <Normal Text> </Normal Text><Keyword>static</Keyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>maxArgumentNameLength</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Decimal>16</Decimal><br/> 0036 <Normal Text></Normal Text><br/> 0037 <Normal Text> </Normal Text><Keyword>init</Keyword><Symbol>(</Symbol><Normal Text>_ args</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>],</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> directory</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0038 <Normal Text> fileOptions </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> fileOptionsFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0039 <Normal Text> formatOptions </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> formatOptionsFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>)</Symbol><br/> 0040 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lint</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>.</Symbol><Normal Text>keys</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>"lint"</String><Symbol>)</Symbol><br/> 0041 <Normal Text> </Normal Text><Keyword>self</Keyword><Symbol>.</Symbol><Normal Text>lint </Normal Text><Symbol>=</Symbol><Normal Text> lint</Normal Text><br/> 0042 <Normal Text> rules </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rulesFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> lint</Normal Text><Symbol>:</Symbol><Normal Text> lint</Normal Text><Symbol>)</Symbol><br/> 0043 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0044 <Normal Text></Normal Text><br/> 0045 <Normal Text> </Normal Text><Keyword>mutating</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>addArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0046 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>oldArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> argumentsFor</Normal Text><Symbol>(</Symbol><Keyword>self</Keyword><Symbol>)</Symbol><br/> 0047 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>newArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> mergeArguments</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> into</Normal Text><Symbol>:</Symbol><Normal Text> oldArguments</Normal Text><Symbol>)</Symbol><br/> 0048 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>newOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> Options</Normal Text><Symbol>(</Symbol><Normal Text>newArguments</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0049 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileInfo</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> formatOptions</Normal Text><Symbol>?.</Symbol><Normal Text>fileInfo </Normal Text><Symbol>{</Symbol><br/> 0050 <Normal Text> newOptions</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions</Normal Text><Symbol>?.</Symbol><Normal Text>fileInfo </Normal Text><Symbol>=</Symbol><Normal Text> fileInfo</Normal Text><br/> 0051 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0052 <Normal Text> </Normal Text><Keyword>self</Keyword><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> newOptions</Normal Text><br/> 0053 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0054 <Symbol>}</Symbol><br/> 0055 <Normal Text></Normal Text><br/> 0056 <Comment>// Parse a space-delimited string into an array of command-line arguments</Comment><br/> 0057 <Comment>// Replicates the behavior implemented by the console when parsing input</Comment><br/> 0058 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>argumentString</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>ignoreComments</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> true</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0059 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><String>""</String><Symbol>]</Symbol><Normal Text> </Normal Text><Comment>// Arguments always begin with script path</Comment><br/> 0060 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>characters</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>.</Symbol><Normal Text>UnicodeScalarView</Normal Text><Symbol>.</Symbol><Normal Text>SubSequence</Normal Text><Symbol>(</Symbol><Normal Text>argumentString</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>)</Symbol><br/> 0061 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>string</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0062 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>escaped</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0063 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>quoted</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0064 <Normal Text> loop</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>char</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> characters</Normal Text><Symbol>.</Symbol><Normal Text>popFirst</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0065 <Normal Text> </Normal Text><ControlFlowKeyword>switch</ControlFlowKeyword><Normal Text> char </Normal Text><Symbol>{</Symbol><br/> 0066 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"#"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>ignoreComments </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/> 0067 <Normal Text> </Normal Text><ControlFlowKeyword>break</ControlFlowKeyword><Normal Text> loop </Normal Text><Comment>// comment</Comment><br/> 0068 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped</Normal Text><Symbol>:</Symbol><br/> 0069 <Normal Text> escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0070 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/> 0071 <Normal Text> quoted </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0072 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> quoted</Normal Text><Symbol>:</Symbol><br/> 0073 <Normal Text> quoted </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0074 <Normal Text> </Normal Text><ControlFlowKeyword>fallthrough</ControlFlowKeyword><br/> 0075 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>" "</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/> 0076 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0077 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/> 0078 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0079 <Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>removeAll</Normal Text><Symbol>()</Symbol><br/> 0080 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> escaped</Normal Text><Symbol>:</Symbol><br/> 0081 <Normal Text> escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0082 <Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\"</String Char><String>"</String><Symbol>)</Symbol><br/> 0083 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> _ </Normal Text><Keyword>where</Keyword><Normal Text> escaped </Normal Text><Symbol>&&</Symbol><Normal Text> quoted</Normal Text><Symbol>:</Symbol><br/> 0084 <Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\\</String Char><String>"</String><Symbol>)</Symbol><br/> 0085 <Normal Text> </Normal Text><ControlFlowKeyword>fallthrough</ControlFlowKeyword><br/> 0086 <Normal Text> </Normal Text><Keyword>default</Keyword><Symbol>:</Symbol><br/> 0087 <Normal Text> escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0088 <Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>Character</Normal Text><Symbol>(</Symbol><Normal Text>char</Normal Text><Symbol>))</Symbol><br/> 0089 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0090 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0091 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0092 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/> 0093 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0094 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><br/> 0095 <Symbol>}</Symbol><br/> 0096 <Normal Text></Normal Text><br/> 0097 <Comment>// Parse a flat array of command-line arguments into a dictionary of flags and values</Comment><br/> 0098 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>preprocessArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>_</Variable><Normal Text> </Normal Text><Variable>names</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0099 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>anonymousArgs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Decimal>0</Decimal><br/> 0100 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>namedArgs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[:]</Symbol><br/> 0101 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>name</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0102 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> arg </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> args </Normal Text><Symbol>{</Symbol><br/> 0103 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"--"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0104 <Normal Text> </Normal Text><Comment>// Long argument names</Comment><br/> 0105 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>key</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>(</Symbol><Decimal>2</Decimal><Symbol>))</Symbol><br/> 0106 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> names</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0107 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> bestMatches</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>for</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> key</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> names</Normal Text><Symbol>).</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0108 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option --</String><Error>\(</Error><String>key)"</String><Symbol>)</Symbol><br/> 0109 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0110 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option --</String><Error>\(</Error><String>key). Did you mean --</String><Error>\(</Error><String>match)?"</String><Symbol>)</Symbol><br/> 0111 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0112 <Normal Text> name </Normal Text><Symbol>=</Symbol><Normal Text> key</Normal Text><br/> 0113 <Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0114 <Normal Text> </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/> 0115 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"-"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0116 <Normal Text> </Normal Text><Comment>// Short argument names</Comment><br/> 0117 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>flag</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>())</Symbol><br/> 0118 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> names</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><Normal Text>flag</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0119 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown flag -</String><Error>\(</Error><String>flag)"</String><Symbol>)</Symbol><br/> 0120 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0121 <Normal Text> name </Normal Text><Symbol>=</Symbol><Normal Text> match</Normal Text><br/> 0122 <Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0123 <Normal Text> </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/> 0124 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0125 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> name </Normal Text><Symbol>==</Symbol><Normal Text> </Normal Text><String>""</String><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0126 <Normal Text> </Normal Text><Comment>// Argument is anonymous</Comment><br/> 0127 <Normal Text> name </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>anonymousArgs</Normal Text><Symbol>)</Symbol><br/> 0128 <Normal Text> anonymousArgs </Normal Text><Symbol>+=</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><br/> 0129 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0130 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arg</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><br/> 0131 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>hasTrailingComma</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasSuffix</Normal Text><Symbol>(</Symbol><String>","</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>&&</Symbol><Normal Text> arg </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><String>","</String><br/> 0132 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> hasTrailingComma </Normal Text><Symbol>{</Symbol><br/> 0133 <Normal Text> arg </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>dropLast</Normal Text><Symbol>())</Symbol><br/> 0134 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0135 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>existing</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>],</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>existing</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><br/> 0136 <Normal Text> </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a more general way to represent merge-able options</Comment><br/> 0137 <Normal Text> </Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"unexclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"disable"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"enable"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"lintonly"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"rules"</String><Symbol>].</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>name</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><br/> 0138 <Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0139 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> name </Normal Text><Symbol>&&</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>isSetType</Normal Text><br/> 0140 <Normal Text> </Normal Text><Symbol>})</Symbol><br/> 0141 <Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0142 <Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> existing </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><String>","</String><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> arg</Normal Text><br/> 0143 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0144 <Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><br/> 0145 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0146 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>hasTrailingComma </Normal Text><Symbol>{</Symbol><br/> 0147 <Normal Text> name </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0148 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0149 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0150 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> namedArgs</Normal Text><br/> 0151 <Symbol>}</Symbol><br/> 0152 <Normal Text></Normal Text><br/> 0153 <Comment>// Find best match for a given string in a list of options</Comment><br/> 0154 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>bestMatches</Function><Symbol>(</Symbol><Variable>for</Variable><Normal Text> </Normal Text><Variable>query</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>options</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0155 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lowercaseQuery</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> query</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/> 0156 <Normal Text> </Normal Text><Comment>// Sort matches by Levenshtein edit distance</Comment><br/> 0157 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> options</Normal Text><br/> 0158 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><Normal Text> option </Normal Text><Symbol>-></Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>String</Normal Text><Symbol>,</Symbol><Normal Text> distance</Normal Text><Symbol>:</Symbol><Normal Text> Int</Normal Text><Symbol>,</Symbol><Normal Text> commonPrefix</Normal Text><Symbol>:</Symbol><Normal Text> Int</Normal Text><Symbol>)?</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/> 0159 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lowercaseOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/> 0160 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>distance</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> editDistance</Normal Text><Symbol>(</Symbol><Normal Text>lowercaseOption</Normal Text><Symbol>,</Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>)</Symbol><br/> 0161 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>commonPrefix</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> lowercaseOption</Normal Text><Symbol>.</Symbol><Normal Text>commonPrefix</Normal Text><Symbol>(</Symbol><Normal Text>with</Normal Text><Symbol>:</Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>)</Symbol><br/> 0162 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> commonPrefix</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> distance </Normal Text><Symbol>></Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>/</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0163 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0164 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0165 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>option</Normal Text><Symbol>,</Symbol><Normal Text> distance</Normal Text><Symbol>,</Symbol><Normal Text> commonPrefix</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>)</Symbol><br/> 0166 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0167 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>sorted </Normal Text><Symbol>{</Symbol><br/> 0168 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>distance </Normal Text><Symbol>==</Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>distance </Normal Text><Symbol>{</Symbol><br/> 0169 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>commonPrefix </Normal Text><Symbol>></Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>commonPrefix</Normal Text><br/> 0170 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0171 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>distance </Normal Text><Symbol><</Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>distance</Normal Text><br/> 0172 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0173 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.0</Float><Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0174 <Symbol>}</Symbol><br/> 0175 <Normal Text></Normal Text><br/> 0176 <Comment>/// The Damerau-Levenshtein edit-distance between two strings</Comment><br/> 0177 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>editDistance</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>lhs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>_</Variable><Normal Text> </Normal Text><Variable>rhs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>Int</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0178 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lhs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>lhs</Normal Text><Symbol>)</Symbol><br/> 0179 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rhs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>rhs</Normal Text><Symbol>)</Symbol><br/> 0180 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>dist</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[[</Symbol><Normal Text>Int</Normal Text><Symbol>]]()</Symbol><br/> 0181 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> i </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>0</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> lhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/> 0182 <Normal Text> dist</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>([</Symbol><Normal Text>i</Normal Text><Symbol>])</Symbol><br/> 0183 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0184 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> j </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> rhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/> 0185 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Decimal>0</Decimal><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>j</Normal Text><Symbol>)</Symbol><br/> 0186 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0187 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> i </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> lhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/> 0188 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> j </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> rhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/> 0189 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0190 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>])</Symbol><br/> 0191 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0192 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>min</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><br/> 0193 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><br/> 0194 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>))</Symbol><br/> 0195 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0196 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> i </Normal Text><Symbol>></Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><Normal Text> j </Normal Text><Symbol>></Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>],</Symbol><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0197 <Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> min</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>],</Symbol><Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>)</Symbol><br/> 0198 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0199 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0200 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0201 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>lhs</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>][</Symbol><Normal Text>rhs</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>]</Symbol><br/> 0202 <Symbol>}</Symbol><br/> 0203 <Normal Text></Normal Text><br/> 0204 <Comment>// Parse a comma-delimited list of items</Comment><br/> 0205 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseCommaDelimitedList</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>string</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0206 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>components</Normal Text><Symbol>(</Symbol><Normal Text>separatedBy</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>).</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><br/> 0207 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>item</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespacesAndNewlines</Normal Text><Symbol>)</Symbol><br/> 0208 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> item</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>?</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><Normal Text> </Normal Text><Symbol>:</Symbol><Normal Text> item</Normal Text><br/> 0209 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0210 <Symbol>}</Symbol><br/> 0211 <Normal Text></Normal Text><br/> 0212 <Comment>// Parse a comma-delimited string into an array of rules</Comment><br/> 0213 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>allRules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>.</Symbol><Normal Text>keys</Normal Text><Symbol>)</Symbol><br/> 0214 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseRules</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>rules</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0215 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>).</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> proposedName </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/> 0216 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>name</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0217 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> proposedName</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/> 0218 <Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0219 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> name</Normal Text><br/> 0220 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0221 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0222 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> proposedName</Normal Text><br/> 0223 <Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0224 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> rule </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Keyword>where</Keyword><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>proposedName</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0225 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><br/> 0226 <Normal Text> </Normal Text><String>"'</String><Error>\(</Error><String>proposedName)' is not a formatting rule. Did you mean '</String><Error>\(</Error><String>rule.name)'?"</String><br/> 0227 <Normal Text> </Normal Text><Symbol>)</Symbol><br/> 0228 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0229 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"'</String><Error>\(</Error><String>proposedName)' is not a formatting rule"</String><Symbol>)</Symbol><br/> 0230 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0231 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> bestMatches</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>for</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> proposedName</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>allRules</Normal Text><Symbol>)).</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0232 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown rule '</String><Error>\(</Error><String>proposedName)'"</String><Symbol>)</Symbol><br/> 0233 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0234 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown rule '</String><Error>\(</Error><String>proposedName)'. Did you mean '</String><Error>\(</Error><String>match)'?"</String><Symbol>)</Symbol><br/> 0235 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0236 <Symbol>}</Symbol><br/> 0237 <Normal Text></Normal Text><br/> 0238 <Comment>// Parse single file path, disallowing globs or commas</Comment><br/> 0239 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parsePath</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>path</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>for</Variable><Normal Text> </Normal Text><Variable>argument</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>URL</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0240 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>expandedPath</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> expandPath</Normal Text><Symbol>(</Symbol><Normal Text>path</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0241 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>FileManager</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>fileExists</Normal Text><Symbol>(</Symbol><Normal Text>atPath</Normal Text><Symbol>:</Symbol><Normal Text> expandedPath</Normal Text><Symbol>.</Symbol><Normal Text>path</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0242 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> path</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>","</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0243 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>argument) argument does not support multiple paths"</String><Symbol>)</Symbol><br/> 0244 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0245 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> pathContainsGlobSyntax</Normal Text><Symbol>(</Symbol><Normal Text>path</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0246 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>argument) path cannot contain wildcards"</String><Symbol>)</Symbol><br/> 0247 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0248 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0249 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> expandedPath</Normal Text><br/> 0250 <Symbol>}</Symbol><br/> 0251 <Normal Text></Normal Text><br/> 0252 <Comment>// Parse one or more comma-delimited file paths, expanding globs as required</Comment><br/> 0253 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parsePaths</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>paths</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>URL</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0254 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> matchGlobs</Normal Text><Symbol>(</Symbol><Normal Text>expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>paths</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>),</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0255 <Symbol>}</Symbol><br/> 0256 <Normal Text></Normal Text><br/> 0257 <Comment>// Merge two dictionaries of arguments</Comment><br/> 0258 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>mergeArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>into</Variable><Normal Text> </Normal Text><Variable>config</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0259 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>input</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> config</Normal Text><br/> 0260 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>output</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><br/> 0261 <Normal Text> </Normal Text><Comment>// Merge excluded urls</Comment><br/> 0262 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>exclude</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>),</Symbol><br/> 0263 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>excluded</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>({</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><br/> 0264 <Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0265 <Normal Text> excluded</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>exclude</Normal Text><Symbol>)</Symbol><br/> 0266 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>excluded</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0267 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0268 <Normal Text> </Normal Text><Comment>// Merge unexcluded urls</Comment><br/> 0269 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>unexclude</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>),</Symbol><br/> 0270 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>unexcluded</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>({</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><br/> 0271 <Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0272 <Normal Text> unexcluded</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>unexclude</Normal Text><Symbol>)</Symbol><br/> 0273 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>unexcluded</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0274 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0275 <Normal Text> </Normal Text><Comment>// Merge rules</Comment><br/> 0276 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0277 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0278 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0279 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0280 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0281 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0282 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0283 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0284 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0285 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0286 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0287 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0288 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0289 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0290 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0291 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>enable</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0292 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0293 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0294 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0295 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0296 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0297 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>disable</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0298 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0299 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0300 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0301 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0302 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0303 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>enable</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0304 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0305 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0306 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0307 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0308 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0309 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0310 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>disable</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0311 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0312 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0313 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0314 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0315 <Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_lintonly</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0316 <Normal Text> output</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0317 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0318 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0319 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0320 <Normal Text> </Normal Text><Comment>// Merge other arguments</Comment><br/> 0321 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>,</Symbol><Normal Text> inValue</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> input </Normal Text><Symbol>{</Symbol><br/> 0322 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>outValue</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0323 <Normal Text> output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> inValue</Normal Text><br/> 0324 <Normal Text> </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/> 0325 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0326 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> key </Normal Text><Symbol>&&</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>isSetType </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0327 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>inOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>inValue</Normal Text><Symbol>)</Symbol><br/> 0328 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>outOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>outValue</Normal Text><Symbol>)</Symbol><br/> 0329 <Normal Text> output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>inOptions</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>outOptions</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0330 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0331 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0332 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> output</Normal Text><br/> 0333 <Symbol>}</Symbol><br/> 0334 <Normal Text></Normal Text><br/> 0335 <Comment>// Parse a configuration file into a dictionary of arguments</Comment><br/> 0336 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseConfigFile</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>data</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Data</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0337 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>input</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>data</Normal Text><Symbol>:</Symbol><Normal Text> data</Normal Text><Symbol>,</Symbol><Normal Text> encoding</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>utf8</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0338 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>reading</Normal Text><Symbol>(</Symbol><String>"Unable to read data for configuration file"</String><Symbol>)</Symbol><br/> 0339 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0340 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lines</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> cumulate</Normal Text><Symbol>(</Symbol><Normal Text>successiveLines</Normal Text><Symbol>:</Symbol><Normal Text> input</Normal Text><Symbol>.</Symbol><Normal Text>components</Normal Text><Symbol>(</Symbol><Normal Text>separatedBy</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>newlines</Normal Text><Symbol>))</Symbol><br/> 0341 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> lines</Normal Text><Symbol>.</Symbol><Normal Text>flatMap </Normal Text><Symbol>{</Symbol><Normal Text> line </Normal Text><Symbol>-></Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/> 0342 <Normal Text> </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: parseArguments isn't a perfect fit here - should we use a different approach?</Comment><br/> 0343 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>line</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> line</Normal Text><Symbol>.</Symbol><Normal Text>replacingOccurrences</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>n"</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><br/> 0344 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>parts</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseArguments</Normal Text><Symbol>(</Symbol><Normal Text>line</Normal Text><Symbol>,</Symbol><Normal Text> ignoreComments</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><Symbol>).</Symbol><Normal Text>dropFirst</Normal Text><Symbol>().</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/> 0345 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>replacingOccurrences</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>n"</String><Symbol>)</Symbol><br/> 0346 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0347 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>key</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parts</Normal Text><Symbol>.</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0348 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>[]</Symbol><br/> 0349 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0350 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>key</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"-"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0351 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option '</String><Error>\(</Error><String>key)' in configuration file"</String><Symbol>)</Symbol><br/> 0352 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0353 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>,</Symbol><Normal Text> parts</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>" "</String><Symbol>)]</Symbol><br/> 0354 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0355 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0356 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> preprocessArguments</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>,</Symbol><Normal Text> optionsArguments</Normal Text><Symbol>)</Symbol><br/> 0357 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>catch</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>FormatError</Variable><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>message</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0358 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>message) in configuration file"</String><Symbol>)</Symbol><br/> 0359 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0360 <Symbol>}</Symbol><br/> 0361 <Normal Text></Normal Text><br/> 0362 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>cumulate</Function><Symbol>(</Symbol><Variable>successiveLines</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0363 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>cumulatedLines</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]()</Symbol><br/> 0364 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>iterator</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> successiveLines</Normal Text><Symbol>.</Symbol><Normal Text>makeIterator</Normal Text><Symbol>()</Symbol><br/> 0365 <Normal Text> </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>currentLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> iterator</Normal Text><Symbol>.</Symbol><Normal Text>next</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0366 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>cumulatedLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> effectiveContent</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> currentLine</Normal Text><Symbol>)</Symbol><br/> 0367 <Normal Text> </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> cumulatedLine</Normal Text><Symbol>.</Symbol><Normal Text>hasSuffix</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\\</String Char><String>"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0368 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>nextLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> iterator</Normal Text><Symbol>.</Symbol><Normal Text>next</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0369 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>reading</Normal Text><Symbol>(</Symbol><String>"Configuration file ends with an illegal line continuation character '</String><String Char>\'</String Char><String>"</String><Symbol>)</Symbol><br/> 0370 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0371 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>nextLine</Normal Text><Symbol>.</Symbol><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespaces</Normal Text><Symbol>).</Symbol><Normal Text>starts</Normal Text><Symbol>(</Symbol><Normal Text>with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"#"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0372 <Normal Text> cumulatedLine </Normal Text><Symbol>=</Symbol><Normal Text> cumulatedLine</Normal Text><Symbol>.</Symbol><Normal Text>dropLast</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> effectiveContent</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> nextLine</Normal Text><Symbol>)</Symbol><br/> 0373 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0374 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0375 <Normal Text> cumulatedLines</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>String</Normal Text><Symbol>(</Symbol><Normal Text>cumulatedLine</Normal Text><Symbol>))</Symbol><br/> 0376 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0377 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> cumulatedLines</Normal Text><br/> 0378 <Symbol>}</Symbol><br/> 0379 <Normal Text></Normal Text><br/> 0380 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>effectiveContent</Function><Symbol>(</Symbol><Variable>of</Variable><Normal Text> </Normal Text><Variable>line</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0381 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> line</Normal Text><br/> 0382 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>prefix </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Normal Text> </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><String>"#"</String><Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0383 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespaces</Normal Text><Symbol>)</Symbol><br/> 0384 <Symbol>}</Symbol><br/> 0385 <Normal Text></Normal Text><br/> 0386 <Comment>// Serialize a set of options into either an arguments string or a file</Comment><br/> 0387 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>serialize</Function><Symbol>(</Symbol><Variable>options</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Options</Data Type><Symbol>,</Symbol><br/> 0388 <Normal Text> </Normal Text><Variable>swiftVersion</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Version</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>undefined</Normal Text><Symbol>,</Symbol><br/> 0389 <Normal Text> </Normal Text><Variable>excludingDefaults</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> false</Normal Text><Symbol>,</Symbol><br/> 0390 <Normal Text> </Normal Text><Variable>separator</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><br/> 0391 <Symbol>{</Symbol><br/> 0392 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]]()</Symbol><br/> 0393 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>fileOptions </Normal Text><Symbol>{</Symbol><br/> 0394 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/> 0395 <Normal Text> Options</Normal Text><Symbol>(</Symbol><Normal Text>fileOptions</Normal Text><Symbol>:</Symbol><Normal Text> fileOptions</Normal Text><Symbol>),</Symbol><br/> 0396 <Normal Text> excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/> 0397 <Normal Text> </Normal Text><Symbol>))</Symbol><br/> 0398 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0399 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formatOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions </Normal Text><Symbol>{</Symbol><br/> 0400 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/> 0401 <Normal Text> Options</Normal Text><Symbol>(</Symbol><Normal Text>formatOptions</Normal Text><Symbol>:</Symbol><Normal Text> formatOptions</Normal Text><Symbol>),</Symbol><br/> 0402 <Normal Text> excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/> 0403 <Normal Text> </Normal Text><Symbol>))</Symbol><br/> 0404 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> swiftVersion </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>undefined </Normal Text><Symbol>{</Symbol><br/> 0405 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>descriptor</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>swiftVersion</Normal Text><br/> 0406 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>([</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>:</Symbol><Normal Text> swiftVersion</Normal Text><Symbol>.</Symbol><Normal Text>rawValue</Normal Text><Symbol>])</Symbol><br/> 0407 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0408 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>rules </Normal Text><Symbol>{</Symbol><br/> 0409 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/> 0410 <Normal Text> Options</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>:</Symbol><Normal Text> rules</Normal Text><Symbol>),</Symbol><br/> 0411 <Normal Text> excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/> 0412 <Normal Text> </Normal Text><Symbol>))</Symbol><br/> 0413 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0414 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><br/> 0415 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> serialize</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>:</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0416 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>filter </Normal Text><Symbol>{</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>$</Normal Text><Float>0.</Float><Normal Text>isEmpty </Normal Text><Symbol>}</Symbol><br/> 0417 <Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><br/> 0418 <Symbol>}</Symbol><br/> 0419 <Normal Text></Normal Text><br/> 0420 <Comment>// Serialize arguments</Comment><br/> 0421 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>serialize</Function><Symbol>(</Symbol><Variable>arguments</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><br/> 0422 <Normal Text> </Normal Text><Variable>separator</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><br/> 0423 <Symbol>{</Symbol><br/> 0424 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/> 0425 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> $</Normal Text><Decimal>1</Decimal><br/> 0426 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> value</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>" "</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0427 <Normal Text> value </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><Error>\(</Error><String>value.replacingOccurrences(of: "</String><Normal Text>\</Normal Text><String>""</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\\"</String Char><String>"</String><Symbol>))</Symbol><Normal Text>\</Normal Text><String>""</String><br/> 0428 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0429 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><String>"--</String><Error>\(</Error><String Interpolation>$</String Interpolation><String>0) </String><Error>\(</Error><String>value)"</String><br/> 0430 <Normal Text> </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><br/> 0431 <Symbol>}</Symbol><br/> 0432 <Normal Text></Normal Text><br/> 0433 <Comment>// Get command line arguments from options</Comment><br/> 0434 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>argumentsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>options</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Options</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>excludingDefaults</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> false</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0435 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>args</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]()</Symbol><br/> 0436 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>fileOptions </Normal Text><Symbol>{</Symbol><br/> 0437 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>fileArguments</Normal Text><Symbol>)</Symbol><br/> 0438 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0439 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>||</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>!=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>{</Symbol><br/> 0440 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"symlinks"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>?</Symbol><Normal Text> </Normal Text><String>"follow"</String><Normal Text> </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"ignore"</String><br/> 0441 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0442 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"symlinks"</String><Symbol>)</Symbol><br/> 0443 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0444 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0445 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0446 <Normal Text> </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better alternative to stringifying url</Comment><br/> 0447 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>description </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0448 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0449 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"exclude"</String><Symbol>)</Symbol><br/> 0450 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0451 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0452 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0453 <Normal Text> </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better alternative to stringifying url</Comment><br/> 0454 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>description </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0455 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0456 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"unexclude"</String><Symbol>)</Symbol><br/> 0457 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0458 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0459 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>||</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>!=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>{</Symbol><br/> 0460 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"minversion"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>minVersion</Normal Text><Symbol>.</Symbol><Normal Text>description</Normal Text><br/> 0461 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0462 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"minversion"</String><Symbol>)</Symbol><br/> 0463 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0464 <Normal Text> assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>)</Symbol><br/> 0465 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0466 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formatOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions </Normal Text><Symbol>{</Symbol><br/> 0467 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> descriptor </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>isRenamed </Normal Text><Symbol>{</Symbol><br/> 0468 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>fromOptions</Normal Text><Symbol>(</Symbol><Normal Text>formatOptions</Normal Text><Symbol>)</Symbol><br/> 0469 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> value </Normal Text><Symbol>!=</Symbol><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>fromOptions</Normal Text><Symbol>(.</Symbol><Keyword>default</Keyword><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><br/> 0470 <Normal Text> </Normal Text><Symbol>(!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>isDeprecated</Normal Text><Symbol>)</Symbol><br/> 0471 <Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0472 <Normal Text> </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/> 0473 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0474 <Normal Text> </Normal Text><Comment>// Special case for swiftVersion</Comment><br/> 0475 <Normal Text> </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better solution for this</Comment><br/> 0476 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>swiftVersion</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>,</Symbol><br/> 0477 <Normal Text> value </Normal Text><Symbol>==</Symbol><Normal Text> Version</Normal Text><Symbol>.</Symbol><Normal Text>undefined</Normal Text><Symbol>.</Symbol><Normal Text>rawValue</Normal Text><br/> 0478 <Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0479 <Normal Text> </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/> 0480 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0481 <Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> value</Normal Text><br/> 0482 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0483 <Normal Text> </Normal Text><Comment>// Special case for wrapParameters</Comment><br/> 0484 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>argumentName</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>wrapParameters</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><br/> 0485 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> WrapMode</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>rawValue </Normal Text><Symbol>{</Symbol><br/> 0486 <Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>wrapArguments</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><br/> 0487 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0488 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0489 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>lint </Normal Text><Symbol>{</Symbol><br/> 0490 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"lint"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/> 0491 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0492 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>rules </Normal Text><Symbol>{</Symbol><br/> 0493 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>defaultRules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>disabledByDefault</Normal Text><Symbol>)</Symbol><br/> 0494 <Normal Text></Normal Text><br/> 0495 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enabled</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>defaultRules</Normal Text><Symbol>)</Symbol><br/> 0496 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>enabled</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0497 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> enabled</Normal Text><Symbol>.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0498 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0499 <Normal Text></Normal Text><br/> 0500 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disabled</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> defaultRules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>)</Symbol><br/> 0501 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>disabled</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0502 <Normal Text> args</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> disabled</Normal Text><Symbol>.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/> 0503 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0504 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0505 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> args</Normal Text><br/> 0506 <Symbol>}</Symbol><br/> 0507 <Normal Text></Normal Text><br/> 0508 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>processOption</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>key</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><br/> 0509 <Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><br/> 0510 <Normal Text> </Normal Text><Variable>from</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>inout</Data Type><Normal Text> </Normal Text><Variable>Set</Variable><Normal Text><</Normal Text><Variable>String</Variable><Normal Text>></Normal Text><Symbol>,</Symbol><br/> 0511 <Normal Text> </Normal Text><Variable>handler</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Data Type>throws</Data Type><Normal Text> -> </Normal Text><Variable>Void</Variable><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><br/> 0512 <Symbol>{</Symbol><br/> 0513 <Normal Text> precondition</Normal Text><Symbol>(</Symbol><Normal Text>optionsArguments</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>),</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>key) not in optionsArguments"</String><Symbol>)</Symbol><br/> 0514 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> from</Normal Text><br/> 0515 <Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><br/> 0516 <Normal Text> from </Normal Text><Symbol>=</Symbol><Normal Text> arguments</Normal Text><br/> 0517 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0518 <Normal Text> </Normal Text><Keyword>return</Keyword><br/> 0519 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0520 <Normal Text> </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0521 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> handler</Normal Text><Symbol>(</Symbol><Normal Text>value</Normal Text><Symbol>)</Symbol><br/> 0522 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>catch</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0523 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>value</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0524 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>key) option expects a value"</String><Symbol>)</Symbol><br/> 0525 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0526 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>FormatError</Variable><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> error</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/> 0527 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0528 <Normal Text> string </Normal Text><Symbol>+=</Symbol><Normal Text> </Normal Text><String>" in --</String><Error>\(</Error><String>key)"</String><br/> 0529 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0530 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/> 0531 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0532 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unsupported --</String><Error>\(</Error><String>key) value '</String><Error>\(</Error><String>value)'"</String><Symbol>)</Symbol><br/> 0533 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0534 <Symbol>}</Symbol><br/> 0535 <Normal Text></Normal Text><br/> 0536 <Comment>// Parse rule names from arguments</Comment><br/> 0537 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>rulesFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>lint</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>Set</Function><Symbol><</Symbol><Data Type>String</Data Type><Symbol>></Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0538 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><br/> 0539 <Normal Text> rules </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/> 0540 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/> 0541 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>disabledByDefault</Normal Text><Symbol>)</Symbol><br/> 0542 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/> 0543 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/> 0544 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0545 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/> 0546 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtract</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/> 0547 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0548 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> rulesString </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/> 0549 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> lint </Normal Text><Symbol>{</Symbol><br/> 0550 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>rulesString</Normal Text><Symbol>))</Symbol><br/> 0551 <Normal Text> </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0552 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtract</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>rulesString</Normal Text><Symbol>))</Symbol><br/> 0553 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0554 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0555 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> rules</Normal Text><br/> 0556 <Symbol>}</Symbol><br/> 0557 <Normal Text></Normal Text><br/> 0558 <Comment>// Parse FileOptions from arguments</Comment><br/> 0559 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>fileOptionsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>FileOptions</Function><Normal Text>? </Normal Text><Symbol>{</Symbol><br/> 0560 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>options</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>()</Symbol><br/> 0561 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>fileArguments</Normal Text><Symbol>)</Symbol><br/> 0562 <Normal Text></Normal Text><br/> 0563 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>containsFileOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0564 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"symlinks"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0565 <Normal Text> containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0566 <Normal Text> </Normal Text><ControlFlowKeyword>switch</ControlFlowKeyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0567 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"follow"</String><Symbol>:</Symbol><br/> 0568 <Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0569 <Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"ignore"</String><Symbol>:</Symbol><br/> 0570 <Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0571 <Normal Text> </Normal Text><Keyword>default</Keyword><Symbol>:</Symbol><br/> 0572 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>""</String><Symbol>)</Symbol><br/> 0573 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0574 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0575 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"exclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0576 <Normal Text> containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0577 <Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs </Normal Text><Symbol>+=</Symbol><Normal Text> expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0578 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0579 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"unexclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0580 <Normal Text> containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0581 <Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs </Normal Text><Symbol>+=</Symbol><Normal Text> expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/> 0582 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0583 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"minversion"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0584 <Normal Text> containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0585 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>minVersion</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Version</Normal Text><Symbol>(</Symbol><Normal Text>rawValue</Normal Text><Symbol>:</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0586 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unsupported --minversion value '</String><Error>\(</Error><String Interpolation>$</String Interpolation><String>0)'"</String><Symbol>)</Symbol><br/> 0587 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0588 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> minVersion </Normal Text><Symbol><=</Symbol><Normal Text> Version</Normal Text><Symbol>(</Symbol><Normal Text>stringLiteral</Normal Text><Symbol>:</Symbol><Normal Text> swiftFormatVersion</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0589 <Normal Text> </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Project specifies SwiftFormat --minversion of </String><Error>\(</Error><String>minVersion)"</String><Symbol>)</Symbol><br/> 0590 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0591 <Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>=</Symbol><Normal Text> minVersion</Normal Text><br/> 0592 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0593 <Normal Text> assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>arguments.joined(separator: "</String><Symbol>,</Symbol><String>"))"</String><Symbol>)</Symbol><br/> 0594 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> containsFileOption </Normal Text><Symbol>?</Symbol><Normal Text> options </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0595 <Symbol>}</Symbol><br/> 0596 <Normal Text></Normal Text><br/> 0597 <Comment>// Parse FormatOptions from arguments</Comment><br/> 0598 <Comment>// Returns nil if the arguments dictionary does not contain any formatting arguments</Comment><br/> 0599 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>formatOptionsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>FormatOptions</Function><Normal Text>? </Normal Text><Symbol>{</Symbol><br/> 0600 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>options</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><br/> 0601 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>formattingArguments</Normal Text><Symbol>)</Symbol><br/> 0602 <Normal Text></Normal Text><br/> 0603 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>containsFormatOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0604 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> option </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Symbol>{</Symbol><br/> 0605 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><Normal Text>option</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0606 <Normal Text> containsFormatOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/> 0607 <Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>toOptions</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>options</Normal Text><Symbol>)</Symbol><br/> 0608 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0609 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0610 <Normal Text> assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>arguments.joined(separator: "</String><Symbol>,</Symbol><String>"))"</String><Symbol>)</Symbol><br/> 0611 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> containsFormatOption </Normal Text><Symbol>?</Symbol><Normal Text> options </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0612 <Symbol>}</Symbol><br/> 0613 <Normal Text></Normal Text><br/> 0614 <Comment>// Get deprecation warnings from a set of arguments</Comment><br/> 0615 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>warningsForArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/> 0616 <Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>warnings</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]()</Symbol><br/> 0617 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> option </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Symbol>{</Symbol><br/> 0618 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>option</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><Symbol>,</Symbol><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>message</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>deprecationMessage </Normal Text><Symbol>{</Symbol><br/> 0619 <Normal Text> warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>option.argumentName) option is deprecated. </String><Error>\(</Error><String>message)"</String><Symbol>)</Symbol><br/> 0620 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0621 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0622 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> name </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>rulesArguments</Normal Text><Symbol>.</Symbol><Normal Text>flatMap </Normal Text><Symbol>{</Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><ControlFlowKeyword>try</ControlFlowKeyword><Symbol>?</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><Symbol>[])</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><Symbol>[]</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0623 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>message</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]?.</Symbol><Normal Text>deprecationMessage </Normal Text><Symbol>{</Symbol><br/> 0624 <Normal Text> warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>name) rule is deprecated. </String><Error>\(</Error><String>message)"</String><Symbol>)</Symbol><br/> 0625 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0626 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0627 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Symbol>?</Symbol><Normal Text> rulesFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> lint</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0628 <Normal Text> </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> arg </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>.</Symbol><Normal Text>keys </Normal Text><Keyword>where</Keyword><Normal Text> formattingArguments</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0629 <Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>rules</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0630 <Normal Text> </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rule</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>[</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0631 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Keyword>false</Keyword><br/> 0632 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0633 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>sharedOptions</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><br/> 0634 <Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0635 <Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>expected</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/> 0636 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><br/> 0637 <Normal Text> </Normal Text><Symbol>})?.</Symbol><Normal Text>name </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>"associated"</String><br/> 0638 <Normal Text> warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>arg) option has no effect when </String><Error>\(</Error><String>expected) rule is disabled"</String><Symbol>)</Symbol><br/> 0639 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0640 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0641 <Normal Text> </Normal Text><Symbol>}</Symbol><br/> 0642 <Normal Text> </Normal Text><Keyword>return</Keyword><Normal Text> warnings</Normal Text><br/> 0643 <Symbol>}</Symbol><br/> 0644 <Normal Text></Normal Text><br/> 0645 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/> 0646 <Normal Text> </Normal Text><String>"symlinks"</String><Symbol>,</Symbol><br/> 0647 <Normal Text> </Normal Text><String>"exclude"</String><Symbol>,</Symbol><br/> 0648 <Normal Text> </Normal Text><String>"unexclude"</String><Symbol>,</Symbol><br/> 0649 <Normal Text> </Normal Text><String>"minversion"</String><Symbol>,</Symbol><br/> 0650 <Symbol>]</Symbol><br/> 0651 <Normal Text></Normal Text><br/> 0652 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rulesArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/> 0653 <Normal Text> </Normal Text><String>"disable"</String><Symbol>,</Symbol><br/> 0654 <Normal Text> </Normal Text><String>"enable"</String><Symbol>,</Symbol><br/> 0655 <Normal Text> </Normal Text><String>"lintonly"</String><Symbol>,</Symbol><br/> 0656 <Normal Text> </Normal Text><String>"rules"</String><Symbol>,</Symbol><br/> 0657 <Symbol>]</Symbol><br/> 0658 <Normal Text></Normal Text><br/> 0659 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formattingArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>formatting</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>}</Symbol><br/> 0660 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>internalArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Keyword>internal</Keyword><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>}</Symbol><br/> 0661 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>optionsArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileArguments </Normal Text><Symbol>+</Symbol><Normal Text> rulesArguments </Normal Text><Symbol>+</Symbol><Normal Text> formattingArguments </Normal Text><Symbol>+</Symbol><Normal Text> internalArguments</Normal Text><br/> 0662 <Normal Text></Normal Text><br/> 0663 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>commandLineArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/> 0664 <Normal Text> </Normal Text><Comment>// Input options</Comment><br/> 0665 <Normal Text> </Normal Text><String>"filelist"</String><Symbol>,</Symbol><br/> 0666 <Normal Text> </Normal Text><String>"stdinpath"</String><Symbol>,</Symbol><br/> 0667 <Normal Text> </Normal Text><String>"config"</String><Symbol>,</Symbol><br/> 0668 <Normal Text> </Normal Text><String>"inferoptions"</String><Symbol>,</Symbol><br/> 0669 <Normal Text> </Normal Text><String>"linerange"</String><Symbol>,</Symbol><br/> 0670 <Normal Text> </Normal Text><String>"output"</String><Symbol>,</Symbol><br/> 0671 <Normal Text> </Normal Text><String>"cache"</String><Symbol>,</Symbol><br/> 0672 <Normal Text> </Normal Text><String>"dryrun"</String><Symbol>,</Symbol><br/> 0673 <Normal Text> </Normal Text><String>"lint"</String><Symbol>,</Symbol><br/> 0674 <Normal Text> </Normal Text><String>"lenient"</String><Symbol>,</Symbol><br/> 0675 <Normal Text> </Normal Text><String>"verbose"</String><Symbol>,</Symbol><br/> 0676 <Normal Text> </Normal Text><String>"quiet"</String><Symbol>,</Symbol><br/> 0677 <Normal Text> </Normal Text><String>"report"</String><Symbol>,</Symbol><br/> 0678 <Normal Text> </Normal Text><Comment>// Misc</Comment><br/> 0679 <Normal Text> </Normal Text><String>"help"</String><Symbol>,</Symbol><br/> 0680 <Normal Text> </Normal Text><String>"version"</String><Symbol>,</Symbol><br/> 0681 <Normal Text> </Normal Text><String>"options"</String><Symbol>,</Symbol><br/> 0682 <Normal Text> </Normal Text><String>"ruleinfo"</String><Symbol>,</Symbol><br/> 0683 <Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> optionsArguments</Normal Text><br/> 0684 <Normal Text></Normal Text><br/> 0685 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>deprecatedArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><br/> 0686 <Normal Text> $</Normal Text><Float>0.</Float><Normal Text>isDeprecated </Normal Text><Symbol>?</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/> 0687 <Symbol>}</Symbol><br/>