// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġtraining . dsl . impl Ċ Ċ import Ġcom . intellij . code Insight . daemon . impl . Daemon Code Analyzer Ex Ċ import Ġcom . intellij . openapi . application .* Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . file Editor . Open FileDescriptor Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . ui . Editor Notifications Ċ import Ġorg . fest . swing . exception . Component Lookup Exception Ċ import Ġorg . fest . swing . exception . Wait Timed Out Error Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġtraining . dsl .* Ċ import Ġtraining . learn . Actions Recorder Ċ import Ġtraining . learn . Learn Bundle Ċ import Ġtraining . learn . lesson . Lesson Manager Ċ import Ġtraining . statistic . Statistic Base Ċ import Ġjava . awt . Component Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Future Ċ import Ġjavax . swing . J Component Ċ Ċ internal Ġclass ĠTask Context Impl ( private Ġval Ġlesson Executor : ĠLess on Executor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrecorder : ĠActions Recorder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata : ĠLess on Executor . Task Data ) Ġ: ĠTask Context () Ġ{ ĊĠ Ġoverride Ġval Ġproject : ĠProject ĊĠĠĠ Ġget () Ġ= Ġlesson Executor . project ĊĊĠ Ġoverride Ġval ĠtaskId Ġ= ĠTask Id ( task Index ) ĊĊĠ Ġprivate Ġval Ġruntime Context Ġ= ĠTask Runtime Context ( lesson Executor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlesson Executor . apply Restore ( this ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlesson Executor . getUser Visible Info ( task Index ) Ġ}) ĊĊĠ Ġval Ġsteps : ĠMutable List < Comp letableFuture < Boolean >> Ġ= Ġmutable ListOf () ĊĊĠ Ġval Ġtest Actions : ĠMutable List < Runnable > Ġ= Ġmutable ListOf () ĊĊĠ Ġoverride Ġfun Ġbefore ( pre paration : ĠTask Runtime Context . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġpreparation ( runtime Context ) Ġ// Ġjust Ġcall Ġit Ġhere ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrestore State ( restore Id : ĠTask Id ?, Ġdelay Millis : ĠInt , Ġrestore Required : ĠTask Runtime Context . () Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġdata . delay Millis Ġ= Ġdelay Millis ĊĠĠĠ Ġval Ġprevious Ġ= Ġdata . should Restore To Task ĊĠĠĠ Ġval Ġactual Id Ġ= Ġrestore Id Ġ?: ĠTask Id ( task Index Ġ- Ġ 1 ) ĊĠĠĠ Ġdata . should Restore To Task Ġ= Ġ{ Ġprevious ?. let Ġ{ Ġit () Ġ} Ġ?: Ġif Ġ( restore Required ( runtime Context )) Ġactual Id Ġelse Ġnull Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpropose Restore ( restore Check : ĠTask Runtime Context . () Ġ-> ĠRestore Notification ?) Ġ{ ĊĠĠĠ Ġrestore State Ġ{ ĊĠĠĠĠĠ Ġ// Ġrestore State Ġis Ġused Ġto Ġtrigger Ġby Ġany ĠIDE Ġstate Ġchange Ġand Ġcheck Ġrestore Ġproposal Ġis Ġneeded ĊĠĠĠĠĠ Ġthis @ Task Context Impl . check And Show Notification IfNeeded ( need To Log Ġ= Ġtrue , Ġrestore Check ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLess on Manager . instance . set Restore Notification ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ restore State Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Editor (): ĠRestore Notification ? Ġ{ ĊĠĠĠ Ġfun Ġrestore Notification ( file : ĠVirtual File ) Ġ= ĊĠĠĠĠĠ ĠRestore Notification ( Learn Bundle . message (" learn . restore . notification . wrong . editor "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLearn Bundle . message (" learn . restore . get . back . link . text ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠFile Editor Manager . getInstance ( project ). open Text Editor ( Open FileDescriptor ( project , Ġfile ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselected Text Editor Ġ= ĠFile Editor Manager . getInstance ( project ). selected Text Editor Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġif Ġ( lesson Executor . lesson . lesson Type . is Single Editor ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( selected Text Editor Ġ!= Ġlesson Executor . pre defined Editor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġlesson Executor . pre defined File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġrestore Notification ( file ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġfile Ġ= Ġruntime Context . previous . file Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġcurrent File Ġ= ĠFile Document Manager . getInstance (). getFile ( selected Text Editor . document ) ĊĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġcurrent File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrestore Notification ( file ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Warning ( text : ĠString , Ġrestore Task When Resolved : ĠBoolean , Ġwarning Required : ĠTask Runtime Context . () Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġrestore State ( taskId , Ġdelay Millis Ġ= Ġdefault Restore Delay ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnotification Required : ĠTask Runtime Context . () Ġ-> ĠRestore Notification ? Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( warning Required ()) ĠRestore Notification ( text ) Ġ{} Ġelse Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġwarning Resolved Ġ= Ġthis @ Task Context Impl . check And Show Notification IfNeeded ( need To Log Ġ= Ġ! restore Task When Resolved , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Required ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLess on Manager . instance . set Warning Notification ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġwarning Resolved Ġ&& Ġrestore Task When Resolved ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġtrue Ġif Ġalready Ġshown Ġnotification Ġhas Ġbeen Ġcleared ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġcheck And Show Notification IfNeeded ( need To Log : ĠBoolean , Ġnotification Required : ĠTask Runtime Context . () Ġ-> ĠRestore Notification ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification : Ġ( Restore Notification ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġlesson Executor . virtual File ĊĠĠĠ Ġval Ġproposal Ġ= Ġcheck Editor () Ġ?: Ġnotification Required ( runtime Context ) ĊĠĠĠ Ġif Ġ( proposal Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( Lesson Manager . instance . shown Restore Notification Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLess on Manager . instance . clear Restore Message () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( proposal . message Ġ!= ĠLess on Manager . instance . shown Restore Notification ?. message ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEditor Notifications . getInstance ( runtime Context . project ). update Notifications ( file ) ĊĠĠĠĠĠĠĠ Ġset Notification ( proposal ) ĊĠĠĠĠĠĠĠ Ġif ( need To Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠStat istic Base . log Restore Performed ( lesson Executor . lesson , Ġlesson Executor . current Task Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtext (@ Language (" HTML ") Ġtext : ĠString , Ġuse Bal loon : ĠLearning Bal loon Config ?) Ġ{ ĊĠĠĠ Ġif Ġ( use Bal loon Ġ== Ġnull Ġ|| Ġuse Bal loon . duplicate Message ) ĊĠĠĠĠĠ Ġlesson Executor . text ( text ) ĊĊĠĠĠ Ġif Ġ( use Bal loon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġui Ġ= Ġuse Bal loon . highlight ing Component Ġ?: Ġruntime Context . previous . ui Ġas ? ĠJ Component Ġ?: Ġreturn ĊĠĠĠĠĠ ĠLess on Executor Util . show Bal loon Message ( text , Ġui , Ġuse Bal loon , Ġruntime Context . actions Recorder , Ġlesson Executor . project ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĊĠ Ġoverride Ġfun Ġtype ( text : ĠString ) Ġ= Ġbefore Ġ{ ĊĠĠĠ Ġinvoke Later ( Modal ity State . current ()) Ġ{ ĊĠĠĠĠĠ ĠWrite Command Action . run Write Command Action ( project ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġeditor . caret Model . offset ĊĠĠĠĠĠĠĠ Ġeditor . document . insert String ( start Offset , Ġtext ) ĊĠĠĠĠĠĠĠ Ġeditor . caret Model . moveTo Offset ( start Offset Ġ+ Ġtext . length ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġruntime Text ( callback : ĠRuntime Text Context . () Ġ-> ĠString ?) Ġ{ ĊĠĠĠ Ġval Ġruntime Text Context Ġ= ĠRuntime Text Context ( runtime Context ) ĊĠĠĠ Ġval Ġtext Ġ= Ġcallback ( runtime Text Context ) ĊĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlesson Executor . text ( text , Ġruntime Text Context . remove After Done ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtrigger ( action Id : ĠString ) Ġ{ ĊĠĠĠ Ġadd Step ( recorder . future Action ( action Id )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtrigger ( check Id : Ġ( String ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġadd Step ( recorder . future Action ( check Id )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtrigger Start ( action Id : ĠString , Ġcheck State : ĠTask Runtime Context . () Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġadd Step ( recorder . future Action On Start ( action Id ) Ġ{ Ġcheck State ( runtime Context ) Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtriggers ( var arg Ġaction Ids : ĠString ) Ġ{ ĊĠĠĠ Ġadd Step ( recorder . future List Actions ( action Ids . toList ())) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny ?> Ġtrigger ( action Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate State : ĠTask Runtime Context . () Ġ-> ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State : ĠTask Runtime Context .( T , ĠT ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġ// ĠSome Ġchecks Ġare Ġneeded Ġto Ġbe Ġperformed Ġin ĠE DT Ġthread ĊĠĠĠ Ġ// ĠFor Ġexample , Ġselection Ġinformation Ġ Ġcould Ġnot Ġbe Ġgot Ġ( for Ġsome Ġmagic Ġreason ) Ġfrom Ġanother Ġthread ĊĠĠĠ Ġ// ĠAlso Ġwe Ġneed Ġto Ġcommit Ġdocument ĊĠĠĠ Ġfun Ġcalculate Action () Ġ= ĠWrite Action . compute And Wait < T , ĠRuntimeException > Ġ{ ĊĠĠĠĠĠ ĠPsi Document Manager . getInstance ( runtime Context . project ). commit Document ( runtime Context . editor . document ) ĊĠĠĠĠĠ Ġcalculate State ( runtime Context ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġstate : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġadd Step ( recorder . future Action And Check Around ( action Id , Ġ{ Ġstate Ġ= Ġcalculate Action () }) Ġ{ ĊĠĠĠĠĠ Ġstate ?. let Ġ{ Ġcheck State ( runtime Context , Ġit , Ġcalculate Action ()) Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġstate Check ( check State : ĠTask Runtime Context . () Ġ-> ĠBoolean ): ĠCompletableFuture < Boolean > Ġ{ ĊĠĠĠ Ġval Ġfuture Ġ= Ġrecorder . future Check Ġ{ Ġcheck State ( runtime Context ) Ġ} ĊĠĠĠ Ġadd Step ( future ) ĊĠĠĠ Ġreturn Ġfuture ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġstate Required ( required State : ĠTask Runtime Context . () Ġ-> ĠT ?): ĠFuture < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠCompletableFuture < T >() ĊĠĠĠ Ġval Ġfuture Ġ= Ġrecorder . future Check Ġ{ ĊĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequired State ( runtime Context ) ĊĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . complete ( state ) ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġadd Step ( future ) ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Future Step ( p : ĠDone Step Context . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġfuture : ĠCompletableFuture < Boolean > Ġ= ĠCompletableFuture () ĊĠĠĠ Ġadd Step ( future ) ĊĠĠĠ Ġp . invoke ( Done Step Context ( future , Ġruntime Context )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Step ( step : ĠCompletableFuture < Boolean >) Ġ{ ĊĠĠĠ Ġsteps . add ( step ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtest ( wait Editor ToBe Ready : ĠBoolean , Ġaction : ĠTask TestContext . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġtest Actions . add ( Runnable Ġ{ ĊĠĠĠĠĠ ĠD umb Service . getInstance ( runtime Context . project ). waitFor Smart Mode () ĊĠĠĠĠĠ Ġ// ĠThis Ġwait Ġimplementation Ġis Ġquite Ġugly , Ġbut Ġit Ġworks Ġand Ġit Ġis Ġneeded Ġin Ġthe Ġtest Ġmode Ġonly . ĠSo Ġshould Ġbe Ġok Ġfor Ġnow . ĊĠĠĠĠĠ Ġif Ġ( wait Editor ToBe Ready ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġinvoke And Wait IfNeeded Ġ{ ĠPsi Document Manager . getInstance ( project ). get Psi File ( runtime Context . editor . document ) Ġ} Ġ?: Ġreturn @ Runnable ĊĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! run Read Action Ġ{ ĠDa emon Code Analyzer Ex . getInstance Ex ( project ). isError Analy zing Finished ( psi File ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( step . to Long ()) ĊĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġstep ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ> Ġ 3 0 0 0 ) Ġreturn @ Runnable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠTask TestContext ( runtime Context ). action () ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġ@ Suppress (" Over riding Deprecated Member ") ĊĠ Ġoverride Ġfun Ġtrigger By Ui Component And Highlight ( find And Highlight : ĠTask Runtime Context . () Ġ-> Ġ(() Ġ-> ĠComponent )) Ġ{ ĊĠĠĠ Ġval Ġstep Ġ= ĠCompletableFuture < Boolean >() ĊĠĠĠ ĠApplication Manager . getApplication (). execute On P ooled Thread Ġ{ ĊĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lesson Executor . has Been Stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstep . complete ( false ) ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġhighlight Function Ġ= Ġfind And Highlight ( runtime Context ) ĊĠĠĠĠĠĠĠĠĠ Ġinvoke Later ( Modal ity State . any ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlesson Executor . found Component Ġ= Ġhighlight Function () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlesson Executor . re highlight Component Ġ= Ġhighlight Function ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep . complete ( true ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠWait Timed Out Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠComponent Lookup Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġsteps . add ( step ) ĊĠ Ġ} Ċ }