open-insight/LSL2/STPROC/TEST_JCH.txt
2024-05-22 14:06:46 -07:00

819 lines
18 KiB
Plaintext

COMPILE ROUTINE TEST_JCH(Dummy)
ROWDEF(CHARSTR)
COMMON /FILENAME/ Files_Array, Handles_Array
DECLARE SUBROUTINE obj_Schedule, RList,Send_Dyn, Print_Carton_Labels, Btree.Extract, msg, Set_List_Box_Data, Get_Status, Create_Table
DECLARE SUBROUTINE ErrMsg, Print_Small_Loc_Label, Print_Loc_Label, obj_RDS2, Set_Status, Send_Info, obj_Tables, obj_Location
DECLARE SUBROUTINE obj_WO_Log, obj_WM_In,obj_WM_Out, Make.List, ErrMsg, SetInitDirOptions, Msg, obj_Reprocess, obj_RDS
DECLARE SUBROUTINE obj_Export, Print_SAP_Cass_Ship_Label, obj_WO_MAT, obj_Notes, Send_Dyn, Send_Info, obj_WO_Wfr,Rename_Table
DECLARE FUNCTION Get_Status,Security_Check, Ping, FTPList, Utility, INet_OI_XML, obj_WM_Out,Get_Repos_Entities, obj_RDS, Printer_Select, obj_WO_MAT
DECLARE FUNCTION Repository, obj_Tables, Popup, obj_MUWafers, FTPList, FTPSend, Get_Property, List_User_Locks, Security_Check, Set_Printer, Get_Priner
DECLARE FUNCTION obj_LSL_Users, SRPSendMail, MemberOf, obj_Reactor, obj_Prod_Spec, obj_React_Run, Collect.IXVals
$INSERT WO_STEP_EQUATES
$INSERT WO_REACT_EQUATES
$INSERT WM_IN_EQUATES
$Insert COMPANY_EQUATES
$INSERT SURFACE_SCAN_EQUATES
$INSERT REACT_RUN_EQUATES
$INSERT CLEAN_INSP_EQUATES
$INSERT WM_OUT_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT TOOL_EQUATES
$INSERT TOOL_CLASS_EQUATES
$INSERT WAREHOUSE_EQUATES
$INSERT SRPMail_Inserts
EQU PI$LEFT TO 1
EQU PI$TOP TO 2
EQU PI$RIGHT TO 3
EQU PI$BOTTOM TO 4
EQU PI$WIDTH TO 5
EQU PI$HEIGHT TO 6
EQU PI$SIZE TO 7
EQU CRLF$ TO \0D0A\
EQU TAB$ TO \09\
DEBUG
thisVal = ICONV('37','MD0')
GOTO Bail
WfrID = '162798*8*9'
ShipSlot = '162798*3*4'
RDSNo = 980616
CALL obj_React_Run('UnShipGANWfrs',RDSNo:@RM:ShipSlot:@RM:WfrID)
GOTO Bail
*** Parameter setup of SRPSendMail ***
ConfigFile = ''
ConfigFile<1> = SendUsing_Port$
ConfigFile<2> = ''
ConfigFile<3> = 25 ;// Server port
*ConfigFile<4> = '10.36.10.51' ;// IFX Mail server
ConfigFile<4> = 'smtp.intra.infineon.com' ;// Infinfeon Mail Server
ConfigFile<5> = 1 ;// Authenticate
ConfigFile<6> = 'oinotify@irf.com' ;// Username **************************** Suspected Problem *******************
ConfigFile<7> = 'oinotify1' ;// Password **************************** Suspected Problem *******************
ConfigFile<8> = 0 ;// Use SSL
SentFrom = 'oinotify@irf.com' ;* Sent From eMail addr
SendTo = 'Francois.Rivard@infineon.com' ;* eMailAddr (comma separated)
Message = ''
Message<1> = 'eMail Test' ; // Subject
Message<2> = SentFrom ; // From (email address)
Message<3> = SendTo ; // Send to (email address)
Message<5> = '' ; // Blind Carbon Copy (email address)
*Message<6> = 'roderic.lathion@infineon.com' ; // Reply To (email address)
Message<6> = '' ; // Reply To (email address)
Message<7> = 'TEXT' ; // Content Type (TEXT or HTML)
Message<8> = 'Test' ; // Content / Body
Message<9> ='' ; // Attachment(s) (path to file name(s))
Def = ""
Def<MTEXT$> = 'Sending eMail w/attachements ':ShipNo:'...'
Def<MTYPE$> = "U"
MsgSent = SRPSendMail(Message, ConfigFile) ;* T E M P O R A R Y * until email is workding
debug
GOTO Bail
OrgTable = '!PM_SCHED'
dbID = @DBID
NewTable = 'BAD_INDEX'
LockFlag = 0
Status = ''
DEBUG
CALL Rename_Table(OrgTable,dbID,NewTable,LockFlag,Status)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
GOTO Bail
OPEN 'WAREHOUSE' TO FileIn ELSE
DEBUG
GOTO Bail
END
DEBUG
LocKeys = XLATE('WAREHOUSE','1K',WAREHOUSE_LOC_KEY$,'X')
SortedKeys = ''
kCnt = COUNT(LocKeys,@VM) + (LocKeys NE '')
FOR I = 4 TO 99
LocKey = LocKeys<1,I>
IF LocKey NE '' THEN
LOCATE LocKEy IN SortedKeys BY 'AR' SETTING Pos ELSE
SortedKeys = INSERT(SortedKeys,1,Pos,0,LocKey)
END
END
NEXT I
/*
SortCnt = COUNT(SortedKeys,@VM) + (SortedKeys NE '')
FOR I = 1 TO SortCnt
LocKey = SortedKeys<1,I>
PRINT_SMALL_LOC_LABEL(LocKey
*/
GOTO Bail
DEBUG
SetInitDirOptions("D")
InitDir "R:\Ship_eMail\*.*"
SubDirList = ''
List = DirList()
LOOP
Line = List[1,@FM]
List[1,Col2()] = ""
UNTIL Line = ''
IF Line NE '.' AND Line NE '..' THEN
SubDirList<1,-1> = Line
END
REPEAT
SetInitDirOptions("D")
InitDir 'R:\Ship_Data\*.*'
SubDirList = ''
List = DirList()
LOOP
Line = List[1,@FM]
List[1,Col2()] = ""
UNTIL Line = ''
IF Line NE '.' AND Line NE '..' THEN
SubDirList<1,-1> = Line
END
REPEAT
GOTO Bail
WfrIDs = '162798*6*12':@VM
WfrIDs := '162798*6*13':@VM
WfrIDs := '162798*6*14':@VM
WfrIDs := '162798*6*15'
CurrQueueID = 'GCH*Q_SP'
NextQueueID = 'GGR*Q_DISP'
CONVERT '.' TO '*' IN WfrIDs
EventBy = 'BRYCE_BART'
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
IF WfrIDs NE '' THEN
Parms = WfrIDs :@RM ;* mv
Parms := EventDtm:@RM
Parms := EventBy:@RM
Parms := 'SKIP':@RM ;* Event
Parms := '':@RM ;* mv NewSlotIDs
Parms := '':@RM ;* mv RunLocs
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;*TWUse
Parms := '':@RM ;* mv CurrSlotIDs
Parms := '':@RM ;* NewToolID
Parms := '':@RM ;* CurrToolID
Parms := NextQueueID:@RM ;* NewInvLoc
Parms := CurrQueueID:@RM ;* CurrInvLoc
Parms := 'O':@RM ;* WfrSide
Parms := '':@RM ;* NewCarrLocs ;* mv
Parms := '':@RM ;* CurrCarrLocs ;* mv
Parms := '' ;* Scribes ;* mv
*obj_WO_Wfr('TestAddEvent',Parms)
IF Get_Status(errCode) THEN
ErrMsg(ErrCode)
RETURN
END
END ;* End of check for wafers in the carrier
GOTO Bail
* * * * * * * * * * * * * *
@RECORD = XLATE('REACT_RUN',965970,'','X')
*QU REACT_RUN_IN_WFR_ID$ TO 81
*EQU REACT_RUN_CARR_WFR_ID$ TO 89
*EQU REACT_RUN_CARR_PREV_WFR_ID$ TO 90
EQU WO_WFR_SCRIBE$ TO 12
InWfrIDs = @RECORD<REACT_RUN_IN_WFR_ID$>
CarrWfrIDs = @RECORD<REACT_RUN_CARR_WFR_ID$>
PrevCarrWfrIDs = @RECORD<REACT_RUN_CARR_PREV_WFR_ID$>
lCnt = COUNT( InWfrIDs , @VM ) + ( InWfrIDs NE '' )
WfrIDs = ''
FOR I = 1 TO ICnt
WfrID = CarrWfrIDs<1,I>
IF WfrID = '' THEN
WfrID = PrevCarrWfrIDs<1,I>
END
WfrIDs<1,I> = WfrID
NEXT I
@ANS = XLATE( 'WO_WFR' , WfrIDs , WO_WFR_SCRIBE$ , 'X')
GOTO Bail
EventBy = 'BRYCE_BARB'
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
WfrIDs = '162798*1*11':@VM:'162798*1*12':@VM:'162798*1*13':@VM:'162798*1*14':@VM:'162798*1*15'
Parms = WfrIDs :@RM ;* mv
Parms := EventDtm:@RM
Parms := EventBy:@RM
Parms := 'Skip':@RM ;* Event
Parms := '':@RM ;* mv NewSlotIDs
Parms := '':@RM ;* mv RunLocs
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;*TWUse
Parms := '':@RM ;* mv CurrSlotIDs
Parms := '':@RM ;* NewToolID
Parms := '':@RM ;* CurrToolID
Parms := 'GCH*WARP_Q':@RM ;* NewInvLoc
Parms := 'GCH*UV_Q':@RM ;* CurrInvLoc
Parms := 'O':@RM ;* WfrSide
Parms := '':@RM ;* NewCarrLocs ;* mv
Parms := '':@RM ;* CurrCarrLocs ;* mv
Parms := '' ;* Scribes ;* mv
obj_WO_Wfr('TestAddEvent',Parms)
DEBUG
/*
SortStageKeys = obj_Prod_Spec('GetStage','4645':@RM)
ToolClasses = XLATE('PRS_STAGE',SortStageKeys,'PROC_TOOL_CLASS','X')
QIns = XLATE('TOOL_CLASS',ToolClasses,'QIN_LOC_ID','X')
QOuts = XLATE('TOOL_CLASS',ToolClasses,'QOUT_LOC_ID','X')
*/
GOTO Bail
* * * * ************************************
WONo = '162710'
WOMatKeys = XLATE('WO_LOG',162710,31,'X') ;*WO_LOG_WO_MAT_KEY$
WfrsRxd = 75 ;* Total Wafers received
CassettesRxd = 3
CassShipQty = 8
IF CassShipQty <= 0 THEN CassShipQty = 25
WOMatReq = INT(WfrsRxd/CassShipQty) ;* Qty of WO_MAT records required
a = MOD(WfrsRxd,CassShipQty)
IF MOD(WfrsRxd,CassShipQty) THEN
WOMatReq += 1 ;* Add another WO_MAT for a short qty box at the end
END
LastInCassNo = ''
LastOutCassNo = ''
* * * * Loop through existing WOMatKeys and set pointers for newly received information * * * *
IF WOMatKeys NE '' THEN
womCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO womCnt
WOMatKey = WOMatKeys<1,I>
RxDTM = XLATE('WO_MAT',WOMatKey,WO_MAT_RX_DTM$,'X')
IF RxDTM NE '' THEN
LastInCassNo = I ;* This assumes cassettes received are in numerical order and none have been deleted out of sequence
END
LastOutCassNo = I
NEXT I
END
NextInCassNo = LastInCassNo + 1
NextOutCassNo = LastOutCassNo + 1
FOR I = 1 TO WOMatReq
CassNo = NextInCassNo
WOMatKey = WONo:'*':CassNo
WOMatExists = ''
LOCATE WOMatKey IN WOMatKeys BY 'AR' USING @VM SETTING NewPos ELSE
WOMatKeys = INSERT(WOMatKeys,1,NewPos,0,WOMatKey)
END
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* WOMat record may be an outbound on
IF Get_Status(errCode) THEN
DEBUG
END
IF WOMatRec NE '' THEN WOMatExists = 1
IF WOMatExists THEN
* Update the existing WO_MAT Record
END ELSE
* * Create new WO_MAT record with Receiving Data * *
WOMatRec = ''
END ;* End of check for existing WO_MAT record
NextInCassNo += 1
IF NextInCassNo >= NextOutCassNo THEN
NextOutCassNo += 1
END
NEXT I
GOTO Bail
*******************************************************************
WOWfrRec = XLATE('WO_WFR','162545*1*1','','X')
RPZs = WOWfrRec<5>
LOOP
RPZ = RPZs[-1,'B':@VM]
UNTIL RPZ NE '' OR RPZs = ''
RPZs[COL1(),20] = ''
REPEAT
as = COL1()
af = COL2()
GOTO Bail
Select FileIn
Done = 0
RecCnt = 0
FixCnt = 0
DEBUG
LOOP
READNEXT SSKey ELSE Done = 1
UNTIL Done
DELETE FileIn,SSKey THEN
Send_Dyn(SSKey:' purged')
END
REPEAT
GOTO Bail
Done = 0
RecCnt = 0
FixCnt = 0
DEBUG
LOOP
READNEXT SSKey ELSE Done = 1
UNTIL Done
WONo = SSKey[1,'*']
WOStep = SSKey[COL2()+1,'*']
CassNo = SSKey[COL2()+1,'*']
Stage = SSKey[COL2()+1,'*']
READ SurfRec FROM FileIn,SSKey THEN
RecCnt += 1
RDSNo = SurfRec<SURFACE_SCAN_RDS_NO$>
IF RDSNo NE '' THEN
RRunRec = XLATE('REACT_RUN',RDSNo,'','X')
IF RRunRec NE '' THEN
FixCnt += 1
CINos = RRunRec<REACT_RUN_CI_NO$>
CIStages = RRunRec<REACT_RUN_CI_STAGE$>
CIStage = ''
IF CINos = '' THEN
DELETE FileIn,SSKey THEN
Send_Info(RecCnt:' ':RDSNo:' -> ':SSKey:' Purged ')
END
END ELSE
BEGIN CASE
CASE Stage = 'PC'
CIStage = 'POST'
CASE Stage = 'PE'
CIStage = 'PRE'
CASE Stage = 'FW'
IF INDEX(CIStages,'FWI',1) THEN CIStage = 'FWI'
IF INDEX(CIStages,'LWI',1) THEN CIStage = 'LWI'
IF CIStage = '' AND CIstages = 'PRE':@VM:@VM:'POST' THEN
READ CIRec FROM CITable,CINos<1,2> THEN
CIRec<CLEAN_INSP_STAGE$> = 'FWI'
WRITE CIRec ON CITable,CINos<1,2> THEN
CIStages<1,2> = 'FWI'
CIStage = 'FWI'
END
END
END ;* End of missing Stage fixit
CASE 1
CIStage = ''
END CASE
IF CIStage NE '' THEN
LOCATE CIStage IN CIStages USING @VM SETTING Pos THEN
CINo = CINos<1,Pos>
IF CINo NE '' THEN
READ CIRec FROM CITable,CINo THEN
ScanUser = SurfRec<SURFACE_SCAN_SCAN_USER$>
ScanDTM = SurfRec<SURFACE_SCAN_SCAN_DTM$>
LOCATE ScanDTM IN CIRec<CLEAN_INSP_SCAN_SIG_DTM$> USING @VM SETTING SPos THEN
CIRec<CLEAN_INSP_SCAN_SIG$,SPos> = ScanUser
WRITE CIRec ON CITable,CINo THEN
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' CI ':CINo:' Updated - Surfscan Rec ':SSKey: ' purged')
END
END ;* End of CIRec write
END ELSE
ScanFlag = 0
IF CIRec<CLEAN_INSP_SCAN_TOOL$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_SCAN_SIG$> NE '' THEN ScanFlag = 1
IF CIRec<CLEAN_INSP_INSP_SIG_DTM$> NE '' THEN ScanFlag = 1
IF NOT(ScanFlag) THEN
CIRec<CLEAN_INSP_SCAN_TOOL$> = SurfRec<SURFACE_SCAN_SCAN_TOOL$>
CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$> = SurfRec<SURFACE_SCAN_SUM_OF_DEF_MIN$>
CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$> = SurfRec<SURFACE_SCAN_SUM_OF_DEF_MAX$>
CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$> = SurfRec<SURFACE_SCAN_SUM_OF_DEF_AVG$>
CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$> = SurfRec<SURFACE_SCAN_HAZE_AVG_AVG$>
CIRec<CLEAN_INSP_SCAN_SIG$> = SurfRec<SURFACE_SCAN_SCAN_USER$>
CIRec<CLEAN_INSP_INSP_SIG_DTM$> = SurfRec<SURFACE_SCAN_SCAN_DTM$>
WRITE CIRec ON CITable,CINo THEN
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' CI ':CINo:' Updated - Surfscan Rec ':SSKey: ' purged')
END
END ;* End of CIRec write
END ELSE
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' CI ':CINo:' Sig DTM mismatch ':SSKey: ' purged')
END
END;* End of check for ScanFlag
END;* End of Locate ScanDTM
END ELSE
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' CI ':CINo:' NOT FOUND - Surfscan Rec ':SSKey: ' purged')
END
END ;* End of record read
END ELSE
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' Null CINo found with CIStage ':CIStage:' in REACT_RUN record')
END
END ;* End of check for null CINo in REACT_RUN
END ELSE
DELETE FileIn,SSKey THEN
Send_Dyn(RecCnt:' CIStage ':CISTage:' not found in REACT_RUN Records':SSKey: ' purged')
END
END ;* End OF Stage LOCATE
END ELSE
Send_Dyn(RecCnt:'Null CIStage for Stage: ':Stage)
END;* End of check for Null CIStage
END ;* End of check for CINos
END ;* End of RRunRec read
END ELSE
NULL
/*
WMOKey = FIELD(SSKey,'*',1,3)
CINo = XLATE('WM_OUT',WMOKey,WM_OUT_CI_NO$,'X')
IF CINo NE '' THEN
READ CIRec FROM CITable,CINo THEN
ScanUser = SurfRec<SURFACE_SCAN_SCAN_USER$>
ScanDTM = SurfRec<SURFACE_SCAN_SCAN_DTM$>
LOCATE ScanDTM IN CIRec<CLEAN_INSP_SCAN_SIG_DTM$> USING @VM SETTING SPos THEN
CIRec<CLEAN_INSP_SCAN_SIG$,SPos> = ScanUser
WRITE CIRec ON CITable,CINo THEN
DELETE FileIn,SSKey THEN
Send_Info(RecCnt:' CI ':CINo:' Updated - Surfscan Rec ':SSKey: ' purged')
END
END ;* End of CIRec write
END ;* End of Locatre ScanDTM
END ELSE
DELETE FileIn,SSKey THEN
Send_Info(RecCnt:' CIRec ':CINo:' NOT FOUND - Surfscan Rec ':SSKey: ' purged')
END
END
END ELSE
DELETE FileIn,SSKey THEN
Send_Info(RecCnt:' Null CINo ON WM_OUT RECORD - Surfscan Rec ':SSKey: ' purged')
END
END
*/
END ;* End of check for Null RDS No
Send_Info(RecCnt)
END ;* End of Srface Rec Read
REPEAT
GOTO Bail
BatchID = 'M007673.2'
Open 'DICT.WO_MAT' To DictWOMat Then
Search = 'SAP_BATCH_NO':@VM:BatchID:@FM
Flag = ''
ScanWOMatKey = ''
Set_Status(0)
Btree.Extract(Search,'WO_MAT',DictWOMat,ScanWOMatKey,'',Flag)
If Get_Status(errCode) Then
ErrMsg(errCode)
End
If ScanWOMatKey NE '' Then
CassID = Xlate('WO_MAT',ScanWOMatKey,'CASS_ID_SAP','X')
If CheckID Matches "0N'.'1N'.'0N" THEN
WMOKey = Xlate('WO_MAT',ScanWOMatKey,WO_MAT_WMO_KEY$,'X')
Convert '*' To '.' In WMOKey
CassID = WMOKey
End
*Set_Property(CtrlEntID,'INVALUE',CassID,PrevSelPos)
End Else
*Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
*Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* No corresponding data record found for label scanned bad read or wrong thing scanned
*Return
END
End ;* End of DictWOMat open
Goto Bail
Result = obj_Prod_Spec('GetQAMet',4521:@RM:@RM)
DEBUG
GOTO Bail
Set_Status(1,'STPROC','Missing Reactor No. on RDS':@SVM:'Reactor No. is required prior to recording test results.')
ErrMsg('STPROC':@VM:'Missing Reactor No. on RDS':@SVM:'Reactor No. is required prior to recording test results.')
DEBUG
GOTO Bail
/*
WOReactKey = '159608*1*61'
WOReactRec = XLATE('WO_REACT',WOReactKey,'','X')
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
WONo = FIELD(WOReactKey,'*',1)
StepNo = FIELD(WOReactKey,'*',2)
* * * * * * Prototype for obj_WO_React('RemRdsNo' routine
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
PSNo = PSNos<1,StepNo>
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* Get Reactor Scheduled QA Metrology
Start = QAMetData<COL$QA_MET_SLOT>
Interval = QAMetData<COL$QA_MET_INTERVAL>
AllTestPos = ''
*RemRDSNo = 871366
RemRDSNo = 870613
* Build list of all RDS sequence positions on this WO-REACT that require the test
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
SeqCnt = 0
FOR TestSeq = 1 TO RDSCnt
IF REM((TestSeq - Start),Interval) = 0 THEN
AllTestPos<1,-1> = TestSeq
SeqCnt += 1
END
Send_Dyn(AllTestPos)
NEXT TestSeq
* Find where the the RDS being removed is in the list.
DEBUG
LOCATE RemRDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
LOCATE RemPos IN AllTestPos BY 'AR' USING @VM SETTING TrimPos ELSE Null
UnschedPosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
upCnt = COUNT(UnschedPosList,@VM) + (UnschedPosList NE '')
FOR I = 1 TO upCnt
CassNo =
NEXT I
END ELSE
* Houston we have a problem
DEBUG
GOTO Bail
END
GOTO Bail
*/
**********************************************************************
* * * * * *
Bail:
* * * * * *
END