IMD 1.16: 31/08/2008 10:56:12 f92903 84-93929-03-a100 nm4crt0.asm nm4crtd.bin nm4crtd.jcl    @0|)wwЀЀtQql)  " }gA ` MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME480110313391400801103133914 801103133914:F92903 VOLCRT II TEST PROGRAM (LSI-4) 84-93929-03-A100   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII M@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>==8? TBIT 3,A JF OV,CHK16 IMS DVA INCRMENT BASE DEVICE ADDRESS TBIT 4,A IS UNIT NO. >= 24? JF OV,SAVCHL IMS DVA INCREMENT BASE DEVICE ADDRESS I  MS DVA JMP SAVCHL CHK16 TBIT 4,A IS UNIT NO. >=16? JF OV,SAVCHL IMS DVA INCREMENT BASE DEVICE ADDRESS IMS DVA SAVCHL AND =:7,A COPY A,CHNL SAVE CHANNEL NUMBER COPY DVA,A GET DEVICE ADDRESS BACK RBIT 1,S SHIFT A,LO,4 COPY A,ADSEL SAVE DEVICE ADDRESS COPY CHNL,A GET CHANNEL NUMBER SHIFT A,LO,1 SHIFT CHANNEL NO. 1 BIT OR ADSEL,A COMBINE CHANNEL NO. WITH DEVICE ADDR. COPY A,DEVAD SAVE DEVICE ADDRESS FUNCTION CODE JMP *DEVCAL LPOOL * * INMUX - SUBTROUTINE TO INITIALIZE ASYNC. MUX. * FIRST THE MUX BOARD IS RESET. THEN THE AUTO OUTPUT BYTE * BLOCK IS SET TO WRITE OPTION TABLE. BOTH RECEIVE AND * TRANSMIT CHANNEL ARE RESET. OPTIOPN TABLE IS THEN WRITTEN. * FINALLY DTR AND RTS ARE RAISED. * INMUX ENT JST DEVCAL CALCULATE DEVCIE ADDRESS COPY ADSEL,X XNX X SELP A,4 RESET MUX COPY =INTBAS,X GET INTERRUPT BASE ADDRESS COPY CHNL,A RBIT 1,S SHIFT A,LO,3 ADD A,X COPY DEVAD,A GET DEVICE ADDRESS OR =AOB,A COPY A,0(X) STORE AOB INSTRUCTION COPY =-4,A COPY A,1(X) STORE BYTE COUNT COPY =OPTAB,A GET OPITON TABLE ADDRESS ADD =OPTAB,A FORM BYTE ADDRESS -1 SUB =1,A COPY A,2(X) COPY =RSTN1,A COPY A,TIMOUT SET INTERRUPT RETURN ADDRESS COPY =RXMT,A COPY DEVAD,X XNX X OUT A,1 RESET TRANSMIT HALF CHANNEL SBIT 8,S RSTN1 COPY =RSTN2,A COPY A,TIMOUT COPY =RRCV,A RESET RECEIVE HALF CHANNEL COPY DEVAD,X XNX X OUT A,1 SBIT 8,S RSTN2 COPY =WOPTAB,A WRITE OPTION TABLE COPY DEVAD,X XNX X OUT A,1 SBIT 8,S JST TIMOUT COPY =WMOREG,A WRRITE MODEM REGISTER COPY DEVAD,X XNX X OUT A,1 SBIT 8,S JST TIMOUT JMP *INMUX * * ASYNC MUX RECEIVER EOB INTERRUPT HANDLER * EOBRCV ENT COPY FULPEX,A IS IT FULL DUPLEX? JEQ A,EOBRT1 COPY =0,A COPY A,FULPEX COPY TIMOUT,A COPY A,EOBRCV JMP $+2 EOBRT1 IMS EOBRCV JMP *EOBRCV * * ASYNC MUX TRANSMITTER WEOB INTERRUTPT HANDLER * EOBXMT ENT COPY TIMOUT,A GET RETURN ADDRESS COPY A,EOBXMT SBIT 8,S JMP *EOBXMT LPOOL TITL TEST 1. CURSOR COMMAND TEST * TEST 1 * CURSOR COMMAND TEST * * THIS TEST CHECKS THE VARIOUS CRT CURSOR FUNCTIONS *  THIS TEST DOES NOT REQUIRE OPERATOR INTERVENTION * * * TEST1 EQU $ COPY =0,A RESET AMM POWER FAIL FLAG  COPY A,PWFG COPY S,A SAVE PSW COPY A,PSW JF SS,$+3 COPY =1,A JMP $+2 COPY =0,A COPY A,SENREG SAVE SENSE SWITCH SETTING JST MSGA SEND MESSAGE WORD TSTMSG TEST 1 NO OPERATOR INTERVENTION COPY =15,X 3 SEC. DELAY COPY =0,A SUB =1,A JNE A,$-1 SUB =1,X JNE X,$-3 * CURSOR COMMAND TESTING * * TEST POSITIONING AND VERIFICATION OF CURSOR * * CURSOR IS PLACED AT 9, 10 * IT IS VERIFIED THAT CURSOR IS AT 9, 10 LOP1 EQU $ COPY DATARG,A CLSN =0,A OPTION CARD JMP LOP1B CSK A,=2 JMP LOP1C  DIO INTERFACE NOP ASYNCH MULTIPLEXER INTERFACE COPY =-1,A COPY A,RECFLG SET MULTI U FLAG JMP LOP1C LOP1B EQU $ LOP1C IMS PASCT NOP IFT SCRT COPY =SCROLL,A ALLOW FOR SCROLLING ENDC IFF SCRT COPY =KYLOK,A LOCK KEYBOARD DURING TEST 1 ENDC JST OTA PLACE: 9,10 PLACE CURSOR AT 9, 10 VRIFY: 9,10 VERIFY CURSOR AT 9, 10 PLACE: 5,0 PLACE CURSOR AT 5, 10   VRIFY: 5,10 VERIFY CURSOR AT 5, 10 PLACE: 0,50 PLACE CURSOR AT 5, 50 VRIFY: 5,50 VERIFY CURSOR AT 5,50 PATCH: LOP1 PATCH THIS INTO NOP * JMP LOP2 LPOOL * TEST HOME * * FIRST CURSOR IS PLACED AT 8,7 AND THEN * HOME IS ISSUED AND IT IS VERIFIED THAT * CURSOR IS AT 1,1 * LOP2 EQU $ PLACE: 8,7 PLACE CURSOR AT 8,7 VRIFY: 8,7 VERIFY CURSOR AT 8, 7 COPY =HOME,A JST OTA ISSUE HOME VRIFY: 1,1 VERIFY CURSOR AT 1,1 PATCH: LOP2 PATCH THIS INTO NOP * * TEST SCREEN ERASE * * FIRST CURSOR IS PLACED AT 10,12 * THEN SCREEN ERASE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 1,1 LOP3 EQU $ PLACE: 10,12 PLACE CURSOR AT 10,12 VRIFY: 10,12 VERIFY CURSOR AT 10,12 COPY =SCRERA,A JST OTA ISSUE SCREENERASE VRIFY: 1,1 VERIFY CURSOR AT 1,1 PATCH: LOP3 PATCH THIS INTO NOP JMP LOP4 LPOOL * * TEST BACKSPACE * * FIRST CURSOR IS PLACED AT 19,45 * BACKSPACE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 19,45 LOP4  EQU $ PLACE: 19,45 PLACE CURSOR AT 19,45 VRIFY: 19,45 VERIFY CURSOR AT 19,45 COPY =BKSP,A  JST OTA ISSUE BACKSPACE VRIFY: 19,44 VERIFY CURSOR AT 19,44 * * CURSOR IS PLACED AT 2,1 * BACKSPACE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 1,80 PLACE: 2,1 PLACE CURSOR AT 2,1 VRIFY: 2,1 VERIFY CURSOR AT 2,1 COPY =BKSP,A JST OTA ISSUE BACKSPACE VRIFY: 1,80 VERIFY CURSOR AT 1,80 * * CURSOR IS PLACED AT 1,1 * BACKSPACE IS ISSUED AND * IT IS VERIFIED THAT CURSOR POSITION IS UNCHANGED PLACE: 1,1 PLACE CURSOR AT 1,1 VRIFY: 1,1 VERIFY CURSOR AT 1,1 COPY =BKSP,A JST OTA ISSUE BACKSPACE  VRIFY: 1,1 VERIFY CURSOR AT 1,1 PATCH: LOP4 PATCH THIS INTO NOP * * TEST FRAME ERASE * * CURSOR IS PLACED AT 22,50 * FRAME ERASE IS ISSUED AND * IT IS VERIFIED THAT CURSOR POSITION IS UNCHANGED LOP5 EQU $ PLACE: 22,50 PLACE CURSOR AT 22,50 VRIFY: 22,50 VERIFY CURSOR AT 22,50 COPY =FRAERA,A JST OTA ISSUE SCREEN ERASE VRIFY: 22,50 VERIFY CURSOR AT 22,50 PATCH: LOP5 PATCH THIS INTO NOP JMP LOP6  LPOOL * * ENTERING A DISPLAYABLE CHARACTER * * CURSOR IS PLACED AT 5,10 * A CHARACTER IS ENTERED AND * IT IS VERIFIED THAT CURSOR IS AT 5,11 LOP6 EQU $ PLACE: 5,10 PLACE CURSOR AT 5,10 VRIFY: 5,10 VERIFY CURSOR AT 5,10  COPY ='Q',A JST OTA ENTER Q VRIFY: 5,11 VERIFY CURSOR AT 5,11 * CURSOR IS PLACED AT 5,80 * A CHARACTER IS ENTERED AND * IT IS VERIFIED THAT CURSOR IS AT 6,1 PLACE: 5,80 PLACE CURSOR AT 5,80 VRIFY: 5,80 VERIFY CURSOR AT 5,80 COPY ='Q',A JST OTA ENTER Q VRIFY: 6,1 VERIFY CURSOR AT 6,1 * CURSOR IS PLACED AT 24,80 * A CHARACTER IS ENTERED AND * IT IS VERIFIED THAT CURSOR IS AT 24,1 PLACE: 24,80 PLACE CURSOR AT 24,80 VRIFY: 24,80 VERIFY CURSOR AT 24,80 COPY ='Q',A JST OTA VRIFY: 24,1  VERIFY CURSOR AT 24,1 PATCH: LOP6 PATCH THIS IN NOP JMP LOP7 LPOOL * * TEST LINEFEED * * CURSOR IS PLACED AT 12, 35 * IT IS VERIFIED THAT CURSOR IS AT 13, 35 LOP7 EQU $ PLACE: 12,35 PLACE CURSOR AT 12, 35  VRIFY: 12,35 VERIFY CURSOR AT 12, 35 COPY =LF,A JST OTA ISSUE LINEFEED VRIFY: 13,35 VERIFY CURSOR AT 13, 35 * CURSOR IS PLACED AT 24, 5 * LINEFEED IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 24, 5 PLACE: 24,5 PLACE CURSOR AT 24, 5 VRIFY: 24,5 VERIFY CURSOR AT 24, 5 COPY =LF,A JST OTA  ISSUE LINEFEED VRIFY: 24,5 VERIFY CURSOR AT 24, 5 PATCH: LOP7 PATCH THIS INTO NOP JMP LOP8  LPOOL * * TEST CARRIAGE RETURN * * CURSOR IS PLACED AT 10, 48 * CARRIAGE RETURN IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 10, 1 LOP8 EQU $ PLACE: 10,48 PLACE CURSOR AT 10, 48 VRIFY: 10,48 VERIFY CURSOR AT 10, 48  COPY =CR,A JST OTA ISSUE CARRIAGE RETURN VRIFY: 10,1 VERIFY CURSOR AT 10,1 PATCH: LOP8 PATCH THIS INTO LOOP * * TEST ROLL UP * * CURSOR IS PLACED AT 6, 12 * ROLL UP IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 6, 12 LOP9 EQU $ PLACE: 6,12 PLACE CURSOR AT 6, 12 VRIFY: 6,12 VERIFY CURSOR AT 6, 12  COPY =ROLUP,A JST OTA ISSUE ROLL UP VRIFY: 6,12 VERIFY CURSOR AT 6, 12 PATCH: LOP9  PATCH THIS INTO NOP * * TEST LINE ERASE * * CURSOR IS PLACED AT 13, 11 * LINE ERASE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 13, 11 * VISUAL CHECK OF LINE ERASE IS DONE IN TEST2 LOP10 EQU $ PLACE: 13,11 PLACE CURSOR AT 13, 11  VRIFY: 13,11 VERIFY CURSOR AT 13, 11 COPY =ERASLN,A JST OTA ISSUE LINE ERASE VRIFY: 13,11 VERIFY CURSOR AT 13, 11 PATCH: LOP10 PATCH THIS INTO NOP * * TEST NEW LINE * * CURSOR IS PLACED AT 17, 10 * NEW LINE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 18, 1 LOP11 EQU $ PLACE: 17,10 PLACE CURSOR AT 17, 10 VRIFY: 17,10 VERIFY CURSOR AT 17,10 COPY =NULIN,A JST OTA ISSUE NEW LINE VRIFY: 18,1 VERIFY CURSOR AT 18, 1 * CURSOR IS PLACED AT 24, 12 * NEW LINE IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 24, 1 PLACE: 24,12 PLACE CURSOR AT 24, 12 VRIFY: 24,12 VERIFY CURSOR AT 24, 12 COPY =NULIN,A JST OTA ISSUE NEW LINE VRIFY: 24,1 VERIFY CURSOR AT 24, 1 PATCH: LOP11 PATCH THIS INTO NOP JMP LOP11A LPOOL * * TEST CURSOR UP * * CURSOR IS PLACED AT 10, 35 * CURSOR UP IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 9, 35 LOP11A EQU $ PLACE: 10,35 PLACE CURSOR AT 10, 35 VRIFY: 10,35 VERIFY CURSOR AT 10, 35 COPY =CRSRUP,A JST OTA ISSUE CURSOR UP VRIFY: 9,35 VERIFY CURSOR AT 9, 35 * CURSOR IS PLACED AT 1, 20 * CURSOR UP IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 24, 20 PLACE: 1,20 PLACE CURSOR AT 1, 20 VRIFY: 1,20 VERIFY CURSOR AT 1, 20 COPY =CRSRUP,A JST OTA ISSUE CURSOR UP VRIFY:  24,20 VERIFY CURSOR AT 24, 20 PATCH: LOP11A PATCH THIS INTO NOP * * TEST CURSOR DOWN * * CURSOR IS PLACED AT 17, 60 * CURSOR DOWN IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 18, 60 LOP11B EQU $ PLACE: 17,60 PLACE CURSOR AT 17, 60 VRIFY: 17,60 VERIFY CURSOR AT 17, 60 COPY =CRSRDN,A JST OTA ISSUE CURSOR DOWN  VRIFY: 18,60 VERIFY CURSOR AT 18, 60 * CURSOR IS PLACED AT 24, 37 * CURSOR DOWN IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 1, 37 PLACE: 24,37 PLACE CURSOR AT 24, 37 VRIFY: 24,37 VERIFY CURSOR AT 24, 37 COPY =CRSRDN,A JST OTA ISSUE CURSOR DOWN VRIFY: 1,37 VERIFY CURSOR AT 1, 37 PATCH: LOP11B PATCH THIS INTO NOP JMP LOP11C LPOOL * * CURSOR RIGHT FUNCTION TEST * * CURSOR IS PLACED AT 18, 70 * CURSOR RIGHT IS ISSUED * IT IS VERIFIED THAT CURSOR IS AT 18, 71 LOP11C EQU $ PLACE: 18,70 PLACE CURSOR AT 18, 70 VRIFY: 18,70 VERIFY CURSOR AT 18, 70 COPY =CRSRRT,A JST OTA ISSUE CURSOR RIGHT VRIFY: 18,71 VERIFY CURSOR AT 18, 71 * CURSOR IS PLACED AT 6, 80 * CURSOR RIGHT IS ISSUED * IT IS VERIFIED THAT CURSOR IS AT 7, 1 PLACE: 6,80 PLACE CURSOR AT 6, 80 VRIFY: 6,80 VERIFY CURSOR AT 6, 80 COPY =CRSRRT,A JST OTA  ISSUE CURSOR RIGHT VRIFY: 7,1 VERIFY CURSOR AT 7, 1 * CURSOR IS PLACED AT 24, 80 * CURSOR RIGHT IS ISSUED * IT IS VERIFIED THAT CURSOR IS AT 1, 1 PLACE: 24,80 PLACE CURSOR AT 24, 80 VRIFY: 24,80 VERIFY CURSOR AT 24, 80 COPY =CRSRRT,A JST OTA ISSUE CURSOR RIGHT VRIFY: 1,1 VERIFY CURSOR AT 1, 1 PATCH: LOP11C PATCH THIS INTO NOP JMP LOP11D LPOOL * * CURSOR LEFT FUNCTION TEST * * CURSOR IS PLACED AT 22, 10 * CURSOR LEFT IS ISSUED * IT IS VERIFIED THAT CURSOR IS AT 22, 9 LOP11D EQU $ PLACE: 22,10 PLACE CURSOR AT 22, 10 VRIFY: 22,10 VERIFY CURSOR AT 22, 10 COPY =CRSRLT,A JST OTA ISSUE CURSOR LEFT VRIFY: 22,9 VERIFY CURSOR AT 22, 9 * CURSOR IS PLACED AT 9, 1 * CURSOR LEFT IS ISSUED AND * IT IS VERIFIED THAT CURSOR IS AT 8, 80 PLACE: 9,1 PLACE CURSOR AT 9, 1 VRIFY: 9,1 VERIFY CURSOR AT 9, 1 COPY =CRSRLT,A  JST OTA ISSUE CURSOR LEFT VRIFY: 8,80 VERIFY CURSOR AT 8, 80 * CURSOR IS PLACED AT 1, 1 * CURSOR LEFT IS ISSUED * IT IS VERIFIED THAT CURSOR IS AT 24,80 PLACE: 1,1 PLACE CURSOR AT 1, 1 VRIFY: 1,1 VERIFY CURSOR AT 1, 1 COPY =CRSRLT,A JST OTA ISSUE CURSOR LEFT VRIFY: 24,80 VERIFY CURSOR AT 24, 80 PATCH: LOP11D PATCH THIS INTO NOP IFT SCRT COPY =SCROLL,A KEEP SCROLL FEATURE ENDC * * UPDATE ATTRIBUTE STATUS (:1A) & CRT STATUS * READ (:05) TESTS. EACH CHARACTER ATTRIBUTE * IS SET, STATUS IS READ, VERIFIED, AND RESET. * LOP11E COPY =-5,A SET COUNT TO DO 5 ATTRIBUTE STATUS COPY A,ATCNT COPY =2,A COPY A,ATTBIT  INITIALIZE ATTRIBUTE STATUS ATTST COPY =CRATTB,A JST OTA SEND UPDATE ATTRIBUTE STATUS COMMAND COPY  ATTBIT,A GET CHARACTER ATTRIBUTE JST OTA SEND ATTRIBUTE STATUS JST GETSTA GET & COMPARE STATUS  COPY ATTBIT,A GET ATTRIBUT AGAIN SHIFT A,LO,1 SHIFT TO FORM NEXT ATTRIBUTE COPY A,ATTBIT IMS  ATCNT INCREMENT ATTRIBUTE COUNT JMP ATTST DO NEXT UPDATE ATTRIBUTE STATUS COPY =CRATTB,A RESET ALL ATTRIBUTE STATUS BITS JST OTA COPY =0,A JST OTA PATCH: LOP11E JMP LOP11F LPOOL * * SCROLL DISABLE TEST (:04) * CURSOR IS POSITIONED TO (24,80). SCROLL IS * DISABLED. CURSOR IS MOVED RIGHT. CURSOR * IS VERIFIED TO BE AT (1,1). * LOP11F EQU $ COPY =SCRERA,A ERASE SCREEN JST OTA PLACE: 24,80 PLACE CURSOR AT 24,80  VRIFY: 24,80 VERIFY CURSOR AT 24,80 COPY =DISCRO,A DISABLE SCROLL JST OTA COPY =:A0,A MOVE CURSOR RIGHT ONE PLACE JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1,1 PATCH: LOP11F * * SCROLL ENABLE TEST (:00) * CURSOR IS POSITION AT (24,80). SCROLL * IS ENABLED. CURSOR IS MOVED RIGHT ONE POSITION. * CURSOR IS THEN VERIFIED AT (24,1) * LOP11G EQU $ PLACE: 24,80 PLACE CURSOR AT 24,80 VRIFY: 24,80 VERIFY CURSOR AT 24,80 COPY =ENSCO,A ENABLE SCROLL JST OTA COPY =:A0,A MOVE CURSOR RIGHT ONE PLACE JST OTA VRIFY: 24,1 VERIFY CURSOR AT 24,1 PATCH: LOP11G * * PROTECTION MODE TEST * CURSOR IS POSITIONED TO (12,40) AND PROTECTION * MODE IS SET. DATA CHARACTER "P" IS SENT TO * POSITION (12,40) & (12,41). * CURSOR IS POSITIONED TO (12,40), MOVED TO (12,41) * AND VERIFIED. PROTECTION BIT IS RESET. CURSOR * IS VERIFIED AT (12,42). * LOP11H EQU $ PLACE: 12,40 CURSOR IS PLACED AT 12,40 VRIFY: 12,40 VERIFY AT 12,40 COPY =CRATTB,A JST OTA UPDATE ATTRIBUTE STATUS COPY =PROTEC,A JST OTA TO PROTECTION MODE COPY =:50,A SEND CHARACTER "P" JST OTA COPY =:50,A JST OTA PLACE: 12,40 POSITION CURSOR TO 12,40 VRIFY: 12,40 VERIFY CURSOR AT 12,40 COPY =CRSRRT,A JST OTA MOVE CURSOR TO 12,41 VRIFY: 12,41 VERIFY CURSOR AT 12,41 COPY =CRATTB,A UPDATE ATTRIBUT TO UNPROTECT MODE JST OTA COPY =0,A JST OTA VRIFY: 12,42 VERIFY CURSOR AT 12,42 PLACE: 12,1 PLACE CURSOR AT (12,1) COPY =ERASLN,A JST OTA ERASE LINE AND ATTRIBUTE PATCH: LOP11H * * TABULATE (UNPROTECTED) TEST (:10) * CHARACTER AT LOCATION (24,80) IS PROTECTED. CURSOR * IS THEN POSITIONED TO (24,79). TABULATE COMMAND * IS SENT, AND VERIFED CURSOR TO BE AT (1,1). * LOP11I EQU $ PLACE: 24,80 POSITION CURSOR TO 24,80  VRIFY: 24,80 VERIFY CURSOR AT 24,80 COPY =CRATTB,A JST OTA SEND PROTECT ATTRIBUTE STATUS BIT  COPY =PROTEC,A JST OTA COPY =:50,A SEND CHARACTER "P" TO BE PROTECTED JST OTA PLACE: 24,79 PLACE CURSOR AT 24,79 VRIFY: 24,79 VERFIY CURSOR AT 24,79 COPY =TABULA,A SEND TABULATE COMMAND JST  OTA VRIFY: 1,1 VERFIY CURSOR AT 1,1 PLACE: 24,1 PLACE AT 24,1 COPY =ERASLN,A JST OTA B LANK LINE AND ATTRIBUT STATUS PATCH: LOP11I IFF SCRT COPY =UNLOCK,A UNLOCK KEYBOARD ENDC  JST OTA COPY =0,A COPY A,RECFLG JMP TEST2 LPOOL ** TEST1 ENDS TITL TEST 2. SCREEN PATTERN TEST ** TEST 2 THIS TEST ISSUES VARIOUS CURSOR COMMANDS ** AND DISPLAYS PATTERNS ON THE CRT SCREEN. ** THE OPERATOR IS REQUIRED TO VERIFY THAT ** THE DISPLAY IS CORRECT. PRESS THE SPACE BAR ** TO CONTINUE TEST EXECUTION TEST2 COPY TESTS,A SEE IF TEST 2 IS SELECTED SHIFT A,RO,1 JT OV,$+2 JMP TEST3 * * BLANK SCREEN UNPROTECTED (:03) * THE 1ST HALF OF THE SCREEN IS FILLED WITH CHARACTER "U". * THE OTHER HALF IS FILLED WITH "P". ONLY THE 1ST HALF * OF THE SCREEN IS PPROTECTED. BLANK SCREEN UNPROTECTED * COMMAND IS SENT. OPERATOR SHOULD VERIFY THE * UPPER HALF OF THE SCREEN IS ERASED. * COPY =SCRERA,A JST OTA ERASE SCREEN JST MSGA SEND MESSAGE WORD BLKUP MESSAGE FOR BLANK SCREEN UNPROTECTED TEST JST SPACE CHECK FOR SPACE KEY LOP12 COPY =HOME,A JST OTA HOME CURSOR COPY =-960,A COPY A,CHARCT SET COUNTS TO FILL HALF OF SCREEN FILOP1 COPY =:55,A JST OTA FILL UPPER SCREEN WITH U IMS CHARCT JMP FILOP1 COPY =CRATTB,A SET PROTECT ATTRIBUTE STATUS JST OTA COPY =PROTEC,A JST OTA COPY =-960,A SET COUNTS TO FILL LOWER HALF SCREEN COPY A,CHARCT FILOP2 COPY =:50,A JST OTA FILL LOWER HALF SCRREN WITH P  IMS CHARCT JMP FILOP2 COPY =CRATTB,A JST OTA COPY =0,A JST OTA RESET PROTECT ATTRIBUTE STATUS COPY =:03,A JST OTA BLANK UNPROTECTED SCREEN COPY =:05,X DELAY 1.5 SECONDS COPY =0,A SUB =1,A JNE A,$-1 SUB =1,X JNE X,$-3 PATCH: LOP12 ** THIS PORTION OF THE TEST FILLS SCREEN **  WITH * AND U,WHEN THE SCREEN IS FULL ** HIT SPACE AND THEN IT WILL FILL THE ** SCREEN AGAIN WITH U AND *,HIT SPACE ** TO GO INTO NEXT TEST LOP12A EQU $ COPY =CRATTB,A SET PROTECT ATTRIBUTE JST OTA STATUS BIT COPY =PROTEC,A JST OTA COPY =HOME,A PLACE CURSOR AT 1,1 JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1,1 JST MSGA WORD ASU JST SPACE IS IT SPACE? ** FILL SCREEN WITH * AND U COPY =HOME,A JST OTA HOME CURSOR COPY =-960,A HALF OF TOTAL CHAR TO FILL SCREEN COPY A,CHARCT STORE IT BACK2 COPY ='*',A SCREEN FILLED WITH * AND U JST OTA OUTPUT * COPY =CHARU,A LOAD SMALL U JST OTA IMS CHARCT JMP BACK2 JST MSGA MESSAGE WORD UAS  JST SPACE IS IT SPACE COPY =HOME,A PLACE CURSOR AT 1,1 JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1,1 COPY =-960,A HALF OF TOTAL CHAR TO FILL SCREEN COPY A,CHARCT STORE IT BACK1 COPY =CHARU,A LOAD SMALL U JST OTA OUTPUT U COPY ='*',A LOAD ASTERISK JST OTA IMS CHARCT   JMP BACK1 JST MSGA WORD ALT ** LOOP POINT PATCH: LOP12A PATCH THIS INTO NOP JST SPACE IS IT SPACE? ** FILL SCREEN AND THEN OBSERVE A SCREEN ERASE LOP13 EQU $ COPY =HOME,A PLACE CURSOR JST OTA COPY =-960,A HALF OF TOTAL CHAR TO FILL SCREEN COPY A,CHARCT STORE IT BACK3 COPY ='*',A LOAD ASTERISK JST OTA COPY =CHARU,A LOAD SMALL U JST OTA IMS CHARCT JMP BACK3  JST MSGA WORD ERASE JST SPACE IS IT SPACE? COPY =SCRERA,A ISSUE SCREEN ERASE JST  OTA VRIFY: 1,1 VERIFY CURSOR AT 1, 1 ** LOOP POINT PATCH: LOP13 PATCH THIS INTO NOP JMP LOP14 LPOOL ** CHECK FRAME ERASE.12 LINES OUTPUT ON SCREEN AND ** CURSOR PLACED AT 1,12. ENTER SPACE TO INITIATE FRAME ERASE ** PRESS SPACE TO CONTINUE JST SPACE LOP14 EQU $ COPY =HOME,A GENERATE HOME JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1, 1 COPY =-960,A COPY A,CHARCT STORE BACK4 COPY =CHARU,A LOAD SMALL U  JST OTA IMS CHARCT JMP BACK4 JST MSGA OUTPUT FRAME ERASE MESSAGE WORD FRAER0 PLACE: 1,12 CURSOR TO 1,12 VRIFY: 1,12 JST SPACE COPY =FRAERA,A ISSUE FRAME ERASE JST OTA VRIFY: 1,12 ** CHECK FRAME ERASE,LINE ERASE,SCREEN ERASE. 12 LINES ** OUTPUT ON SCREEN AND CURSOR PLACED AT 6,40. ENTER SPACE. ** EVERYTHING ERASED FROM 6,40 ON. CURSOR THEN MOVED ** TO 5,1 PRESS SPACE. LINE 5 IS ERASED AND THE CURSOR ** SHOULD BE AT 5,1. PRESS SPACE TO ERASE THE SCREEN & CONTINUE * JST SPACE GET SPACE TO CONTINUE COPY =HOME,A PLACE CURSOR AT 1,1 JST OTA COPY =-960,A COPY A,CHARCT BACKG COPY =CHARU,A FILL HALF OF SCREEN AGAIN JST OTA IMS CHARCT JMP BACKG JST MSGA OUTPUT MESSAGE TO START FRAME ERASE WORD FRAER0 PLACE: 6,40 JST SPACE COPY =FRAERA,A ISSUE FRAME ERASE JST OTA  VRIFY: 6,40 PLACE: 13,1 JST MSGA OUTPUT MESSAGE TO DO LINE ERASE & WORD ERAS SCREEN ERASE PLACE: 5,1 NOW PLACE CURSOR AT 5,1 JST SPACE ENTER A SPACE FOR LINE ERASE COPY =ERASLN,A DO LINE ERASE JST OTA VRIFY: 5,1 ** LOOP POINT PATCH: LOP14 PATCH THIS INTO NOP ** THERE WILL BE A DISPLAY OF ALL DISPLAYABLE CHARACTERS ON CRT JMP LOP15 LPOOL LOP15 EQU $ JST SPACE IS IT SPACE? COPY =SCRERA,A JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1, 1 JST MSGA WORD STRING PLACE: 8,1 PLACE CURSOR AT 8,1 VRIFY: 8,1 VERIFY CURSOR AT 8,1 JST MSGA WORD CRSR1 ** LOOP POINT PATCH: LOP15 PATCH THIS INTO NOP JMP LOP16A-1 LPOOL * FIRST SIX LINES OF CRT SCREEN ARE FILLED WITH SOLID * LOWER CASE 'U' PATTERN AND THE CURSOR IS PLACED AT * 3,20 THEN VARIOUS CURSOR POSITION COMMANDS ARE ISSUED * AND THE PROGRAM VERIFIES CURSOR MOVEMENTS ALL OPERATOR * HAS TO VERIFY THAT NONE OF THE CHARACTERS ON THE SCREEN *   ARE ERASED JST SPACE IS IT SPACE? LOP16A EQU $ COPY =SCRERA,A JST OTA ISSUE SCREEN ERASE VRIFY: 1,1 VERIFY CURSOR AT 1, 1 COPY =-480,A CHARACTERS REQUIRED TO FILL SIX COPY A,CHARCT LINES OF CRT SCREEN JMP BACK5 LPOOL * * CHECK CURSOR UP, CURSOR DOWN, CURSOR RIGHT, * AND CURSOR LEFT COMMANDS BACK5 COPY =CHARU,A JST OTA IMS CHARCT JMP BACK5 JST MSGA WORD CRSR2  PLACE: 3,20 PLACE CURSOR AT 3, 20 VRIFY: 3,20 VERIFY CURSOR AT 3,20 JST SPACE IS IT SPACE?  COPY =CRSRUP,A JST OTA ISSUE CURSOR UP VRIFY: 2,20 VERIFY CURSOR AT 2, 20 JST SPACE IS IT SPACE COPY =CRSRDN,A JST OTA ISSUE CURSOR DOWN COMMAND VRIFY: 3,20 VERIFY CURSOR AT 3,20 JST SPACE IS IT SPACE? COPY =CRSRRT,A JST OTA ISSUE CURSOR RIGHT VRIFY: 3,21 VERIFY CURSOR AT 3, 21 JST SPACE IS IT SPACE? COPY =CRSRLT,A JST OTA ISSUE CURSOR LEFT VRIFY: 3,20 VERIFY CURSOR AT 3, 20 PATCH: LOP16A PATCH THIS INTO NOP JST SPACE PLACE: 12,1 VRIFY: 12,1 JST MSGA WORD STRNG JMP LOP16-1 LPOOL ** HIT ANY KEY,DISPLAYABLE FROM CRT ** AND THAT CHARACTER WILL BE PRINTED OUT ON CRT JST SPACE IS IT SPACE? LOP16 EQU $ COPY  =SCRERA,A JST OTA VRIFY: 1,1 AGAIN JST CHARIN INPUT CHARACTER FROM KEYBOARD CLSN =:A0,A  JMP LOCK1 DONE WITH CHARACTERS JST OTA OUTPUT CHARACTERS JMP AGAIN TRY NEXT CHARACTER LOCK1 EQU $ IFF SCRT * KEYBOARD LOCK AND UNLOCK TEST JST MSGA WORD LOCK JST SPACE IS IT SPACE? COPY =KYLOK,A LOCK KEYBOARD JST OTA COPY =-10,X TRYAG2 COPY =0,A FOR 30 SECONDS  ADD =1,A JNE A,$-1 ADD =1,X JNE X,TRYAG2 COPY =UNLOCK,A UNLOCK KEYBOARD JST OTA TRYAG4 JST CHARIN CLSN =:A0,A JMP DONE1 JST OTA JMP TRYAG4 ENDC DONE1 EQU $ IFT SCRT * TEST SCROLL, NO SCROLL FEATURE COPY =SCRERA,A JST OTA JST MSGA  MESSAGE TO SCROLL WORD MSGSRL JST SPACE ENTER SPACE TO BEGIN PLACE: 13,1 VRIFY: 13,1  COPY =SCROLL,A SCROLL ENABLE JST OTA COPY =-1920,A CHARS REQUIRED TO FILL SCREEN COPY A,CHARCT FILL COPY ='S',A FILL SCREEN WITH S JST OTA SCREEN SHOULD SCROLL UP IMS CHARCT JMP FILL JST MSGA MESSAGE TO DISABLE SCROLL WORD MSGDIS JST SPACE COPY =SCRERA,A JST OTA VRIFY: 1,1 DELAY IF .GT. 2400 BAUD PLACE: 13,1 COPY =NSCR,A DISABLE SCROLL JST  OTA COPY =-1920,A COPY A,CHARCT FILL1 COPY ='N',A FILL SCREEN WITH N JST OTA NO SCROLLING SHOULD BE OBSERVED IMS CHARCT JMP FILL1 JST SPACE ENTER SPACE TO CONTINUE COPY =S CROLL,A SCROLL ENABLE JST OTA ENDC PATCH: LOP16 JMP CURLOP LPOOL CURLOP EQU $ * TEST CURSOR ENABLE & DISABLE COPY =SCRERA,A JST OTA JST MSGA WORD MSGCUR MESSAGE TO START TEST JST SPACE COPY =CRSRDS,A DISABLE CURSOR JST OTA COPY =-10,X TRYAG3 COPY =0,A FOR ABOUT 3 SECONDS ADD =1,A CURSOR SHOULD NOT BE VISIBLE JNE A,$-1 ADD =1,X JNE X,TRYAG3 COPY =CRSREN,A NOW REENABLE CURSOR JST OTA PATCH: CURLOP * * REVERSE VIDEO MODE TEST * SCREEN IS FILLED WITH ALTERNATE $ AND % CHARACTERS, * IN REVERSE VIDEO FIELD. * LOP16X EQU $ COPY =HOME,A JST OTA HOME CURSOR JST MSGA SEND MESSAGE WORD REVERV HIT SPACE TO TEST REVERSE VIDEO JST SPACE IS IT A SPACE? COPY =CRATTB,A JST OTA SET REVERSE ATTRIBUTE STATUS COPY =RVIDEO,A  JST OTA COPY =HOME,A JST OTA HOME CURSOR COPY =-960,A COPY A,CHARCT SET COUNT TO FILL SCREEN FILOP3 COPY =:24,A SEND $ JST OTA COPY =:25,A JST OTA SEND % IMS CHARCT JMP FILOP3 PATCH: LOP16X * * UNDERLINE TEST * SCREEN IS FILLED WITH ALTERNATE AND # CHARACTERS * UNDERLINED. * LOP16B EQU $ COPY =HOME,A JST OTA HOME CURSOR COPY =ERASLN,A ERASE TOP LINE  JST OTA JST MSGA SEND MESSAGE WORD ULINEM HIT SPACE TO TEST UNDERLINE JST SPACE WAIT FOR SPACE KEY COPY =HOME,A JST OTA HOME CURSOR COPY =CRATTB,A JST OTA COPY  =ULINE,A JST OTA SET UNDERLINE ATTRIBUTE STATUS COPY =HOME,A JST OTA COPY =-960,A  SET COUNT TO FILL SCREEN COPY A,CHARCT FILOP4 COPY =:40,A JST OTA SEND CHARACTER COPY =:23,A JST OTA SEND CHARACTER # IMS CHARCT JMP FILOP4 PATCH: LOP16B * * BLINKING MODE * FILL SCREEN WITH BLINKING ASTERIKS * LOP16C EQU $ COPY =HOME,A JST OTA COPY =ERASLN,A JST  OTA ERASE LINE JST MSGA SEND MESSAGE WORD BLINKM HIT SPACE TO TEST BLINKING JST SPACE WAIT UNTIL SPACE KEY IS PRESSED COPY =HOME,A JST OTA HOME CURSOR COPY =CRATTB,A JST OTA COPY =BLINK,A SET BLINKING ATTRIBUTE JST OTA COPY =-1920,A SET COUNT TO FILL SCREEN  COPY A,CHARCT COPY =:2A,A JST OTA SEND * IMS CHARCT JMP $-3 PATCH: LOP16C * * SUBDUE MODE * THE SCREEN IS FILLED WITH ALTERNATE S AND D CHARACTERS * IN SUBDUE MODE. * LOP16D EQU $ COPY =HOME,A JST OTA COPY =ERASLN,A JST OTA ERASE LINE JST MSGA SEND MESSAGE  WORD SUBDEM HIT SPACE TO TEST SUBDUE JST SPACE WAIT FOR SPACE BAR TO BE PRESSED COPY =HOME,A JST OTA HOME CURSOR COPY =CRATTB,A JST OTA COPY =SUBDUE,A JST OTA SET SUBDUE  ATTRIBUTE STATUS COPY =-960,A COPY A,CHARCT SET COUNT TO FILL SCREEN FILOP5 COPY =:53,A SEND S JST OTA COPY =:44,A JST OTA IMS CHARCT JMP FILOP5 PATCH: LOP16D JMP LOP16E LPOOL * * GRAPHIC MODE * A SYNMETRICAL GRAPHIC PATTERN WHICH USES ALL * 32 GRAPHIC CHARACTERS IS DISPLAYED. * LOP16E EQU $ COPY =HOME,A JST OTA COPY =ERASLN,A JST OTA ERASE LINE JST MSGA SEND MESSAGE WORD GRAPHM HIT SPACE TO TEST GRAPHIC JST SPACE WAIT FOR SPACE KEY COPY =SCRERA,A JST OTA ERASE SCREEN COPY =CRATTB,A JST OTA COPY =GRAPH,A SET GRAPHIC ATTRIBUTE STATUS JST OTA PLACE: 5,32 START DRAWING GRTAPHIC PATTERN COPY =:48,A JST OTA PLACE: 5,48 COPY =:48,A JST OTA PLACE: 19,32 COPY =:48,A JST OTA PLACE: 19,48  COPY =:48,A JST OTA COPY =37,A COPY A,COLADR INIT. COLUMN NO. COPY =:8,A COPY A,ROWADR INITIALIZE ROW NO. COPY =-4,A COPY A,COLCNT INIT. COLUMN COUNT COPY =-9,A COPY  A,ROWCNT INIT. ROW COUNT COPY =GRATAB,A INIT. ADDRESS OF RAPHIC TABLE COPY A,TABPTR STORE TABEL POINTER GRLOP1 COPY =CSRPSN,A SEND POSITION CURSOR COMMAND JST OTA COPY ROWADR,A POSITION CURSOR JST OTA  COPY COLADR,A JST OTA GRLOP2 COPY TABPTR,X GET GRAPHIC TABLE POINTER SHIFT X,LO,1 CONVERT TO BYTE ADDRESS SBIT 2,S COPYB 0(X),A GET GRAPHIC CHARACTER RBIT 2,S JST OTA SEND CHARACTER COPY TABPTR,X SHIFT X,LO,1 SBIT 2,S COPYB 1(X),A RBIT 2,S JST OTA IMS TABPTR INCREMENT TABLE POINTER IMS COLCNT INCREMENT COLUMN COUNT JMP GRLOP2 COPY =-4,A  COPY A,COLCNT RE-INITIALIZE COLUMN COUNT IMS ROWADR INCREMENT ROW ADDRESS IMS ROWCNT INCREMENT COUNT JMP GRLOP1 COPY =-15,A COPY A,CHARCT SET COUNT TO PRINT DARK BAR PLACE: 6,33  COPY =CRATTB,A SET REVERSE & GRAPHOIC ATTRIBUTE JST OTA COPY =:22,A JST OTA COPY =:5D,A PRINT REVERSE BAR JST OTA IMS CHARCT JMP $-3 JMP PDIAMD LPOOL PDIAMD PLACE: 8,34 COPY =:5C,A JST OTA PLACE: 9,34 COPY =:5E,A JST OTA PLACE: 15,34 COPY =:5C,A  JST OTA PLACE: 16,34 COPY =:5E,A JST OTA PLACE: 8,47 COPY =:5C,A JST  OTA PLACE: 9,47 COPY =:5E,A JST OTA PLACE: 15,47 COPY =:5C,A JST OTA  PLACE: 16,47 COPY =:5E,A JST OTA PLACE: 8,33 COPY =CRATTB,A JST OTA COPY  =GRAPH,A JST OTA COPY =:5E,A JST OTA PLACE: 9,33 COPY =:5C,A JST OTA  PLACE: 15,33 COPY =:5E,A JST OTA PLACE: 16,33 COPY =:5C,A JST OTA PLACE:  8,46 COPY =:5E,A JST OTA JMP GRAPH1 LPOOL GRAPH1 PLACE: 9,46 COPY =:5C,A JST OTA  PLACE: 15,46 COPY =:5E,A JST OTA PLACE: 16,46 COPY =:5C,A JST OTA COPY =-15,A PRINT BOTTOM BAR COPY A,CHARCT PLACE: 18,33 COPY =:5D,A JST OTA IMS CHARCT  JMP $-3 COPY =HOME,A JST OTA GRAPHIC DONE HOME CURSOR COPY =CRATTB,A JST OTA COPY =0,A JST OTA BLANK ATTRIBUTE STATUS PATCH: LOP16E * * DIAGNOSTIC MODE * :00 - :1F CONTROL CODES ARE DISPLAYED IN * GRAPHIC CHARACTERS. * :20 - :7F ARE DISPLAYED AS DATA CHARACTERS. * A TOTAL OF 128 CHARACTERS ARE DISPLAYED IN TWO LINE. * OPERATOR MUST HIT SHIFT SCREEN PRINT TO EXIT TEST. * LOP16F EQU $ JST MSGA SEND MESSAGE WORD DIAGM HIT SPACE TO TEST DIAGNOSTIC JST SPACE WAIT FOR SPACE KEY COPY =SCRERA,A ERASE SCREEN JST OTA COPY =CRATTB,A JST OTA COPY =1,A JST OTA SET DIAGNOSTIC ATTRIBUTE STATUS COPY =-:7F,A SET NO. OF CHARACTERS TO DISPLAY COPY A,CHARCT COPY =0,A COPY A,CRCODE INIT. CHARACTER CODE DIAGLP COPY CRCODE,A JST OTA IMS CRCODE IMS CHARCT JMP DIAGLP COPY =-35,A COPY A,CHARCT COPY =:20,A JST OTA PRINT 35 SPACES IMS CHARCT JMP $-3 JST MSGA WORD SCPTMS JST SPACE LOOK AT SPACE BAR PATCH: LOP16F  JMP TEST3 JMP TEST3 LPOOL TITL TEST-3, PRINTER TEST ** TEST 3. PRINTER OPTION TEST ** A FEW CHARACTERS WILL BE OUTPUT ON BOTH CRT AND LINEPRINTED ** LATER CRT WILL BE TURNED OFF AND JUST LINE PRINTER WILL BE ** TURNED ON TEST3 COPY TESTS,A SEE IF TEST 3 IS SELECTED SHIFT A,RO,2 JF OV,TEST4 LOP17 EQU $ COPY =PRINOF,A  JST OTA COPY =PRINON,A NOW TURN CRT AND PRINTER BOTH ON JST OTA JST MSGA WORD BOTH COPY =PRINOF,A JST OTA JST SPACE IS IT A SPACE? COPY =CRTOF,A JST OTA COPY =PRINON,A JST OTA JST MSGA WORD JUST COPY =PRINOF,A JST OTA ** LOOP PONT PATCH: LOP17 * * SCREEN PRINT FUNCTION TEST (:01) * A MESSAGE IS SENT OUT TO BOTH THE CRT & PRINTER * USING THE SCREEN PRINT FUNCTION * LOP17A EQU $ COPY =SCRERA,A EERASE SCREEN JST OTA JST MSGA WORD SCRPTM SEND MESAGE, HIT SPACE FOR SCREEN PRINT JST SPACE WAIT FOR A SPACE KEY COPY =:01,A JST OTA SEND SCREEN PRINT COMMAND JST SPACE WAIT FOR A SPACE PATCH: LOP17A JMP TEST4 LPOOL TITL  TEST 4. FULL KEYBOARD TEST ** TEST4 -THIS IS KEYBOARD TEST DESIGN AS GO NO-GO TEST ** FOR KEYBOARDS USAGE OF THIS TEST MAY BE UNNECESSARY ** FOR NORMAL DIAGNOSTIC TESTING TEST4 EQU $ COPY TESTS,A SEE IF TEST4 IS SELECTED SHIFT A,RO,3 JT OV,$+2 JMP AGAIN1 COPY =SCRERA,A PLACE CURSOR AT 1,1 AND ERASE JST OTA SCREEN VR IFY: 1,1 IFF SCRT COPY =KYLOK,A JST OTA ENDC JST MSGA WORD PASS1 OUTPUT MESSAGE FOR FIRST PASS JMP LAVD LPOOL LAVD JST MSGA WORD KYBORD COPY TABAD1,X ADD =1,X IFF SCRT COPY =UNLOCK,A JST OTA ENDC JST INCHAR CHECK FIRST PASS  COPY =SCRERA,A CLEAR SCREEN JST OTA VRIFY: 1,1 VERIFY CURSOR AT 1,1 IFF SCRT COPY =KYLOK,A JST OTA ENDC JST MSGA OUTPUT MESSAGE FOR PASS 2 WORD PASS2 JST MSGA WORD KYBORD COPY TABAD2,X ADD =1,X IFF SCRT COPY =UNLOCK,A JST OTA  ENDC JST INCHAR CHECK SECOND PASS COPY =SCRERA,A JST OTA CLEAR SCREEN VRIFY: 1,1 VERIFY CURSOR AT 1,1 IFF SCRT COPY =KYLOK,A JST OTA ENDC JST MSGA OUTPUT MESSAGE FOR PASS3 WORD PASS3 JST MSGA WORD KYBORD COPY TABAD3,X ADD =1,X  IFF SCRT COPY =UNLOCK,A JST OTA ENDC JST INCHAR CHECK THIRD PASS COPY =SCRERA,A JST OTA CLEAR SCREEN VRIFY: 1,1 VERIFY CURSOR AT 1,1 IFF SCRT COPY =KYLOK,A JST OTA ENDC JST MSGA WORD PASS4 OUTPUT MESSAGE FOR PASS4 JST MSGA  WORD KYBORD COPY TABAD4,X ADD =1,X IFF SCRT COPY =UNLOCK,A JST OTA ENDC JST INCHAR CHECK FOURTH PASS COPY =SCRERA,A JST OTA CLEAR SCREEN IFF SCRT  COPY =KYLOK,A JST OTA ENDC JST MSGA WORD PASS5 OUTPUT MESSAGE FOR PASS5 JST  MSGA WORD KYBORD COPY TABAD5,X ADD =1,X IFF SCRT COPY =UNLOCK,A JST OTA ENDC JST INCHAR CHECK FIFTH PASS * * KEY REPEATING FUNCTION CHECK * OPERATOR IS INSTRUCTED TO HOLD DOWN ANY ONE * DATA CHARACTER KEY LONG ENOUGH FOR KEY REPEAT * TO FUNCTION, AND VISUALLY INSPECT THIS ON THE SCREEN. * LOP18 EQU $ COPY =SCRERA,A ERASE SCREEN JST OTA JST MSGA SEND MESSAGE WORD RPTMSG KEY REPEAT FUNCTION TEST LOP18A JST CHARIN GET A CHARACTER CLSN =:A0,A IS IT A SPACE JMP ENTST JST OTA DISPLAY THAT CHARACTER JMP LOP18A ENTST PATCH: LOP18 JMP AGAIN1 * A KEYBOARD MISCOMPARE OCCURRED. OUTPUT AN ERROR MESSAGE * THIS ROUTINE IS CALLED BY INCHAR ERROR1 COPY X,XSAVE1 SAVE REGISTERS COPY A,ASAVE1  COPY KYCHAR,A CLSN =:A0,A IF SPACE, MOVE ON TO NEXT KEY JMP $+2 JMP BEEP1 ADD =1,X  IMS TOTKY1 JMP NEXT COPY INCHAR,A GET RETURN ADDRESS COPY A,$+2 JMP *$+1 RETRUN RES 1,0 LPOOL *IF NOT SPECIAL CASE,PRINT ERROR BEEP1 EQU $ IFF SCRT COPY =KYLOK,A LOCK OUT KEYBOARD DURING PRINTOUT  ENDC IFT SCRT COPY =SCROLL,A ERROR MESSAGES WILL SCROLL ENDC JST OTA COPY =BEEP,A  JST OTA OUTPUT BEEP JST MSGA WORD INP OUTPUT MESSAGE COPY KYCHAR,A JST OHEX1 OUTPUT HEX VALUE COPY ='(',A JST OTA OUTPUT '(' COPY KYCHAR,A CSK A,=AZERO JMP UNPRIN NO JMP $+2 JMP UNPRIN JST OTA OUTPUT IT JMP EXPECT UNPRIN COPY =-38,X COPY X,COUNT1 COPY TABQ,X POINTER TO UNPRINTABLE DATA TABLE SHIFT X,LO,1 CONVERT IT TO BYT ADDRESS TAG1 COPY KYCHAR,A SBIT 2,S XORB 0(X),A IS IT RIGTONE RBIT 2,S JEQ A,TAG2 ADD =1,X IMS COUNT1 JMP TAG1 JST MSGA WORD UNPR JMP EXPECT LPOOL TAG2 COPY X,A SUB TABQ,A SUB TABQ,A ADD TABP,A COPY A,X COPY 0(X),X COPY X,$+2 JST MSGA NOP EXPECT JST MSGA WORD EXP COPY ASAVE1,A EXPECTED CHARACTER JST OHEX1 CONVERT IT INTO HEX AND PRINT COPY ='(',A JST OTA COPY TOTKY1,A  ADD =TOTKYS,A ADD TABAD2,A COPY A,X ADD =1,X SBIT 2,S COPYB 0(X),A GET CORRESPONDING UNSHIFT RBIT 2,S CSK A,=AZERO JMP UNPRN NO JMP $+2 YES,IT IS  JMP UNPRN NO JST OTA COPY =')',A CLOSE BRACKET JST OTA COPY =NULIN,A GO TO NEXT LINE JST OTA COPY XSAVE1,X JMP OUT UNPRN COPY =-38,X COPY X,COUNT1 COPY TABQ,X POINTER TO UNPRINTABLE DATA-TABLE SHIFT X,LO,1 CONVERT IT TO BYTE ADDRESS TAG11 COPY ASAVE1,A SBIT  2,S XORB 0(X),A IS IT RIGHTONE RBIT 2,S JEQ A,TAG22 ADD =1,X IMS COUNT1  JMP TAG11 JST MSGA WORD UNPR JST MSGA WORD BRACK COPY XSAVE1,X JMP  OUT TAG22 COPY X,A SUB TABQ,A SUB TABQ,A ADD TABP,A COPY A,X COPY 0(X),X  COPY X,$+2 JST MSGA NOP JST MSGA WORD BRACK COPY XSAVE1,X OUT EQU $  IFF SCRT COPY =UNLOCK,A UNLOCK KEYBOARD JST OTA ENDC JMP NEXT * FIVE PASSES COMPLETED. LOOP BACK TO START OF PROGRAM OR STOP AGAIN1 COPY DATARG,A CLSN =3,A JMP EQUAL JF SS,$+2  JMP TEST1 CONTINUOUS OPERATION JMP END * TEST NEXT CRT IF MULTI UNIT MULTIPLEXER IS THE I/O INTERFACE EQUAL  COPY =1,A SET FLAG IF PFAIL SHOULD OCCUR NOW COPY A,PWFG IMS LINTTL BUMP UNIT COUNT JMP $+2 JMP PASSDN COPY LINNUM,X ADD =1,X JMP DTRY2 * ONE PASS USING MULTI UNIT MUX FINISHED. RESET CRT TABLE OR STOP. PASSDN JT SS,$+2 JMP END COPY =0,A COPY A,BASE COPY =0,A  ADD =1,A JNE A,$-1 COPY =1,A SET FLAG FOR CONTINUOUS TESTING COPY A,RPTFLG JMP DBACK3 TITL POWER FAIL ROUTINE PWRFAL EQU $ RBIT 2,S SBIT 8,S REENABLE INTERRUPTS JST  MSGA OUTPUT PF MESSAGE WORD PWRF1 COPY PSW,A COPY A,S COPY SENREG,A OUT A,0*8+0 RESTORE SENSE REG,SENSE SWITCH COPY DATARG,A SELP A,4 RESTORE DATA REGISTER INPUT CLSN =3,A JMP $+2 JMP PWRFI COPY =0,A ADD =1,A JNE A,$-1 PWRFI COPY =HOME,A IF PF OCCURRED DURING POSITION JST OTA CURSOR OR READ CURSOR OPERATION, COPY =HOME,A THESE TWO COMMANDS WILL PUT EVERYTHING JST OTA BACK INTO SYNC COPY DATARG,A SEE IF USING MULTI U MUX CLSN =3,A JMP $+2 PWRF2 JMP TEST1 GO BACK TO TEST 1 COPY INITFG,A RETURN TO INITIALIZE IF FLAG ZERO JEQ A,PWF3  COPY PWFG,A CHECK PF FLAG STATUS JEQ A,PWRF2 IF ZERO, GO BACK TO TEST 1 COPY LINTTL,A IF ALL UNITS TERSTED, RESET FOR NEW PASS JEQ A,PASSDN COPY LINNUM,X OTHERWISE, RESTORE CRT ADDRESS NOP JMP  DTRY2 AND EVENTUALLY, GO BACK TO TEST 1 PWF3 JMP DBACK3 LPOOL TITL CRT MESSAGES AND PROMPTS + CHARACTER TABLES TABAD1 WORD DTABL1*2 TABAD2 WORD DTABL2*2 TABAD3 WORD DTABL3*2 TABAD4 WORD DTABL4*2 TABAD5 WORD DTABL5*2 KYBORD BYTE 'KEYBOARD TEST: EACH KEY MUST BE TYPED IN' BYTE 'EACH ROW, LEFT TO RIGHT AS FOLLOWS:' WORD :8D8A BYTE '1. CONTROL KEY GROUP (TOP ROW):' WORD :8D8A BYTE ' "TERMINATE" KEY THROUGH "SCRN ' BYTE 'ERASE" KEY ( SKIP "SCREEN PRINT" KEY )' WORD :8D8A BYTE '2. MAIN KEYBOARD GROUP (LOWER LEFT GROUP):' WORD :8D8A BYTE ' "1" KEY THROUGH "BACK SPACE" KEY' WORD :8D8A BYTE '  "TAB" KEY THROUGH "' WORD :7DA2 BYTE ' KEY' WORD :8D8A BYTE ' "A" KEY THROUGH "RETURN" KEY' WORD :8D8A BYTE ' "Z" KEY THROUGH "/" KEY' WORD :8D8A BYTE '3. NUMERIC PAD GROUP (LOWER RIGHT GROUP):' WORD :8D8A BYTE ' "7" KEY THROUGH "-" KEY' WORD :8D8A  BYTE ' "BACKSP" KEY THROUGH "6" KEY' WORD :8D8A BYTE ' "1" KEY THROUGH "ENTER" KEY'  WORD :8D8A BYTE ' "CANCEL" KEY THROUGH "." KEY' WORD :8D8A BYTE 'BEEP TONE INDICATES ERROR; RETYPE THE CORRECT KEY.' WORD :8D8A BYTE '********************************************************'  WORD :8D8A WORD :FFFF PASS1 BYTE 'PASS 1: TYPE THE SEQUENCE BELOW IN ' BYTE 'LOWER CASE MODE.' WORD :8D8A WORD :FFFF PASS2 BYTE 'PASS 2: TYPE THE SEQUENCE BELOW IN "CAPS" ' BYTE ' MODE (DEPRESS "ALL CAPS" KEY, UPPER ' WORD :8D8A BYTE ' RIGHT).' WORD :8D8A WORD :FFFF PASS3 BYTE 'PASS 3: TYPE THE SEQUENCE BELOW IN SHIFT ' BYTE ' MODE (RELEASE "ALL CAPS" KEY, DEPRESS' WORD :8D8A BYTE  '"LOCK" KEY, LOWER LEFT).' WORD :8D8A WORD :FFFF PASS4 BYTE 'PASS 4: TYPE THE SEQUENCE BELOW IN CAPS '  BYTE '& SHIFT MODE (DEPRESS "ALL CAPS" AND' WORD :8D8A BYTE ' "LOCK" KEYS BOTH).' WORD   :8D8A WORD :FFFF PASS5 BYTE 'PASS 5: TYPE THE SEQUENCE BELOW IN CONTROL ' BYTE ' MODE (DEPRESS "ALL CAPS" AND RELEASE "LOCK"' WORD :8D8A BYTE 'KEYS, HOLD DOWN "CNTRL" KEY (TOP LEFT).' WORD :8D8A WORD :FFFF UNPR BYTE 'UNPRINTABLE' WORD :FFFF EXP BYTE '), SHOULD BE :' WORD :FFFF , INP BYTE 'INPUT= :' WORD :FFFF TABQ WORD $+1 WORD :849F WORD :9B91 WORD :9287 WORD :8F9E  WORD :8C8A WORD :8898 WORD :8D80 WORD :9596 WORD :9789 WORD :A081 WORD :8283 WORD :8586 WORD :8B8E WORD :9093 WORD :9499 WORD :9A9C WORD :9DE0 WORD :DEFC WORD :DCFE TABP WORD $+1 WORD TERMSG WORD C1MSG WORD C2MSG  WORD C3MSG WORD C4MSG WORD SIGMSG WORD SKPMSG WORD HMEMSG WORD SCRMSG WORD TABMSG WORD BCKMSG WORD CANMSG WORD ENTMSG WORD BRKMSG WORD LTMSG WORD  UPMSG WORD DNMSG WORD RTMSG WORD SPMSG WORD SPTMSG WORD CTBMSG WORD CTCMSG WORD CTEMSG WORD CTFMSG WORD CTKMSG WORD CTNMSG WORD CTPMSG WORD CTSMSG  WORD CTTMSG WORD CTYMSG WORD CTZMSG WORD CTCLMG WORD CTPSMG WORD CTLAM WORD CTUAM WORD CTDAM WORD CTRAM WORD BRKMSG TERMSG BYTE 'TERMINATE' WORD :FFFF C1MSG BYTE  'C1' WORD :FFFF C2MSG BYTE 'C2' WORD :FFFF C3MSG BYTE 'C3' WORD :FFFF C4MSG BYTE 'C4'  WORD :FFFF SIGMSG BYTE 'SIG' WORD :FFFF SKPMSG BYTE 'SKIP' WORD :FFFF HMEMSG BYTE 'HOME' WORD :FFFF SCRMSG BYTE 'SCREEN ERASE' WORD :FFFF TABMSG BYTE 'TAB' WORD :FFFF BCKMSG BYTE 'BACK SPACE'  WORD :FFFF CANMSG BYTE 'CANCEL' WORD :FFFF ENTMSG BYTE 'ENT/RET' WORD :FFFF BRKMSG BYTE 'BREAK'  WORD :FFFF LTMSG BYTE 'LEFT ARR' WORD :FFFF UPMSG BYTE 'UP ARR' WORD :FFFF DNMSG BYTE 'DOWN ARR' WORD :FFFF RTMSG BYTE 'RIGHT ARR' WORD :FFFF SPMSG BYTE 'SPACE' WORD :FFFF CTBMSG BYTE 'CTL B' WORD -1 CTCMSG BYTE 'CTL C' WORD -1 CTEMSG BYTE 'CTL E' WORD -1 CTFMSG BYTE 'CTL F'  WORD -1 CTKMSG BYTE 'CTL K' WORD -1 CTNMSG BYTE 'CTL N' WORD -1 CTPMSG BYTE 'CTL P' WORD -1 CTSMSG BYTE 'CTL S' WORD -1 CTTMSG BYTE 'CTL T' WORD -1 CTYMSG BYTE 'CTL Y' WORD -1 CTZMSG BYTE 'CTL Z' WORD -1 CTCLMG BYTE 'CTL :' WORD -1 CTPSMG BYTE 'CTL +' WORD -1 CTLAM BYTE 'CTL LEFT ARR' WORD -1 CTUAM BYTE 'CTL UP ARR' WORD -1 CTDAM BYTE 'CTL DOWN ARR' WORD -1 CTRAM BYTE  'CTL RIGHT ARR' WORD -1 SPTMSG BYTE 'SCREEN PRINT' WORD -1 ** UNSHIFT DTABL1 WORD :C4C4,:9F9B,:9192,:878F,:8095,:9697,:899E WORD :8CB1,:B2B3,:B4B5,:B6B7,:B8B9,:B0AD,:BD88,:8AF1 WORD :F7E5,:F2F4,:F9F5,:E9EF,:F0DD,:F DE1,:F3E4 WORD :E6E7,:E8EA,:EBEC,:BBA7,:8DFA,:F8E3,:F6E2 WORD :EEED,:ACAE,:AFB7,:B8B9,:AD88,:B4B5,:B6B1  WORD :B2B3,:8D98,:B0AE,:A0A0 ** UNSHIFT CAP DTABL2 WORD :C4C4,:9F9B,:9192,:878F,:8095,:9697,:899E,:8CB1 WORD :B2B3,:B4B5,:B6B7,:B8B9,:B0AD,:BD88,:8AD1 WORD :D7C5,:D2D4,:D9D5,:C9CF,:D0DD,:FDC1,:D3C4 WORD :C6C7,:C8CA,:CBCC,:BBA7,:8DDA,:D8C3,:D6C2 WORD :CECD,:ACAE,:AFB7,:B8B9,:AD88,:B4B5,:B6B1 WORD :B2B3,:8D98,:B0AE,:A0A0 ** SHIFT MODE DTABL3 WORD :C4C4,:9F9B,:9192,:878F,:8095,:9697,:899E,:8CA1 WORD :C0A3,:A4A5,:A7A6,:AAA8,:A9DF,:AB88,:8AD1 WORD :D7C5,:D2D4,:D9D5,:C9CF,:D0DB,:FBC1,:D3C4 WORD :C6C7,:C8CA,:CBCC,:BAA2,:8DDA,:D8C3,:D6C2 WORD :CECD,:BCBE,:BFB7,:B8B9,:AD88,:B4B5,:B6B1 WORD :B2B3,:8D98,:B0AE,:A0A0 ** CAPS SHIFT MODE DTABL4 WORD :C4C4,:9F9B,:9192,:878F,:8095,:9697,:899E,:8CA1 WORD :C0A3,:A4A5,:A7A6,:AAA8,:A9DF,:AB88,:8AD1 WORD :D7C5,:D2D4,:D9D5,:C9CF,:D0DB,:FBC1,:D3C4 WORD :C6C7,:C8CA,:CBCC,:BAA2,:8DDA,:D8C3,:D6C2 WORD :CECD,:BCBE,:BFB7,:B8B9,:AD88,:B4B5,:B6B1 WORD :B2B3,:8D98,:B0AE,:A0A0 ** CONTROL MODE DTABL5 WORD :8484,:9F9B,:9192,:878F,:80E0,:DEFC,:DCFE,:8CB1,:B2B3 WORD  :B4B5,:B6B7,:B8B9,:B0AD,:9D88,:8A91 WORD :9785,:9294,:9995,:898F,:9080,:FF81,:9384 WORD :8687,:888A,:8B8C,:9C9F,:8D9A,:9883,:9682 WORD :8E8D,:ACAE,:AFB7,:B8B9,:AD88,:B4B5,:B6B1 WORD :B2B3,:8D98,:B0AE,:A0A0 STRT WORD  TBL TABLE ADDR TBL WORD 10000,1000,100 WORD 10,1 * GRAPHIC PATTERN CODES GRATAB WORD :4040,:594D,:5140,:4040 WORD :4040,:565F,:5740,:4040 WORD :4055,:4547,:4654,:4040 WORD :5245,:4340,:4446,:5340 WORD :4B4B,:5B4E,:5A4B,:4B40 WORD :5744,:4640,:4543,:5640 WORD :4054,:4447,:4355,:4040 WORD :4040,:534F,:5240,:4040 WORD :4040,:584D,:5040,:4040 ALT WORD :2020 BYTE 'HIT SPACE FOR * AND U PATTERN' WORD :8D8A WORD :FFFF BOTH WORD :8D8A BYTE 'THIS MESSAGE IS PRINTED ON BOTH' BYTE ' CRT AND PRINTER' WORD :8D8A BYTE 'HIT SPACE FOR CRT OFF' WORD :8D8A WORD :FFFF JUST WORD :2020  BYTE 'THIS MESSAGE IS PRINTED ON' BYTE ' PRINTER BUT NOT ON CRT' WORD :8D8A WORD :FFFF ASU WORD :2020 WORD :2020 BYTE 'HIT SPACE FOR FULL SCREEN' WORD :8D8A WORD :FFFF UAS WORD :2020 WORD :2020 BYTE 'HIT SPACE FOR ALTERNATE PATTERN' WORD :8D8A WORD :FFFF ERASE WORD :2020 WORD :2020 BYTE 'HIT SPACE FOR SCREEN ERASE' WORD :8D8A WORD :FFFF FRAER0 WORD :8D8A  BYTE 'HIT SPACE FOR FRAME ERASE' WORD :8D8A BYTE 'AFTERWARDS HIT SPACE TO CONTINUE' WORD :FFFF ERAS BYTE 'HIT SPACE FOR LINE ERASE' WORD :8D8A BYTE 'HIT SPACE FOR SCREEN ERASE' WORD :FFFF CRSR1 BYTE 'HIT SPACE FOR CURSOR MOVEMENT' BYTE 'VERIFICATION TEST' WORD :FFFF CRSR2 BYTE 'HIT SPACE FOR CURSOR UP' WORD :8D8A BYTE 'HIT SPACE FOR CURSOR DOWN' WORD :8D8A BYTE 'HIT SPACE FOR CURSOR R IGHT' WORD :8D8A BYTE 'HIT SPACE FOR CURSOR LEFT' SPSG BYTE ' HIT SPACE TO CONTINUE' WORD :FFFF STRING WORD :2020 WORD :2020 BYTE 'STRING OF DISPLAYABLE CHARACTERS' WORD :8D8A BYTE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' WORD :8D8A WORD :6162 WORD :6364 WORD :6566 WORD :6768  WORD :696A WORD :6B6C WORD :6D6E WORD :6F70 WORD :7172 WORD :7374 WORD  :7576 WORD :7778 WORD :797A WORD :8D8A BYTE '0123456789' WORD :8D8A BYTE  '?!#$%^+-=*@":;.,<>/\[]()' WORD :8D8A WORD :FFFF PWRF1 BYTE ' POWERFAIL' WORD :FFFF STRNG WORD  :2020 BYTE 'HIT SPACE FOR SCREEN ERASE' WORD :8D8A BYTE 'THEN HIT ANY KEY FROM KEYBOARD' WORD :8D8A BYTE 'AND IT IS PRINTED BACK' WORD :8D8A WORD :FFFF LOCK WORD :8D8A BYTE 'CRT IS IN KEYBOARD LOCK ' BYTE 'MODE FOR 3 SECONDS' WORD :8D8A BYTE 'VERIFY THAT THE KEYBOARD IS NOT ACTIVE' BYTE ' AFTER HITTING SPACE' WORD :8D8A WORD :FFFF ERCNT1 WORD :8D8A BYTE 'TOTAL ERRORS =' WORD :FFFF PCOUNT WORD :8D8A BYTE 'OCCURRED AT LOCATION :' WORD :FFFF PASCT1 WORD :8D8A  BYTE 'DURING PASS ' WORD :FFFF UNITN1 WORD :8D8A BYTE 'ON UNIT ' WORD :FFFF MULTU WORD :8D8A BYTE 'SPECIFY CRT UNIT NUMBERS FOR TESTING (0 TO 31)' WORD :8D8A BYTE 'ENTER> ' WORD :FFFF U1 BYTE ' UNIT ' WORD -1 ERMSG1 WORD :8D8A BYTE 'ERROR: CURSOR POSITION INCORRECT' WORD -1 ERMSG2 WORD :8D8A BYTE 'ERROR: STATUS INCORRECT' WORD -1 ERMSG3 WORD :8D8A BYTE 'ERROR: INPUT DEVICE NOT READY' WORD -1 ERMSG4 WORD :8D8A BYTE 'ERROR: BAD CURSOR POPSITION CHARACTER' WORD -1 ERMSG5 WORD :8D8A BYTE 'ERROR: INVALID UNIT #' WORD -1 U2 BYTE ' NOT RESPONDING ' WORD :8D8A WORD :FFFF BRACK WORD :A0A9 WORD :8D8A WORD :FFFF TSTMSG WORD :8D8A BYTE 'CRT II DIAGNOSTIC REV. (A1)' WORD :8D8A BYTE 'TEST 1 - CURSOR TEST' WORD :8D8A BYTE 'NO OPERATOR INTERVENTION' WORD :8D8A,-1 ACTMSG WORD :8D8A BYTE 'ACTUAL STATUS =:' WORD -1 EXPMSG WORD :8D8A BYTE 'EXPECTED STATUS =:' WORD -1 RPTMSG WORD :8D8A BYTE 'HOLD DOWN ANY DATA CHARACTER KEY MORE THAN 1 SECOND.' WORD :8D8A BYTE 'VERIFY THE CHARACTER REPEATS ON THE SCREEN,' WORD :8D8A BYTE 'THEN HIT SPACE TO END TEST' WORD :8D8A,-1 MSGSRL BYTE 'ENTER SPACE TO TEST SCROLL ENABLE' WORD :FFFF MSGDIS BYTE ' ENTER SPACE TO TEST SCROLL DISABLE' WORD :FFFF MSGCUR BYTE 'ENTER SPACE TO DISABLE CURSOR ' WORD :FFFF BLKUP BYTE 'HIT SPACE TO TEST BLANK SCREEN UNPROTECTED' WORD -1 REVERV BYTE 'HIT SPACE TO TEST REVERSE VIEDO' WORD -1 ULINEM BYTE 'HIT SPACE TO TEST UNDERLINE' WORD -1 BLINKM BYTE 'HIT SPACE TO TEST BLINKING' WORD -1 SUBDEM BYTE  'HIT SPACE TO TEST SUBDUE MODE' WORD -1 GRAPHM BYTE 'HIT SPACE TO TEST GRAPHIC' WORD -1 DIAGM BYTE 'HIT SPACE TO TEST DIAGNOSTIC MODE' WORD -1 SCPTMS BYTE 'HIT SHIFT "SCREEN PRINT", THEN SPACE TO CONTINUE' WORD  -1 SCRPTM BYTE 'HIT SPACE TO TEST SCREEN PRINT' WORD :8D8A BYTE 'WHEN PRINTING COMPLETED, HIT SPACE TO DO NEXT TEST' WORD -1 ACTCUR WORD :8D8A BYTE 'ACTUAL CURSOR POSTION = (' WORD -1 EXPCUR BYTE ')'  WORD :8D8A BYTE 'EXPECTED CURSOR POSTION = (' WORD -1 TITL GLOBAL VARIABLES LINTBL WORD $+1  RES 32,0 DASH RES 1,0 BBASE RES 1,0 LINEND RES 1,0 BASE RES 1,0 V1 RES 1,0 DATARG WORD 0 KYCHAR RES 1,0 TOTKY1 RES 1,0 TOTAL NUMBER OF KEYS STORED CHARCT RES 1,0 HALF NO OF CHAR TO FILL SCREEN COUNT RES 1,0 ASAVE2 RES 1,0 XSAVE2 RES 1,0 ASAVE RES 1,0 T1 RES 1,0 XSAVE1 RES 1,0 ASAVE1 RES 1,0 K7 WORD 7 KBA WORD :BA KA WORD :A V RES 1,0 VALUE T RES 1,0 COUNT PTR RES 1,0 POINTER COUNT1 RES 1,0 MISAVE RES 1,0 TISAVE RES 1,0 XSAVE RES 1,0 SENREG RES 1,0 LINTTL RES 1,0 LINNUM RES 1,0 KYBENT RES 1,0 PFLAG RES 1,0 RECFLG RES 1,0 TEMP3 RES 1,0 RPTFLG RES 1,0 AMM CONTINUOUS TEST FLAG PWFG RES 1,0 USED FOR AMMUX POWER FAIL STATUS INITFG RES 1,0 INITIALIZE FLAG FOR AMM POWER FAILS STAS1 RES 1,0 STATUS BYTES STAS2 RES 1,0 STAS3 RES 1,0 STAS4 RES 1,0 ATTBIT RES 1,0 ATTRIBUTE STATUS REVNOS WORD :41 FIRMWARE REVISION NO. ASTATS WORD 0 ERROR STATUS CRCODE WORD 0 C HARACTER CODE COLADR RES 1,0 COLUMN NO. ROWADR RES 1,0 ROW NO. COLCNT RES 1,0 COLUMN COUNT ROWCNT RES 1,0 ROW COUNT VPOS RES 1,0 VERTICAL CURSOR POSITION HPOS RES 1,0 HORIZATIONAL CURSOR POSITION ATCNT RES 1,0 ATTRIBUTE STATUS COUNT ERRNO RES 1,0 ERROR # EXPSTA RES 1,0 EXPECTED STATUS TABPTR RES 1,0 GRAPHIC TABLE POINTER PCTERR RES 1,0 PROGRAM LOCATION WHERE ERROR OCCURED STAACT RES 1,0 STATUS TEMPORARY STORAGE TESTS RES 1,0 TEST SELETION STORED HERE PSW RES 1,0 PSW SAVE DVA RES 1,0 ASYNCMUX DEVICE ADDRESS BASE DEVAD RES 1,0 CHANNEL NO. OF ASYNCMUX CHNL RES 1,0 CHANNEL NO. OF ASYNC MUX ADSEL RES 1,0 ASYNCMUX DEVICE ADDRESS BYCNT RES 1,0 BYTE COUNT FULPEX WORD 0 FULL OR HALF DUPLEX MODE FLAG OPTAB WORD :53CD,:3E17 FULL DUPLEX,9600 BAUD, 2 STOP BITS, 8-BIT/CHAR. *  NO PARTITY ENABLE,AUXILIARY ENABLED,DTR ASSERTED END HLT JMP START6 END START1 RES 1,0 POINTER COUNT1 RES 1,0 MISAVE RES 1,0 TISAVE RES 1,0 XSAVE RES 1,0 SENREG RES 1,0 LINTTL RES 1,0 LINNUM RES 1,0 KYBENT RES 1,0 PFLAG RES 1,0 RECFLG RES 1,0 TEMP3 RES 1,0 RPTFLG RES 1,0 AMM CONTINUOUS TEST FLAG PWFG RES 1,0 USED FOR AMMUX POWER FAIL STATUS INITFG RES 1,0 INITIALIZE FLAG FOR AMM POWER FAILS STAS1 RES 1IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe;801103133914801103133914801103134818e@801103133914801103133914801103133914e:' 801103133914801103133914801103133914e801103133914801103133914801103133914801103133914801103133914801103133914eTk8011031345050080110313461625801103134616de>(8011031346345080110313464700801103134647deS.8011031347035080110313470825801103134708d( ) * + , - . / 0 . NM4CRTD ASMNM4CRTD BINNM4CRTD JCLOVicEdDano         l  zz‡ )rr  (৲+߮| (ߧ  1 ]ߗH +ql  ~}y yg uc+u |zq J "%䀃、' l Ї؆ʣ,,,, "!.K6=!.K6_! J+@# D# A2qH)K)IebE@9 ie,,,,` \;6"ReTP# FG[^ W| ;C ?= ȿ̓2ľGþEƒd ̇$" 0.,*   "%'K)c)e)g |‚v .96C k     LG ,C ABӿ[? ,9 7: )3 . ,ο(ʂ2ŞzwtB WyO9 )A \ IK=@ߡߛsl  .ދ|ރrjA rԇտq  hjSgѓba_]\iZ T J+ {y d> ih8 4> S-  XW' - * )8l s %'+ߢrn r   {҃   S\I t!  m )?6ߚO6ߗߖO6ߒߑ1fEq ]x# r! o c# \# W# Q# R E ywv }{e  9 0  ) *1 ߰        2  2Q!\ r p n m ll g f eem; _ ] [ Z YY T S RRmN: J H -F E -DD ? > ,== 8 6 4 3 22 - , P++ & $ " !    I   2  2   2m:    Q    P  P Q     P  P Q  I, y w #u t #ss n m #ll g e c b aa \ [ ZZ[ R P 0N M 0LL G F EEm ? = ; : 99 4 3 22m& , * ( ' && ! m9&               [^, { y #w v #qq p o #jj i g e d __ ^ ] XX[& V T  y w u t ss n m ll g e c b aa \ [ PZZ U S Q P OO J I PHHI$  ><߇v 4 2m7 * ( & P$ # P""    iS   P  P    kh8  ( (   P P  (2  (Ϳ )ƿ  *   I-   P  P   P   O  O       T4   6A t o Ukߞ| g e؇ Pa՞| ] [ Y)  *1a. P N L K JJ B *> U<߰zѿ 5 4 33 U, **ߞzkS+ " * Uߐz忊   kA\\j@ y   ̂rr Uo|j    ^   V TT UQ|L   (E   (  6   /   . y x ws p n l k jf 1hC _ ^ ]Y URz|J L J H G FB @ ? >: 8 7 62 0 / .* ( ' &"A3     מ\j}    {on ( +1  {a . {VU v( +1 np B kFE f d ḃ $^ %\Şzl V W U0/ P N L J @F #D߭zh n ? =˿ 8 6 4 *0ߙ|l  + )ٿ $ " @ S D߃zj  @       H   0 H   H   0 H %  .%'.%'ߠߜqߗߘf)   !  " ]|\jG t r "p \n l j "h ^f d b "` \^ \ Z "X ^V T R /P \N L J /H ^F D B /@ \> < : /8 ^6 4 2 !0 . , ^* ( & !$ \"   ! ^   ! \   . ^   . \   . ^   . \   ! ]ߩ|       ߓߐ{݇ ߊ| d \j 6 t rr} no k ii en  bb"a ]^w m})6A R   KK C %+ = : q pp 33 1 %+ + ( _ ^^ !! ֿ %+   M LL  %+   D %+   {v Q& +ߋ !\& # " # $ q omo (ik c(ڧ.`%'J+߅xT |{ FDEo (@C M +%' 3 )1 //(ڧYY.*%'I+Pxܣ HG ܣ    ߶+A  'Ѓ0     G;?'\B 2KEYBOARD TEST: EACH KEY MUST BE TYPED INEACH ROW, LEFT TO RIGHT AS FOLLOWS: 1. CONTROL KEY GROUP (TOP ROW): "TERMINATE" KEY THROUGH "SCRN ERASE" KEY ( SKIP "SCREEN PRINT" KEY )2. MAIN KEYBOARD GROUP (LOWER LEFT GROUP): "1" KEY THROUGH "BACK SPACE" KEY  "TAB" KEY THROUGH " } KEY "A" KEY THROUGH "RETURN" KEY "Z" KEY THROUGH "/" KEY 3. NUMERIC PAD GROUP (LOWER RIGHT GROUP): "7" KEY THROUGH "-" KEY "BACKSP" KEY THROUGH "6" KEY "1" KEY THROUGH "ENTER" KEY "CANCEL" KEY THROUGH "." KEYBEEP TONE INDICATES ERROR; RETYPE THE CORRECT KEY.********************************************************PASS 1: TYPE THE SEQUENCE BELOW IN LOWER CASE MODE.PASS 2: TYPE THE SEQUENCE BELOW 3 IN "CAPS" MODE (DEPRESS "ALL CAPS" KEY, UPPER RIGHT). PASS 3: TYPE THE SEQUENCE BELOW IN SHIFT MODE (RELEASE "ALL CAPS" KEY, DEPRESS"LOCK" KEY, LOWER LEFT).PASS 4: TYPE THE SEQUENCE BELOW IN CAPS & SHIFT MODE (DEPRESS "ALL CAPS" AND "LOCK" KEYS BOTH).PASS 5: TYPE THE SEQUENCE BELOW IN CONTROL MODE (DEPRESS "ALL CAPS" AND RELEASE "LOCK"KEYS, HOLD DOWN "CNTRL" KEY (TOP LEFT). UNPRINTABLE ), SHOULD BE :INPUT= : r"&*.26:>BFJNRV]cjTERMINATE C1C2C3C4SIG SKIPHOMESCREEN ERASETAB BACK SPACECANCELENT/RET BREAK LEFT ARRUP ARRDOWN ARRRIGHT ARR SPACE CTL B CTL C CTL E CTL F CTL K CTL N CTL P CTL S CTL T CTL Y CTL Z CTL : CTL + CTL LEFT ARRCTL UP ARRCTL DOWN ARRCTL RIGHT ARR SCREEN PRINTğ컧ğ̻ͬğ̺߫ͼğ̺߫ͼB'd @@YMQ@@@@@V_W@@@@UEGFT@@REC@DFS@KK[NZKK@WDF@ECV@@TDGCU@@@@SOR@@@@@XMP@@@ HIT SPACE FOR * AND U PATTERN THIS MESSAGE IS PRINTED ON BOTH CRT AND PRINTERHIT SPACE FOR CRT OFF THIS MESSAGE IS PRINTED ON PRINTER BUT NOT ON CRT HIT SPACE FOR FULL SCREEN HIT SPACE FOR ALTERNATE PATTERN HIT SPACE FOR SCREEN ERASEHIT SPACE FOR FRAME ERASE AFTERWARDS HIT SPACE TO CONTINUEHIT SPACE FOR LINE ERASEHIT SPACE FOR SCREEN ERASEHIT SPACE FOR CURSOR MOVEMENT VERIFICATION TEST HIT SPACE FOR CURSOR UP HIT SPACE FOR CURSOR DOWN HIT SPACE FOR CURSOR RIGHTHIT SPACE FOR CURSOR LEFT HIT SPACE TO CONTINUE STRING OF DISPLAYABLE CHARACTERSABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?!#$%^+-=*@":;.,<>/\[]() POWERFAIL HIT SPACE FOR SCREEN ERASETHEN HIT ANY KEY FROM KEYBOARDAND IT IS PRINTED BACKCRT IS IN KEYBOARD LOCK MODE FOR 3 SECONDSVERIFY THAT THE KEYBOARD IS NOT ACTIVE AFTER HITTING SPACETOTAL ERRORS =OCCURRED AT LOCATION :DURING PASS ON UNIT SPECIFY CRT UNIT NUMBERS FOR TESTING (0 TO 31)ENTER> UNIT ERROR: CURSOR POSITION INCORRECTERROR: STATUS INCORRECT ERROR: INPUT DEVICE NOT READY ERROR: BAD CURSOR POPSITION CHARACTER ERROR: INVALID UNIT # NOT RESPONDING CRT II DIAGNOSTIC REV. (A1) TEST 1 - CURSOR TESTNO OPERATOR INTERVENTIONACTUAL STATUS =:EXPECTED STATUS =:HOLD DOWN ANY DATA CHARACTER KEY MORE THAN 1 SECOND.VERIFY THE CHARACTER REPEATS ON THE SCREEN, THEN HIT SPACE TO END TESTENTER SPACE TO TEST SCROLL ENABLE ENTER SPACE TO TEST SCROLL DISABLEENTER SPACE TO DISABLE CURSOR HIT SPACE TO TEST BLANK SCREEN UNPROTECTEDHIT SPACE TO TEST REVERSE VIEDO HIT SPACE TO TEST UNDERLINE HIT SPACE TO TEST BLINKINGHIT SPACE TO TEST SUBDUE MODE HIT SPACE TO TEST GRAPHIC HIT SPACE TO TEST DIAGNOSTIC MODE HIT SHIFT "SCREEN PRINT", THEN SPACE TO CONTINUEHIT SPACE TO TEST SCREEN PRINTW4 HEN PRINTING COMPLETED, HIT SPACE TO DO NEXT TESTACTUAL CURSOR POSTION = ( ) EXPECTED CURSOR POSTION = ( m%  AS> mE7E4E5E3--E2E0 DISPLAYABLE CHARACTERSABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?!#$%^+-=*@":;.,<>/\[]() POWERFAIL HIT SPACE FOR SCREEN ERASETHEN HIT ANY KEY FROM KEYBOARDAND IT IS PRINTED BACKCRT IS IN KEYBOARD LOCK MODE FOR 3 SECONDSVERIFY THAT THE KEYBOARD IS NOT ACTIVE AFTER HITTAS LO=LP MACRO DF.NM4CRTD(EX) LINK DF.NM4CRTD .8010220947215080102209472400801103134706IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII