/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Jvm Name (" Trim Util ") Ċ @ file : Suppress (" NAME _ SH ADO WING ") Ċ Ċ package Ġcom . intellij . diff . comparison Ċ Ċ import Ġcom . intellij . diff . util . Int Pair Ċ import Ġcom . intellij . diff . util . Merge Range Ċ import Ġcom . intellij . diff . util . Range Ċ import Ġcom . intellij . openapi . util . text . StringUtil . is WhiteSpace Ċ import Ġjava . util .* Ċ Ċ fun Ġis P unctuation ( c : ĠChar ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġis P unctuation ( c . toInt ()) Ċ } Ċ Ċ fun Ġis P unctuation ( b : ĠInt ): ĠBoolean Ġ{ ĊĠ Ġif Ġ( b Ġ== Ġ 9 5 ) Ġreturn Ġfalse Ġ// Ġexclude Ġ'_' ĊĠ Ġreturn Ġb Ġ>= Ġ 3 3 Ġ&& Ġb Ġ<= Ġ 4 7 Ġ|| Ġ// Ġ! " #$ % & ' ()* + ,- ./ ĊĠĠĠĠĠĠĠĠ Ġb Ġ>= Ġ 5 8 Ġ&& Ġb Ġ<= Ġ 6 4 Ġ|| Ġ// Ġ: ;< => ? @ ĊĠĠĠĠĠĠĠĠ Ġb Ġ>= Ġ 9 1 Ġ&& Ġb Ġ<= Ġ 9 6 Ġ|| Ġ// Ġ[\ ]^ _` ĊĠĠĠĠĠĠĠĠ Ġb Ġ>= Ġ 1 2 3 Ġ&& Ġb Ġ<= Ġ 1 2 6 Ġ Ġ// Ġ{ |} ~ Ċ } Ċ Ċ fun Ġis Alpha ( c : ĠInt ): ĠBoolean Ġ{ ĊĠ Ġif Ġ( is WhiteSpace Code Point ( c )) Ġreturn Ġfalse ĊĠ Ġreturn Ġ! is P unctuation ( c ) Ċ } Ċ Ċ fun Ġis WhiteSpace Code Point ( c : ĠInt ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġc Ġ< Ġ 1 2 8 Ġ&& Ġis WhiteSpace ( c . to Char ()) Ċ } Ċ Ċ fun Ġis Continuous Script ( c : ĠInt ): ĠBoolean Ġ{ ĊĠ Ġif Ġ( c Ġ< Ġ 1 2 8 ) Ġreturn Ġfalse ĊĠ Ġif Ġ( Character . is Digit ( c )) Ġreturn Ġfalse ĊĊĠ Ġif Ġ(! Character . is B mp Code Point ( c )) Ġreturn Ġtrue ĊĠ Ġif Ġ( Character . is Ide o graphic ( c )) Ġreturn Ġtrue ĊĠ Ġif Ġ(! Character . is Alphabet ic ( c )) Ġreturn Ġtrue ĊĊĠ Ġval Ġscript Ġ= ĠCharacter . Unicode Script . of ( c ) ĊĠ Ġreturn Ġscript Ġ== ĠCharacter . Unicode Script . HIR AG ANA Ġ|| ĊĠĠĠĠĠĠĠĠ Ġscript Ġ== ĠCharacter . Unicode Script . K ATA KAN A Ġ|| ĊĠĠĠĠĠĠĠĠ Ġscript Ġ== ĠCharacter . Unicode Script . TH AI Ġ|| ĊĠĠĠĠĠĠĠĠ Ġscript Ġ== ĠCharacter . Unicode Script . J AV ANE SE Ċ } Ċ Ċ fun Ġtrim ( text : ĠCharSequence , Ġstart : ĠInt , Ġend : ĠInt ): ĠInt Pair Ġ{ ĊĠ Ġreturn Ġtrim ( start , Ġend , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text [ index ]) Ġ}) Ċ } Ċ Ċ fun Ġtrim ( start : ĠInt , Ġend : ĠInt , Ġignored : ĠBit Set ): ĠInt Pair Ġ{ ĊĠ Ġreturn Ġtrim ( start , Ġend , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġignored [ index ] Ġ}) Ċ } Ċ Ċ fun Ġtrim Start ( text : ĠCharSequence , Ġstart : ĠInt , Ġend : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġtrim Start ( start , Ġend , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text [ index ]) Ġ}) Ċ } Ċ Ċ fun Ġtrim End ( text : ĠCharSequence , Ġstart : ĠInt , Ġend : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġtrim End ( start , Ġend , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġtrim ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠRange Ġ{ ĊĠ Ġreturn Ġtrim ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 2 [ index ]) Ġ}) Ċ } Ċ Ċ fun Ġtrim ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt ): ĠMerge Range Ġ{ ĊĠ Ġreturn Ġtrim ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 2 [ index ]) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 3 [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġexpand ( text 1 : ĠList <* >, Ġtext 2 : ĠList <* >, ĊĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } Ċ Ċ fun Ġexpand Forward ( text 1 : ĠList <* >, Ġtext 2 : ĠList <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } Ċ Ċ fun Ġexpand Backward ( text 1 : ĠList <* >, Ġtext 2 : ĠList <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } ĊĊ Ċ fun Ġ< T > Ġexpand ( text 1 : ĠList < T >, Ġtext 2 : ĠList < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( T , ĠT ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġequals ( text 1 [ index 1 ], Ġtext 2 [ index 2 ]) Ġ}) Ċ } ĊĊ Ċ fun Ġexpand ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } Ċ Ċ fun Ġexpand Forward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } Ċ Ċ fun Ġexpand Backward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}) Ċ } ĊĊ Ċ fun Ġexpand Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand Ignored ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġexpand Wh ites p aces Forward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Ignored Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġexpand Wh ites p aces Backward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Ignored Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġexpand Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt ): ĠMerge Range Ġ{ ĊĠ Ġreturn Ġexpand Ignored ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 3 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 3 [ index 3 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } Ċ Ċ fun Ġexpand Wh ites p aces Forward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Ignored Forward ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 3 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 3 [ index 3 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } Ċ Ċ fun Ġexpand Wh ites p aces Backward ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġexpand Ignored Backward ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 3 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 3 [ index 3 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġis WhiteSpace ( text 1 [ index ]) Ġ}) Ċ } ĊĊ Ċ fun Ġ< T > Ġtrim Expand Range ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġreturn Ġtrim Expand ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġequals ( index 1 , Ġindex 2 ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġignored 1 ( index ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġignored 2 ( index ) Ġ}) Ċ } Ċ Ċ fun Ġtrim Expand Text ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : ĠBit Set , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : ĠBit Set ): ĠRange Ġ{ ĊĠ Ġreturn Ġtrim Expand ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex 1 , Ġindex 2 Ġ-> Ġtext 1 [ index 1 ] Ġ== Ġtext 2 [ index 2 ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġignored 1 [ index ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġindex Ġ-> Ġignored 2 [ index ] Ġ}) Ċ } ĊĊ Ċ fun Ġtrim ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠ Ġrange : ĠRange ): ĠRange Ġ{ ĊĠ Ġreturn Ġtrim ( text 1 , Ġtext 2 , Ġrange . start 1 , Ġrange . start 2 , Ġrange . end 1 , Ġrange . end 2 ) Ċ } Ċ Ċ fun Ġtrim ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠ Ġrange : ĠMerge Range ): ĠMerge Range Ġ{ ĊĠ Ġreturn Ġtrim ( text 1 , Ġtext 2 , Ġtext 3 , Ġrange . start 1 , Ġrange . start 2 , Ġrange . start 3 , Ġrange . end 1 , Ġrange . end 2 , Ġrange . end 3 ) Ċ } Ċ Ċ fun Ġexpand ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠRange ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand ( text 1 , Ġtext 2 , Ġrange . start 1 , Ġrange . start 2 , Ġrange . end 1 , Ġrange . end 2 ) Ċ } Ċ Ċ fun Ġexpand Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠRange ): ĠRange Ġ{ ĊĠ Ġreturn Ġexpand Wh ites p aces ( text 1 , Ġtext 2 , Ġrange . start 1 , Ġrange . start 2 , Ġrange . end 1 , Ġrange . end 2 ) Ċ } Ċ Ċ fun Ġexpand Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠMerge Range ): ĠMerge Range Ġ{ ĊĠ Ġreturn Ġexpand Wh ites p aces ( text 1 , Ġtext 2 , Ġtext 3 , Ġrange . start 1 , Ġrange . start 2 , Ġrange . start 3 , Ġrange . end 1 , Ġrange . end 2 , Ġrange . end 3 ) Ċ } ĊĊ Ċ fun Ġis Equals ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠRange ): ĠBoolean Ġ{ ĊĠ Ġval Ġsequence 1 Ġ= Ġtext 1 . sub Sequence ( range . start 1 , Ġrange . end 1 ) ĊĠ Ġval Ġsequence 2 Ġ= Ġtext 2 . sub Sequence ( range . start 2 , Ġrange . end 2 ) ĊĠ Ġreturn ĠComparison Util . is Equals ( sequence 1 , Ġsequence 2 , ĠComparison Policy . DEFAULT ) Ċ } Ċ Ċ fun Ġis Equals Ignore Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠRange ): ĠBoolean Ġ{ ĊĠ Ġval Ġsequence 1 Ġ= Ġtext 1 . sub Sequence ( range . start 1 , Ġrange . end 1 ) ĊĠ Ġval Ġsequence 2 Ġ= Ġtext 2 . sub Sequence ( range . start 2 , Ġrange . end 2 ) ĊĠ Ġreturn ĠComparison Util . is Equals ( sequence 1 , Ġsequence 2 , ĠComparison Policy . IGNORE _ WH IT ESP ACES ) Ċ } Ċ Ċ fun Ġis Equals ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠMerge Range ): ĠBoolean Ġ{ ĊĠ Ġval Ġsequence 1 Ġ= Ġtext 1 . sub Sequence ( range . start 1 , Ġrange . end 1 ) ĊĠ Ġval Ġsequence 2 Ġ= Ġtext 2 . sub Sequence ( range . start 2 , Ġrange . end 2 ) ĊĠ Ġval Ġsequence 3 Ġ= Ġtext 3 . sub Sequence ( range . start 3 , Ġrange . end 3 ) ĊĠ Ġreturn ĠComparison Util . is Equals ( sequence 2 , Ġsequence 1 , ĠComparison Policy . DEFAULT ) Ġ&& ĊĠĠĠĠĠĠĠĠ ĠComparison Util . is Equals ( sequence 2 , Ġsequence 3 , ĠComparison Policy . DEFAULT ) Ċ } Ċ Ċ fun Ġis Equals Ignore Wh ites p aces ( text 1 : ĠCharSequence , Ġtext 2 : ĠCharSequence , Ġtext 3 : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange : ĠMerge Range ): ĠBoolean Ġ{ ĊĠ Ġval Ġsequence 1 Ġ= Ġtext 1 . sub Sequence ( range . start 1 , Ġrange . end 1 ) ĊĠ Ġval Ġsequence 2 Ġ= Ġtext 2 . sub Sequence ( range . start 2 , Ġrange . end 2 ) ĊĠ Ġval Ġsequence 3 Ġ= Ġtext 3 . sub Sequence ( range . start 3 , Ġrange . end 3 ) ĊĠ Ġreturn ĠComparison Util . is Equals ( sequence 2 , Ġsequence 1 , ĠComparison Policy . IGNORE _ WH IT ESP ACES ) Ġ&& ĊĠĠĠĠĠĠĠĠ ĠComparison Util . is Equals ( sequence 2 , Ġsequence 3 , ĠComparison Policy . IGNORE _ WH IT ESP ACES ) Ċ } Ċ Ċ // Ċ // ĠTrim Ċ // Ċ Ċ private Ġinline Ġfun Ġtrim ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġstart 1 Ġ= Ġtrim Start ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġend 1 Ġ= Ġtrim End ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġstart 2 Ġ= Ġtrim Start ( start 2 , Ġend 2 , Ġignored 2 ) ĊĠ Ġend 2 Ġ= Ġtrim End ( start 2 , Ġend 2 , Ġignored 2 ) ĊĊĠ Ġreturn ĠRange ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 3 : Ġ( Int ) Ġ-> ĠBoolean ): ĠMerge Range Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġstart 3 Ġ= Ġstart 3 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĠ Ġvar Ġend 3 Ġ= Ġend 3 ĊĊĠ Ġstart 1 Ġ= Ġtrim Start ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġend 1 Ġ= Ġtrim End ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġstart 2 Ġ= Ġtrim Start ( start 2 , Ġend 2 , Ġignored 2 ) ĊĠ Ġend 2 Ġ= Ġtrim End ( start 2 , Ġend 2 , Ġignored 2 ) ĊĠ Ġstart 3 Ġ= Ġtrim Start ( start 3 , Ġend 3 , Ġignored 3 ) ĊĠ Ġend 3 Ġ= Ġtrim End ( start 3 , Ġend 3 , Ġignored 3 ) ĊĊĠ Ġreturn ĠMerge Range ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 , Ġstart 3 , Ġend 3 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim ( start : ĠInt , Ġend : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Pair Ġ{ ĊĠ Ġvar Ġstart Ġ= Ġstart ĊĠ Ġvar Ġend Ġ= Ġend ĊĊĠ Ġstart Ġ= Ġtrim Start ( start , Ġend , Ġignored ) ĊĠ Ġend Ġ= Ġtrim End ( start , Ġend , Ġignored ) ĊĊĠ Ġreturn ĠInt Pair ( start , Ġend ) Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim Start ( start : ĠInt , Ġend : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġstart Ġ= Ġstart ĊĊĠ Ġwhile Ġ( start Ġ< Ġend ) Ġ{ ĊĠĠĠ Ġif Ġ(! ignored ( start )) Ġbreak ĊĠĠĠ Ġstart ++ ĊĠ Ġ} ĊĠ Ġreturn Ġstart Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim End ( start : ĠInt , Ġend : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġend Ġ= Ġend ĊĊĠ Ġwhile Ġ( start Ġ< Ġend ) Ġ{ ĊĠĠĠ Ġif Ġ(! ignored ( end Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġend -- ĊĠ Ġ} ĊĠ Ġreturn Ġend Ċ } Ċ Ċ // Ċ // ĠExpand Ċ // Ċ Ċ private Ġinline Ġfun Ġexpand ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġval Ġcount 1 Ġ= Ġexpand Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals ) ĊĠ Ġstart 1 Ġ+= Ġcount 1 ĊĠ Ġstart 2 Ġ+= Ġcount 1 ĊĊĠ Ġval Ġcount 2 Ġ= Ġexpand Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals ) ĊĠ Ġend 1 Ġ-= Ġcount 2 ĊĠ Ġend 2 Ġ-= Ġcount 2 ĊĊĠ Ġreturn ĠRange ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Forward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĊĠ Ġval Ġold Start 1 Ġ= Ġstart 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals ( start 1 , Ġstart 2 )) Ġbreak ĊĠĠĠ Ġstart 1 ++ ĊĠĠĠ Ġstart 2 ++ ĊĠ Ġ} ĊĊĠ Ġreturn Ġstart 1 Ġ- Ġold Start 1 Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Backward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġval Ġold End 1 Ġ= Ġend 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals ( end 1 Ġ- Ġ 1 , Ġend 2 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġend 1 -- ĊĠĠĠ Ġend 2 -- ĊĠ Ġ} ĊĊĠ Ġreturn Ġold End 1 Ġ- Ġend 1 Ċ } Ċ Ċ // Ċ // ĠExpand ĠIgnore d Ċ // Ċ Ċ private Ġinline Ġfun Ġexpand Ignored ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġval Ġcount 1 Ġ= Ġexpand Ignored Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals , Ġignored 1 ) ĊĠ Ġstart 1 Ġ+= Ġcount 1 ĊĠ Ġstart 2 Ġ+= Ġcount 1 ĊĊĠ Ġval Ġcount 2 Ġ= Ġexpand Ignored Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals , Ġignored 1 ) ĊĠ Ġend 1 Ġ-= Ġcount 2 ĊĠ Ġend 2 Ġ-= Ġcount 2 ĊĊĠ Ġreturn ĠRange ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Ignored Forward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĊĠ Ġval Ġold Start 1 Ġ= Ġstart 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals ( start 1 , Ġstart 2 )) Ġbreak ĊĠĠĠ Ġif Ġ(! ignored 1 ( start 1 )) Ġbreak ĊĠĠĠ Ġstart 1 ++ ĊĠĠĠ Ġstart 2 ++ ĊĠ Ġ} ĊĊĠ Ġreturn Ġstart 1 Ġ- Ġold Start 1 Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Ignored Backward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġval Ġold End 1 Ġ= Ġend 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals ( end 1 Ġ- Ġ 1 , Ġend 2 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġif Ġ(! ignored 1 ( end 1 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġend 1 -- ĊĠĠĠ Ġend 2 -- ĊĠ Ġ} ĊĊĠ Ġreturn Ġold End 1 Ġ- Ġend 1 Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Ignored ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 2 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 3 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠMerge Range Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġstart 3 Ġ= Ġstart 3 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĠ Ġvar Ġend 3 Ġ= Ġend 3 ĊĊĠ Ġval Ġcount 1 Ġ= Ġexpand Ignored Forward ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , Ġequals 1 2 , Ġequals 1 3 , Ġignored 1 ) ĊĠ Ġstart 1 Ġ+= Ġcount 1 ĊĠ Ġstart 2 Ġ+= Ġcount 1 ĊĠ Ġstart 3 Ġ+= Ġcount 1 ĊĊĠ Ġval Ġcount 2 Ġ= Ġexpand Ignored Backward ( start 1 , Ġstart 2 , Ġstart 3 , Ġend 1 , Ġend 2 , Ġend 3 , Ġequals 1 2 , Ġequals 1 3 , Ġignored 1 ) ĊĠ Ġend 1 Ġ-= Ġcount 2 ĊĠ Ġend 2 Ġ-= Ġcount 2 ĊĠ Ġend 3 Ġ-= Ġcount 2 ĊĊĠ Ġreturn ĠMerge Range ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 , Ġstart 3 , Ġend 3 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Ignored Forward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 2 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 3 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġstart 3 Ġ= Ġstart 3 ĊĊĠ Ġval Ġold Start 1 Ġ= Ġstart 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 Ġ&& Ġstart 3 Ġ< Ġend 3 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals 1 2 ( start 1 , Ġstart 2 )) Ġbreak ĊĠĠĠ Ġif Ġ(! equals 1 3 ( start 1 , Ġstart 3 )) Ġbreak ĊĠĠĠ Ġif Ġ(! ignored 1 ( start 1 )) Ġbreak ĊĠĠĠ Ġstart 1 ++ ĊĠĠĠ Ġstart 2 ++ ĊĠĠĠ Ġstart 3 ++ ĊĠ Ġ} ĊĊĠ Ġreturn Ġstart 1 Ġ- Ġold Start 1 Ċ } Ċ Ċ private Ġinline Ġfun Ġexpand Ignored Backward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġstart 3 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , Ġend 3 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 2 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals 1 3 : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĠ Ġvar Ġend 3 Ġ= Ġend 3 ĊĊĠ Ġval Ġold End 1 Ġ= Ġend 1 ĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 Ġ&& Ġstart 3 Ġ< Ġend 3 ) Ġ{ ĊĠĠĠ Ġif Ġ(! equals 1 2 ( end 1 Ġ- Ġ 1 , Ġend 2 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġif Ġ(! equals 1 3 ( end 1 Ġ- Ġ 1 , Ġend 3 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġif Ġ(! ignored 1 ( end 1 Ġ- Ġ 1 )) Ġbreak ĊĠĠĠ Ġend 1 -- ĊĠĠĠ Ġend 2 -- ĊĠĠĠ Ġend 3 -- ĊĠ Ġ} ĊĊĠ Ġreturn Ġold End 1 Ġ- Ġend 1 Ċ } Ċ Ċ // Ċ // ĠTrim ĠExpand Ċ // Ċ Ċ private Ġinline Ġfun Ġtrim Expand ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean ): ĠRange Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġval Ġstarts Ġ= Ġtrim Expand Forward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals , Ġignored 1 , Ġignored 2 ) ĊĠ Ġstart 1 Ġ= Ġstarts . val 1 ĊĠ Ġstart 2 Ġ= Ġstarts . val 2 ĊĊĠ Ġval Ġends Ġ= Ġtrim Expand Backward ( start 1 , Ġstart 2 , Ġend 1 , Ġend 2 , Ġequals , Ġignored 1 , Ġignored 2 ) ĊĠ Ġend 1 Ġ= Ġends . val 1 ĊĠ Ġend 2 Ġ= Ġends . val 2 ĊĊĠ Ġreturn ĠRange ( start 1 , Ġend 1 , Ġstart 2 , Ġend 2 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim Expand Forward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Pair Ġ{ ĊĠ Ġvar Ġstart 1 Ġ= Ġstart 1 ĊĠ Ġvar Ġstart 2 Ġ= Ġstart 2 ĊĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ( equals ( start 1 , Ġstart 2 )) Ġ{ ĊĠĠĠĠĠ Ġstart 1 ++ ĊĠĠĠĠĠ Ġstart 2 ++ ĊĠĠĠĠĠ Ġcontinue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġskipped Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( ignored 1 ( start 1 )) Ġ{ ĊĠĠĠĠĠ Ġskipped Ġ= Ġtrue ĊĠĠĠĠĠ Ġstart 1 ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( ignored 2 ( start 2 )) Ġ{ ĊĠĠĠĠĠ Ġskipped Ġ= Ġtrue ĊĠĠĠĠĠ Ġstart 2 ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! skipped ) Ġbreak ĊĠ Ġ} ĊĊĠ Ġstart 1 Ġ= Ġtrim Start ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġstart 2 Ġ= Ġtrim Start ( start 2 , Ġend 2 , Ġignored 2 ) ĊĊĠ Ġreturn ĠInt Pair ( start 1 , Ġstart 2 ) Ċ } Ċ Ċ private Ġinline Ġfun Ġtrim Expand Backward ( start 1 : ĠInt , Ġstart 2 : ĠInt , Ġend 1 : ĠInt , Ġend 2 : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals : Ġ( Int , ĠInt ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 1 : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored 2 : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Pair Ġ{ ĊĠ Ġvar Ġend 1 Ġ= Ġend 1 ĊĠ Ġvar Ġend 2 Ġ= Ġend 2 ĊĊĠ Ġwhile Ġ( start 1 Ġ< Ġend 1 Ġ&& Ġstart 2 Ġ< Ġend 2 ) Ġ{ ĊĠĠĠ Ġif Ġ( equals ( end 1 Ġ- Ġ 1 , Ġend 2 Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠ Ġend 1 -- ĊĠĠĠĠĠ Ġend 2 -- ĊĠĠĠĠĠ Ġcontinue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġskipped Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( ignored 1 ( end 1 Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠ Ġskipped Ġ= Ġtrue ĊĠĠĠĠĠ Ġend 1 -- ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( ignored 2 ( end 2 Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠ Ġskipped Ġ= Ġtrue ĊĠĠĠĠĠ Ġend 2 -- ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! skipped ) Ġbreak ĊĠ Ġ} ĊĊĠ Ġend 1 Ġ= Ġtrim End ( start 1 , Ġend 1 , Ġignored 1 ) ĊĠ Ġend 2 Ġ= Ġtrim End ( start 2 , Ġend 2 , Ġignored 2 ) ĊĊĠ Ġreturn ĠInt Pair ( end 1 , Ġend 2 ) Ċ } Ċ