Martin Prikryl 16 years ago
parent
commit
1b88be96ba
100 changed files with 6777 additions and 2004 deletions
  1. 4 4
      Console.rc
  2. 4 4
      DragExt.rc
  3. 4 4
      DragExt64.rc
  4. 343 341
      WinSCP.drc
  5. 6 6
      WinSCP.rc
  6. 23 2
      core/Common.cpp
  7. 2 1
      core/Common.h
  8. 7 0
      core/Configuration.cpp
  9. 3 0
      core/Configuration.h
  10. 33 2
      core/CopyParam.cpp
  11. 1 0
      core/CoreMain.cpp
  12. 16 1
      core/Exceptions.h
  13. 157 5
      core/FileInfo.cpp
  14. 11 10
      core/FileOperationProgress.cpp
  15. 6 6
      core/FileOperationProgress.h
  16. 3 2
      core/FileSystems.h
  17. 286 161
      core/FtpFileSystem.cpp
  18. 11 5
      core/FtpFileSystem.h
  19. 1 0
      core/Interface.h
  20. 2 2
      core/Queue.cpp
  21. 12 4
      core/RemoteFiles.cpp
  22. 3 1
      core/RemoteFiles.h
  23. 63 79
      core/ScpFileSystem.cpp
  24. 2 2
      core/ScpFileSystem.h
  25. 87 36
      core/Script.cpp
  26. 3 1
      core/Script.h
  27. 1 0
      core/SecureShell.cpp
  28. 66 1
      core/SessionData.cpp
  29. 3 0
      core/SessionData.h
  30. 6 4
      core/SessionInfo.cpp
  31. 1 1
      core/SessionInfo.h
  32. 349 303
      core/SftpFileSystem.cpp
  33. 3 3
      core/SftpFileSystem.h
  34. 290 90
      core/Terminal.cpp
  35. 19 7
      core/Terminal.h
  36. 22 0
      filezilla/ApiLog.cpp
  37. 51 31
      filezilla/FileZillaIntf.cpp
  38. 26 1
      filezilla/FtpControlSocket.cpp
  39. 8 0
      filezilla/MainThread.cpp
  40. 20 0
      forms/About.cpp
  41. 3425 94
      forms/About.dfm
  42. 1 4
      forms/Console.cpp
  43. 12 4
      forms/Copy.cpp
  44. 3 3
      forms/Copy.dfm
  45. 1 1
      forms/Copy.h
  46. 0 1
      forms/CopyParamCustom.cpp
  47. 8 99
      forms/CopyParamCustom.dfm
  48. 0 1
      forms/CopyParamPreset.cpp
  49. 9 99
      forms/CopyParamPreset.dfm
  50. 26 52
      forms/CopyParams.cpp
  51. 111 114
      forms/CopyParams.dfm
  52. 6 11
      forms/CopyParams.h
  53. 178 49
      forms/CustomScpExplorer.cpp
  54. 15 2
      forms/CustomScpExplorer.dfm
  55. 19 4
      forms/CustomScpExplorer.h
  56. 2 2
      forms/EditorPreferences.cpp
  57. 11 18
      forms/FullSynchronize.cpp
  58. 2 2
      forms/FullSynchronize.dfm
  59. 0 1
      forms/FullSynchronize.h
  60. 177 46
      forms/Glyphs.dfm
  61. 2 0
      forms/LogSettings.cpp
  62. 3 3
      forms/Login.dfm
  63. 131 17
      forms/NonVisual.cpp
  64. 42 5
      forms/NonVisual.dfm
  65. 13 2
      forms/NonVisual.h
  66. 11 2
      forms/Preferences.cpp
  67. 61 112
      forms/Preferences.dfm
  68. 4 0
      forms/Preferences.h
  69. 60 11
      forms/Progress.cpp
  70. 58 41
      forms/Progress.dfm
  71. 8 4
      forms/Progress.h
  72. 95 17
      forms/ScpCommander.cpp
  73. 15 3
      forms/ScpCommander.dfm
  74. 5 1
      forms/ScpCommander.h
  75. 15 2
      forms/ScpExplorer.dfm
  76. 4 1
      forms/ScpExplorer.h
  77. 76 5
      forms/SynchronizeChecklist.cpp
  78. 22 12
      forms/SynchronizeChecklist.dfm
  79. 4 1
      forms/SynchronizeChecklist.h
  80. 1 1
      openssl/Makefile
  81. 1 1
      openssl/crypto/asn1/a_bytes.c
  82. 3 0
      openssl/crypto/asn1/asn1.h
  83. 2 0
      openssl/crypto/asn1/asn1_err.c
  84. 2 0
      openssl/crypto/asn1/asn1_par.c
  85. 0 2
      openssl/crypto/asn1/asn_mime.c
  86. 1 1
      openssl/crypto/asn1/t_x509.c
  87. 33 11
      openssl/crypto/asn1/tasn_dec.c
  88. 12 10
      openssl/crypto/bio/bss_mem.c
  89. 5 0
      openssl/crypto/bio/bss_sock.c
  90. 2 2
      openssl/crypto/buildinf.h
  91. 1 1
      openssl/crypto/evp/enc_min.c
  92. 3 3
      openssl/crypto/opensslv.h
  93. 4 0
      openssl/crypto/pem/pem.h
  94. 3 0
      openssl/crypto/pkcs12/p12_crt.c
  95. 1 2
      openssl/crypto/pkcs7/pk7_smime.c
  96. 90 0
      openssl/crypto/s390xcpuid.S
  97. 4 0
      openssl/crypto/symhacks.h
  98. 1 0
      openssl/crypto/ui/ui_lib.c
  99. 2 1
      openssl/crypto/x509/x509_cmp.c
  100. 13 3
      openssl/crypto/x509/x509_vpm.c

+ 4 - 4
Console.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 2,2,0,103
-PRODUCTVERSION 2,2,0,103
+FILEVERSION 2,2,0,105
+PRODUCTVERSION 2,2,0,105
 FILEOS 0x4
 FILETYPE 0x1
 {
@@ -10,13 +10,13 @@ FILETYPE 0x1
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Console interface for WinSCP\0"
-            VALUE "FileVersion", "2.2.0.103\0"
+            VALUE "FileVersion", "2.2.0.105\0"
             VALUE "InternalName", "console\0"
             VALUE "LegalCopyright", "(c) 2000-2009 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "winscp.com\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.2.1.0\0"
+            VALUE "ProductVersion", "4.2.2.0\0"
             VALUE "ReleaseType", "beta\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 4 - 4
DragExt.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 1,1,8,97
-PRODUCTVERSION 1,1,8,97
+FILEVERSION 1,1,8,100
+PRODUCTVERSION 1,1,8,100
 FILEOS 0x4
 FILETYPE 0x2
 {
@@ -10,13 +10,13 @@ FILETYPE 0x2
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Drag&Drop shell extension for WinSCP (32-bit)\0"
-            VALUE "FileVersion", "1.1.8.97\0"
+            VALUE "FileVersion", "1.1.8.100\0"
             VALUE "InternalName", "dragext32\0"
             VALUE "LegalCopyright", "(c) 2000-2009 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.2.1.0\0"
+            VALUE "ProductVersion", "4.2.2.0\0"
             VALUE "ReleaseType", "beta\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 4 - 4
DragExt64.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 1,1,8,97
-PRODUCTVERSION 1,1,8,97
+FILEVERSION 1,1,8,100
+PRODUCTVERSION 1,1,8,100
 FILEOS 0x4
 FILETYPE 0x2
 {
@@ -10,13 +10,13 @@ FILETYPE 0x2
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Drag&Drop shell extension for WinSCP (64-bit)\0"
-            VALUE "FileVersion", "1.1.8.97\0"
+            VALUE "FileVersion", "1.1.8.100\0"
             VALUE "InternalName", "dragext64\0"
             VALUE "LegalCopyright", "(c) 2000-2009 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext64.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.2.1.0\0"
+            VALUE "ProductVersion", "4.2.2.0\0"
             VALUE "ReleaseType", "beta\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 343 - 341
WinSCP.drc

@@ -7,322 +7,323 @@
   produced executable.
 */
 
-#define Consts_SPictureLabel 65200
-#define Consts_SPictureDesc 65201
-#define Consts_SPreviewLabel 65202
-#define Consts_SCannotOpenAVI 65203
-#define Consts_SDockedCtlNeedsName 65204
-#define Consts_SDockTreeRemoveError 65205
-#define Consts_SDockZoneNotFound 65206
-#define Consts_SDockZoneHasNoCtl 65207
-#define Consts_SMultiSelectRequired 65208
-#define Consts_SSeparator 65209
-#define Consts_SErrorSettingCount 65210
-#define Consts_SListBoxMustBeVirtual 65211
-#define Consts_SmkcDown 65216
-#define Consts_SmkcIns 65217
-#define Consts_SmkcDel 65218
-#define Consts_SmkcShift 65219
-#define Consts_SmkcCtrl 65220
-#define Consts_SmkcAlt 65221
-#define Consts_srNone 65222
-#define Consts_SOutOfRange 65223
-#define Consts_sAllFilter 65224
-#define Consts_SInsertLineError 65225
-#define Consts_SInvalidClipFmt 65226
-#define Consts_SIconToClipboard 65227
-#define Consts_SCannotOpenClipboard 65228
-#define Consts_SInvalidMemoSize 65229
-#define Consts_SNoDefaultPrinter 65230
-#define Consts_SDuplicateMenus 65231
-#define Consts_SMsgDlgIgnore 65232
-#define Consts_SMsgDlgAll 65233
-#define Consts_SMsgDlgNoToAll 65234
-#define Consts_SMsgDlgYesToAll 65235
-#define Consts_SmkcBkSp 65236
-#define Consts_SmkcTab 65237
-#define Consts_SmkcEsc 65238
-#define Consts_SmkcEnter 65239
-#define Consts_SmkcSpace 65240
-#define Consts_SmkcPgUp 65241
-#define Consts_SmkcPgDn 65242
-#define Consts_SmkcEnd 65243
-#define Consts_SmkcHome 65244
-#define Consts_SmkcLeft 65245
-#define Consts_SmkcUp 65246
-#define Consts_SmkcRight 65247
-#define Consts_SVEnhMetafiles 65248
-#define Consts_SVIcons 65249
-#define Consts_SVBitmaps 65250
-#define Consts_SMaskErr 65251
-#define Consts_SMaskEditErr 65252
-#define Consts_SMsgDlgWarning 65253
-#define Consts_SMsgDlgError 65254
-#define Consts_SMsgDlgInformation 65255
-#define Consts_SMsgDlgConfirm 65256
-#define Consts_SMsgDlgYes 65257
-#define Consts_SMsgDlgNo 65258
-#define Consts_SMsgDlgOK 65259
-#define Consts_SMsgDlgCancel 65260
-#define Consts_SMsgDlgHelp 65261
-#define Consts_SMsgDlgAbort 65262
-#define Consts_SMsgDlgRetry 65263
-#define Consts_SDeviceOnPort 65264
-#define Consts_SGroupIndexTooLow 65265
-#define Consts_SNoMDIForm 65266
-#define Consts_SControlParentSetToSelf 65267
-#define Consts_SOKButton 65268
-#define Consts_SCancelButton 65269
-#define Consts_SYesButton 65270
-#define Consts_SNoButton 65271
-#define Consts_SHelpButton 65272
-#define Consts_SCloseButton 65273
-#define Consts_SIgnoreButton 65274
-#define Consts_SRetryButton 65275
-#define Consts_SAbortButton 65276
-#define Consts_SAllButton 65277
-#define Consts_SCannotDragForm 65278
-#define Consts_SVMetafiles 65279
-#define Consts_SWindowDCError 65280
-#define Consts_SWindowClass 65281
-#define Consts_SCannotFocus 65282
-#define Consts_SParentRequired 65283
-#define Consts_SParentGivenNotAParent 65284
-#define Consts_SMDIChildNotVisible 65285
-#define Consts_SVisibleChanged 65286
-#define Consts_SCannotShowModal 65287
-#define Consts_SPropertyOutOfRange 65288
-#define Consts_SMenuIndexError 65289
-#define Consts_SMenuReinserted 65290
-#define Consts_SMenuNotFound 65291
-#define Consts_SNoTimers 65292
-#define Consts_SNotPrinting 65293
-#define Consts_SPrinting 65294
-#define Consts_SInvalidPrinter 65295
-#define Consts_SInvalidIcon 65296
-#define Consts_SInvalidMetafile 65297
-#define Consts_SInvalidPixelFormat 65298
-#define Consts_SInvalidImage 65299
-#define Consts_SScanLine 65300
-#define Consts_SChangeIconSize 65301
-#define Consts_SUnknownExtension 65302
-#define Consts_SUnknownClipboardFormat 65303
-#define Consts_SOutOfResources 65304
-#define Consts_SNoCanvasHandle 65305
-#define Consts_SInvalidImageSize 65306
-#define Consts_SInvalidImageList 65307
-#define Consts_SReplaceImage 65308
-#define Consts_SImageIndexError 65309
-#define Consts_SImageReadFail 65310
-#define Consts_SImageWriteFail 65311
-#define Comstrs_sTabFailRetrieve 65312
-#define Comstrs_sTabFailGetObject 65313
-#define Comstrs_sTabFailSet 65314
-#define Comstrs_sTabFailSetObject 65315
-#define Comstrs_sTabMustBeMultiLine 65316
-#define Comstrs_sInvalidIndex 65317
-#define Comstrs_sInsertError 65318
-#define Comstrs_sInvalidOwner 65319
-#define Comstrs_sRichEditInsertError 65320
-#define Comstrs_sRichEditLoadFail 65321
-#define Comstrs_sRichEditSaveFail 65322
-#define Comstrs_sPageIndexError 65323
-#define Comstrs_sInvalidComCtl32 65324
-#define Consts_SInvalidTabPosition 65325
-#define Consts_SInvalidTabStyle 65326
-#define Consts_SInvalidBitmap 65327
-#define Sysconst_SLongDayNameTue 65328
-#define Sysconst_SLongDayNameWed 65329
-#define Sysconst_SLongDayNameThu 65330
-#define Sysconst_SLongDayNameFri 65331
-#define Sysconst_SLongDayNameSat 65332
-#define Sysconst_SCannotCreateDir 65333
-#define Tb2consts_STBToolbarIndexOutOfBounds 65334
-#define Tb2consts_STBToolbarItemReinserted 65335
-#define Tb2consts_STBViewerNotFound 65336
-#define Tb2consts_STBChevronItemMoreButtonsHint 65337
-#define Tb2consts_STBDockParentNotAllowed 65338
-#define Tb2consts_STBDockCannotChangePosition 65339
-#define Tb2consts_STBToolwinNameNotSet 65340
-#define Tb2consts_STBToolwinDockedToNameNotSet 65341
-#define Comstrs_sTabFailClear 65342
-#define Comstrs_sTabFailDelete 65343
-#define Sysconst_SLongMonthNameJun 65344
-#define Sysconst_SLongMonthNameJul 65345
-#define Sysconst_SLongMonthNameAug 65346
-#define Sysconst_SLongMonthNameSep 65347
-#define Sysconst_SLongMonthNameOct 65348
-#define Sysconst_SLongMonthNameNov 65349
-#define Sysconst_SLongMonthNameDec 65350
-#define Sysconst_SShortDayNameSun 65351
-#define Sysconst_SShortDayNameMon 65352
-#define Sysconst_SShortDayNameTue 65353
-#define Sysconst_SShortDayNameWed 65354
-#define Sysconst_SShortDayNameThu 65355
-#define Sysconst_SShortDayNameFri 65356
-#define Sysconst_SShortDayNameSat 65357
-#define Sysconst_SLongDayNameSun 65358
-#define Sysconst_SLongDayNameMon 65359
-#define Sysconst_SShortMonthNameFeb 65360
-#define Sysconst_SShortMonthNameMar 65361
-#define Sysconst_SShortMonthNameApr 65362
-#define Sysconst_SShortMonthNameMay 65363
-#define Sysconst_SShortMonthNameJun 65364
-#define Sysconst_SShortMonthNameJul 65365
-#define Sysconst_SShortMonthNameAug 65366
-#define Sysconst_SShortMonthNameSep 65367
-#define Sysconst_SShortMonthNameOct 65368
-#define Sysconst_SShortMonthNameNov 65369
-#define Sysconst_SShortMonthNameDec 65370
-#define Sysconst_SLongMonthNameJan 65371
-#define Sysconst_SLongMonthNameFeb 65372
-#define Sysconst_SLongMonthNameMar 65373
-#define Sysconst_SLongMonthNameApr 65374
-#define Sysconst_SLongMonthNameMay 65375
-#define Sysconst_SVarTypeConvertOverflow 65376
-#define Sysconst_SVarOverflow 65377
-#define Sysconst_SVarInvalid 65378
-#define Sysconst_SVarBadType 65379
-#define Sysconst_SVarNotImplemented 65380
-#define Sysconst_SVarUnexpected 65381
-#define Sysconst_SExternalException 65382
-#define Sysconst_SAssertionFailed 65383
-#define Sysconst_SIntfCastError 65384
-#define Sysconst_SSafecallException 65385
-#define Sysconst_SAssertError 65386
-#define Sysconst_SAbstractError 65387
-#define Sysconst_SModuleAccessViolation 65388
-#define Sysconst_SOSError 65389
-#define Sysconst_SUnkOSError 65390
-#define Sysconst_SShortMonthNameJan 65391
-#define Sysconst_SExceptTitle 65392
-#define Sysconst_SInvalidFormat 65393
-#define Sysconst_SArgumentMissing 65394
-#define Sysconst_SDispatchError 65395
-#define Sysconst_SReadAccess 65396
-#define Sysconst_SWriteAccess 65397
-#define Sysconst_SFormatTooLong 65398
-#define Sysconst_SVarArrayCreate 65399
-#define Sysconst_SVarArrayBounds 65400
-#define Sysconst_SVarArrayLocked 65401
-#define Sysconst_SInvalidVarCast 65402
-#define Sysconst_SInvalidVarOp 65403
-#define Sysconst_SInvalidVarOpWithHResult 65404
-#define Sysconst_SVarNotArray 65405
-#define Sysconst_SInvalidVarNullOp 65406
-#define Sysconst_SVarTypeCouldNotConvert 65407
-#define Sysconst_SInvalidInput 65408
-#define Sysconst_SDivByZero 65409
-#define Sysconst_SRangeError 65410
-#define Sysconst_SIntOverflow 65411
-#define Sysconst_SInvalidOp 65412
-#define Sysconst_SZeroDivide 65413
-#define Sysconst_SOverflow 65414
-#define Sysconst_SUnderflow 65415
-#define Sysconst_SInvalidPointer 65416
-#define Sysconst_SInvalidCast 65417
-#define Sysconst_SAccessViolation 65418
-#define Sysconst_SStackOverflow 65419
-#define Sysconst_SControlC 65420
-#define Sysconst_SPrivilege 65421
-#define Sysconst_SOperationAborted 65422
-#define Sysconst_SException 65423
-#define Comconst_STooManyParams 65424
-#define Sysconst_SInvalidInteger 65425
-#define Sysconst_SInvalidFloat 65426
-#define Sysconst_SInvalidDate 65427
-#define Sysconst_SInvalidTime 65428
-#define Sysconst_SInvalidDateTime 65429
-#define Sysconst_STimeEncodeError 65430
-#define Sysconst_SDateEncodeError 65431
-#define Sysconst_SOutOfMemory 65432
-#define Sysconst_SInOutError 65433
-#define Sysconst_SFileNotFound 65434
-#define Sysconst_SInvalidFilename 65435
-#define Sysconst_STooManyOpenFiles 65436
-#define Sysconst_SAccessDenied 65437
-#define Sysconst_SEndOfFile 65438
-#define Sysconst_SDiskFull 65439
-#define Rtlconsts_SReadError 65440
-#define Rtlconsts_SReadOnlyProperty 65441
-#define Rtlconsts_SRegCreateFailed 65442
-#define Rtlconsts_SRegGetDataFailed 65443
-#define Rtlconsts_SRegisterError 65444
-#define Rtlconsts_SRegSetDataFailed 65445
-#define Rtlconsts_SResNotFound 65446
-#define Rtlconsts_SSeekNotImplemented 65447
-#define Rtlconsts_SSortedListError 65448
-#define Rtlconsts_STooManyDeleted 65449
-#define Rtlconsts_SUnknownGroup 65450
-#define Rtlconsts_SUnknownProperty 65451
-#define Rtlconsts_SWriteError 65452
-#define Comconst_SOleError 65453
-#define Comconst_SNoMethod 65454
-#define Comconst_SVarNotObject 65455
-#define Rtlconsts_SFOpenError 65456
-#define Rtlconsts_SGridTooLarge 65457
-#define Rtlconsts_SIndexOutOfRange 65458
-#define Rtlconsts_SIniFileWriteError 65459
-#define Rtlconsts_SInvalidImage 65460
-#define Rtlconsts_SInvalidMask 65461
-#define Rtlconsts_SInvalidName 65462
-#define Rtlconsts_SInvalidProperty 65463
-#define Rtlconsts_SInvalidPropertyPath 65464
-#define Rtlconsts_SInvalidPropertyValue 65465
-#define Rtlconsts_SInvalidRegType 65466
-#define Rtlconsts_SListCapacityError 65467
-#define Rtlconsts_SListCountError 65468
-#define Rtlconsts_SListIndexError 65469
-#define Rtlconsts_SMemoryStreamError 65470
-#define Rtlconsts_SPropertyException 65471
-#define HelpIntfs_16400 65472
-#define HelpIntfs_16402 65473
-#define HelpIntfs_16404 65474
-#define Rtlconsts_SAncestorNotFound 65475
-#define Rtlconsts_SAssignError 65476
-#define Rtlconsts_SBitsIndexError 65477
-#define Rtlconsts_SCantWriteResourceStreamError 65478
-#define Rtlconsts_SCheckSynchronizeError 65479
-#define Rtlconsts_SClassNotFound 65480
-#define Rtlconsts_SDuplicateClass 65481
-#define Rtlconsts_SDuplicateItem 65482
-#define Rtlconsts_SDuplicateName 65483
-#define Rtlconsts_SDuplicateString 65484
-#define Rtlconsts_SFCreateError 65485
-#define Rtlconsts_SFixedColTooBig 65486
-#define Rtlconsts_SFixedRowTooBig 65487
-#define Customdirview_STextFileExt 65488
-#define Customdirview_STextFiles 65489
-#define Customdirview_STextDirectories 65490
-#define Customdirview_SParentDir 65491
-#define Customdirview_SIconUpdateThreadTerminationError 65492
-#define Customdirview_SDragDropError 65493
-#define Customdirview_SDriveNotReady 65494
-#define Customdirview_SDirNotExists 65495
-#define Customunixdirview_SUnixDefaultRootName 65496
-#define Unixdirviewcolproperties_SUnixDirViewRightsCol 65497
-#define Unixdirviewcolproperties_SUnixDirViewOwnerCol 65498
-#define Unixdirviewcolproperties_SUnixDirViewGroupCol 65499
-#define Unixdirviewcolproperties_SUnixDirViewLinkTargetCol 65500
-#define Unixdirviewcolproperties_SUnixDirViewTypeCol 65501
-#define Customdriveview_SDragDropError 65502
-#define HelpIntfs_16398 65503
-#define Driveview_Space 65504
-#define DriveView_16407 65505
-#define Fileoperator_SFileOperation 65506
-#define Baseutils_SNoValidPath 65507
-#define Baseutils_SUcpPathsNotSupported 65508
-#define Iedriveinfo_ErrorInvalidDrive 65509
-#define Dirviewcolproperties_SDirViewNameCol 65510
-#define Dirviewcolproperties_SDirViewSizeCol 65511
-#define Dirviewcolproperties_SDirViewTypeCol 65512
-#define Dirviewcolproperties_SDirViewChangedCol 65513
-#define Dirviewcolproperties_SDirViewAttrCol 65514
-#define Dirviewcolproperties_SDirViewExtCol 65515
-#define Customdirview_SErrorOpenFile 65516
-#define Customdirview_SErrorRenameFile 65517
-#define Customdirview_SErrorRenameFileExists 65518
-#define Customdirview_SErrorInvalidName 65519
+#define Consts_SDuplicateMenus 65200
+#define Consts_SPictureLabel 65201
+#define Consts_SPictureDesc 65202
+#define Consts_SPreviewLabel 65203
+#define Consts_SCannotOpenAVI 65204
+#define Consts_SDockedCtlNeedsName 65205
+#define Consts_SDockTreeRemoveError 65206
+#define Consts_SDockZoneNotFound 65207
+#define Consts_SDockZoneHasNoCtl 65208
+#define Consts_SMultiSelectRequired 65209
+#define Consts_SSeparator 65210
+#define Consts_SErrorSettingCount 65211
+#define Consts_SListBoxMustBeVirtual 65212
+#define Consts_SmkcRight 65216
+#define Consts_SmkcDown 65217
+#define Consts_SmkcIns 65218
+#define Consts_SmkcDel 65219
+#define Consts_SmkcShift 65220
+#define Consts_SmkcCtrl 65221
+#define Consts_SmkcAlt 65222
+#define Consts_srNone 65223
+#define Consts_SOutOfRange 65224
+#define Consts_sAllFilter 65225
+#define Consts_SInsertLineError 65226
+#define Consts_SInvalidClipFmt 65227
+#define Consts_SIconToClipboard 65228
+#define Consts_SCannotOpenClipboard 65229
+#define Consts_SInvalidMemoSize 65230
+#define Consts_SNoDefaultPrinter 65231
+#define Consts_SMsgDlgRetry 65232
+#define Consts_SMsgDlgIgnore 65233
+#define Consts_SMsgDlgAll 65234
+#define Consts_SMsgDlgNoToAll 65235
+#define Consts_SMsgDlgYesToAll 65236
+#define Consts_SmkcBkSp 65237
+#define Consts_SmkcTab 65238
+#define Consts_SmkcEsc 65239
+#define Consts_SmkcEnter 65240
+#define Consts_SmkcSpace 65241
+#define Consts_SmkcPgUp 65242
+#define Consts_SmkcPgDn 65243
+#define Consts_SmkcEnd 65244
+#define Consts_SmkcHome 65245
+#define Consts_SmkcLeft 65246
+#define Consts_SmkcUp 65247
+#define Consts_SVMetafiles 65248
+#define Consts_SVEnhMetafiles 65249
+#define Consts_SVIcons 65250
+#define Consts_SVBitmaps 65251
+#define Consts_SMaskErr 65252
+#define Consts_SMaskEditErr 65253
+#define Consts_SMsgDlgWarning 65254
+#define Consts_SMsgDlgError 65255
+#define Consts_SMsgDlgInformation 65256
+#define Consts_SMsgDlgConfirm 65257
+#define Consts_SMsgDlgYes 65258
+#define Consts_SMsgDlgNo 65259
+#define Consts_SMsgDlgOK 65260
+#define Consts_SMsgDlgCancel 65261
+#define Consts_SMsgDlgHelp 65262
+#define Consts_SMsgDlgAbort 65263
+#define Consts_SInvalidPrinter 65264
+#define Consts_SDeviceOnPort 65265
+#define Consts_SGroupIndexTooLow 65266
+#define Consts_SNoMDIForm 65267
+#define Consts_SControlParentSetToSelf 65268
+#define Consts_SOKButton 65269
+#define Consts_SCancelButton 65270
+#define Consts_SYesButton 65271
+#define Consts_SNoButton 65272
+#define Consts_SHelpButton 65273
+#define Consts_SCloseButton 65274
+#define Consts_SIgnoreButton 65275
+#define Consts_SRetryButton 65276
+#define Consts_SAbortButton 65277
+#define Consts_SAllButton 65278
+#define Consts_SCannotDragForm 65279
+#define Consts_SImageWriteFail 65280
+#define Consts_SWindowDCError 65281
+#define Consts_SWindowClass 65282
+#define Consts_SCannotFocus 65283
+#define Consts_SParentRequired 65284
+#define Consts_SParentGivenNotAParent 65285
+#define Consts_SMDIChildNotVisible 65286
+#define Consts_SVisibleChanged 65287
+#define Consts_SCannotShowModal 65288
+#define Consts_SPropertyOutOfRange 65289
+#define Consts_SMenuIndexError 65290
+#define Consts_SMenuReinserted 65291
+#define Consts_SMenuNotFound 65292
+#define Consts_SNoTimers 65293
+#define Consts_SNotPrinting 65294
+#define Consts_SPrinting 65295
+#define Consts_SInvalidBitmap 65296
+#define Consts_SInvalidIcon 65297
+#define Consts_SInvalidMetafile 65298
+#define Consts_SInvalidPixelFormat 65299
+#define Consts_SInvalidImage 65300
+#define Consts_SScanLine 65301
+#define Consts_SChangeIconSize 65302
+#define Consts_SUnknownExtension 65303
+#define Consts_SUnknownClipboardFormat 65304
+#define Consts_SOutOfResources 65305
+#define Consts_SNoCanvasHandle 65306
+#define Consts_SInvalidImageSize 65307
+#define Consts_SInvalidImageList 65308
+#define Consts_SReplaceImage 65309
+#define Consts_SImageIndexError 65310
+#define Consts_SImageReadFail 65311
+#define Comstrs_sTabFailDelete 65312
+#define Comstrs_sTabFailRetrieve 65313
+#define Comstrs_sTabFailGetObject 65314
+#define Comstrs_sTabFailSet 65315
+#define Comstrs_sTabFailSetObject 65316
+#define Comstrs_sTabMustBeMultiLine 65317
+#define Comstrs_sInvalidIndex 65318
+#define Comstrs_sInsertError 65319
+#define Comstrs_sInvalidOwner 65320
+#define Comstrs_sRichEditInsertError 65321
+#define Comstrs_sRichEditLoadFail 65322
+#define Comstrs_sRichEditSaveFail 65323
+#define Comstrs_sPageIndexError 65324
+#define Comstrs_sInvalidComCtl32 65325
+#define Consts_SInvalidTabPosition 65326
+#define Consts_SInvalidTabStyle 65327
+#define Sysconst_SLongDayNameMon 65328
+#define Sysconst_SLongDayNameTue 65329
+#define Sysconst_SLongDayNameWed 65330
+#define Sysconst_SLongDayNameThu 65331
+#define Sysconst_SLongDayNameFri 65332
+#define Sysconst_SLongDayNameSat 65333
+#define Sysconst_SCannotCreateDir 65334
+#define Tb2consts_STBToolbarIndexOutOfBounds 65335
+#define Tb2consts_STBToolbarItemReinserted 65336
+#define Tb2consts_STBViewerNotFound 65337
+#define Tb2consts_STBChevronItemMoreButtonsHint 65338
+#define Tb2consts_STBDockParentNotAllowed 65339
+#define Tb2consts_STBDockCannotChangePosition 65340
+#define Tb2consts_STBToolwinNameNotSet 65341
+#define Tb2consts_STBToolwinDockedToNameNotSet 65342
+#define Comstrs_sTabFailClear 65343
+#define Sysconst_SLongMonthNameMay 65344
+#define Sysconst_SLongMonthNameJun 65345
+#define Sysconst_SLongMonthNameJul 65346
+#define Sysconst_SLongMonthNameAug 65347
+#define Sysconst_SLongMonthNameSep 65348
+#define Sysconst_SLongMonthNameOct 65349
+#define Sysconst_SLongMonthNameNov 65350
+#define Sysconst_SLongMonthNameDec 65351
+#define Sysconst_SShortDayNameSun 65352
+#define Sysconst_SShortDayNameMon 65353
+#define Sysconst_SShortDayNameTue 65354
+#define Sysconst_SShortDayNameWed 65355
+#define Sysconst_SShortDayNameThu 65356
+#define Sysconst_SShortDayNameFri 65357
+#define Sysconst_SShortDayNameSat 65358
+#define Sysconst_SLongDayNameSun 65359
+#define Sysconst_SShortMonthNameJan 65360
+#define Sysconst_SShortMonthNameFeb 65361
+#define Sysconst_SShortMonthNameMar 65362
+#define Sysconst_SShortMonthNameApr 65363
+#define Sysconst_SShortMonthNameMay 65364
+#define Sysconst_SShortMonthNameJun 65365
+#define Sysconst_SShortMonthNameJul 65366
+#define Sysconst_SShortMonthNameAug 65367
+#define Sysconst_SShortMonthNameSep 65368
+#define Sysconst_SShortMonthNameOct 65369
+#define Sysconst_SShortMonthNameNov 65370
+#define Sysconst_SShortMonthNameDec 65371
+#define Sysconst_SLongMonthNameJan 65372
+#define Sysconst_SLongMonthNameFeb 65373
+#define Sysconst_SLongMonthNameMar 65374
+#define Sysconst_SLongMonthNameApr 65375
+#define Sysconst_SVarTypeCouldNotConvert 65376
+#define Sysconst_SVarTypeConvertOverflow 65377
+#define Sysconst_SVarOverflow 65378
+#define Sysconst_SVarInvalid 65379
+#define Sysconst_SVarBadType 65380
+#define Sysconst_SVarNotImplemented 65381
+#define Sysconst_SVarUnexpected 65382
+#define Sysconst_SExternalException 65383
+#define Sysconst_SAssertionFailed 65384
+#define Sysconst_SIntfCastError 65385
+#define Sysconst_SSafecallException 65386
+#define Sysconst_SAssertError 65387
+#define Sysconst_SAbstractError 65388
+#define Sysconst_SModuleAccessViolation 65389
+#define Sysconst_SOSError 65390
+#define Sysconst_SUnkOSError 65391
+#define Sysconst_SException 65392
+#define Sysconst_SExceptTitle 65393
+#define Sysconst_SInvalidFormat 65394
+#define Sysconst_SArgumentMissing 65395
+#define Sysconst_SDispatchError 65396
+#define Sysconst_SReadAccess 65397
+#define Sysconst_SWriteAccess 65398
+#define Sysconst_SFormatTooLong 65399
+#define Sysconst_SVarArrayCreate 65400
+#define Sysconst_SVarArrayBounds 65401
+#define Sysconst_SVarArrayLocked 65402
+#define Sysconst_SInvalidVarCast 65403
+#define Sysconst_SInvalidVarOp 65404
+#define Sysconst_SInvalidVarOpWithHResult 65405
+#define Sysconst_SVarNotArray 65406
+#define Sysconst_SInvalidVarNullOp 65407
+#define Sysconst_SDiskFull 65408
+#define Sysconst_SInvalidInput 65409
+#define Sysconst_SDivByZero 65410
+#define Sysconst_SRangeError 65411
+#define Sysconst_SIntOverflow 65412
+#define Sysconst_SInvalidOp 65413
+#define Sysconst_SZeroDivide 65414
+#define Sysconst_SOverflow 65415
+#define Sysconst_SUnderflow 65416
+#define Sysconst_SInvalidPointer 65417
+#define Sysconst_SInvalidCast 65418
+#define Sysconst_SAccessViolation 65419
+#define Sysconst_SStackOverflow 65420
+#define Sysconst_SControlC 65421
+#define Sysconst_SPrivilege 65422
+#define Sysconst_SOperationAborted 65423
+#define Comconst_SVarNotObject 65424
+#define Comconst_STooManyParams 65425
+#define Sysconst_SInvalidInteger 65426
+#define Sysconst_SInvalidFloat 65427
+#define Sysconst_SInvalidDate 65428
+#define Sysconst_SInvalidTime 65429
+#define Sysconst_SInvalidDateTime 65430
+#define Sysconst_STimeEncodeError 65431
+#define Sysconst_SDateEncodeError 65432
+#define Sysconst_SOutOfMemory 65433
+#define Sysconst_SInOutError 65434
+#define Sysconst_SFileNotFound 65435
+#define Sysconst_SInvalidFilename 65436
+#define Sysconst_STooManyOpenFiles 65437
+#define Sysconst_SAccessDenied 65438
+#define Sysconst_SEndOfFile 65439
+#define Rtlconsts_SPropertyException 65440
+#define Rtlconsts_SReadError 65441
+#define Rtlconsts_SReadOnlyProperty 65442
+#define Rtlconsts_SRegCreateFailed 65443
+#define Rtlconsts_SRegGetDataFailed 65444
+#define Rtlconsts_SRegisterError 65445
+#define Rtlconsts_SRegSetDataFailed 65446
+#define Rtlconsts_SResNotFound 65447
+#define Rtlconsts_SSeekNotImplemented 65448
+#define Rtlconsts_SSortedListError 65449
+#define Rtlconsts_STooManyDeleted 65450
+#define Rtlconsts_SUnknownGroup 65451
+#define Rtlconsts_SUnknownProperty 65452
+#define Rtlconsts_SWriteError 65453
+#define Comconst_SOleError 65454
+#define Comconst_SNoMethod 65455
+#define Rtlconsts_SFixedRowTooBig 65456
+#define Rtlconsts_SFOpenError 65457
+#define Rtlconsts_SGridTooLarge 65458
+#define Rtlconsts_SIndexOutOfRange 65459
+#define Rtlconsts_SIniFileWriteError 65460
+#define Rtlconsts_SInvalidImage 65461
+#define Rtlconsts_SInvalidMask 65462
+#define Rtlconsts_SInvalidName 65463
+#define Rtlconsts_SInvalidProperty 65464
+#define Rtlconsts_SInvalidPropertyPath 65465
+#define Rtlconsts_SInvalidPropertyValue 65466
+#define Rtlconsts_SInvalidRegType 65467
+#define Rtlconsts_SListCapacityError 65468
+#define Rtlconsts_SListCountError 65469
+#define Rtlconsts_SListIndexError 65470
+#define Rtlconsts_SMemoryStreamError 65471
+#define HelpIntfs_16398 65472
+#define HelpIntfs_16400 65473
+#define HelpIntfs_16402 65474
+#define HelpIntfs_16404 65475
+#define Rtlconsts_SAncestorNotFound 65476
+#define Rtlconsts_SAssignError 65477
+#define Rtlconsts_SBitsIndexError 65478
+#define Rtlconsts_SCantWriteResourceStreamError 65479
+#define Rtlconsts_SCheckSynchronizeError 65480
+#define Rtlconsts_SClassNotFound 65481
+#define Rtlconsts_SDuplicateClass 65482
+#define Rtlconsts_SDuplicateItem 65483
+#define Rtlconsts_SDuplicateName 65484
+#define Rtlconsts_SDuplicateString 65485
+#define Rtlconsts_SFCreateError 65486
+#define Rtlconsts_SFixedColTooBig 65487
+#define Customdirview_SErrorInvalidName 65488
+#define Customdirview_STextFileExt 65489
+#define Customdirview_STextFiles 65490
+#define Customdirview_STextDirectories 65491
+#define Customdirview_SParentDir 65492
+#define Customdirview_SIconUpdateThreadTerminationError 65493
+#define Customdirview_SDragDropError 65494
+#define Customdirview_SDriveNotReady 65495
+#define Customdirview_SDirNotExists 65496
+#define Customunixdirview_SUnixDefaultRootName 65497
+#define Unixdirviewcolproperties_SUnixDirViewRightsCol 65498
+#define Unixdirviewcolproperties_SUnixDirViewOwnerCol 65499
+#define Unixdirviewcolproperties_SUnixDirViewGroupCol 65500
+#define Unixdirviewcolproperties_SUnixDirViewLinkTargetCol 65501
+#define Unixdirviewcolproperties_SUnixDirViewTypeCol 65502
+#define Customdriveview_SDragDropError 65503
+#define Driveview_coInvalidDosChars 65504
+#define Driveview_Space 65505
+#define DriveView_16407 65506
+#define Fileoperator_SFileOperation 65507
+#define Baseutils_SNoValidPath 65508
+#define Baseutils_SUcpPathsNotSupported 65509
+#define Iedriveinfo_ErrorInvalidDrive 65510
+#define Dirviewcolproperties_SDirViewNameCol 65511
+#define Dirviewcolproperties_SDirViewSizeCol 65512
+#define Dirviewcolproperties_SDirViewTypeCol 65513
+#define Dirviewcolproperties_SDirViewChangedCol 65514
+#define Dirviewcolproperties_SDirViewAttrCol 65515
+#define Dirviewcolproperties_SDirViewExtCol 65516
+#define Customdirview_SErrorOpenFile 65517
+#define Customdirview_SErrorRenameFile 65518
+#define Customdirview_SErrorRenameFileExists 65519
 #define Dragdrop_MICopyStr 65520
 #define Dragdrop_MIMoveStr 65521
 #define Dragdrop_MILinkStr 65522
@@ -334,13 +335,14 @@
 #define Tcpip_STimeout 65528
 #define Tcpip_SUnknownSockError 65529
 #define Tcpip_SHttpError 65530
-#define Dirview_coFileOperatorTitle 65531
-#define Dirview_coInvalidDosChars 65532
-#define Dirview_Space 65533
-#define Driveview_coFileOperatorTitle 65534
-#define Driveview_coInvalidDosChars 65535
+#define Tcpip_SRedirectLimitError 65531
+#define Dirview_coFileOperatorTitle 65532
+#define Dirview_coInvalidDosChars 65533
+#define Dirview_Space 65534
+#define Driveview_coFileOperatorTitle 65535
 STRINGTABLE
 BEGIN
+	Consts_SDuplicateMenus,	"Menu '%s' is already being used by another form"
 	Consts_SPictureLabel,	"Picture:"
 	Consts_SPictureDesc,	" (%dx%d)"
 	Consts_SPreviewLabel,	"Preview"
@@ -353,6 +355,7 @@ BEGIN
 	Consts_SSeparator,	"Separator"
 	Consts_SErrorSettingCount,	"Error setting %s.Count"
 	Consts_SListBoxMustBeVirtual,	"Listbox (%s) style must be virtual in order to set Count"
+	Consts_SmkcRight,	"Right"
 	Consts_SmkcDown,	"Down"
 	Consts_SmkcIns,	"Ins"
 	Consts_SmkcDel,	"Del"
@@ -368,7 +371,7 @@ BEGIN
 	Consts_SCannotOpenClipboard,	"Cannot open clipboard"
 	Consts_SInvalidMemoSize,	"Text exceeds memo capacity"
 	Consts_SNoDefaultPrinter,	"There is no default printer currently selected"
-	Consts_SDuplicateMenus,	"Menu '%s' is already being used by another form"
+	Consts_SMsgDlgRetry,	"&Retry"
 	Consts_SMsgDlgIgnore,	"&Ignore"
 	Consts_SMsgDlgAll,	"&All"
 	Consts_SMsgDlgNoToAll,	"N&o to All"
@@ -384,7 +387,7 @@ BEGIN
 	Consts_SmkcHome,	"Home"
 	Consts_SmkcLeft,	"Left"
 	Consts_SmkcUp,	"Up"
-	Consts_SmkcRight,	"Right"
+	Consts_SVMetafiles,	"Metafiles"
 	Consts_SVEnhMetafiles,	"Enhanced Metafiles"
 	Consts_SVIcons,	"Icons"
 	Consts_SVBitmaps,	"Bitmaps"
@@ -400,7 +403,7 @@ BEGIN
 	Consts_SMsgDlgCancel,	"Cancel"
 	Consts_SMsgDlgHelp,	"&Help"
 	Consts_SMsgDlgAbort,	"&Abort"
-	Consts_SMsgDlgRetry,	"&Retry"
+	Consts_SInvalidPrinter,	"Printer selected is not valid"
 	Consts_SDeviceOnPort,	"%s on %s"
 	Consts_SGroupIndexTooLow,	"GroupIndex cannot be less than a previous menu item's GroupIndex"
 	Consts_SNoMDIForm,	"Cannot create form. No MDI forms are currently active"
@@ -416,7 +419,7 @@ BEGIN
 	Consts_SAbortButton,	"Abort"
 	Consts_SAllButton,	"&All"
 	Consts_SCannotDragForm,	"Cannot drag a form"
-	Consts_SVMetafiles,	"Metafiles"
+	Consts_SImageWriteFail,	"Failed to write ImageList data to stream"
 	Consts_SWindowDCError,	"Error creating window device context"
 	Consts_SWindowClass,	"Error creating window class"
 	Consts_SCannotFocus,	"Cannot focus a disabled or invisible window"
@@ -432,7 +435,7 @@ BEGIN
 	Consts_SNoTimers,	"Not enough timers available"
 	Consts_SNotPrinting,	"Printer is not currently printing"
 	Consts_SPrinting,	"Printing in progress"
-	Consts_SInvalidPrinter,	"Printer selected is not valid"
+	Consts_SInvalidBitmap,	"Bitmap image is not valid"
 	Consts_SInvalidIcon,	"Icon image is not valid"
 	Consts_SInvalidMetafile,	"Metafile is not valid"
 	Consts_SInvalidPixelFormat,	"Invalid pixel format"
@@ -448,7 +451,7 @@ BEGIN
 	Consts_SReplaceImage,	"Unable to Replace Image"
 	Consts_SImageIndexError,	"Invalid ImageList Index"
 	Consts_SImageReadFail,	"Failed to read ImageList data from stream"
-	Consts_SImageWriteFail,	"Failed to write ImageList data to stream"
+	Comstrs_sTabFailDelete,	"Failed to delete tab at index %d"
 	Comstrs_sTabFailRetrieve,	"Failed to retrieve tab at index %d"
 	Comstrs_sTabFailGetObject,	"Failed to get object at index %d"
 	Comstrs_sTabFailSet,	"Failed to set tab \"%s\" at index %d"
@@ -464,7 +467,7 @@ BEGIN
 	Comstrs_sInvalidComCtl32,	"This control requires version 4.70 or greater of COMCTL32.DLL"
 	Consts_SInvalidTabPosition,	"Tab position incompatible with current tab style"
 	Consts_SInvalidTabStyle,	"Tab style incompatible with current tab position"
-	Consts_SInvalidBitmap,	"Bitmap image is not valid"
+	Sysconst_SLongDayNameMon,	"Monday"
 	Sysconst_SLongDayNameTue,	"Tuesday"
 	Sysconst_SLongDayNameWed,	"Wednesday"
 	Sysconst_SLongDayNameThu,	"Thursday"
@@ -480,7 +483,7 @@ BEGIN
 	Tb2consts_STBToolwinNameNotSet,	"Cannot save dockable window's position because Name property is not set"
 	Tb2consts_STBToolwinDockedToNameNotSet,	"Cannot save dockable window's position because DockedTo's Name property not set"
 	Comstrs_sTabFailClear,	"Failed to clear tab control"
-	Comstrs_sTabFailDelete,	"Failed to delete tab at index %d"
+	Sysconst_SLongMonthNameMay,	"May"
 	Sysconst_SLongMonthNameJun,	"June"
 	Sysconst_SLongMonthNameJul,	"July"
 	Sysconst_SLongMonthNameAug,	"August"
@@ -496,7 +499,7 @@ BEGIN
 	Sysconst_SShortDayNameFri,	"Fri"
 	Sysconst_SShortDayNameSat,	"Sat"
 	Sysconst_SLongDayNameSun,	"Sunday"
-	Sysconst_SLongDayNameMon,	"Monday"
+	Sysconst_SShortMonthNameJan,	"Jan"
 	Sysconst_SShortMonthNameFeb,	"Feb"
 	Sysconst_SShortMonthNameMar,	"Mar"
 	Sysconst_SShortMonthNameApr,	"Apr"
@@ -512,7 +515,7 @@ BEGIN
 	Sysconst_SLongMonthNameFeb,	"February"
 	Sysconst_SLongMonthNameMar,	"March"
 	Sysconst_SLongMonthNameApr,	"April"
-	Sysconst_SLongMonthNameMay,	"May"
+	Sysconst_SVarTypeCouldNotConvert,	"Could not convert variant of type (%s) into type (%s)"
 	Sysconst_SVarTypeConvertOverflow,	"Overflow while converting variant of type (%s) into type (%s)"
 	Sysconst_SVarOverflow,	"Variant overflow"
 	Sysconst_SVarInvalid,	"Invalid argument"
@@ -528,7 +531,7 @@ BEGIN
 	Sysconst_SModuleAccessViolation,	"Access violation at address %p in module '%s'. %s of address %p"
 	Sysconst_SOSError,	"System Error.  Code: %d.\r\n%s"
 	Sysconst_SUnkOSError,	"A call to an OS function failed"
-	Sysconst_SShortMonthNameJan,	"Jan"
+	Sysconst_SException,	"Exception %s in module %s at %p.\r\n%s%s\r\n"
 	Sysconst_SExceptTitle,	"Application Error"
 	Sysconst_SInvalidFormat,	"Format '%s' invalid or incompatible with argument"
 	Sysconst_SArgumentMissing,	"No argument for format '%s'"
@@ -544,7 +547,7 @@ BEGIN
 	Sysconst_SInvalidVarOpWithHResult,	"Invalid variant operation ($%.8x)"
 	Sysconst_SVarNotArray,	"Variant is not an array"
 	Sysconst_SInvalidVarNullOp,	"Invalid NULL variant operation"
-	Sysconst_SVarTypeCouldNotConvert,	"Could not convert variant of type (%s) into type (%s)"
+	Sysconst_SDiskFull,	"Disk full"
 	Sysconst_SInvalidInput,	"Invalid numeric input"
 	Sysconst_SDivByZero,	"Division by zero"
 	Sysconst_SRangeError,	"Range check error"
@@ -560,7 +563,7 @@ BEGIN
 	Sysconst_SControlC,	"Control-C hit"
 	Sysconst_SPrivilege,	"Privileged instruction"
 	Sysconst_SOperationAborted,	"Operation aborted"
-	Sysconst_SException,	"Exception %s in module %s at %p.\r\n%s%s\r\n"
+	Comconst_SVarNotObject,	"Variant does not reference an automation object"
 	Comconst_STooManyParams,	"Dispatch methods do not support more than 64 parameters"
 	Sysconst_SInvalidInteger,	"'%s' is not a valid integer value"
 	Sysconst_SInvalidFloat,	"'%s' is not a valid floating point value"
@@ -576,7 +579,7 @@ BEGIN
 	Sysconst_STooManyOpenFiles,	"Too many open files"
 	Sysconst_SAccessDenied,	"File access denied"
 	Sysconst_SEndOfFile,	"Read beyond end of file"
-	Sysconst_SDiskFull,	"Disk full"
+	Rtlconsts_SPropertyException,	"Error reading %s%s%s: %s"
 	Rtlconsts_SReadError,	"Stream read error"
 	Rtlconsts_SReadOnlyProperty,	"Property is read-only"
 	Rtlconsts_SRegCreateFailed,	"Failed to create key %s"
@@ -592,7 +595,7 @@ BEGIN
 	Rtlconsts_SWriteError,	"Stream write error"
 	Comconst_SOleError,	"OLE error %.8x"
 	Comconst_SNoMethod,	"Method '%s' not supported by automation object"
-	Comconst_SVarNotObject,	"Variant does not reference an automation object"
+	Rtlconsts_SFixedRowTooBig,	"Fixed row count must be less than row count"
 	Rtlconsts_SFOpenError,	"Cannot open file %s"
 	Rtlconsts_SGridTooLarge,	"Grid too large for operation"
 	Rtlconsts_SIndexOutOfRange,	"Grid index out of range"
@@ -608,7 +611,7 @@ BEGIN
 	Rtlconsts_SListCountError,	"List count out of bounds (%d)"
 	Rtlconsts_SListIndexError,	"List index out of bounds (%d)"
 	Rtlconsts_SMemoryStreamError,	"Out of memory while expanding memory stream"
-	Rtlconsts_SPropertyException,	"Error reading %s%s%s: %s"
+	HelpIntfs_16398,	"Unable to find a Table of Contents"
 	HelpIntfs_16400,	"No help found for %s"
 	HelpIntfs_16402,	"No context-sensitive help installed"
 	HelpIntfs_16404,	"No topic-based help system installed"
@@ -624,7 +627,7 @@ BEGIN
 	Rtlconsts_SDuplicateString,	"String list does not allow duplicates"
 	Rtlconsts_SFCreateError,	"Cannot create file %s"
 	Rtlconsts_SFixedColTooBig,	"Fixed column count must be less than column count"
-	Rtlconsts_SFixedRowTooBig,	"Fixed row count must be less than row count"
+	Customdirview_SErrorInvalidName,	"Filename contains invalid characters:"
 	Customdirview_STextFileExt,	"File %s"
 	Customdirview_STextFiles,	"%u Files"
 	Customdirview_STextDirectories,	"%u Directories"
@@ -640,7 +643,7 @@ BEGIN
 	Unixdirviewcolproperties_SUnixDirViewLinkTargetCol,	"Link target"
 	Unixdirviewcolproperties_SUnixDirViewTypeCol,	"Type"
 	Customdriveview_SDragDropError,	"Drag&drop error: %d"
-	HelpIntfs_16398,	"Unable to find a Table of Contents"
+	Driveview_coInvalidDosChars,	"\\/:*?\"<>|"
 	Driveview_Space,	" "
 	DriveView_16407,	"New name contains invalid characters %s"
 	Fileoperator_SFileOperation,	"File Operation"
@@ -656,7 +659,6 @@ BEGIN
 	Customdirview_SErrorOpenFile,	"Can't open file: "
 	Customdirview_SErrorRenameFile,	"Can't rename file or directory: "
 	Customdirview_SErrorRenameFileExists,	"File already exists: "
-	Customdirview_SErrorInvalidName,	"Filename contains invalid characters:"
 	Dragdrop_MICopyStr,	"&Copy Here"
 	Dragdrop_MIMoveStr,	"&Move Here"
 	Dragdrop_MILinkStr,	"&Shortcut(s) Create Here"
@@ -668,10 +670,10 @@ BEGIN
 	Tcpip_STimeout,	"Timeout"
 	Tcpip_SUnknownSockError,	"Unknown error"
 	Tcpip_SHttpError,	"Received response %d %s from %s"
+	Tcpip_SRedirectLimitError,	"Exceeded maximal redirect limie %d"
 	Dirview_coFileOperatorTitle,	"Filesystem Operation"
 	Dirview_coInvalidDosChars,	"\\/:*?\"<>|"
 	Dirview_Space,	" "
 	Driveview_coFileOperatorTitle,	"Filesystem Operation"
-	Driveview_coInvalidDosChars,	"\\/:*?\"<>|"
 END
 

+ 6 - 6
WinSCP.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 4,2,1,428
-PRODUCTVERSION 4,2,1,428
+FILEVERSION 4,2,2,480
+PRODUCTVERSION 4,2,2,480
 FILEOS 0x4
 FILETYPE 0x1
 {
@@ -9,14 +9,14 @@ FILETYPE 0x1
         BLOCK "040904E4"
         {
             VALUE "CompanyName", "Martin Prikryl\0"
-            VALUE "FileDescription", "SFTP, FTP and SCP client\0"
-            VALUE "FileVersion", "4.2.1.428\0"
+            VALUE "FileDescription", "WinSCP: SFTP, FTP and SCP client\0"
+            VALUE "FileVersion", "4.2.2.480\0"
             VALUE "InternalName", "winscp\0"
             VALUE "LegalCopyright", "(c) 2000-2009 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
-            VALUE "OriginalFilename", "winscp421.exe\0"
+            VALUE "OriginalFilename", "winscp422.exe\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.2.1.0\0"
+            VALUE "ProductVersion", "4.2.2.0\0"
             VALUE "ReleaseType", "beta\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 23 - 2
core/Common.cpp

@@ -446,6 +446,27 @@ bool __fastcall ComparePaths(const AnsiString & Path1, const AnsiString & Path2)
   return AnsiSameText(IncludeTrailingBackslash(Path1), IncludeTrailingBackslash(Path2));
 }
 //---------------------------------------------------------------------------
+bool __fastcall IsReservedName(AnsiString FileName)
+{
+  int P = FileName.Pos(".");
+  if (P > 0)
+  {
+    FileName.SetLength(P - 1);
+  }
+  static AnsiString Reserved[] = {
+    "CON", "PRN", "AUX", "NUL",
+    "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
+    "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" };
+  for (int Index = 0; Index < LENOF(Reserved); Index++)
+  {
+    if (SameText(FileName, Reserved[Index]))
+    {
+      return true;
+    }
+  }
+  return false;
+}
+//---------------------------------------------------------------------------
 AnsiString __fastcall DisplayableStr(const AnsiString Str)
 {
   bool Displayable = true;
@@ -583,9 +604,9 @@ unsigned int __fastcall HexToInt(const AnsiString Hex, int MinChars)
   return Result;
 }
 //---------------------------------------------------------------------------
-char __fastcall HexToChar(const AnsiString Hex)
+char __fastcall HexToChar(const AnsiString Hex, int MinChars)
 {
-  return (char)HexToInt(Hex);
+  return (char)HexToInt(Hex, MinChars);
 }
 //---------------------------------------------------------------------------
 bool __fastcall FileSearchRec(const AnsiString FileName, TSearchRec & Rec)

+ 2 - 1
core/Common.h

@@ -53,12 +53,13 @@ void __fastcall ReformatFileNameCommand(AnsiString & Command);
 AnsiString __fastcall ExpandEnvironmentVariables(const AnsiString & Str);
 bool __fastcall ComparePaths(const AnsiString & Path1, const AnsiString & Path2);
 bool __fastcall CompareFileName(const AnsiString & Path1, const AnsiString & Path2);
+bool __fastcall IsReservedName(AnsiString FileName);
 AnsiString __fastcall DisplayableStr(const AnsiString Str);
 AnsiString __fastcall CharToHex(char Ch, bool UpperCase = true);
 AnsiString __fastcall StrToHex(const AnsiString Str, bool UpperCase = true, char Separator = '\0');
 AnsiString __fastcall HexToStr(const AnsiString Hex);
 unsigned int __fastcall HexToInt(const AnsiString Hex, int MinChars = 0);
-char __fastcall HexToChar(const AnsiString Hex);
+char __fastcall HexToChar(const AnsiString Hex, int MinChars = 0);
 AnsiString __fastcall DecodeUrlChars(AnsiString S);
 AnsiString __fastcall EncodeUrlChars(AnsiString S, AnsiString Ignore = "");
 AnsiString __fastcall EncodeUrlString(AnsiString S);

+ 7 - 0
core/Configuration.cpp

@@ -71,6 +71,7 @@ void __fastcall TConfiguration::Default()
   FAutoReadDirectoryAfterOp = true;
   FSessionReopenAuto = 5000;
   FSessionReopenBackground = 2000;
+  FSessionReopenTimeout = 0;
   FTunnelLocalPortNumberLow = 50000;
   FTunnelLocalPortNumberHigh = 50099;
   FCacheDirectoryChangesMaxSize = 100;
@@ -122,6 +123,7 @@ THierarchicalStorage * TConfiguration::CreateScpStorage(bool /*SessionList*/)
     KEY(Bool,     AutoReadDirectoryAfterOp); \
     KEY(Integer,  SessionReopenAuto); \
     KEY(Integer,  SessionReopenBackground); \
+    KEY(Integer,  SessionReopenTimeout); \
     KEY(Integer,  TunnelLocalPortNumberLow); \
     KEY(Integer,  TunnelLocalPortNumberHigh); \
     KEY(Integer,  CacheDirectoryChangesMaxSize); \
@@ -987,6 +989,11 @@ void __fastcall TConfiguration::SetSessionReopenBackground(int value)
   SET_CONFIG_PROPERTY(SessionReopenBackground);
 }
 //---------------------------------------------------------------------------
+void __fastcall TConfiguration::SetSessionReopenTimeout(int value)
+{
+  SET_CONFIG_PROPERTY(SessionReopenTimeout);
+}
+//---------------------------------------------------------------------------
 void __fastcall TConfiguration::SetTunnelLocalPortNumberLow(int value)
 {
   SET_CONFIG_PROPERTY(TunnelLocalPortNumberLow);

+ 3 - 0
core/Configuration.h

@@ -37,6 +37,7 @@ private:
   bool FAutoReadDirectoryAfterOp;
   int FSessionReopenAuto;
   int FSessionReopenBackground;
+  int FSessionReopenTimeout;
   AnsiString FIniFileStorageName;
   int FTunnelLocalPortNumberLow;
   int FTunnelLocalPortNumberHigh;
@@ -90,6 +91,7 @@ private:
   bool __fastcall GetGSSAPIInstalled();
   void __fastcall SetSessionReopenAuto(int value);
   void __fastcall SetSessionReopenBackground(int value);
+  void __fastcall SetSessionReopenTimeout(int value);
   void __fastcall SetTunnelLocalPortNumberLow(int value);
   void __fastcall SetTunnelLocalPortNumberHigh(int value);
   void __fastcall SetCacheDirectoryChangesMaxSize(int value);
@@ -190,6 +192,7 @@ public:
   __property AnsiString PartialExt = {read=GetPartialExt};
   __property int SessionReopenAuto = { read = FSessionReopenAuto, write = SetSessionReopenAuto };
   __property int SessionReopenBackground = { read = FSessionReopenBackground, write = SetSessionReopenBackground };
+  __property int SessionReopenTimeout = { read = FSessionReopenTimeout, write = SetSessionReopenTimeout };
   __property int TunnelLocalPortNumberLow = { read = FTunnelLocalPortNumberLow, write = SetTunnelLocalPortNumberLow };
   __property int TunnelLocalPortNumberHigh = { read = FTunnelLocalPortNumberHigh, write = SetTunnelLocalPortNumberHigh };
   __property int CacheDirectoryChangesMaxSize = { read = FCacheDirectoryChangesMaxSize, write = SetCacheDirectoryChangesMaxSize };

+ 33 - 2
core/CopyParam.cpp

@@ -272,7 +272,20 @@ AnsiString __fastcall TCopyParamType::ValidLocalFileName(AnsiString FileName) co
     char * InvalidChar = FileName.c_str();
     while ((InvalidChar = strpbrk(InvalidChar, Chars)) != NULL)
     {
-      InvalidChar = ReplaceChar(FileName, InvalidChar);
+      int Pos = (InvalidChar - FileName.c_str() + 1);
+      char Char;
+      if ((InvalidCharsReplacement == TokenReplacement) &&
+          (*InvalidChar == TokenPrefix) &&
+          (((FileName.Length() - Pos) <= 1) ||
+           (((Char = HexToChar(FileName.SubString(Pos + 1, 2))) == '\0') ||
+            (FTokenizibleChars.Pos(Char) == 0))))
+      {
+        InvalidChar++;
+      }
+      else
+      {
+        InvalidChar = ReplaceChar(FileName, InvalidChar);
+      }
     }
 
     // Windows trim trailing space, hence we must encode it to preserve it
@@ -280,6 +293,16 @@ AnsiString __fastcall TCopyParamType::ValidLocalFileName(AnsiString FileName) co
     {
       ReplaceChar(FileName, FileName.c_str() + FileName.Length() - 1);
     }
+
+    if (IsReservedName(FileName))
+    {
+      int P = FileName.Pos(".");
+      if (P == 0)
+      {
+        P = FileName.Length() + 1;
+      }
+      FileName.Insert("%00", P);
+    }
   }
   return FileName;
 }
@@ -297,7 +320,8 @@ AnsiString __fastcall TCopyParamType::RestoreChars(AnsiString FileName) const
           (FileName.ByteType(Index + 1) == mbSingleByte) &&
           (FileName.ByteType(Index + 2) == mbSingleByte))
       {
-        char Char = HexToChar(FileName.SubString(Index + 1, 2));
+        AnsiString Hex = FileName.SubString(Index + 1, 2);
+        char Char = HexToChar(Hex);
         if ((Char != '\0') &&
             ((FTokenizibleChars.Pos(Char) > 0) ||
              ((Char == ' ') && (Index == FileName.Length() - 2))))
@@ -306,6 +330,13 @@ AnsiString __fastcall TCopyParamType::RestoreChars(AnsiString FileName) const
           FileName.Delete(Index + 1, 2);
           InvalidChar = FileName.c_str() + Index;
         }
+        else if ((Hex == "00") &&
+                 ((Index == FileName.Length() - 2) || (FileName[Index + 3] == '.')) &&
+                 IsReservedName(FileName.SubString(1, Index - 1) + FileName.SubString(Index + 3, FileName.Length() - Index - 3 + 1)))
+        {
+          FileName.Delete(Index, 3);
+          InvalidChar = FileName.c_str() + Index - 1;
+        }
         else
         {
           InvalidChar++;

+ 1 - 0
core/CoreMain.cpp

@@ -33,6 +33,7 @@ TQueryParams::TQueryParams(unsigned int AParams, AnsiString AHelpKeyword)
   TimerAnswers = 0;
   Timeout = 0;
   TimeoutAnswer = 0;
+  NoBatchAnswers = 0;
   HelpKeyword = AHelpKeyword;
 }
 //---------------------------------------------------------------------------

+ 16 - 1
core/Exceptions.h

@@ -8,6 +8,7 @@
 #include <System.hpp>
 //---------------------------------------------------------------------------
 bool __fastcall ExceptionMessage(Exception * E, AnsiString & Message);
+enum TOnceDoneOperation { odoIdle, odoDisconnect, odoShutDown };
 //---------------------------------------------------------------------------
 class ExtException : public Sysutils::Exception
 {
@@ -81,6 +82,20 @@ public:
   };
 //---------------------------------------------------------------------------
 DERIVE_FATAL_EXCEPTION(ESshFatal, EFatal);
-DERIVE_FATAL_EXCEPTION(ESshTerminate, EFatal); // exception that closes application, but displayes info message (not error message) = close on completion
+//---------------------------------------------------------------------------
+// exception that closes application, but displayes info message (not error message)
+// = close on completionclass ESshTerminate : public EFatal
+class ESshTerminate : public EFatal
+{
+public:
+  inline __fastcall ESshTerminate(Exception* E, AnsiString Msg, TOnceDoneOperation AOperation) :
+    EFatal(E, Msg),
+    Operation(AOperation)
+  { }
+
+  TOnceDoneOperation Operation;
+};
+//---------------------------------------------------------------------------
+AnsiString __fastcall LastSysErrorMessage();
 //---------------------------------------------------------------------------
 #endif  // Exceptions

+ 157 - 5
core/FileInfo.cpp

@@ -3,30 +3,181 @@
 #pragma hdrstop
 
 #include <Common.h>
+#include <Exceptions.h>
 #include <Windows.hpp>
 #include "FileInfo.h"
+#include "FileBuffer.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 //---------------------------------------------------------------------------
+#define DWORD_ALIGN( base, ptr ) \
+    ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) )
+struct VS_VERSION_INFO_STRUCT32
+{
+  WORD  wLength;
+  WORD  wValueLength;
+  WORD  wType;
+  WCHAR szKey[1];
+};
+//---------------------------------------------------------------------------
+unsigned int VERSION_GetFileVersionInfo_PE(const char * FileName, unsigned int DataSize, void * Data)
+{
+  unsigned int Len;
+
+
+  HMODULE Module = GetModuleHandle(FileName);
+  if (Module == NULL)
+  {
+    Module = LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
+  }
+  if (Module == NULL)
+  {
+  }
+  else
+  {
+    try
+    {
+      HANDLE Rsrc = FindResource(Module, MAKEINTRESOURCE(VS_VERSION_INFO),
+        MAKEINTRESOURCE(VS_FILE_INFO));
+      if (Rsrc == NULL)
+      {
+      }
+      else
+      {
+        Len = SizeofResource(Module, Rsrc);
+        HANDLE Mem = LoadResource(Module, Rsrc);
+        if (Mem == NULL)
+        {
+        }
+        else
+        {
+          try
+          {
+            VS_VERSION_INFO_STRUCT32 * VersionInfo = (VS_VERSION_INFO_STRUCT32 *)LockResource(Mem);
+            const VS_FIXEDFILEINFO * FixedInfo =
+              (VS_FIXEDFILEINFO *)DWORD_ALIGN(VersionInfo, VersionInfo->szKey + wcslen(VersionInfo->szKey) + 1);
+
+            if (FixedInfo->dwSignature != VS_FFI_SIGNATURE)
+            {
+              Len = 0;
+            }
+            else
+            {
+              if (Data != NULL)
+              {
+                if (DataSize < Len)
+                {
+                  Len = DataSize;
+                }
+                if (Len > 0)
+                {
+                  memcpy(Data, VersionInfo, Len);
+                }
+              }
+            }
+          }
+          __finally
+          {
+            FreeResource(Mem);
+          }
+        }
+      }
+    }
+    __finally
+    {
+      FreeLibrary(Module);
+    }
+  }
+
+  return Len;
+}
+//---------------------------------------------------------------------------
+bool __fastcall IsWin7()
+{
+  return
+    (Win32MajorVersion > 6) ||
+    ((Win32MajorVersion == 6) && (Win32MinorVersion >= 1));
+}
+//---------------------------------------------------------------------------
+unsigned int GetFileVersionInfoSizeFix(const char * FileName, unsigned long * Handle)
+{
+  unsigned int Len;
+  if (IsWin7())
+  {
+    *Handle = 0;
+    Len = VERSION_GetFileVersionInfo_PE(FileName, 0, NULL);
+
+    if (Len != 0)
+    {
+      Len = (Len * 2) + 4;
+    }
+  }
+  else
+  {
+    Len = GetFileVersionInfoSize((char *)FileName, Handle);
+  }
+
+  return Len;
+}
+//---------------------------------------------------------------------------
+bool GetFileVersionInfoFix(const char * FileName, unsigned long Handle,
+  unsigned int DataSize, void * Data)
+{
+  bool Result;
+
+  if (IsWin7())
+  {
+    VS_VERSION_INFO_STRUCT32 * VersionInfo = (VS_VERSION_INFO_STRUCT32*)Data;
+
+
+    unsigned int Len = VERSION_GetFileVersionInfo_PE(FileName, DataSize, Data);
+
+    Result = (Len != 0);
+    if (Result)
+    {
+      static const char Signature[] = "FE2X";
+      unsigned int BufSize = VersionInfo->wLength + strlen(Signature);
+      unsigned int ConvBuf;
+
+      if (DataSize >= BufSize)
+      {
+        ConvBuf = DataSize - VersionInfo->wLength;
+        memcpy(((char*)(Data)) + VersionInfo->wLength, Signature, ConvBuf > 4 ? 4 : ConvBuf );
+      }
+    }
+  }
+  else
+  {
+    Result = GetFileVersionInfo((char *)FileName, Handle, DataSize, Data);
+  }
+
+  return Result;
+}
+//---------------------------------------------------------------------------
 // Return pointer to file version info block
 void * __fastcall CreateFileInfo(AnsiString FileName)
 {
-  DWORD Handle, Size;
+  unsigned long Handle;
+  unsigned int Size;
   void * Result = NULL;
 
+
   // Get file version info block size
-  Size = GetFileVersionInfoSize(FileName.c_str(), &Handle);
+  Size = GetFileVersionInfoSizeFix(FileName.c_str(), &Handle);
   // If size is valid
-  if (Size)
+  if (Size > 0)
   {
     Result = new char[Size];
     // Get file version info block
-    if (!GetFileVersionInfo(FileName.c_str(), Handle, Size, Result))
+    if (!GetFileVersionInfoFix(FileName.c_str(), Handle, Size, Result))
     {
       delete[] Result;
       Result = NULL;
     }
   }
+  else
+  {
+  }
   return Result;
 }
 //---------------------------------------------------------------------------
@@ -100,7 +251,8 @@ AnsiString __fastcall GetFileInfoString(void * FileInfo,
     throw Exception("Specified file info string not available");
   }
   // c_str() makes sure that returned string has only necessary bytes allocated
-  return AnsiString(P, Len).c_str();
+  AnsiString Result = AnsiString(P, Len).c_str();
+  return Result;
 };
 //---------------------------------------------------------------------------
 int __fastcall CalculateCompoundVersion(int MajorVer,

+ 11 - 10
core/FileOperationProgress.cpp

@@ -25,7 +25,8 @@ __fastcall TFileOperationProgressType::TFileOperationProgressType(
 //---------------------------------------------------------------------------
 __fastcall TFileOperationProgressType::~TFileOperationProgressType()
 {
-  assert((!InProgress && !Suspended) || FReset);
+  assert(!InProgress || FReset);
+  assert(!Suspended || FReset);
 }
 //---------------------------------------------------------------------------
 void __fastcall TFileOperationProgressType::Clear()
@@ -46,11 +47,8 @@ void __fastcall TFileOperationProgressType::Clear()
   TotalSizeSet = false;
   Operation = foNone;
   Temp = false;
-  YesToAll = false;
-  YesToNewer = false;
-  NoToAll = false;
   SkipToAll = false;
-  AlternateResumeAlways = false;
+  BatchOverwrite = boNo;
   // to bypass check in ClearTransfer()
   TransferSize = 0;
   CPSLimit = 0;
@@ -140,13 +138,16 @@ void __fastcall TFileOperationProgressType::Resume()
 int __fastcall TFileOperationProgressType::OperationProgress()
 {
   assert(Count);
-  return (FFilesFinished * 100)/Count;
+  int Result = (FFilesFinished * 100)/Count;
+  return Result;
 }
 //---------------------------------------------------------------------------
 int __fastcall TFileOperationProgressType::TransferProgress()
 {
-  if (TransferSize) return (int)((TransferedSize * 100)/TransferSize);
-    else return 0;
+  int Result;
+  if (TransferSize) Result = (int)((TransferedSize * 100)/TransferSize);
+    else Result = 0;
+  return Result;
 }
 //---------------------------------------------------------------------------
 int __fastcall TFileOperationProgressType::TotalTransferProgress()
@@ -175,13 +176,13 @@ void __fastcall TFileOperationProgressType::DoProgress()
 }
 //---------------------------------------------------------------------------
 void __fastcall TFileOperationProgressType::Finish(AnsiString FileName,
-  bool Success, bool & DisconnectWhenComplete)
+  bool Success, TOnceDoneOperation & OnceDoneOperation)
 {
   assert(InProgress);
 
   FOnFinished(Operation, Side, Temp, FileName,
     /* TODO : There wasn't 'Success' condition, was it by mistake or by purpose? */
-    Success && (Cancel == csContinue), DisconnectWhenComplete);
+    Success && (Cancel == csContinue), OnceDoneOperation);
   FFilesFinished++;
   DoProgress();
 }

+ 6 - 6
core/FileOperationProgress.h

@@ -4,6 +4,7 @@
 //---------------------------------------------------------------------------
 #include "Configuration.h"
 #include "CopyParam.h"
+#include "Exceptions.h"
 #include <vector>
 //---------------------------------------------------------------------------
 class TFileOperationProgressType;
@@ -12,11 +13,12 @@ enum TFileOperation { foNone, foCopy, foMove, foDelete, foSetProperties,
   foGetProperties, foCalculateChecksum };
 enum TCancelStatus { csContinue = 0, csCancel, csCancelTransfer, csRemoteAbort };
 enum TResumeStatus { rsNotAvailable, rsEnabled, rsDisabled };
+enum TBatchOverwrite { boNo, boAll, boNone, boOlder, boAlternateResume, boAppend, boResume };
 typedef void __fastcall (__closure *TFileOperationProgressEvent)
   (TFileOperationProgressType & ProgressData, TCancelStatus & Cancel);
 typedef void __fastcall (__closure *TFileOperationFinished)
   (TFileOperation Operation, TOperationSide Side, bool Temp,
-    const AnsiString & FileName, bool Success, bool & DisconnectWhenComplete);
+    const AnsiString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
 //---------------------------------------------------------------------------
 class TFileOperationProgressType
 {
@@ -65,11 +67,9 @@ public:
   __int64 TotalTransfered;
   __int64 TotalSkipped;
   __int64 TotalSize;
-  bool YesToAll;
-  bool YesToNewer;
-  bool NoToAll;
+
+  TBatchOverwrite BatchOverwrite;
   bool SkipToAll;
-  bool AlternateResumeAlways;
   unsigned long CPSLimit;
 
   bool TotalSizeSet;
@@ -86,7 +86,7 @@ public:
   void __fastcall Clear();
   unsigned int __fastcall CPS();
   void __fastcall Finish(AnsiString FileName, bool Success,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   unsigned long __fastcall LocalBlockSize();
   bool __fastcall IsLocalyDone();
   bool __fastcall IsTransferDone();

+ 3 - 2
core/FileSystems.h

@@ -3,6 +3,7 @@
 #define FileSystemsH
 
 #include <SessionInfo.h>
+#include "Exceptions.h"
 //---------------------------------------------------------------------------
 class TTerminal;
 class TRights;
@@ -49,11 +50,11 @@ public:
   virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete) = 0;
+    TOnceDoneOperation & OnceDoneOperation) = 0;
   virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete) = 0;
+    TOnceDoneOperation & OnceDoneOperation) = 0;
   virtual void __fastcall CreateDirectory(const AnsiString DirName) = 0;
   virtual void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic) = 0;
   virtual void __fastcall DeleteFile(const AnsiString FileName,

+ 286 - 161
core/FtpFileSystem.cpp

@@ -137,12 +137,14 @@ struct TFileTransferData
     Params = 0;
     AutoResume = false;
     OverwriteResult = -1;
+    CopyParam = NULL;
   }
 
   AnsiString FileName;
   int Params;
   bool AutoResume;
   int OverwriteResult;
+  const TCopyParamType * CopyParam;
 };
 //---------------------------------------------------------------------------
 const int tfFirstLevel = 0x01;
@@ -288,15 +290,12 @@ void __fastcall TFTPFileSystem::Open()
       {
         default:
         case 0:
-          LogLevel = TFileZillaIntf::LOG_LIST;
-          break;
-
         case 1:
           LogLevel = TFileZillaIntf::LOG_WARNING;
           break;
 
         case 2:
-          LogLevel = TFileZillaIntf::LOG_DEBUG;
+          LogLevel = TFileZillaIntf::LOG_INFO;
           break;
       }
       FFileZillaIntf->SetDebugLevel(LogLevel);
@@ -363,7 +362,7 @@ void __fastcall TFTPFileSystem::Open()
     FFeatures->Clear();
     FFileSystemInfoValid = false;
 
-    // !!! the same for account? it ever used?
+    // TODO: the same for account? it ever used?
 
     // ask for username if it was not specified in advance, even on retry,
     // but keep previous one as default,
@@ -390,7 +389,7 @@ void __fastcall TFTPFileSystem::Open()
 
     // ask for password if it was not specified in advance,
     // on retry ask always
-    if (Data->Password.IsEmpty() || FPasswordFailed)
+    if ((Data->Password.IsEmpty() && !Data->Passwordless) || FPasswordFailed)
     {
       FTerminal->LogEvent("Password prompt (no password provided or last login attempt failed)");
 
@@ -420,7 +419,7 @@ void __fastcall TFTPFileSystem::Open()
 
     try
     {
-      GotReply(WaitForReply(), REPLY_CONNECT, LoadStr(CONNECTION_FAILED));
+      GotReply(WaitForCommandReply(), REPLY_CONNECT, LoadStr(CONNECTION_FAILED));
 
       // we have passed, even if we got 530 on the way (if it is possible at all),
       // ignore it
@@ -449,7 +448,7 @@ void __fastcall TFTPFileSystem::Close()
   assert(FActive);
   if (FFileZillaIntf->Close())
   {
-    CHECK(FLAGSET(WaitForReply(), TFileZillaIntf::REPLY_DISCONNECTED));
+    CHECK(FLAGSET(WaitForCommandReply(), TFileZillaIntf::REPLY_DISCONNECTED));
     assert(FActive);
     Discard();
     FTerminal->Closed();
@@ -469,12 +468,7 @@ void __fastcall TFTPFileSystem::Idle()
 {
   if (FActive && !FWaitingForReply)
   {
-    unsigned int Reply = PoolForReply();
-    if (Reply != 0)
-    {
-      assert(FLAGSET(Reply, TFileZillaIntf::REPLY_DISCONNECTED));
-      GotReply(Reply);
-    }
+    PoolForFatalNonCommandReply();
 
     // Keep session alive
     if ((FTerminal->SessionData->FtpPingType != ptOff) &&
@@ -571,7 +565,7 @@ void __fastcall TFTPFileSystem::AnyCommand(const AnsiString Command,
   {
     FFileZillaIntf->CustomCommand(Command.c_str());
 
-    GotReply(WaitForReply(), REPLY_2XX_CODE);
+    GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
   }
   __finally
   {
@@ -595,7 +589,7 @@ void __fastcall TFTPFileSystem::DoChangeDirectory(const AnsiString & Directory)
   AnsiString Command = FORMAT("CWD %s", (Directory));
   FFileZillaIntf->CustomCommand(Command.c_str());
 
-  GotReply(WaitForReply(), REPLY_2XX_CODE);
+  GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
 }
 //---------------------------------------------------------------------------
 void __fastcall TFTPFileSystem::ChangeDirectory(const AnsiString ADirectory)
@@ -693,7 +687,7 @@ void __fastcall TFTPFileSystem::ChangeFileProperties(const AnsiString AFileName,
       // FZAPI wants octal number represented as decadic
       FFileZillaIntf->Chmod(Rights.NumberDecadic, FileNameOnly.c_str(), FilePath.c_str());
 
-      GotReply(WaitForReply(), REPLY_2XX_CODE);
+      GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
     }
     __finally
     {
@@ -724,109 +718,96 @@ bool __fastcall TFTPFileSystem::ConfirmOverwrite(AnsiString & FileName,
   const TOverwriteFileParams * FileParams, int Params, bool AutoResume)
 {
   bool Result;
-  if (OperationProgress->YesToAll)
-  {
-    OverwriteMode = omOverwrite;
-    Result = true;
-  }
-  else if (OperationProgress->NoToAll)
+  bool CanResume =
+    (FileParams != NULL) &&
+    (FileParams->DestSize < FileParams->SourceSize);
+
+  int Answer;
+  if (FLAGSET(Params, cpNoConfirmation) && CanResume && AutoResume)
   {
-    FFileTransferAbort = ftaSkip;
-    Result = false;
+    Answer = qaRetry;
   }
   else
   {
-    bool CanResume = (FileParams->DestSize < FileParams->SourceSize);
-
-    int Answer;
-    if (FLAGSET(Params, cpNoConfirmation))
-    {
-      Answer = (CanResume && AutoResume ? qaRetry : qaYes);
-    }
-    else if (!FTerminal->Configuration->ConfirmOverwriting)
-    {
-      Answer = qaYes;
-    }
-    else
-    {
-      // retry = "resume"
-      // all = "yes to newer"
-      // ignore = "rename"
-      int Answers = qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll | qaIgnore;
-      if (CanResume)
-      {
-        Answers |= qaRetry;
-      }
-      TQueryButtonAlias Aliases[3];
-      Aliases[0].Button = qaRetry;
-      Aliases[0].Alias = LoadStr(RESUME_BUTTON);
-      Aliases[1].Button = qaAll;
-      Aliases[1].Alias = LoadStr(YES_TO_NEWER_BUTTON);
-      Aliases[2].Button = qaIgnore;
-      Aliases[2].Alias = LoadStr(RENAME_BUTTON);
-      TQueryParams Params(qpNeverAskAgainCheck);
-      Params.Aliases = Aliases;
-      Params.AliasesCount = LENOF(Aliases);
-      SUSPEND_OPERATION
-      (
-        Answer = FTerminal->ConfirmFileOverwrite(FileName, FileParams,
-          Answers, &Params,
-          OperationProgress->Side == osLocal ? osRemote : osLocal,
-          OperationProgress);
-      )
-    }
-
-    Result = true;
+    // retry = "resume"
+    // all = "yes to newer"
+    // ignore = "rename"
+    int Answers = qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll | qaIgnore;
+    if (CanResume)
+    {
+      Answers |= qaRetry;
+    }
+    TQueryButtonAlias Aliases[3];
+    Aliases[0].Button = qaRetry;
+    Aliases[0].Alias = LoadStr(RESUME_BUTTON);
+    Aliases[1].Button = qaAll;
+    Aliases[1].Alias = LoadStr(YES_TO_NEWER_BUTTON);
+    Aliases[2].Button = qaIgnore;
+    Aliases[2].Alias = LoadStr(RENAME_BUTTON);
+    TQueryParams QueryParams(qpNeverAskAgainCheck);
+    QueryParams.Aliases = Aliases;
+    QueryParams.AliasesCount = LENOF(Aliases);
+    SUSPEND_OPERATION
+    (
+      Answer = FTerminal->ConfirmFileOverwrite(FileName, FileParams,
+        Answers, &QueryParams,
+        OperationProgress->Side == osLocal ? osRemote : osLocal,
+        Params, OperationProgress);
+    )
+  }
 
-    switch (Answer)
-    {
-      // resume
-      case qaRetry:
-        OverwriteMode = omResume;
-        FFileTransferResumed = FileParams->DestSize;
-        break;
+  Result = true;
 
-      // rename
-      case qaIgnore:
-        if (FTerminal->PromptUser(FTerminal->SessionData, pkPrompt,
-              LoadStr(RENAME_TITLE), "", LoadStr(RENAME_PROMPT2), true, 0, FileName))
-        {
-          OverwriteMode = omOverwrite;
-        }
-        else
-        {
-          if (!OperationProgress->Cancel)
-          {
-            OperationProgress->Cancel = csCancel;
-          }
-          FFileTransferAbort = ftaCancel;
-          Result = false;
-        }
-        break;
+  switch (Answer)
+  {
+    // resume
+    case qaRetry:
+      OverwriteMode = omResume;
+      assert(FileParams != NULL);
+      assert(CanResume);
+      FFileTransferResumed = FileParams->DestSize;
+      break;
 
-      case qaYes:
+    // rename
+    case qaIgnore:
+      if (FTerminal->PromptUser(FTerminal->SessionData, pkPrompt,
+            LoadStr(RENAME_TITLE), "", LoadStr(RENAME_PROMPT2), true, 0, FileName))
+      {
         OverwriteMode = omOverwrite;
-        break;
-
-      case qaCancel:
+      }
+      else
+      {
         if (!OperationProgress->Cancel)
         {
           OperationProgress->Cancel = csCancel;
         }
         FFileTransferAbort = ftaCancel;
         Result = false;
-        break;
+      }
+      break;
 
-      case qaNo:
-        FFileTransferAbort = ftaSkip;
-        Result = false;
-        break;
+    case qaYes:
+      OverwriteMode = omOverwrite;
+      break;
 
-      default:
-        assert(false);
-        Result = false;
-        break;
-    }
+    case qaCancel:
+      if (!OperationProgress->Cancel)
+      {
+        OperationProgress->Cancel = csCancel;
+      }
+      FFileTransferAbort = ftaCancel;
+      Result = false;
+      break;
+
+    case qaNo:
+      FFileTransferAbort = ftaSkip;
+      Result = false;
+      break;
+
+    default:
+      assert(false);
+      Result = false;
+      break;
   }
   return Result;
 }
@@ -870,8 +851,12 @@ void __fastcall TFTPFileSystem::DoFileTransferProgress(__int64 TransferSize,
     FFileTransferResumed = 0;
   }
 
-  assert(OperationProgress->TransferedSize <= Bytes);
-  OperationProgress->AddTransfered(Bytes - OperationProgress->TransferedSize);
+  __int64 Diff = Bytes - OperationProgress->TransferedSize;
+  assert(Diff >= 0);
+  if (Diff >= 0)
+  {
+    OperationProgress->AddTransfered(Diff);
+  }
 
   if (OperationProgress->Cancel == csCancel)
   {
@@ -902,7 +887,7 @@ void __fastcall TFTPFileSystem::FileTransfer(const AnsiString & FileName,
   FILE_OPERATION_LOOP(FMTLOAD(TRANSFER_ERROR, (FileName)),
     FFileZillaIntf->FileTransfer(LocalFile.c_str(), RemoteFile.c_str(),
       RemotePath.c_str(), Get, Size, Type, &UserData);
-    unsigned int Reply = WaitForReply();
+    unsigned int Reply = WaitForCommandReply();
     GotReply(Reply, FLAGMASK(FFileTransferCancelled, REPLY_ALLOW_CANCEL));
   );
 
@@ -928,8 +913,9 @@ void __fastcall TFTPFileSystem::FileTransfer(const AnsiString & FileName,
 void __fastcall TFTPFileSystem::CopyToLocal(TStrings * FilesToCopy,
   const AnsiString TargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
+  Params &= ~cpAppend;
   AnsiString FullTargetDir = IncludeTrailingBackslash(TargetDir);
 
   int Index = 0;
@@ -957,7 +943,7 @@ void __fastcall TFTPFileSystem::CopyToLocal(TStrings * FilesToCopy,
     }
     __finally
     {
-      OperationProgress->Finish(FileName, Success, DisconnectWhenComplete);
+      OperationProgress->Finish(FileName, Success, OnceDoneOperation);
     }
     Index++;
   }
@@ -1122,6 +1108,7 @@ void __fastcall TFTPFileSystem::Sink(const AnsiString FileName,
       UserData.FileName = DestFileName;
       UserData.Params = Params;
       UserData.AutoResume = FLAGSET(Flags, tfAutoResume);
+      UserData.CopyParam = CopyParam;
       FileTransfer(FileName, DestFullName, OnlyFileName,
         FilePath, true, File->Size, TransferType, UserData, OperationProgress);
     }
@@ -1191,10 +1178,11 @@ void __fastcall TFTPFileSystem::SinkFile(AnsiString FileName,
 void __fastcall TFTPFileSystem::CopyToRemote(TStrings * FilesToCopy,
   const AnsiString ATargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   assert((FilesToCopy != NULL) && (OperationProgress != NULL));
 
+  Params &= ~cpAppend;
   AnsiString FileName, FileNameOnly;
   AnsiString TargetDir = AbsolutePath(ATargetDir, false);
   AnsiString FullTargetDir = UnixIncludeTrailingBackslash(TargetDir);
@@ -1232,7 +1220,7 @@ void __fastcall TFTPFileSystem::CopyToRemote(TStrings * FilesToCopy,
     }
     __finally
     {
-      OperationProgress->Finish(FileName, Success, DisconnectWhenComplete);
+      OperationProgress->Finish(FileName, Success, OnceDoneOperation);
     }
     Index++;
   }
@@ -1352,6 +1340,7 @@ void __fastcall TFTPFileSystem::Source(const AnsiString FileName,
       UserData.FileName = DestFileName;
       UserData.Params = Params;
       UserData.AutoResume = FLAGSET(Flags, tfAutoResume);
+      UserData.CopyParam = CopyParam;
       FileTransfer(FileName, FileName, DestFileName,
         TargetDir, false, Size, TransferType, UserData, OperationProgress);
     }
@@ -1371,9 +1360,8 @@ void __fastcall TFTPFileSystem::Source(const AnsiString FileName,
       {
         TTouchSessionAction TouchAction(FTerminal->Log, DestFullName,
           UnixToDateTime(
-            ConvertTimestampToUnixSafe(
-              FindData.ftLastWriteTime, FTerminal->SessionData->DSTMode),
-            FTerminal->SessionData->DSTMode));
+            ConvertTimestampToUnixSafe(FindData.ftLastWriteTime, dstmUnix),
+            dstmUnix));
         FindClose(Handle);
       }
     }
@@ -1492,7 +1480,7 @@ void __fastcall TFTPFileSystem::CreateDirectory(const AnsiString ADirName)
 
     FFileZillaIntf->MakeDir(DirName.c_str());
 
-    GotReply(WaitForReply(), REPLY_2XX_CODE);
+    GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
   }
 }
 //---------------------------------------------------------------------------
@@ -1547,7 +1535,7 @@ void __fastcall TFTPFileSystem::DeleteFile(const AnsiString AFileName,
     {
       FFileZillaIntf->Delete(FileNameOnly.c_str(), FilePath.c_str());
     }
-    GotReply(WaitForReply(), REPLY_2XX_CODE);
+    GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
   }
 }
 //---------------------------------------------------------------------------
@@ -1573,7 +1561,7 @@ void __fastcall TFTPFileSystem::DoStartup()
       {
         FFileZillaIntf->CustomCommand(Command.c_str());
 
-        GotReply(WaitForReply(), REPLY_2XX_CODE);
+        GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
       }
     }
   }
@@ -1653,7 +1641,7 @@ void __fastcall TFTPFileSystem::ReadCurrentDirectory()
 
     unsigned int Code;
     TStrings * Response = NULL;
-    GotReply(WaitForReply(), REPLY_2XX_CODE, "", &Code, &Response);
+    GotReply(WaitForCommandReply(), REPLY_2XX_CODE, "", &Code, &Response);
 
     try
     {
@@ -1711,7 +1699,7 @@ void __fastcall TFTPFileSystem::DoReadDirectory(TRemoteFileList * FileList)
   AnsiString Directory = AbsolutePath(FileList->Directory, false);
   FFileZillaIntf->List(Directory.c_str());
 
-  GotReply(WaitForReply(), REPLY_2XX_CODE | REPLY_ALLOW_CANCEL);
+  GotReply(WaitForCommandReply(), REPLY_2XX_CODE | REPLY_ALLOW_CANCEL);
 
   FLastDataSent = Now();
 }
@@ -1836,7 +1824,7 @@ void __fastcall TFTPFileSystem::RenameFile(const AnsiString AFileName,
     FFileZillaIntf->Rename(FileNameOnly.c_str(), NewNameOnly.c_str(),
       FilePathOnly.c_str(), NewPathOnly.c_str());
 
-    GotReply(WaitForReply(), REPLY_2XX_CODE);
+    GotReply(WaitForCommandReply(), REPLY_2XX_CODE);
   }
 }
 //---------------------------------------------------------------------------
@@ -2145,7 +2133,7 @@ void __fastcall TFTPFileSystem::WaitForMessages()
   }
 }
 //---------------------------------------------------------------------------
-unsigned int __fastcall TFTPFileSystem::PoolForReply()
+void __fastcall TFTPFileSystem::PoolForFatalNonCommandReply()
 {
   assert(FReply == 0);
   assert(FCommandReply == 0);
@@ -2171,14 +2159,18 @@ unsigned int __fastcall TFTPFileSystem::PoolForReply()
     FWaitingForReply = false;
   }
 
-  return Reply;
+  if (Reply != 0)
+  {
+    // throws
+    GotNonCommandReply(Reply);
+  }
 }
 //---------------------------------------------------------------------------
 void __fastcall TFTPFileSystem::DoWaitForReply(unsigned int& ReplyToAwait)
 {
   try
   {
-    while (ReplyToAwait == 0)
+    while ((ReplyToAwait == 0) && (FReply == 0))
     {
       WaitForMessages();
       // wait for the first reply only,
@@ -2187,7 +2179,13 @@ void __fastcall TFTPFileSystem::DoWaitForReply(unsigned int& ReplyToAwait)
       // sometime it happens that command (like download) fails because of the error
       // and does not catch the disconnection. then asynchronous "disconnect reply"
       // is posted immediately afterwards. leave detection of that to Idle()
-      while (ProcessMessage() && (ReplyToAwait == 0));
+      while (ProcessMessage() && (ReplyToAwait == 0) && (FReply == 0));
+    }
+
+    if (FReply != 0)
+    {
+      // throws
+      GotNonCommandReply(FReply);
     }
   }
   catch(...)
@@ -2217,7 +2215,7 @@ unsigned int __fastcall TFTPFileSystem::WaitForReply(bool Command)
 
   try
   {
-    unsigned int& ReplyToAwait = (Command ? FCommandReply : FReply);
+    unsigned int & ReplyToAwait = (Command ? FCommandReply : FReply);
     DoWaitForReply(ReplyToAwait);
 
     Reply = ReplyToAwait;
@@ -2233,6 +2231,17 @@ unsigned int __fastcall TFTPFileSystem::WaitForReply(bool Command)
   return Reply;
 }
 //---------------------------------------------------------------------------
+unsigned int __fastcall TFTPFileSystem::WaitForCommandReply()
+{
+  return WaitForReply(true);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFTPFileSystem::WaitForFatalNonCommandReply()
+{
+  WaitForReply(false);
+  assert(false);
+}
+//---------------------------------------------------------------------------
 void __fastcall TFTPFileSystem::ResetReply()
 {
   FLastCode = 0;
@@ -2243,6 +2252,14 @@ void __fastcall TFTPFileSystem::ResetReply()
   FLastError->Clear();
 }
 //---------------------------------------------------------------------------
+void __fastcall TFTPFileSystem::GotNonCommandReply(unsigned int Reply)
+{
+  assert(FLAGSET(Reply, TFileZillaIntf::REPLY_DISCONNECTED));
+  GotReply(Reply);
+  // should never get here as GotReply should raise fatal exception
+  assert(false);
+}
+//---------------------------------------------------------------------------
 void __fastcall TFTPFileSystem::GotReply(unsigned int Reply, unsigned int Flags,
   AnsiString Error, unsigned int * Code, TStrings ** Response)
 {
@@ -2330,6 +2347,11 @@ void __fastcall TFTPFileSystem::GotReply(unsigned int Reply, unsigned int Flags,
           MoreMessages->Add(LoadStr(AUTHENTICATION_FAILED));
         }
 
+        if (FLastCode == 425)
+        {
+          MoreMessages->Add(LoadStr(FTP_CANNOT_OPEN_ACTIVE_CONNECTION));
+        }
+
         MoreMessages->AddStrings(FLastError);
         // already cleared from WaitForReply, but GotReply can be also called
         // from Closed. then make sure that error from previous command not
@@ -2396,10 +2418,9 @@ void __fastcall TFTPFileSystem::GotReply(unsigned int Reply, unsigned int Flags,
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TFTPFileSystem::HandleReplyStatus(const char * AStatus)
+void __fastcall TFTPFileSystem::HandleReplyStatus(AnsiString Response)
 {
   int Code;
-  AnsiString Response(AStatus);
 
   if (FOnCaptureOutput != NULL)
   {
@@ -2514,14 +2535,30 @@ void __fastcall TFTPFileSystem::HandleReplyStatus(const char * AStatus)
   }
 }
 //---------------------------------------------------------------------------
-bool __fastcall TFTPFileSystem::HandleStatus(const char * Status, int Type)
+AnsiString __fastcall TFTPFileSystem::ExtractStatusMessage(AnsiString Status)
 {
-  assert(
-    (Type <= TFileZillaIntf::LOG_LIST) ||
-    ((Type <= TFileZillaIntf::LOG_WARNING) && (FTerminal->Configuration->LogProtocol >= 1)) ||
-    (FTerminal->Configuration->LogProtocol >= 2));
-
-  TLogLineType LogType;
+  // CApiLog::LogMessage
+  // (note that the formatting may not be present when LogMessageRaw is used)
+  int P1 = Status.Pos("): ");
+  if (P1 > 0)
+  {
+    int P2 = Status.Pos(".cpp(");
+    if ((P2 > 0) && (P2 < P1))
+    {
+      int P3 = Status.Pos("   caller=0x");
+      if ((P3 > 0) && (P3 > P1))
+      {
+        Status = Status.SubString(P1 + 3, P3 - P1 - 3);
+      }
+    }
+  }
+  return Status;
+}
+//---------------------------------------------------------------------------
+bool __fastcall TFTPFileSystem::HandleStatus(const char * AStatus, int Type)
+{
+  TLogLineType LogType = (TLogLineType)-1;
+  AnsiString Status(AStatus);
 
   switch (Type)
   {
@@ -2531,15 +2568,15 @@ bool __fastcall TFTPFileSystem::HandleStatus(const char * Status, int Type)
       break;
 
     case TFileZillaIntf::LOG_COMMAND:
-      if (strcmp(Status, "SYST") == 0)
+      if (Status == "SYST")
       {
         FLastCommand = SYST;
       }
-      else if (strcmp(Status, "FEAT") == 0)
+      else if (Status == "FEAT")
       {
         FLastCommand = FEAT;
       }
-      else if (strncmp(Status, "PASS ", 5) == 0)
+      else if (Status.SubString(1, 5) == "PASS ")
       {
         FLastCommand = PASS;
       }
@@ -2551,23 +2588,31 @@ bool __fastcall TFTPFileSystem::HandleStatus(const char * Status, int Type)
       break;
 
     case TFileZillaIntf::LOG_ERROR:
+    case TFileZillaIntf::LOG_APIERROR:
+    case TFileZillaIntf::LOG_WARNING:
       // there can be multiple error messages associated with single failure
       // (such as "cannot open local file..." followed by "download failed"
+      Status = ExtractStatusMessage(Status);
       FLastError->Add(Status);
       LogType = llMessage;
       break;
 
     case TFileZillaIntf::LOG_REPLY:
-      HandleReplyStatus(Status);
+      HandleReplyStatus(AStatus);
       LogType = llOutput;
       break;
 
-    default:
+    case TFileZillaIntf::LOG_INFO:
+      Status = ExtractStatusMessage(Status);
       LogType = llMessage;
       break;
+
+    default:
+      assert(false);
+      break;
   }
 
-  if (FTerminal->Log->Logging)
+  if (FTerminal->Log->Logging && (LogType != (TLogLineType)-1))
   {
     FTerminal->Log->Add(LogType, Status);
   }
@@ -2575,6 +2620,66 @@ bool __fastcall TFTPFileSystem::HandleStatus(const char * Status, int Type)
   return true;
 }
 //---------------------------------------------------------------------------
+TDateTime __fastcall TFTPFileSystem::ConvertLocalTimestamp(time_t Time)
+{
+  // This reverses how FZAPI converts FILETIME to time_t,
+  // before passing it to FZ_ASYNCREQUEST_OVERWRITE.
+  __int64 Timestamp;
+  tm * Tm = localtime(&Time);
+  if (Tm != NULL)
+  {
+    SYSTEMTIME SystemTime;
+    SystemTime.wYear = static_cast<WORD>(Tm->tm_year + 1900);
+    SystemTime.wMonth = static_cast<WORD>(Tm->tm_mon + 1);
+    SystemTime.wDayOfWeek = 0;
+    SystemTime.wDay = static_cast<WORD>(Tm->tm_mday);
+    SystemTime.wHour = static_cast<WORD>(Tm->tm_hour);
+    SystemTime.wMinute = static_cast<WORD>(Tm->tm_min);
+    SystemTime.wSecond = static_cast<WORD>(Tm->tm_sec);
+    SystemTime.wMilliseconds = 0;
+
+    FILETIME LocalTime;
+    SystemTimeToFileTime(&SystemTime, &LocalTime);
+    FILETIME FileTime;
+    LocalFileTimeToFileTime(&LocalTime, &FileTime);
+    Timestamp = ConvertTimestampToUnixSafe(FileTime, dstmUnix);
+  }
+  else
+  {
+    // incorrect, but at least something
+    Timestamp = Time;
+  }
+
+  return UnixToDateTime(Timestamp, dstmUnix);
+}
+//---------------------------------------------------------------------------
+TDateTime __fastcall TFTPFileSystem::ConvertRemoteTimestamp(time_t Time, bool HasTime)
+{
+  TDateTime Result;
+  tm * Tm = localtime(&Time);
+  if (Tm != NULL)
+  {
+    // should be the same as HandleListData
+    Result = EncodeDate(
+      static_cast<unsigned short>(Tm->tm_year + 1900),
+      static_cast<unsigned short>(Tm->tm_mon + 1),
+      static_cast<unsigned short>(Tm->tm_mday));
+    if (HasTime)
+    {
+      Result += EncodeTime(
+        static_cast<unsigned short>(Tm->tm_hour),
+        static_cast<unsigned short>(Tm->tm_min),
+        static_cast<unsigned short>(Tm->tm_sec), 0);
+    }
+  }
+  else
+  {
+    // incorrect, but at least something
+    Result = UnixToDateTime(Time, dstmUnix);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 bool __fastcall TFTPFileSystem::HandleAsynchRequestOverwrite(
   char * FileName1, size_t FileName1Len, const char * /*FileName2*/,
   const char * /*Path1*/, const char * /*Path2*/,
@@ -2600,22 +2705,31 @@ bool __fastcall TFTPFileSystem::HandleAsynchRequestOverwrite(
       assert(UserData.FileName == FileName);
       TOverwriteMode OverwriteMode = omOverwrite;
       TOverwriteFileParams FileParams;
-      FileParams.SourceSize = Size2;
-      FileParams.DestSize = Size1;
-      // !!! TODO DST
-      FileParams.SourceTimestamp = UnixToDateTime(Time2, dstmUnix);
-      FileParams.DestTimestamp = UnixToDateTime(Time1, dstmUnix);
-      if ((OperationProgress->Side == osLocal) && !HasTime1)
-      {
-        FileParams.DestPrecision = mfMDY;
-      }
-      if ((OperationProgress->Side == osRemote) && !HasTime2)
+      bool NoFileParams =
+        (Size1 < 0) || (Time1 == 0) ||
+        (Size2 < 0) || (Time2 == 0);
+      if (!NoFileParams)
       {
-        FileParams.SourcePrecision = mfMDY;
+        FileParams.SourceSize = Size2;
+        FileParams.DestSize = Size1;
+
+        if (OperationProgress->Side == osLocal)
+        {
+          FileParams.SourceTimestamp = ConvertLocalTimestamp(Time2);
+          FileParams.DestTimestamp = ConvertRemoteTimestamp(Time1, HasTime1);
+          FileParams.DestPrecision = (HasTime1 ? mfMDHM : mfMDY);
+        }
+        else
+        {
+          FileParams.SourceTimestamp = ConvertRemoteTimestamp(Time2, HasTime2);
+          FileParams.SourcePrecision = (HasTime2 ? mfMDHM : mfMDY);
+          FileParams.DestTimestamp = ConvertLocalTimestamp(Time1);
+        }
       }
 
       if (ConfirmOverwrite(FileName, OverwriteMode, OperationProgress,
-            &FileParams, UserData.Params, UserData.AutoResume))
+            (NoFileParams ? NULL : &FileParams), UserData.Params,
+            UserData.AutoResume && UserData.CopyParam->AllowResume(FileParams.SourceSize)))
       {
         switch (OverwriteMode)
         {
@@ -2745,6 +2859,19 @@ bool __fastcall TFTPFileSystem::HandleAsynchRequestVerifyCertificate(
       delete Storage;
     }
 
+    if (RequestResult == 0)
+    {
+      AnsiString Buf = FTerminal->SessionData->HostKey;
+      while ((RequestResult == 0) && !Buf.IsEmpty())
+      {
+        AnsiString ExpectedKey = CutToChar(Buf, ';', false);
+        if (ExpectedKey == Fingerprint)
+        {
+          RequestResult = 1;
+        }
+      }
+    }
+
     if (RequestResult == 0)
     {
       int VerificationResultStr;
@@ -2840,6 +2967,7 @@ bool __fastcall TFTPFileSystem::HandleAsynchRequestVerifyCertificate(
 
       TQueryParams Params;
       Params.HelpKeyword = HELP_VERIFY_CERTIFICATE;
+      Params.NoBatchAnswers = qaYes | qaRetry;
       Params.Aliases = Aliases;
       Params.AliasesCount = LENOF(Aliases);
       int Answer = FTerminal->QueryUser(
@@ -2907,6 +3035,8 @@ bool __fastcall TFTPFileSystem::HandleListData(const char * Path,
   else
   {
     assert(FFileList != NULL);
+    // this can actually fail in real life,
+    // when connected to server with case insensitive paths
     assert(UnixComparePaths(AbsolutePath(FFileList->Directory, false), Path));
     USEDPARAM(Path);
 
@@ -2960,6 +3090,7 @@ bool __fastcall TFTPFileSystem::HandleListData(const char * Path,
         // ModificationFmt must be set after Modification
         if (Entry->HasDate)
         {
+          // should be the same as ConvertRemoteTimestamp
           TDateTime Modification =
             EncodeDate((unsigned short)Entry->Year, (unsigned short)Entry->Month,
               (unsigned short)Entry->Day);
@@ -3044,8 +3175,7 @@ bool __fastcall TFTPFileSystem::HandleReply(int Command, unsigned int Reply)
 
     // reply with Command 0 is not associated with current operation
     // so do not treat is as a reply
-    // (it is typically used asynchronously to notify about disconnects,
-    // this is handled in TFileZillaIntf::PostMessage already)
+    // (it is typically used asynchronously to notify about disconnects)
     if (Command != 0)
     {
       assert(FCommandReply == 0);
@@ -3084,13 +3214,8 @@ bool __fastcall TFTPFileSystem::CheckError(int ReturnCode, const char * Context)
   {
     if (!FWaitingForReply)
     {
-      unsigned int Reply = WaitForReply(false);
-
-      assert(FLAGSET(Reply, TFileZillaIntf::REPLY_DISCONNECTED));
-      GotReply(Reply);
-
-      // should never get here as GotReply should raise fatal exception
-      assert(false);
+      // throws
+      WaitForFatalNonCommandReply();
     }
   }
   else

+ 11 - 5
core/FtpFileSystem.h

@@ -45,11 +45,11 @@ public:
   virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CreateDirectory(const AnsiString DirName);
   virtual void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
   virtual void __fastcall DeleteFile(const AnsiString FileName,
@@ -99,13 +99,16 @@ protected:
   bool __fastcall ProcessMessage();
   void __fastcall DiscardMessages();
   void __fastcall WaitForMessages();
-  unsigned int __fastcall WaitForReply(bool Command = true);
-  unsigned int __fastcall PoolForReply();
+  unsigned int __fastcall WaitForReply(bool Command);
+  unsigned int __fastcall WaitForCommandReply();
+  void __fastcall WaitForFatalNonCommandReply();
+  void __fastcall PoolForFatalNonCommandReply();
+  void __fastcall GotNonCommandReply(unsigned int Reply);
   void __fastcall GotReply(unsigned int Reply, unsigned int Flags = 0,
     AnsiString Error = "", unsigned int * Code = NULL,
     TStrings ** Response = NULL);
   void __fastcall ResetReply();
-  void __fastcall HandleReplyStatus(const char * AStatus);
+  void __fastcall HandleReplyStatus(AnsiString Response);
   void __fastcall DoWaitForReply(unsigned int& ReplyToAwait);
 
   bool __fastcall HandleStatus(const char * Status, int Type);
@@ -163,8 +166,11 @@ protected:
     const AnsiString & RemoteFile, const AnsiString & RemotePath, bool Get,
     __int64 Size, int Type, TFileTransferData & UserData,
     TFileOperationProgressType * OperationProgress);
+  TDateTime __fastcall ConvertLocalTimestamp(time_t Time);
+  TDateTime __fastcall ConvertRemoteTimestamp(time_t Time, bool HasTime);
 
   static bool __fastcall Unquote(AnsiString & Str);
+  static AnsiString __fastcall ExtractStatusMessage(AnsiString Status);
 
 private:
   enum TCommand

+ 1 - 0
core/Interface.h

@@ -61,6 +61,7 @@ struct TQueryParams
   unsigned int TimerAnswers;
   unsigned int Timeout;
   unsigned int TimeoutAnswer;
+  unsigned int NoBatchAnswers;
   AnsiString HelpKeyword;
 };
 

+ 2 - 2
core/Queue.cpp

@@ -114,7 +114,7 @@ protected:
     Exception * E, void * Arg);
   void __fastcall OperationFinished(TFileOperation Operation, TOperationSide Side,
     bool Temp, const AnsiString & FileName, bool Success,
-    bool & DisconnectWhenFinished);
+    TOnceDoneOperation & OnceDoneOperation);
   void __fastcall OperationProgress(TFileOperationProgressType & ProgressData,
     TCancelStatus & Cancel);
 };
@@ -1202,7 +1202,7 @@ void __fastcall TTerminalItem::TerminalShowExtendedException(
 //---------------------------------------------------------------------------
 void __fastcall TTerminalItem::OperationFinished(TFileOperation /*Operation*/,
   TOperationSide /*Side*/, bool /*Temp*/, const AnsiString & /*FileName*/,
-  bool /*Success*/, bool & /*DisconnectWhenFinished*/)
+  bool /*Success*/, TOnceDoneOperation & /*OnceDoneOperation*/)
 {
   // nothing
 }

+ 12 - 4
core/RemoteFiles.cpp

@@ -328,7 +328,7 @@ AnsiString __fastcall MakeFileList(TStrings * FileList)
 }
 //---------------------------------------------------------------------------
 // copy from BaseUtils.pas
-void __fastcall ReduceDateTimePrecision(TDateTime & DateTime,
+TDateTime __fastcall ReduceDateTimePrecision(TDateTime DateTime,
   TModificationFmt Precision)
 {
   if (Precision == mfNone)
@@ -353,6 +353,7 @@ void __fastcall ReduceDateTimePrecision(TDateTime & DateTime,
         N = 0;
         S = 0;
         MS = 0;
+        break;
 
       default:
         assert(false);
@@ -360,6 +361,13 @@ void __fastcall ReduceDateTimePrecision(TDateTime & DateTime,
 
     DateTime = EncodeDate(Y, M, D) + EncodeTime(H, N, S, MS);
   }
+  return DateTime;
+}
+//---------------------------------------------------------------------------
+TModificationFmt __fastcall LessDateTimePrecision(
+  TModificationFmt Precision1, TModificationFmt Precision2)
+{
+  return (Precision1 < Precision2) ? Precision1 : Precision2;
 }
 //---------------------------------------------------------------------------
 AnsiString __fastcall UserModificationStr(TDateTime DateTime,
@@ -985,14 +993,14 @@ void __fastcall TRemoteFile::SetListingStr(AnsiString value)
     // so we get only first 9 characters and trim all following spaces (if any)
     Rights->Text = Line.SubString(1, 9);
     Line.Delete(1, 9);
-    // Rights column maybe followed by '+' or '@' signs, we ignore them
+    // Rights column maybe followed by '+', '@' or '.' signs, we ignore them
     // (On MacOS, there may be a space in between)
-    if (!Line.IsEmpty() && ((Line[1] == '+') || (Line[1] == '@')))
+    if (!Line.IsEmpty() && ((Line[1] == '+') || (Line[1] == '@') || (Line[1] == '.')))
     {
       Line.Delete(1, 1);
     }
     else if ((Line.Length() >= 2) && (Line[1] == ' ') &&
-             ((Line[2] == '+') || (Line[2] == '@')))
+             ((Line[2] == '+') || (Line[2] == '@') || (Line[2] == '.')))
     {
       Line.Delete(1, 2);
     }

+ 3 - 1
core/RemoteFiles.h

@@ -443,8 +443,10 @@ AnsiString __fastcall FromUnixPath(const AnsiString Path);
 AnsiString __fastcall ToUnixPath(const AnsiString Path);
 AnsiString __fastcall MinimizeName(const AnsiString FileName, int MaxLen, bool Unix);
 AnsiString __fastcall MakeFileList(TStrings * FileList);
-void __fastcall ReduceDateTimePrecision(TDateTime & DateTime,
+TDateTime __fastcall ReduceDateTimePrecision(TDateTime DateTime,
   TModificationFmt Precision);
+TModificationFmt __fastcall LessDateTimePrecision(
+  TModificationFmt Precision1, TModificationFmt Precision2);
 AnsiString __fastcall UserModificationStr(TDateTime DateTime,
   TModificationFmt Precision);
 int __fastcall FakeFileImageIndex(AnsiString FileName, unsigned long Attrs = 0,

+ 63 - 79
core/ScpFileSystem.cpp

@@ -1324,11 +1324,12 @@ void __fastcall TSCPFileSystem::SCPResponse(bool * GotLastLine)
 void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
   const AnsiString TargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   // scp.c: source(), toremote()
   assert(FilesToCopy && OperationProgress);
 
+  Params &= ~(cpAppend | cpResume);
   AnsiString Options = "";
   bool CheckExistence = UnixComparePaths(TargetDir, FTerminal->CurrentDirectory) &&
     (FTerminal->FFiles != NULL) && FTerminal->FFiles->Loaded;
@@ -1383,43 +1384,24 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
       if (CheckExistence)
       {
         // previously there was assertion on FTerminal->FFiles->Loaded, but it
-        // fails for scripting, is 'ls' is not issued before
+        // fails for scripting, if 'ls' is not issued before.
+        // formally we should call CheckRemoteFile here but as checking is for
+        // free here (almost) ...
         TRemoteFile * File = FTerminal->FFiles->FindFile(FileNameOnly);
-        if (File && OperationProgress->NoToAll)
-        {
-          CanProceed = false;
-        }
-        else if (File && !OperationProgress->YesToAll &&
-          FTerminal->Configuration->ConfirmOverwriting && !(Params & cpNoConfirmation))
+        if (File != NULL)
         {
           int Answer;
           if (File->IsDirectory)
           {
-            TQueryParams Params(qpNeverAskAgainCheck);
+            AnsiString Message = FMTLOAD(DIRECTORY_OVERWRITE, (FileNameOnly));
+            TQueryParams QueryParams(qpNeverAskAgainCheck);
             SUSPEND_OPERATION
             (
-              Answer = FTerminal->QueryUser(
-                FMTLOAD(DIRECTORY_OVERWRITE, (FileNameOnly)), NULL,
+              Answer = FTerminal->ConfirmFileOverwrite(
+                FileNameOnly /*not used*/, NULL,
                 qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll,
-                &Params);
+                &QueryParams, osRemote, Params, OperationProgress, Message);
             );
-            switch (Answer)
-            {
-              case qaNeverAskAgain:
-                FTerminal->Configuration->ConfirmOverwriting = false;
-                Answer = qaYes;
-                break;
-
-              case qaYesToAll:
-                OperationProgress->YesToAll = true;
-                Answer = qaYes;
-                break;
-
-              case qaNoToAll:
-                OperationProgress->NoToAll = true;
-                Answer = qaNo;
-                break;
-            }
           }
           else
           {
@@ -1436,18 +1418,20 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
             TQueryButtonAlias Aliases[1];
             Aliases[0].Button = qaAll;
             Aliases[0].Alias = LoadStr(YES_TO_NEWER_BUTTON);
-            TQueryParams Params(qpNeverAskAgainCheck);
-            Params.Aliases = Aliases;
-            Params.AliasesCount = LENOF(Aliases);
+            TQueryParams QueryParams(qpNeverAskAgainCheck);
+            QueryParams.Aliases = Aliases;
+            QueryParams.AliasesCount = LENOF(Aliases);
             SUSPEND_OPERATION
             (
               Answer = FTerminal->ConfirmFileOverwrite(
                 FileNameOnly, &FileParams,
                 qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll,
-                &Params, osRemote, OperationProgress);
+                &QueryParams, osRemote, Params, OperationProgress);
             );
           }
-          switch (Answer) {
+
+          switch (Answer)
+          {
             case qaYes:
               CanProceed = true;
               break;
@@ -1460,11 +1444,18 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
 
             default:
               assert(false);
+              break;
           }
         }
-          else CanProceed = true;
+        else
+        {
+          CanProceed = true;
+        }
+      }
+      else
+      {
+        CanProceed = true;
       }
-        else CanProceed = true;
 
       if (CanProceed)
       {
@@ -1483,7 +1474,7 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
         {
           SCPSource(FileName, TargetDirFull,
             CopyParam, Params, OperationProgress, 0);
-          OperationProgress->Finish(FileName, true, DisconnectWhenComplete);
+          OperationProgress->Finish(FileName, true, OnceDoneOperation);
         }
         catch (EScpFileSkipped &E)
         {
@@ -1494,13 +1485,13 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
             {
               OperationProgress->Cancel = csCancel;
             }
-            OperationProgress->Finish(FileName, false, DisconnectWhenComplete);
+            OperationProgress->Finish(FileName, false, OnceDoneOperation);
             if (!FTerminal->HandleException(&E)) throw;
           );
         }
         catch (EScpSkipFile &E)
         {
-          OperationProgress->Finish(FileName, false, DisconnectWhenComplete);
+          OperationProgress->Finish(FileName, false, OnceDoneOperation);
           // If ESkipFile occurs, just log it and continue with next file
           SUSPEND_OPERATION (
             if (!FTerminal->HandleException(&E)) throw;
@@ -1508,7 +1499,7 @@ void __fastcall TSCPFileSystem::CopyToRemote(TStrings * FilesToCopy,
         }
         catch (...)
         {
-          OperationProgress->Finish(FileName, false, DisconnectWhenComplete);
+          OperationProgress->Finish(FileName, false, OnceDoneOperation);
           throw;
         }
       }
@@ -1952,9 +1943,10 @@ void __fastcall TSCPFileSystem::SCPDirectorySource(const AnsiString DirectoryNam
 void __fastcall TSCPFileSystem::CopyToLocal(TStrings * FilesToCopy,
   const AnsiString TargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   bool CloseSCP = False;
+  Params &= ~(cpAppend | cpResume);
   AnsiString Options = "";
   if (CopyParam->PreserveRights || CopyParam->PreserveTime) Options = "-p";
   if (FTerminal->SessionData->Scp1Compatibility) Options += " -1";
@@ -2032,11 +2024,11 @@ void __fastcall TSCPFileSystem::CopyToLocal(TStrings * FilesToCopy,
         }
 
         OperationProgress->Finish(FileName,
-          (!OperationProgress->Cancel && Success), DisconnectWhenComplete);
+          (!OperationProgress->Cancel && Success), OnceDoneOperation);
       }
       catch (...)
       {
-        OperationProgress->Finish(FileName, false, DisconnectWhenComplete);
+        OperationProgress->Finish(FileName, false, OnceDoneOperation);
         CloseSCP = (OperationProgress->Cancel != csRemoteAbort);
         throw;
       }
@@ -2311,46 +2303,38 @@ void __fastcall TSCPFileSystem::SCPSink(const AnsiString TargetDir,
               {
                 if (FileExists(DestFileName))
                 {
+                  __int64 MTime;
+                  TOverwriteFileParams FileParams;
+                  FileParams.SourceSize = OperationProgress->TransferSize;
+                  FileParams.SourceTimestamp = SourceTimestamp;
+                  FTerminal->OpenLocalFile(DestFileName, GENERIC_READ,
+                    NULL, NULL, NULL, &MTime, NULL,
+                    &FileParams.DestSize);
+                  FileParams.DestTimestamp = UnixToDateTime(MTime,
+                    FTerminal->SessionData->DSTMode);
+
+                  TQueryButtonAlias Aliases[1];
+                  Aliases[0].Button = qaAll;
+                  Aliases[0].Alias = LoadStr(YES_TO_NEWER_BUTTON);
+                  TQueryParams QueryParams(qpNeverAskAgainCheck);
+                  QueryParams.Aliases = Aliases;
+                  QueryParams.AliasesCount = LENOF(Aliases);
+
                   int Answer;
-                  if (OperationProgress->NoToAll)
-                  {
-                    Answer = qaNo;
-                  }
-                  // if overwrite confirmation is required or
-                  // only newer files should be transfered, get both file timestamps
-                  else if (FLAGSET(Params, cpNewerOnly) ||
-                      (!OperationProgress->YesToAll &&
-                       FTerminal->Configuration->ConfirmOverwriting &&
-                       FLAGCLEAR(Params, cpNoConfirmation)))
-                  {
-                    __int64 MTime;
-                    TOverwriteFileParams FileParams;
-                    FileParams.SourceSize = OperationProgress->TransferSize;
-                    FileParams.SourceTimestamp = SourceTimestamp;
-                    FTerminal->OpenLocalFile(DestFileName, GENERIC_READ,
-                      NULL, NULL, NULL, &MTime, NULL,
-                      &FileParams.DestSize);
-                    FileParams.DestTimestamp = UnixToDateTime(MTime,
-                      FTerminal->SessionData->DSTMode);
-
-                    TQueryButtonAlias Aliases[1];
-                    Aliases[0].Button = qaAll;
-                    Aliases[0].Alias = LoadStr(YES_TO_NEWER_BUTTON);
-                    TQueryParams Params(qpNeverAskAgainCheck);
-                    Params.Aliases = Aliases;
-                    Params.AliasesCount = LENOF(Aliases);
-                    SUSPEND_OPERATION (
-                      Answer = FTerminal->ConfirmFileOverwrite(
-                        OperationProgress->FileName, &FileParams,
-                        qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll,
-                        &Params, osLocal, OperationProgress);
-                    );
-                  }
+                  SUSPEND_OPERATION (
+                    Answer = FTerminal->ConfirmFileOverwrite(
+                      OperationProgress->FileName, &FileParams,
+                      qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll,
+                      &QueryParams, osLocal, Params, OperationProgress);
+                  );
 
                   switch (Answer)
                   {
-                    case qaCancel: OperationProgress->Cancel = csCancel; // continue on next case
-                    case qaNo: SkipConfirmed = true; EXCEPTION;
+                    case qaCancel:
+                      OperationProgress->Cancel = csCancel; // continue on next case
+                    case qaNo:
+                      SkipConfirmed = true;
+                      EXCEPTION;
                   }
                 }
 

+ 2 - 2
core/ScpFileSystem.h

@@ -33,11 +33,11 @@ public:
   virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CreateDirectory(const AnsiString DirName);
   virtual void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
   virtual void __fastcall DeleteFile(const AnsiString FileName,

+ 87 - 36
core/Script.cpp

@@ -298,6 +298,7 @@ __fastcall TScript::TScript(bool LimitedOutput)
 {
   FLimitedOutput = LimitedOutput;
   FTerminal = NULL;
+  FSessionReopenTimeout = Configuration->SessionReopenTimeout;
 
   Init();
 }
@@ -337,14 +338,14 @@ void __fastcall TScript::Init()
   FCommands->Register("ln", SCRIPT_LN_DESC, SCRIPT_LN_HELP, &LnProc, 2, 2, false);
   FCommands->Register("symlink", 0, SCRIPT_LN_HELP, &LnProc, 2, 2, false);
   FCommands->Register("mkdir", SCRIPT_MKDIR_DESC, SCRIPT_MKDIR_HELP, &MkDirProc, 1, 1, false);
-  FCommands->Register("get", SCRIPT_GET_DESC, SCRIPT_GET_HELP2, &GetProc, 1, -1, true);
-  FCommands->Register("recv", 0, SCRIPT_GET_HELP2, &GetProc, 1, -1, false);
-  FCommands->Register("put", SCRIPT_PUT_DESC, SCRIPT_PUT_HELP2, &PutProc, 1, -1, true);
-  FCommands->Register("send", 0, SCRIPT_PUT_HELP2, &PutProc, 1, -1, false);
-  FCommands->Register("option", SCRIPT_OPTION_DESC, SCRIPT_OPTION_HELP5, &OptionProc, -1, 2, false);
-  FCommands->Register("ascii", 0, SCRIPT_OPTION_HELP5, &AsciiProc, 0, 0, false);
-  FCommands->Register("binary", 0, SCRIPT_OPTION_HELP5, &BinaryProc, 0, 0, false);
-  FCommands->Register("synchronize", SCRIPT_SYNCHRONIZE_DESC, SCRIPT_SYNCHRONIZE_HELP2, &SynchronizeProc, 1, 3, true);
+  FCommands->Register("get", SCRIPT_GET_DESC, SCRIPT_GET_HELP3, &GetProc, 1, -1, true);
+  FCommands->Register("recv", 0, SCRIPT_GET_HELP3, &GetProc, 1, -1, false);
+  FCommands->Register("put", SCRIPT_PUT_DESC, SCRIPT_PUT_HELP3, &PutProc, 1, -1, true);
+  FCommands->Register("send", 0, SCRIPT_PUT_HELP3, &PutProc, 1, -1, false);
+  FCommands->Register("option", SCRIPT_OPTION_DESC, SCRIPT_OPTION_HELP6, &OptionProc, -1, 2, false);
+  FCommands->Register("ascii", 0, SCRIPT_OPTION_HELP6, &AsciiProc, 0, 0, false);
+  FCommands->Register("binary", 0, SCRIPT_OPTION_HELP6, &BinaryProc, 0, 0, false);
+  FCommands->Register("synchronize", SCRIPT_SYNCHRONIZE_DESC, SCRIPT_SYNCHRONIZE_HELP3, &SynchronizeProc, 1, 3, true);
   FCommands->Register("keepuptodate", SCRIPT_KEEPUPTODATE_DESC, SCRIPT_KEEPUPTODATE_HELP2, &KeepUpToDateProc, 0, 2, true);
 }
 //---------------------------------------------------------------------------
@@ -374,7 +375,16 @@ void __fastcall TScript::Command(AnsiString Cmd)
       AnsiString Command;
       if (CutToken(Cmd, Command))
       {
-        FCommands->Execute(Command, Cmd);
+        int ASessionReopenTimeout = Configuration->SessionReopenTimeout;
+        try
+        {
+          Configuration->SessionReopenTimeout = FSessionReopenTimeout;
+          FCommands->Execute(Command, Cmd);
+        }
+        __finally
+        {
+          Configuration->SessionReopenTimeout = ASessionReopenTimeout;
+        }
       }
     }
   }
@@ -602,6 +612,25 @@ void __fastcall TScript::CheckParams(TScriptProcParams * Parameters)
   TScriptCommands::CheckParams(Parameters, false);
 }
 //---------------------------------------------------------------------------
+void __fastcall TScript::TransferParamParams(int & Params, TScriptProcParams * Parameters)
+{
+  Params |= FLAGMASK(!FConfirm, cpNoConfirmation);
+
+  if (Parameters->FindSwitch("delete"))
+  {
+    Params |= cpDelete;
+  }
+
+  if (Parameters->FindSwitch("resume"))
+  {
+    Params |= cpResume;
+  }
+  else if (Parameters->FindSwitch("append"))
+  {
+    Params |= cpAppend;
+  }
+}
+//---------------------------------------------------------------------------
 void __fastcall TScript::CopyParamParams(TCopyParamType & CopyParam, TScriptProcParams * Parameters)
 {
   AnsiString Value;
@@ -905,13 +934,8 @@ void __fastcall TScript::GetProc(TScriptProcParams * Parameters)
       CopyParam.FileMask = ExtractFileName(Target);
     }
 
-    int Params = FLAGMASK(!FConfirm, cpNoConfirmation);
-
-    if (Parameters->FindSwitch("delete"))
-    {
-      Params |= cpDelete;
-    }
-
+    int Params = 0;
+    TransferParamParams(Params, Parameters);
     CopyParamParams(CopyParam, Parameters);
     CheckParams(Parameters);
 
@@ -951,13 +975,8 @@ void __fastcall TScript::PutProc(TScriptProcParams * Parameters)
       CopyParam.FileMask = UnixExtractFileName(Target);
     }
 
-    int Params = FLAGMASK(!FConfirm, cpNoConfirmation);
-
-    if (Parameters->FindSwitch("delete"))
-    {
-      Params |= cpDelete;
-    }
-
+    int Params = 0;
+    TransferParamParams(Params, Parameters);
     CopyParamParams(CopyParam, Parameters);
     CheckParams(Parameters);
 
@@ -971,9 +990,9 @@ void __fastcall TScript::PutProc(TScriptProcParams * Parameters)
 //---------------------------------------------------------------------------
 void __fastcall TScript::OptionImpl(AnsiString OptionName, AnsiString ValueName)
 {
-  enum { Echo, Batch, Confirm, Transfer, SynchDelete, Exclude, Include };
+  enum { Echo, Batch, Confirm, Transfer, SynchDelete, Exclude, Include, ReconnectTime };
   static const char * Names[] = { "echo", "batch", "confirm", "transfer",
-    "synchdelete", "exclude", "include" };
+    "synchdelete", "exclude", "include", "reconnecttime" };
 
   enum { Off, On };
   static const char * ToggleNames[] = { "off", "on" };
@@ -999,7 +1018,7 @@ void __fastcall TScript::OptionImpl(AnsiString OptionName, AnsiString ValueName)
   }
 
   #define OPT(OPT) ((Option < 0) || (Option == OPT))
-  const char * ListFormat = "%-12s %-10s";
+  const char * ListFormat = "%-15s %-10s";
   bool SetValue = !ValueName.IsEmpty();
 
   if (OPT(Echo))
@@ -1118,6 +1137,37 @@ void __fastcall TScript::OptionImpl(AnsiString OptionName, AnsiString ValueName)
     }
   }
 
+  if (OPT(ReconnectTime))
+  {
+    if (SetValue)
+    {
+      int Value;
+      if (ValueName == ToggleNames[Off])
+      {
+        Value = 0;
+      }
+      else
+      {
+        Value = StrToInt(ValueName) * 1000;
+      }
+      if (Value < 0)
+      {
+        throw Exception(FMTLOAD(SCRIPT_VALUE_UNKNOWN, (ValueName, OptionName)));
+      }
+      FSessionReopenTimeout = Value;
+    }
+
+    if (FSessionReopenTimeout == 0)
+    {
+      ValueName = ToggleNames[Off];
+    }
+    else
+    {
+      ValueName = IntToStr(FSessionReopenTimeout / 1000);
+    }
+    PrintLine(FORMAT(ListFormat, (Names[ReconnectTime], ValueName)));
+  }
+
   #undef OPT
 }
 //---------------------------------------------------------------------------
@@ -1211,11 +1261,16 @@ void __fastcall TScript::SynchronizeProc(TScriptProcParams * Parameters)
     }
     if (Parameters->FindSwitch("criteria", Value))
     {
-      enum { Time, Size, Both };
-      static const char * CriteriaNames[] = { "time", "size", "both" };
+      enum { None, Time, Size, Both };
+      static const char * CriteriaNames[] = { "none", "time", "size", "both" };
       int Criteria = TScriptCommands::FindCommand(CriteriaNames, LENOF(CriteriaNames), Value);
       switch (Criteria)
       {
+        case None:
+          SynchronizeParams |= TTerminal::spNotByTime;
+          SynchronizeParams &= ~TTerminal::spBySize;
+          break;
+
         case Time:
           SynchronizeParams &= ~(TTerminal::spNotByTime | TTerminal::spBySize);
           break;
@@ -1232,14 +1287,10 @@ void __fastcall TScript::SynchronizeProc(TScriptProcParams * Parameters)
     }
 
     // enforce rules
-    if (FSynchronizeMode == TTerminal::smBoth)
+    if (FSynchronizeMode  == TTerminal::smBoth)
     {
       SynchronizeParams &= ~(TTerminal::spNotByTime | TTerminal::spBySize);
     }
-    if (FLAGSET(SynchronizeParams, TTerminal::spMirror))
-    {
-      SynchronizeParams &= ~TTerminal::spNotByTime;
-    }
 
     CheckParams(Parameters);
 
@@ -1465,10 +1516,10 @@ bool __fastcall TManagementScript::QueryCancel()
 }
 //---------------------------------------------------------------------------
 void __fastcall TManagementScript::TerminalInformation(TTerminal * Terminal,
-  const AnsiString & Str, bool /*Status*/, bool /*Active*/)
+  const AnsiString & Str, bool /*Status*/, bool Active)
 {
   assert(Terminal != NULL);
-  if (Terminal->Status == ssOpening)
+  if (Active && (Terminal->Status == ssOpening))
   {
     PrintLine(Str);
   }
@@ -1576,7 +1627,7 @@ void __fastcall TManagementScript::TerminalOperationProgress(
 void __fastcall TManagementScript::TerminalOperationFinished(
   TFileOperation Operation, TOperationSide /*Side*/,
   bool /*Temp*/, const AnsiString & FileName, Boolean Success,
-  bool & /*DisconnectWhenComplete*/)
+  TOnceDoneOperation & /*OnceDoneOperation*/)
 {
   assert(Operation != foCalculateSize);
 

+ 3 - 1
core/Script.h

@@ -68,6 +68,7 @@ protected:
   bool FKeepingUpToDate;
   AnsiString FSynchronizeIntro;
   bool FLimitedOutput;
+  int FSessionReopenTimeout;
 
   virtual void __fastcall ResetTransfer();
   virtual void __fastcall ConnectTerminal(TTerminal * Terminal);
@@ -77,6 +78,7 @@ protected:
   void __fastcall CheckSession();
   void __fastcall CheckParams(TScriptProcParams * Parameters);
   void __fastcall CopyParamParams(TCopyParamType & CopyParam, TScriptProcParams * Parameters);
+  void __fastcall TransferParamParams(int & Params, TScriptProcParams * Parameters);
   enum TFileListType
   {
     fltDefault =     0x00,
@@ -162,7 +164,7 @@ protected:
     TCancelStatus & Cancel);
   void __fastcall TerminalOperationFinished(TFileOperation Operation, TOperationSide Side,
     bool Temp, const AnsiString & FileName, Boolean Success,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
 
   void __fastcall PrintActiveSession();
   TTerminal * __fastcall FindSession(const AnsiString Index);

+ 1 - 0
core/SecureShell.cpp

@@ -1777,6 +1777,7 @@ void __fastcall TSecureShell::VerifyHostKey(AnsiString Host, int Port,
       }
 
       TQueryParams Params;
+      Params.NoBatchAnswers = qaYes | qaRetry | qaSkip | qaOK;
       Params.HelpKeyword = (Unknown ? HELP_UNKNOWN_KEY : HELP_DIFFERENT_KEY);
       Params.Aliases = Aliases;
       Params.AliasesCount = AliasesCount;

+ 66 - 1
core/SessionData.cpp

@@ -29,6 +29,7 @@ const TKex DefaultKexList[KEX_COUNT] =
 const char FSProtocolNames[FSPROTOCOL_COUNT][11] = { "SCP", "SFTP (SCP)", "SFTP", "", "", "FTP" };
 const int SshPortNumber = 22;
 const int FtpPortNumber = 21;
+const int FtpsImplicitPortNumber = 990;
 //---------------------------------------------------------------------
 TDateTime __fastcall SecToDateTime(int Sec)
 {
@@ -49,6 +50,7 @@ void __fastcall TSessionData::Default()
   PortNumber = SshPortNumber;
   UserName = "";
   Password = "";
+  Passwordless = false;
   PingInterval = 30;
   // when changing default, update load/save logic
   PingType = ptOff;
@@ -186,6 +188,7 @@ void __fastcall TSessionData::Assign(TPersistent * Source)
     DUPL(PortNumber);
     DUPL(UserName);
     DUPL(Password);
+    DUPL(Passwordless);
     DUPL(PingInterval);
     DUPL(PingType);
     DUPL(Timeout);
@@ -323,6 +326,7 @@ void __fastcall TSessionData::Load(THierarchicalStorage * Storage)
         FPassword = Storage->ReadString("Password", FPassword);
       }
     }
+    Passwordless = Storage->ReadBool("Passwordless", Passwordless);
     // Putty uses PingIntervalSecs
     int PingIntervalSecs = Storage->ReadInteger("PingIntervalSecs", -1);
     if (PingIntervalSecs < 0)
@@ -573,6 +577,7 @@ void __fastcall TSessionData::Save(THierarchicalStorage * Storage,
       Storage->DeleteValue("Password");
     }
     Storage->DeleteValue("PasswordPlain");
+    WRITE_DATA(Bool, Passwordless);
     WRITE_DATA_EX(Integer, "PingInterval", PingInterval / 60, );
     WRITE_DATA_EX(Integer, "PingIntervalSecs", PingInterval % 60, );
     Storage->DeleteValue("PingIntervalSec"); // obsolete
@@ -824,8 +829,10 @@ bool __fastcall TSessionData::ParseUrl(AnsiString Url, TOptions * Options,
   bool * AProtocolDefined)
 {
   bool ProtocolDefined = false;
+  bool PortNumberDefined = false;
   TFSProtocol AFSProtocol;
   int APortNumber;
+  TFtps AFtps = ftpsNone;
   if (Url.SubString(1, 4).LowerCase() == "scp:")
   {
     AFSProtocol = fsSCPonly;
@@ -843,10 +850,27 @@ bool __fastcall TSessionData::ParseUrl(AnsiString Url, TOptions * Options,
   else if (Url.SubString(1, 4).LowerCase() == "ftp:")
   {
     AFSProtocol = fsFTP;
+    Ftps = ftpsNone;
     APortNumber = FtpPortNumber;
     Url.Delete(1, 4);
     ProtocolDefined = true;
   }
+  else if (Url.SubString(1, 5).LowerCase() == "ftps:")
+  {
+    AFSProtocol = fsFTP;
+    AFtps = ftpsImplicit;
+    // adjust default port number to default Ftps mode
+    if (AFtps == ftpsImplicit)
+    {
+      APortNumber = FtpsImplicitPortNumber;
+    }
+    else
+    {
+      APortNumber = FtpPortNumber;
+    }
+    Url.Delete(1, 5);
+    ProtocolDefined = true;
+  }
 
   if (ProtocolDefined && (Url.SubString(1, 2) == "//"))
   {
@@ -932,14 +956,18 @@ bool __fastcall TSessionData::ParseUrl(AnsiString Url, TOptions * Options,
       if (!HostInfo.IsEmpty())
       {
         PortNumber = StrToIntDef(DecodeUrlChars(HostInfo), -1);
+        PortNumberDefined = true;
       }
       else if (ProtocolDefined)
       {
         PortNumber = APortNumber;
+        Ftps = AFtps;
       }
 
+      bool PasswordSeparator = (UserInfo.Pos(':') != 0);
       UserName = DecodeUrlChars(CutToChar(UserInfo, ':', false));
       Password = DecodeUrlChars(UserInfo);
+      Passwordless = Password.IsEmpty() && PasswordSeparator;
 
       ARemoteDirectory = Url.SubString(PSlash, Url.Length() - PSlash + 1);
     }
@@ -983,7 +1011,8 @@ bool __fastcall TSessionData::ParseUrl(AnsiString Url, TOptions * Options,
     {
       Timeout = StrToInt(Value);
     }
-    if (Options->FindSwitch("hostkey", Value))
+    if (Options->FindSwitch("hostkey", Value) ||
+        Options->FindSwitch("certificate", Value))
     {
       HostKey = Value;
     }
@@ -991,6 +1020,33 @@ bool __fastcall TSessionData::ParseUrl(AnsiString Url, TOptions * Options,
     {
       FtpPasvMode = (StrToIntDef(Value, 1) != 0);
     }
+    if (Options->FindSwitch("implicit", Value))
+    {
+      bool Enabled = (StrToIntDef(Value, 1) != 0);
+      Ftps = Enabled ? ftpsImplicit : ftpsNone;
+      if (!PortNumberDefined && Enabled)
+      {
+        PortNumber = FtpsImplicitPortNumber;
+      }
+    }
+    if (Options->FindSwitch("explicitssl", Value))
+    {
+      bool Enabled = (StrToIntDef(Value, 1) != 0);
+      Ftps = Enabled ? ftpsExplicitSsl : ftpsNone;
+      if (!PortNumberDefined && Enabled)
+      {
+        PortNumber = FtpPortNumber;
+      }
+    }
+    if (Options->FindSwitch("explicittls", Value))
+    {
+      bool Enabled = (StrToIntDef(Value, 1) != 0);
+      Ftps = Enabled ? ftpsExplicitTls : ftpsNone;
+      if (!PortNumberDefined && Enabled)
+      {
+        PortNumber = FtpPortNumber;
+      }
+    }
   }
 
   return true;
@@ -1130,6 +1186,10 @@ void __fastcall TSessionData::SetUserName(AnsiString value)
 //---------------------------------------------------------------------
 void __fastcall TSessionData::SetPassword(AnsiString value)
 {
+  if (!value.IsEmpty())
+  {
+    Passwordless = false;
+  }
   value = EncryptPassword(value, UserName+HostName);
   SET_SESSION_PROPERTY(Password);
 }
@@ -1139,6 +1199,11 @@ AnsiString __fastcall TSessionData::GetPassword()
   return DecryptPassword(FPassword, UserName+HostName);
 }
 //---------------------------------------------------------------------
+void __fastcall TSessionData::SetPasswordless(bool value)
+{
+  SET_SESSION_PROPERTY(Passwordless);
+}
+//---------------------------------------------------------------------
 void __fastcall TSessionData::SetPingInterval(int value)
 {
   SET_SESSION_PROPERTY(PingInterval);

+ 3 - 0
core/SessionData.h

@@ -50,6 +50,7 @@ private:
   int FPortNumber;
   AnsiString FUserName;
   AnsiString FPassword;
+  bool FPasswordless;
   int FPingInterval;
   TPingType FPingType;
   bool FTryAgent;
@@ -148,6 +149,7 @@ private:
   void __fastcall SetUserName(AnsiString value);
   void __fastcall SetPassword(AnsiString value);
   AnsiString __fastcall GetPassword();
+  void __fastcall SetPasswordless(bool value);
   void __fastcall SetPingInterval(int value);
   void __fastcall SetTryAgent(bool value);
   void __fastcall SetAgentFwd(bool value);
@@ -291,6 +293,7 @@ public:
   __property int PortNumber  = { read=FPortNumber, write=SetPortNumber };
   __property AnsiString UserName  = { read=FUserName, write=SetUserName };
   __property AnsiString Password  = { read=GetPassword, write=SetPassword };
+  __property bool Passwordless = { read=FPasswordless, write=SetPasswordless };
   __property int PingInterval  = { read=FPingInterval, write=SetPingInterval };
   __property bool TryAgent  = { read=FTryAgent, write=SetTryAgent };
   __property bool AgentFwd  = { read=FAgentFwd, write=SetAgentFwd };

+ 6 - 4
core/SessionInfo.cpp

@@ -682,7 +682,7 @@ void __fastcall TSessionLog::Add(TLogLineType Type, const AnsiString & Line)
       catch (Exception &E)
       {
         AddException(&E);
-        FUI->ShowExtendedException(&E);
+        FUI->HandleExtendedException(&E);
       }
     }
   }
@@ -729,8 +729,9 @@ void __fastcall TSessionLog::ReflectSettings()
   }
 
   // if logging to file was turned off or log file was change -> close current log file
+  // but disallow changing logfilename for xml logging
   if ((FFile != NULL) &&
-      (!LogToFile() || (FCurrentLogFileName != FConfiguration->LogFileName)))
+      ((!LogToFile() || (FCurrentLogFileName != FConfiguration->LogFileName)) && !FLoggingActions))
   {
     CloseLogFile();
   }
@@ -809,7 +810,8 @@ void TSessionLog::OpenLogFile()
         Index += Replacement.Length() - 1;
       }
     }
-    FFile = fopen(NewFileName.c_str(), (FConfiguration->LogFileAppend ? "a" : "w"));
+    FFile = fopen(NewFileName.c_str(),
+      (FConfiguration->LogFileAppend && !FLoggingActions ? "a" : "w"));
     if (FFile)
     {
       setvbuf((FILE *)FFile, NULL, _IONBF, BUFSIZ);
@@ -833,7 +835,7 @@ void TSessionLog::OpenLogFile()
     catch (Exception & E)
     {
       AddException(&E);
-      FUI->ShowExtendedException(&E);
+      FUI->HandleExtendedException(&E);
     }
   }
   StateChange();

+ 1 - 1
core/SessionInfo.h

@@ -61,7 +61,7 @@ public:
     TStrings * Results) = 0;
   virtual void __fastcall DisplayBanner(const AnsiString & Banner) = 0;
   virtual void __fastcall FatalError(Exception * E, AnsiString Msg) = 0;
-  virtual void __fastcall ShowExtendedException(Exception * E) = 0;
+  virtual void __fastcall HandleExtendedException(Exception * E) = 0;
   virtual void __fastcall Closed() = 0;
 };
 //---------------------------------------------------------------------------

+ 349 - 303
core/SftpFileSystem.cpp

@@ -992,32 +992,22 @@ public:
 
   __fastcall ~TSFTPQueue()
   {
-    try
-    {
-      if (FFileSystem->FTerminal->Active)
-      {
-        Dispose();
-      }
-    }
-    __finally
-    {
-      TSFTPQueuePacket * Request;
-      TSFTPPacket * Response;
+    TSFTPQueuePacket * Request;
+    TSFTPPacket * Response;
 
-      assert(FResponses->Count == FRequests->Count);
-      for (int Index = 0; Index < FRequests->Count; Index++)
-      {
-        Request = static_cast<TSFTPQueuePacket*>(FRequests->Items[Index]);
-        assert(Request);
-        delete Request;
+    assert(FResponses->Count == FRequests->Count);
+    for (int Index = 0; Index < FRequests->Count; Index++)
+    {
+      Request = static_cast<TSFTPQueuePacket*>(FRequests->Items[Index]);
+      assert(Request);
+      delete Request;
 
-        Response = static_cast<TSFTPPacket*>(FResponses->Items[Index]);
-        assert(Response);
-        delete Response;
-      }
-      delete FRequests;
-      delete FResponses;
+      Response = static_cast<TSFTPPacket*>(FResponses->Items[Index]);
+      assert(Response);
+      delete Response;
     }
+    delete FRequests;
+    delete FResponses;
   }
 
   bool __fastcall Init()
@@ -1025,7 +1015,7 @@ public:
     return SendRequests();
   }
 
-  void __fastcall Dispose()
+  virtual void __fastcall Dispose()
   {
     assert(FFileSystem->FTerminal->Active);
 
@@ -1067,6 +1057,14 @@ public:
     }
   }
 
+  void __fastcall DisposeSafe()
+  {
+    if (FFileSystem->FTerminal->Active)
+    {
+      Dispose();
+    }
+  }
+
   bool __fastcall ReceivePacket(TSFTPPacket * Packet,
     int ExpectedType = -1, int AllowStatus = -1, void ** Token = NULL)
   {
@@ -1216,11 +1214,20 @@ public:
   __fastcall TSFTPAsynchronousQueue(TSFTPFileSystem * AFileSystem) : TSFTPQueue(AFileSystem)
   {
     FFileSystem->FSecureShell->RegisterReceiveHandler(ReceiveHandler);
+    FReceiveHandlerRegistered = true;
   }
 
   virtual __fastcall ~TSFTPAsynchronousQueue()
   {
-    FFileSystem->FSecureShell->UnregisterReceiveHandler(ReceiveHandler);
+    UnregisterReceiveHandler();
+  }
+
+  virtual void __fastcall Dispose()
+  {
+    // we do not want to receive asynchronous notifications anymore,
+    // while waiting synchronously for pending responses
+    UnregisterReceiveHandler();
+    TSFTPQueue::Dispose();
   }
 
   bool __fastcall Continue()
@@ -1247,6 +1254,18 @@ protected:
     // noop
     return true;
   }
+
+  void __fastcall UnregisterReceiveHandler()
+  {
+    if (FReceiveHandlerRegistered)
+    {
+      FReceiveHandlerRegistered = false;
+      FFileSystem->FSecureShell->UnregisterReceiveHandler(ReceiveHandler);
+    }
+  }
+
+private:
+  bool FReceiveHandlerRegistered;
 };
 //---------------------------------------------------------------------------
 class TSFTPDownloadQueue : public TSFTPFixedLenQueue
@@ -1374,6 +1393,12 @@ protected:
             PrevBufSize + BlockBuf.Size);
         }
 
+        if (FFileSystem->FTerminal->Configuration->LogProtocol >= 1)
+        {
+          FFileSystem->FTerminal->LogEvent(FORMAT("Write request offset: %d, len: %d",
+            (int(FTransfered), int(BlockBuf.Size))));
+        }
+
         Request->ChangeType(SSH_FXP_WRITE);
         Request->AddString(FHandle);
         Request->AddInt64(FTransfered);
@@ -2980,10 +3005,13 @@ void __fastcall TSFTPFileSystem::ReadDirectory(TRemoteFileList * FileList)
               FTerminal->LogEvent(FORMAT("Read file '%s' from listing", (File->FileName)));
             }
             FileList->AddFile(File);
-
-            Total++;
           }
 
+          // Even if all files are ignored, do not treat listing as empty.
+          // Also, if the first file is ignored, we would call DoReadDirectoryProgress
+          // twice with 0, what may confuse handler, which uses 0 as indication of start.
+          Total++;
+
           if (Total % 10 == 0)
           {
             FTerminal->DoReadDirectoryProgress(Total, isEOF);
@@ -3354,11 +3382,10 @@ bool __fastcall TSFTPFileSystem::LoadFilesProperties(TStrings * FileList)
 
     FTerminal->FOperationProgress = &Progress;
 
+    static int LoadFilesPropertiesQueueLen = 5;
+    TSFTPLoadFilesPropertiesQueue Queue(this);
     try
     {
-      static int LoadFilesPropertiesQueueLen = 5;
-      // at end of this block queue is disposed
-      TSFTPLoadFilesPropertiesQueue Queue(this);
       if (Queue.Init(LoadFilesPropertiesQueueLen, FileList))
       {
         TRemoteFile * File;
@@ -3374,8 +3401,8 @@ bool __fastcall TSFTPFileSystem::LoadFilesProperties(TStrings * FileList)
             assert(File != NULL);
             LoadFile(File, &Packet);
             Result = true;
-            bool DisconnectWhenComplete;
-            Progress.Finish(File->FileName, true, DisconnectWhenComplete);
+            TOnceDoneOperation OnceDoneOperation;
+            Progress.Finish(File->FileName, true, OnceDoneOperation);
           }
 
           if (Progress.Cancel != csContinue)
@@ -3388,9 +3415,11 @@ bool __fastcall TSFTPFileSystem::LoadFilesProperties(TStrings * FileList)
     }
     __finally
     {
+      Queue.DisposeSafe();
       FTerminal->FOperationProgress = NULL;
       Progress.Stop();
     }
+    // queue is discarded here
   }
 
   return Result;
@@ -3401,7 +3430,7 @@ void __fastcall TSFTPFileSystem::DoCalculateFilesChecksum(const AnsiString & Alg
   TCalculatedChecksumEvent OnCalculatedChecksum,
   TFileOperationProgressType * OperationProgress, bool FirstLevel)
 {
-  bool DisconnectWhenComplete; // not used
+  TOnceDoneOperation OnceDoneOperation; // not used
 
   // recurse into subdirectories only if we have callback function
   if (OnCalculatedChecksum != NULL)
@@ -3445,7 +3474,7 @@ void __fastcall TSFTPFileSystem::DoCalculateFilesChecksum(const AnsiString & Alg
 
             if (FirstLevel)
             {
-              OperationProgress->Finish(File->FileName, Success, DisconnectWhenComplete);
+              OperationProgress->Finish(File->FileName, Success, OnceDoneOperation);
             }
           }
         }
@@ -3454,62 +3483,69 @@ void __fastcall TSFTPFileSystem::DoCalculateFilesChecksum(const AnsiString & Alg
   }
 
   static int CalculateFilesChecksumQueueLen = 5;
-  // at end of this block queue is disposed
   TSFTPCalculateFilesChecksumQueue Queue(this);
-  if (Queue.Init(CalculateFilesChecksumQueueLen, Alg, FileList))
+  try
   {
-    TSFTPPacket Packet;
-    bool Next;
-    do
+    if (Queue.Init(CalculateFilesChecksumQueueLen, Alg, FileList))
     {
-      bool Success = false;
-      AnsiString Alg;
-      AnsiString Checksum;
-      TRemoteFile * File = NULL;
-
-      try
+      TSFTPPacket Packet;
+      bool Next;
+      do
       {
+        bool Success = false;
+        AnsiString Alg;
+        AnsiString Checksum;
+        TRemoteFile * File = NULL;
+
         try
         {
-          Next = Queue.ReceivePacket(&Packet, File);
-          assert(Packet.Type == SSH_FXP_EXTENDED_REPLY);
+          try
+          {
+            Next = Queue.ReceivePacket(&Packet, File);
+            assert(Packet.Type == SSH_FXP_EXTENDED_REPLY);
 
-          OperationProgress->SetFile(File->FileName);
+            OperationProgress->SetFile(File->FileName);
 
-          Alg = Packet.GetString();
-          Checksum = StrToHex(AnsiString(Packet.GetNextData(Packet.RemainingLength), Packet.RemainingLength));
-          OnCalculatedChecksum(File->FileName, Alg, Checksum);
+            Alg = Packet.GetString();
+            Checksum = StrToHex(AnsiString(Packet.GetNextData(Packet.RemainingLength), Packet.RemainingLength));
+            OnCalculatedChecksum(File->FileName, Alg, Checksum);
 
-          Success = true;
+            Success = true;
+          }
+          catch (Exception & E)
+          {
+            FTerminal->CommandError(&E, FMTLOAD(CHECKSUM_ERROR,
+              (File != NULL ? File->FullFileName : AnsiString(""))));
+            // TODO: retries? resume?
+            Next = false;
+          }
+
+          if (Checksums != NULL)
+          {
+            Checksums->Add("");
+          }
         }
-        catch (Exception & E)
+        __finally
         {
-          FTerminal->CommandError(&E, FMTLOAD(CHECKSUM_ERROR,
-            (File != NULL ? File->FullFileName : AnsiString(""))));
-          // TODO: retries? resume?
-          Next = false;
+          if (FirstLevel)
+          {
+            OperationProgress->Finish(File->FileName, Success, OnceDoneOperation);
+          }
         }
 
-        if (Checksums != NULL)
-        {
-          Checksums->Add("");
-        }
-      }
-      __finally
-      {
-        if (FirstLevel)
+        if (OperationProgress->Cancel != csContinue)
         {
-          OperationProgress->Finish(File->FileName, Success, DisconnectWhenComplete);
+          Next = false;
         }
       }
-
-      if (OperationProgress->Cancel != csContinue)
-      {
-        Next = false;
-      }
+      while (Next);
     }
-    while (Next);
   }
+  __finally
+  {
+    Queue.DisposeSafe();
+  }
+  // queue is discarded here
 }
 //---------------------------------------------------------------------------
 void __fastcall TSFTPFileSystem::CalculateFilesChecksum(const AnsiString & Alg,
@@ -3575,7 +3611,7 @@ void __fastcall TSFTPFileSystem::SpaceAvailable(const AnsiString Path,
 void __fastcall TSFTPFileSystem::CopyToRemote(TStrings * FilesToCopy,
   const AnsiString TargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   assert(FilesToCopy && OperationProgress);
 
@@ -3621,114 +3657,92 @@ void __fastcall TSFTPFileSystem::CopyToRemote(TStrings * FilesToCopy,
     __finally
     {
       FAvoidBusy = false;
-      OperationProgress->Finish(FileName, Success, DisconnectWhenComplete);
+      OperationProgress->Finish(FileName, Success, OnceDoneOperation);
     }
     Index++;
   }
 }
 //---------------------------------------------------------------------------
 void __fastcall TSFTPFileSystem::SFTPConfirmOverwrite(AnsiString & FileName,
-  TFileOperationProgressType * OperationProgress,
+  int Params, TFileOperationProgressType * OperationProgress,
   TSFTPOverwriteMode & OverwriteMode, const TOverwriteFileParams * FileParams)
 {
-  bool TargetSmallerThanSource = (FileParams->DestSize < FileParams->SourceSize);
-  bool CanAlternateResume = TargetSmallerThanSource && !OperationProgress->AsciiTransfer;
-  if (OperationProgress->NoToAll)
-  {
-    THROW_SKIP_FILE_NULL;
-  }
-  else if (CanAlternateResume && OperationProgress->AlternateResumeAlways)
-  {
-    OverwriteMode = omResume;
-  }
-  else
-  {
-    int Answer;
-    SUSPEND_OPERATION
-    (
-      int Answers = qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll | qaIgnore;
-      if ((FVersion < 4) || !OperationProgress->AsciiTransfer)
-      {
-        Answers |= qaRetry;
-      }
-      TQueryButtonAlias Aliases[3];
-      Aliases[0].Button = qaRetry;
-      Aliases[0].Alias = LoadStr(APPEND_BUTTON);
-      Aliases[1].Button = qaAll;
-      Aliases[1].Alias = LoadStr(YES_TO_NEWER_BUTTON);
-      Aliases[2].Button = qaIgnore;
-      Aliases[2].Alias = LoadStr(RENAME_BUTTON);
-      TQueryParams Params(qpNeverAskAgainCheck);
-      Params.Aliases = Aliases;
-      Params.AliasesCount = LENOF(Aliases);
-      Answer = FTerminal->ConfirmFileOverwrite(FileName, FileParams,
-        Answers, &Params,
-        OperationProgress->Side == osLocal ? osRemote : osLocal,
-        OperationProgress);
-    );
+  bool CanAppend = (FVersion < 4) || !OperationProgress->AsciiTransfer;
+  int Answer;
+  SUSPEND_OPERATION
+  (
+    int Answers = qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll | qaAll | qaIgnore;
+
+    // possibly we can allow alternate resume at least in some cases
+    if (CanAppend)
+    {
+      Answers |= qaRetry;
+    }
+    TQueryButtonAlias Aliases[3];
+    Aliases[0].Button = qaRetry;
+    Aliases[0].Alias = LoadStr(APPEND_BUTTON);
+    Aliases[1].Button = qaAll;
+    Aliases[1].Alias = LoadStr(YES_TO_NEWER_BUTTON);
+    Aliases[2].Button = qaIgnore;
+    Aliases[2].Alias = LoadStr(RENAME_BUTTON);
+    TQueryParams QueryParams(qpNeverAskAgainCheck);
+    QueryParams.NoBatchAnswers = qaIgnore | qaRetry | qaAll;
+    QueryParams.Aliases = Aliases;
+    QueryParams.AliasesCount = LENOF(Aliases);
+    Answer = FTerminal->ConfirmFileOverwrite(FileName, FileParams,
+      Answers, &QueryParams,
+      OperationProgress->Side == osLocal ? osRemote : osLocal,
+      Params, OperationProgress);
+  );
 
-    if (Answer == qaRetry)
+  if (CanAppend &&
+      ((Answer == qaRetry) || (Answer == qaSkip)))
+  {
+    // duplicated in TTerminal::ConfirmFileOverwrite
+    bool CanAlternateResume =
+      (FileParams->DestSize < FileParams->SourceSize) && !OperationProgress->AsciiTransfer;
+    TBatchOverwrite BatchOverwrite =
+      FTerminal->EffectiveBatchOverwrite(Params, OperationProgress, true);
+    // when mode is forced by batch, never query user
+    if (BatchOverwrite == boAppend)
     {
-      if (!CanAlternateResume)
-      {
-        OverwriteMode = omAppend;
-      }
-      else
-      {
-        TQueryParams Params(0, HELP_APPEND_OR_RESUME);
-        SUSPEND_OPERATION
-        (
-          Answer = FTerminal->QueryUser(FORMAT(LoadStr(APPEND_OR_RESUME), (FileName)),
-            NULL, qaYes | qaNo | qaNoToAll | qaCancel, &Params);
-        );
-
-        switch (Answer)
-        {
-          case qaYes:
-            OverwriteMode = omAppend;
-            break;
-
-          case qaNo:
-            OverwriteMode = omResume;
-            break;
-
-          case qaNoToAll:
-            OverwriteMode = omResume;
-            OperationProgress->AlternateResumeAlways = true;
-            break;
-
-          default: assert(false); //fallthru
-          case qaCancel:
-            if (!OperationProgress->Cancel)
-            {
-              OperationProgress->Cancel = csCancel;
-            }
-            Abort();
-            break;
-        }
-      }
+      OverwriteMode = omAppend;
     }
-    else if (Answer == qaIgnore)
+    else if (CanAlternateResume &&
+             ((BatchOverwrite == boResume) || (BatchOverwrite == boAlternateResume)))
     {
-      if (FTerminal->PromptUser(FTerminal->SessionData, pkPrompt, LoadStr(RENAME_TITLE), "",
-            LoadStr(RENAME_PROMPT2), true, 0, FileName))
-      {
-        OverwriteMode = omOverwrite;
-      }
-      else
-      {
-        if (!OperationProgress->Cancel)
-        {
-          OperationProgress->Cancel = csCancel;
-        }
-        Abort();
-      }
+      OverwriteMode = omResume;
+    }
+    // no other option, but append
+    else if (!CanAlternateResume)
+    {
+      OverwriteMode = omAppend;
     }
     else
     {
-      OverwriteMode = omOverwrite;
+      TQueryParams Params(0, HELP_APPEND_OR_RESUME);
+      SUSPEND_OPERATION
+      (
+        Answer = FTerminal->QueryUser(FORMAT(LoadStr(APPEND_OR_RESUME), (FileName)),
+          NULL, qaYes | qaNo | qaNoToAll | qaCancel, &Params);
+      );
+
       switch (Answer)
       {
+        case qaYes:
+          OverwriteMode = omAppend;
+          break;
+
+        case qaNo:
+          OverwriteMode = omResume;
+          break;
+
+        case qaNoToAll:
+          OverwriteMode = omResume;
+          OperationProgress->BatchOverwrite = boAlternateResume;
+          break;
+
+        default: assert(false); //fallthru
         case qaCancel:
           if (!OperationProgress->Cancel)
           {
@@ -3736,12 +3750,42 @@ void __fastcall TSFTPFileSystem::SFTPConfirmOverwrite(AnsiString & FileName,
           }
           Abort();
           break;
-
-        case qaNo:
-          THROW_SKIP_FILE_NULL;
       }
     }
   }
+  else if (Answer == qaIgnore)
+  {
+    if (FTerminal->PromptUser(FTerminal->SessionData, pkPrompt, LoadStr(RENAME_TITLE), "",
+          LoadStr(RENAME_PROMPT2), true, 0, FileName))
+    {
+      OverwriteMode = omOverwrite;
+    }
+    else
+    {
+      if (!OperationProgress->Cancel)
+      {
+        OperationProgress->Cancel = csCancel;
+      }
+      Abort();
+    }
+  }
+  else
+  {
+    OverwriteMode = omOverwrite;
+    switch (Answer)
+    {
+      case qaCancel:
+        if (!OperationProgress->Cancel)
+        {
+          OperationProgress->Cancel = csCancel;
+        }
+        Abort();
+        break;
+
+      case qaNo:
+        THROW_SKIP_FILE_NULL;
+    }
+  }
 }
 //---------------------------------------------------------------------------
 bool TSFTPFileSystem::SFTPConfirmResume(const AnsiString DestFileName,
@@ -3985,7 +4029,8 @@ void __fastcall TSFTPFileSystem::SFTPSource(const AnsiString FileName,
               File = NULL;
 
               bool PartialBiggerThanSource = (ResumeOffset > OperationProgress->LocalSize);
-              if (FLAGCLEAR(Params, cpNoConfirmation))
+              if (FLAGCLEAR(Params, cpNoConfirmation) &&
+                  FLAGCLEAR(Params, cpResume))
               {
                 ResumeTransfer = SFTPConfirmResume(DestFileName,
                   PartialBiggerThanSource, OperationProgress);
@@ -4006,23 +4051,17 @@ void __fastcall TSFTPFileSystem::SFTPSource(const AnsiString FileName,
             }
             else
             {
-              // partial upload file does not exists, check for full file
-              if (DestFileExists &&
-                  (FLAGSET(Params, cpNewerOnly) ||
-                   (FTerminal->Configuration->ConfirmOverwriting &&
-                    !OperationProgress->YesToAll && FLAGCLEAR(Params, cpNoConfirmation))))
+              // partial upload file does not exists, full file does, confirm overwrite
+              AnsiString PrevDestFileName = DestFileName;
+              SFTPConfirmOverwrite(DestFileName,
+                Params, OperationProgress, OpenParams.OverwriteMode, &FileParams);
+              if (PrevDestFileName != DestFileName)
               {
-                AnsiString PrevDestFileName = DestFileName;
-                SFTPConfirmOverwrite(DestFileName,
-                  OperationProgress, OpenParams.OverwriteMode, &FileParams);
-                if (PrevDestFileName != DestFileName)
-                {
-                  // update paths in case user changes the file name
-                  DestFullName = LocalCanonify(TargetDir + DestFileName);
-                  DestPartinalFullName = DestFullName + FTerminal->Configuration->PartialExt;
-                  FTerminal->LogEvent("Checking existence of new file.");
-                  DestFileExists = RemoteFileExists(DestFullName, NULL);
-                }
+                // update paths in case user changes the file name
+                DestFullName = LocalCanonify(TargetDir + DestFileName);
+                DestPartinalFullName = DestFullName + FTerminal->Configuration->PartialExt;
+                FTerminal->LogEvent("Checking existence of new file.");
+                DestFileExists = RemoteFileExists(DestFullName, NULL);
               }
             }
           }
@@ -4109,10 +4148,9 @@ void __fastcall TSFTPFileSystem::SFTPSource(const AnsiString FileName,
           OperationProgress->AddResumed(ResumeOffset);
         }
 
-        // at end of this block queue is disposed
+        TSFTPUploadQueue Queue(this);
+        try
         {
-          TSFTPUploadQueue Queue(this);
-
           Queue.Init(FileName, File, OperationProgress,
             OpenParams.RemoteFileHandle,
             DestWriteOffset + OperationProgress->TransferedSize);
@@ -4138,8 +4176,13 @@ void __fastcall TSFTPFileSystem::SFTPSource(const AnsiString FileName,
             ReserveResponse(&PropertiesRequest, &PropertiesResponse);
           }
         }
+        __finally
+        {
+          Queue.DisposeSafe();
+        }
 
         TransferFinished = true;
+        // queue is discarded here
       }
       __finally
       {
@@ -4338,9 +4381,8 @@ int __fastcall TSFTPFileSystem::SFTPOpenRemote(void * AOpenParams, void * /*Para
     try
     {
       ConfirmOverwriting =
-        FTerminal->Configuration->ConfirmOverwriting &&
-        !OpenParams->Confirmed && !OperationProgress->YesToAll && !OpenParams->Resume &&
-        !(OpenParams->Params & cpNoConfirmation);
+        !OpenParams->Confirmed && !OpenParams->Resume &&
+        FTerminal->CheckRemoteFile(OpenParams->Params, OperationProgress);
       OpenType = SSH_FXF_WRITE | SSH_FXF_CREAT;
       // when we want to preserve overwritten files, we need to find out that
       // they exist first... even if overwrite confirmation is disabled.
@@ -4412,7 +4454,7 @@ int __fastcall TSFTPFileSystem::SFTPOpenRemote(void * AOpenParams, void * /*Para
           // confirmation duplicated in SFTPSource for resumable file transfers.
           AnsiString RemoteFileNameOnly = UnixExtractFileName(OpenParams->RemoteFileName);
           SFTPConfirmOverwrite(RemoteFileNameOnly,
-            OperationProgress, OpenParams->OverwriteMode, OpenParams->FileParams);
+            OpenParams->Params, OperationProgress, OpenParams->OverwriteMode, OpenParams->FileParams);
           if (RemoteFileNameOnly != UnixExtractFileName(OpenParams->RemoteFileName))
           {
             OpenParams->RemoteFileName =
@@ -4626,7 +4668,7 @@ void __fastcall TSFTPFileSystem::SFTPDirectorySource(const AnsiString DirectoryN
 void __fastcall TSFTPFileSystem::CopyToLocal(TStrings * FilesToCopy,
   const AnsiString TargetDir, const TCopyParamType * CopyParam,
   int Params, TFileOperationProgressType * OperationProgress,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   assert(FilesToCopy && OperationProgress);
 
@@ -4667,7 +4709,7 @@ void __fastcall TSFTPFileSystem::CopyToLocal(TStrings * FilesToCopy,
     __finally
     {
       FAvoidBusy = false;
-      OperationProgress->Finish(FileName, Success, DisconnectWhenComplete);
+      OperationProgress->Finish(FileName, Success, OnceDoneOperation);
     }
     Index++;
   }
@@ -4869,18 +4911,14 @@ void __fastcall TSFTPFileSystem::SFTPSink(const AnsiString FileName,
         }
       }
 
-      if ((Attrs >= 0) && !ResumeTransfer &&
-          (FLAGSET(Params, cpNewerOnly) ||
-           (FTerminal->Configuration->ConfirmOverwriting &&
-            !OperationProgress->YesToAll &&
-            FLAGCLEAR(Params, cpNoConfirmation))))
+      if ((Attrs >= 0) && !ResumeTransfer)
       {
         __int64 DestFileSize;
         __int64 MTime;
         FTerminal->OpenLocalFile(DestFullName, GENERIC_WRITE,
           NULL, &LocalHandle, NULL, &MTime, NULL, &DestFileSize, false);
 
-        FTerminal->LogEvent("Checking existence of file.");
+        FTerminal->LogEvent("Confirming overwriting of file.");
         TOverwriteFileParams FileParams;
         FileParams.SourceSize = OperationProgress->TransferSize;
         FileParams.SourceTimestamp = File->Modification;
@@ -4888,7 +4926,7 @@ void __fastcall TSFTPFileSystem::SFTPSink(const AnsiString FileName,
           FTerminal->SessionData->DSTMode);
         FileParams.DestSize = DestFileSize;
         AnsiString PrevDestFileName = DestFileName;
-        SFTPConfirmOverwrite(DestFileName, OperationProgress, OverwriteMode, &FileParams);
+        SFTPConfirmOverwrite(DestFileName, Params, OperationProgress, OverwriteMode, &FileParams);
         if (PrevDestFileName != DestFileName)
         {
           DestFullName = TargetDir + DestFileName;
@@ -4974,138 +5012,146 @@ void __fastcall TSFTPFileSystem::SFTPSink(const AnsiString FileName,
 
       FileStream = new TSafeHandleStream((THandle)LocalHandle);
 
-      // at end of this block queue is disposed
+      // at end of this block queue is discarded
       {
         TSFTPDownloadQueue Queue(this);
-        TSFTPPacket DataPacket;
-
-        int QueueLen = int(File->Size / DownloadBlockSize(OperationProgress)) + 1;
-        if ((QueueLen > FTerminal->SessionData->SFTPDownloadQueue) ||
-            (QueueLen < 0))
-        {
-          QueueLen = FTerminal->SessionData->SFTPDownloadQueue;
-        }
-        if (QueueLen < 1)
-        {
-          QueueLen = 1;
-        }
-        Queue.Init(QueueLen, RemoteHandle, OperationProgress->TransferedSize,
-          OperationProgress);
-
-        bool Eof = false;
-        bool PrevIncomplete = false;
-        int GapFillCount = 0;
-        int GapCount = 0;
-        unsigned long Missing = 0;
-        unsigned long DataLen = 0;
-        unsigned long BlockSize;
-
-        while (!Eof)
+        try
         {
-          if (Missing > 0)
-          {
-            Queue.InitFillGapRequest(OperationProgress->TransferedSize, Missing,
-              &DataPacket);
-            GapFillCount++;
-            SendPacketAndReceiveResponse(&DataPacket, &DataPacket,
-              SSH_FXP_DATA, asEOF);
-          }
-          else
+          TSFTPPacket DataPacket;
+
+          int QueueLen = int(File->Size / DownloadBlockSize(OperationProgress)) + 1;
+          if ((QueueLen > FTerminal->SessionData->SFTPDownloadQueue) ||
+              (QueueLen < 0))
           {
-            Queue.ReceivePacket(&DataPacket, BlockSize);
+            QueueLen = FTerminal->SessionData->SFTPDownloadQueue;
           }
-
-          if (DataPacket.Type == SSH_FXP_STATUS)
+          if (QueueLen < 1)
           {
-            // must be SSH_FX_EOF, any other status packet would raise exception
-            Eof = true;
-            // close file right away, before waiting for pending responses
-            SFTPCloseRemote(RemoteHandle, DestFileName, OperationProgress,
-              true, true, NULL);
-            RemoteHandle = ""; // do not close file again in __finally block
+            QueueLen = 1;
           }
-
-          if (!Eof)
+          Queue.Init(QueueLen, RemoteHandle, OperationProgress->TransferedSize,
+            OperationProgress);
+
+          bool Eof = false;
+          bool PrevIncomplete = false;
+          int GapFillCount = 0;
+          int GapCount = 0;
+          unsigned long Missing = 0;
+          unsigned long DataLen = 0;
+          unsigned long BlockSize;
+
+          while (!Eof)
           {
-            if ((Missing == 0) && PrevIncomplete)
+            if (Missing > 0)
             {
-              // This can happen only if last request returned less bytes
-              // than expected, but exacly number of bytes missing to last
-              // known file size, but actually EOF was not reached.
-              // Can happen only when filesize has changed since directory
-              // listing and server returns less bytes than requested and
-              // file has some special file size.
-              FTerminal->LogEvent(FORMAT(
-                "Received incomplete data packet before end of file, "
-                "offset: %s, size: %d, requested: %d",
-                (IntToStr(OperationProgress->TransferedSize), int(DataLen),
-                int(BlockSize))));
-              FTerminal->TerminalError(NULL, LoadStr(SFTP_INCOMPLETE_BEFORE_EOF));
+              Queue.InitFillGapRequest(OperationProgress->TransferedSize, Missing,
+                &DataPacket);
+              GapFillCount++;
+              SendPacketAndReceiveResponse(&DataPacket, &DataPacket,
+                SSH_FXP_DATA, asEOF);
+            }
+            else
+            {
+              Queue.ReceivePacket(&DataPacket, BlockSize);
             }
 
-            // Buffer for one block of data
-            TFileBuffer BlockBuf;
-
-            DataLen = DataPacket.GetCardinal();
-
-            PrevIncomplete = false;
-            if (Missing > 0)
+            if (DataPacket.Type == SSH_FXP_STATUS)
             {
-              assert(DataLen <= Missing);
-              Missing -= DataLen;
+              // must be SSH_FX_EOF, any other status packet would raise exception
+              Eof = true;
+              // close file right away, before waiting for pending responses
+              SFTPCloseRemote(RemoteHandle, DestFileName, OperationProgress,
+                true, true, NULL);
+              RemoteHandle = ""; // do not close file again in __finally block
             }
-            else if (DataLen < BlockSize)
+
+            if (!Eof)
             {
-              if (OperationProgress->TransferedSize + DataLen !=
-                    OperationProgress->TransferSize)
+              if ((Missing == 0) && PrevIncomplete)
               {
-                // with native text transfer mode (SFTP>=4), do not bother about
-                // getting less than requested, read offset is ignored anyway
-                if ((FVersion < 4) || !OperationProgress->AsciiTransfer)
+                // This can happen only if last request returned less bytes
+                // than expected, but exacly number of bytes missing to last
+                // known file size, but actually EOF was not reached.
+                // Can happen only when filesize has changed since directory
+                // listing and server returns less bytes than requested and
+                // file has some special file size.
+                FTerminal->LogEvent(FORMAT(
+                  "Received incomplete data packet before end of file, "
+                  "offset: %s, size: %d, requested: %d",
+                  (IntToStr(OperationProgress->TransferedSize), int(DataLen),
+                  int(BlockSize))));
+                FTerminal->TerminalError(NULL, LoadStr(SFTP_INCOMPLETE_BEFORE_EOF));
+              }
+
+              // Buffer for one block of data
+              TFileBuffer BlockBuf;
+
+              DataLen = DataPacket.GetCardinal();
+
+              PrevIncomplete = false;
+              if (Missing > 0)
+              {
+                assert(DataLen <= Missing);
+                Missing -= DataLen;
+              }
+              else if (DataLen < BlockSize)
+              {
+                if (OperationProgress->TransferedSize + DataLen !=
+                      OperationProgress->TransferSize)
                 {
-                  GapCount++;
-                  Missing = BlockSize - DataLen;
+                  // with native text transfer mode (SFTP>=4), do not bother about
+                  // getting less than requested, read offset is ignored anyway
+                  if ((FVersion < 4) || !OperationProgress->AsciiTransfer)
+                  {
+                    GapCount++;
+                    Missing = BlockSize - DataLen;
+                  }
+                }
+                else
+                {
+                  PrevIncomplete = true;
                 }
               }
-              else
+
+              assert(DataLen <= BlockSize);
+              BlockBuf.Insert(0, DataPacket.GetNextData(DataLen), DataLen);
+              OperationProgress->AddTransfered(DataLen);
+
+              if (OperationProgress->AsciiTransfer)
               {
-                PrevIncomplete = true;
-              }
-            }
+                assert(!ResumeTransfer && !ResumeAllowed);
 
-            assert(DataLen <= BlockSize);
-            BlockBuf.Insert(0, DataPacket.GetNextData(DataLen), DataLen);
-            OperationProgress->AddTransfered(DataLen);
+                unsigned int PrevBlockSize = BlockBuf.Size;
+                BlockBuf.Convert(GetEOL(), FTerminal->Configuration->LocalEOLType, 0);
+                OperationProgress->SetLocalSize(
+                  OperationProgress->LocalSize - PrevBlockSize + BlockBuf.Size);
+              }
 
-            if (OperationProgress->AsciiTransfer)
-            {
-              assert(!ResumeTransfer && !ResumeAllowed);
+              FILE_OPERATION_LOOP (FMTLOAD(WRITE_ERROR, (LocalFileName)),
+                BlockBuf.WriteToStream(FileStream, BlockBuf.Size);
+              );
 
-              unsigned int PrevBlockSize = BlockBuf.Size;
-              BlockBuf.Convert(GetEOL(), FTerminal->Configuration->LocalEOLType, 0);
-              OperationProgress->SetLocalSize(
-                OperationProgress->LocalSize - PrevBlockSize + BlockBuf.Size);
+              OperationProgress->AddLocalyUsed(BlockBuf.Size);
             }
 
-            FILE_OPERATION_LOOP (FMTLOAD(WRITE_ERROR, (LocalFileName)),
-              BlockBuf.WriteToStream(FileStream, BlockBuf.Size);
-            );
-
-            OperationProgress->AddLocalyUsed(BlockBuf.Size);
-          }
+            if (OperationProgress->Cancel == csCancel)
+            {
+              Abort();
+            }
+          };
 
-          if (OperationProgress->Cancel == csCancel)
+          if (GapCount > 0)
           {
-            Abort();
+            FTerminal->LogEvent(FORMAT(
+              "%d requests to fill %d data gaps were issued.",
+              (GapFillCount, GapCount)));
           }
-        };
-
-        if (GapCount > 0)
+        }
+        __finally
         {
-          FTerminal->LogEvent(FORMAT(
-            "%d requests to fill %d data gaps were issued.",
-            (GapFillCount, GapCount)));
+          Queue.DisposeSafe();
         }
+        // queue is discarded here
       }
 
       if (CopyParam->PreserveTime)

+ 3 - 3
core/SftpFileSystem.h

@@ -45,11 +45,11 @@ public:
   virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
     const AnsiString TargetDir, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress,
-    bool & DisconnectWhenComplete);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall CreateDirectory(const AnsiString DirName);
   virtual void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
   virtual void __fastcall DeleteFile(const AnsiString FileName,
@@ -161,7 +161,7 @@ protected:
     const AnsiString TargetDir, int Attrs, const TCopyParamType * CopyParam,
     int Params, TFileOperationProgressType * OperationProgress, unsigned int Flags);
   void __fastcall SFTPConfirmOverwrite(AnsiString & FileName,
-    TFileOperationProgressType * OperationProgress,
+    int Params, TFileOperationProgressType * OperationProgress,
     TSFTPOverwriteMode & Mode, const TOverwriteFileParams * FileParams);
   bool SFTPConfirmResume(const AnsiString DestFileName, bool PartialBiggerThanSource,
     TFileOperationProgressType * OperationProgress);

+ 290 - 90
core/Terminal.cpp

@@ -9,7 +9,6 @@
 
 #include "Common.h"
 #include "PuttyTools.h"
-#include "Exceptions.h"
 #include "FileBuffer.h"
 #include "Interface.h"
 #include "RemoteFiles.h"
@@ -100,7 +99,7 @@ TOverwriteFileParams::TOverwriteFileParams()
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 TSynchronizeChecklist::TItem::TItem() :
-  Action(saNone), IsDirectory(false), FRemoteFile(NULL), Checked(true), ImageIndex(-1)
+  Action(saNone), IsDirectory(false), RemoteFile(NULL), Checked(true), ImageIndex(-1)
 {
   Local.ModificationFmt = mfFull;
   Local.Modification = 0;
@@ -112,7 +111,7 @@ TSynchronizeChecklist::TItem::TItem() :
 //---------------------------------------------------------------------------
 TSynchronizeChecklist::TItem::~TItem()
 {
-  delete FRemoteFile;
+  delete RemoteFile;
 }
 //---------------------------------------------------------------------------
 const AnsiString& TSynchronizeChecklist::TItem::GetFileName() const
@@ -258,7 +257,7 @@ public:
     TStrings * Results);
   virtual void __fastcall DisplayBanner(const AnsiString & Banner);
   virtual void __fastcall FatalError(Exception * E, AnsiString Msg);
-  virtual void __fastcall ShowExtendedException(Exception * E);
+  virtual void __fastcall HandleExtendedException(Exception * E);
   virtual void __fastcall Closed();
 
 private:
@@ -347,11 +346,11 @@ void __fastcall TTunnelUI::FatalError(Exception * E, AnsiString Msg)
   throw ESshFatal(E, Msg);
 }
 //---------------------------------------------------------------------------
-void __fastcall TTunnelUI::ShowExtendedException(Exception * E)
+void __fastcall TTunnelUI::HandleExtendedException(Exception * E)
 {
   if (GetCurrentThreadId() == FTerminalThread)
   {
-    FTerminal->ShowExtendedException(E);
+    FTerminal->HandleExtendedException(E);
   }
 }
 //---------------------------------------------------------------------------
@@ -399,18 +398,33 @@ __fastcall TCallbackGuard::~TCallbackGuard()
   delete FFatalError;
 }
 //---------------------------------------------------------------------------
+class ECallbackGuardAbort : public EAbort
+{
+public:
+  __fastcall ECallbackGuardAbort() : EAbort("")
+  {
+  }
+};
+//---------------------------------------------------------------------------
 void __fastcall TCallbackGuard::FatalError(Exception * E, const AnsiString & Msg)
 {
   assert(FGuarding);
-  assert(FFatalError == NULL);
 
-  FFatalError = new ExtException(E, Msg);
+  // make sure we do not bother about getting back the silent abort exception
+  // we issued outselves. this may happen when there is an exception handler
+  // that converts any exception to fatal one (such as in TTerminal::Open).
+  if (dynamic_cast<ECallbackGuardAbort *>(E) == NULL)
+  {
+    assert(FFatalError == NULL);
+
+    FFatalError = new ExtException(E, Msg);
+  }
 
   // silently abort what we are doing.
   // non-silent exception would be catched probably by default application
   // exception handler, which may not do an appropriate action
   // (particularly it will not resume broken transfer).
-  Abort();
+  throw ECallbackGuardAbort();
 }
 //---------------------------------------------------------------------------
 void __fastcall TCallbackGuard::Dismiss()
@@ -489,7 +503,7 @@ __fastcall TTerminal::~TTerminal()
 
   if (FCallbackGuard != NULL)
   {
-    // see TTerminal::ShowExtendedException
+    // see TTerminal::HandleExtendedException
     FCallbackGuard->Dismiss();
   }
   assert(FTunnel == NULL);
@@ -539,7 +553,7 @@ void __fastcall TTerminal::Idle()
         // it is displayed, because it can be useful to know.
         if (FCommandSession->Active)
         {
-          FCommandSession->ShowExtendedException(&E);
+          FCommandSession->HandleExtendedException(&E);
         }
       }
     }
@@ -885,19 +899,22 @@ void __fastcall TTerminal::Closed()
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::Reopen(int Params)
 {
-  assert(FExceptionOnFail == 0);
-
   TFSProtocol OrigFSProtocol = SessionData->FSProtocol;
   AnsiString PrevRemoteDirectory = SessionData->RemoteDirectory;
   bool PrevReadCurrentDirectoryPending = FReadCurrentDirectoryPending;
   bool PrevReadDirectoryPending = FReadDirectoryPending;
   int PrevInTransaction = FInTransaction;
   bool PrevAutoReadDirectory = FAutoReadDirectory;
+  // here used to be a check for FExceptionOnFail being 0
+  // but it can happen, e.g. when we are downloading file to execute it.
+  // however I'm not sure why we mind having excaption-on-fail enabled here
+  int PrevExceptionOnFail = FExceptionOnFail;
   try
   {
     FReadCurrentDirectoryPending = false;
     FReadDirectoryPending = false;
     FInTransaction = 0;
+    FExceptionOnFail = 0;
     // typically, we avoid reading directory, when there is operation ongoing,
     // for file list which may reference files from current directory
     if (FLAGSET(Params, ropNoReadDirectory))
@@ -926,6 +943,7 @@ void __fastcall TTerminal::Reopen(int Params)
     FReadCurrentDirectoryPending = PrevReadCurrentDirectoryPending;
     FReadDirectoryPending = PrevReadDirectoryPending;
     FInTransaction = PrevInTransaction;
+    FExceptionOnFail = PrevExceptionOnFail;
   }
 }
 //---------------------------------------------------------------------------
@@ -979,7 +997,16 @@ bool __fastcall TTerminal::DoPromptUser(TSessionData * /*Data*/, TPromptKind Kin
       ((Kind == pkPassword) || (Kind == pkPassphrase) || (Kind == pkKeybInteractive) ||
        (Kind == pkTIS) || (Kind == pkCryptoCard)))
   {
-    FPassword = EncryptPassword(Results->Strings[0], SessionData->SessionName);
+    AnsiString EncryptedPassword =
+      EncryptPassword(Results->Strings[0], SessionData->SessionName);
+    if (FTunnelOpening)
+    {
+      FTunnelPassword = EncryptedPassword;
+    }
+    else
+    {
+      FPassword = EncryptedPassword;
+    }
   }
 
   return AResult;
@@ -1051,7 +1078,7 @@ void __fastcall TTerminal::DisplayBanner(const AnsiString & Banner)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminal::ShowExtendedException(Exception * E)
+void __fastcall TTerminal::HandleExtendedException(Exception * E)
 {
   Log->AddException(E);
   if (OnShowExtendedException != NULL)
@@ -1064,6 +1091,15 @@ void __fastcall TTerminal::ShowExtendedException(Exception * E)
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TTerminal::ShowExtendedException(Exception * E)
+{
+  Log->AddException(E);
+  if (OnShowExtendedException != NULL)
+  {
+    OnShowExtendedException(this, E, NULL);
+  }
+}
+//---------------------------------------------------------------------------
 void __fastcall TTerminal::DoInformation(const AnsiString & Str, bool Status,
   bool Active)
 {
@@ -1097,12 +1133,12 @@ void __fastcall TTerminal::DoProgress(TFileOperationProgressType & ProgressData,
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::DoFinished(TFileOperation Operation, TOperationSide Side, bool Temp,
-  const AnsiString & FileName, bool Success, bool & DisconnectWhenComplete)
+  const AnsiString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation)
 {
   if (OnFinished != NULL)
   {
     TCallbackGuard Guard(this);
-    OnFinished(Operation, Side, Temp, FileName, Success, DisconnectWhenComplete);
+    OnFinished(Operation, Side, Temp, FileName, Success, OnceDoneOperation);
     Guard.Verify();
   }
 }
@@ -1210,6 +1246,7 @@ bool __fastcall TTerminal::QueryReopen(Exception * E, int Params,
 
   if (Result)
   {
+    TDateTime Start = Now();
     do
     {
       try
@@ -1220,7 +1257,10 @@ bool __fastcall TTerminal::QueryReopen(Exception * E, int Params,
       {
         if (!Active)
         {
-          Result = DoQueryReopen(&E);
+          Result =
+            ((Configuration->SessionReopenTimeout == 0) ||
+             (int(double(Now() - Start) * 24*60*60*1000) < Configuration->SessionReopenTimeout)) &&
+            DoQueryReopen(&E);
         }
         else
         {
@@ -1490,7 +1530,7 @@ AnsiString __fastcall TTerminal::GetUserName() const
   // in future might also be implemented to detect username similar to GetUserGroups
   assert(FFileSystem != NULL);
   AnsiString Result = FFileSystem->GetUserName();
-  // Is empty also when stored password was used
+  // Is empty also when stored username was used
   if (Result.IsEmpty())
   {
     Result = SessionData->UserName;
@@ -1676,7 +1716,7 @@ int __fastcall TTerminal::CommandError(Exception * E, const AnsiString Msg,
     ECommand * ECmd = new ECommand(E, Msg);
     try
     {
-      ShowExtendedException(ECmd);
+      HandleExtendedException(ECmd);
     }
     __finally
     {
@@ -1728,31 +1768,98 @@ bool __fastcall TTerminal::HandleException(Exception * E)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminal::CloseOnCompletion(const AnsiString Message)
+void __fastcall TTerminal::CloseOnCompletion(TOnceDoneOperation Operation, const AnsiString Message)
 {
   LogEvent("Closing session after completed operation (as requested by user)");
   Close();
   throw ESshTerminate(NULL,
-    Message.IsEmpty() ? LoadStr(CLOSED_ON_COMPLETION) : Message);
+    Message.IsEmpty() ? LoadStr(CLOSED_ON_COMPLETION) : Message,
+    Operation);
 }
 //---------------------------------------------------------------------------
-int __fastcall TTerminal::ConfirmFileOverwrite(const AnsiString FileName,
-  const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * Params,
-  TOperationSide Side, TFileOperationProgressType * OperationProgress)
+TBatchOverwrite __fastcall TTerminal::EffectiveBatchOverwrite(
+  int Params, TFileOperationProgressType * OperationProgress, bool Special)
 {
-  int Answer;
-  int AnswerForNewer =
-    (CompareFileTime(FileParams->SourceTimestamp, FileParams->DestTimestamp) > 0) ?
-    qaYes : qaNo;
-  if (OperationProgress->YesToNewer)
+  TBatchOverwrite Result;
+  if (Special && FLAGSET(Params, cpResume))
   {
-    Answer = AnswerForNewer;
+    Result = boResume;
+  }
+  else if (FLAGSET(Params, cpAppend))
+  {
+    Result = boAppend;
+  }
+  else if (FLAGSET(Params, cpNewerOnly))
+  {
+    // no way to change batch overwrite mode when cpNewerOnly is on
+    Result = boOlder;
+  }
+  else if (FLAGSET(Params, cpNoConfirmation) || !Configuration->ConfirmOverwriting)
+  {
+    // no way to change batch overwrite mode when overwrite confirmations are off
+    assert(OperationProgress->BatchOverwrite == boNo);
+    Result = boAll;
   }
   else
   {
-    AnsiString Message = FMTLOAD((Side == osLocal ? LOCAL_FILE_OVERWRITE :
-      REMOTE_FILE_OVERWRITE), (FileName));
-    if (FileParams)
+    Result = OperationProgress->BatchOverwrite;
+    if (!Special &&
+        ((Result == boOlder) || (Result == boAlternateResume) || (Result == boResume)))
+    {
+      Result = boNo;
+    }
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
+bool __fastcall TTerminal::CheckRemoteFile(int Params, TFileOperationProgressType * OperationProgress)
+{
+  return (EffectiveBatchOverwrite(Params, OperationProgress, true) != boAll);
+}
+//---------------------------------------------------------------------------
+int __fastcall TTerminal::ConfirmFileOverwrite(const AnsiString FileName,
+  const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * QueryParams,
+  TOperationSide Side, int Params, TFileOperationProgressType * OperationProgress,
+  AnsiString Message)
+{
+  int Result;
+  // duplicated in TSFTPFileSystem::SFTPConfirmOverwrite
+  bool CanAlternateResume =
+    (FileParams != NULL) &&
+    (FileParams->DestSize < FileParams->SourceSize) &&
+    !OperationProgress->AsciiTransfer;
+  TBatchOverwrite BatchOverwrite = EffectiveBatchOverwrite(Params, OperationProgress, true);
+  bool Applicable = true;
+  switch (BatchOverwrite)
+  {
+    case boOlder:
+      Applicable = (FileParams != NULL);
+      break;
+
+    case boAlternateResume:
+      Applicable = CanAlternateResume;
+      break;
+
+    case boResume:
+      Applicable = CanAlternateResume;
+      break;
+  }
+
+  if (!Applicable)
+  {
+    TBatchOverwrite ABatchOverwrite = EffectiveBatchOverwrite(Params, OperationProgress, false);
+    assert(BatchOverwrite != ABatchOverwrite);
+    BatchOverwrite = ABatchOverwrite;
+  }
+
+  if (BatchOverwrite == boNo)
+  {
+    if (Message.IsEmpty())
+    {
+      Message = FMTLOAD((Side == osLocal ? LOCAL_FILE_OVERWRITE :
+        REMOTE_FILE_OVERWRITE), (FileName));
+    }
+    if (FileParams != NULL)
     {
       Message = FMTLOAD(FILE_OVERWRITE_DETAILS, (Message,
         IntToStr(FileParams->SourceSize),
@@ -1760,30 +1867,76 @@ int __fastcall TTerminal::ConfirmFileOverwrite(const AnsiString FileName,
         IntToStr(FileParams->DestSize),
         UserModificationStr(FileParams->DestTimestamp, FileParams->DestPrecision)));
     }
-    Answer = QueryUser(Message, NULL, Answers, Params);
-    switch (Answer)
+    Result = QueryUser(Message, NULL, Answers, QueryParams);
+    switch (Result)
     {
       case qaNeverAskAgain:
         Configuration->ConfirmOverwriting = false;
-        Answer = qaYes;
+        Result = qaYes;
         break;
 
       case qaYesToAll:
-        OperationProgress->YesToAll = true;
-        Answer = qaYes;
+        BatchOverwrite = boAll;
         break;
 
       case qaAll:
-        OperationProgress->YesToNewer = true;
-        Answer = AnswerForNewer;
+        BatchOverwrite = boOlder;
         break;
 
       case qaNoToAll:
-        OperationProgress->NoToAll = true;
-        Answer = qaNo;
+        BatchOverwrite = boNone;
+        break;
+    }
+
+    // we user has not selected another batch overwrite mode,
+    // keep the current one. note that we may get here even
+    // when batch overwrite was selected already, but it could not be applied
+    // to current transfer (see condition above)
+    if (BatchOverwrite != boNo)
+    {
+      OperationProgress->BatchOverwrite = BatchOverwrite;
     }
   }
-  return Answer;
+
+  if (BatchOverwrite != boNo)
+  {
+    switch (BatchOverwrite)
+    {
+      case boAll:
+        Result = qaYes;
+        break;
+
+      case boNone:
+        Result = qaNo;
+        break;
+
+      case boOlder:
+        Result =
+          ((FileParams != NULL) &&
+           (CompareFileTime(
+             ReduceDateTimePrecision(FileParams->SourceTimestamp,
+               LessDateTimePrecision(FileParams->SourcePrecision, FileParams->DestPrecision)),
+             ReduceDateTimePrecision(FileParams->DestTimestamp,
+               LessDateTimePrecision(FileParams->SourcePrecision, FileParams->DestPrecision))) > 0)) ?
+          qaYes : qaNo;
+        break;
+
+      case boAlternateResume:
+        assert(CanAlternateResume);
+        Result = qaSkip; // ugh
+        break;
+
+      case boAppend:
+        Result = qaRetry;
+        break;
+
+      case boResume:
+        Result = qaRetry;
+        break;
+    }
+  }
+
+  return Result;
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::FileModified(const TRemoteFile * File,
@@ -2295,7 +2448,7 @@ bool __fastcall TTerminal::ProcessFiles(TStrings * FileList,
   assert(FileList);
 
   bool Result = false;
-  bool DisconnectWhenComplete = false;
+  TOnceDoneOperation OnceDoneOperation = odoIdle;
 
   try
   {
@@ -2335,7 +2488,7 @@ bool __fastcall TTerminal::ProcessFiles(TStrings * FileList,
           }
           __finally
           {
-            Progress.Finish(FileName, Success, DisconnectWhenComplete);
+            Progress.Finish(FileName, Success, OnceDoneOperation);
           }
           Index++;
         }
@@ -2361,15 +2514,15 @@ bool __fastcall TTerminal::ProcessFiles(TStrings * FileList,
   }
   catch (...)
   {
-    DisconnectWhenComplete = false;
+    OnceDoneOperation = odoIdle;
     // this was missing here. was it by purpose?
     // without it any error message is lost
     throw;
   }
 
-  if (DisconnectWhenComplete)
+  if (OnceDoneOperation != odoIdle)
   {
-    CloseOnCompletion();
+    CloseOnCompletion(OnceDoneOperation);
   }
 
   return Result;
@@ -3281,7 +3434,7 @@ void __fastcall TTerminal::DoAnyCommand(const AnsiString Command,
       RollbackAction(*Action, NULL, &E);
     }
     if (ExceptionOnFail || (E.InheritsFrom(__classid(EFatal)))) throw;
-      else ShowExtendedException(&E);
+      else HandleExtendedException(&E);
   }
 }
 //---------------------------------------------------------------------------
@@ -3308,11 +3461,11 @@ bool __fastcall TTerminal::CreateLocalFile(const AnsiString FileName,
         {
           if (FLAGSET(FileAttr, faReadOnly))
           {
-            if (OperationProgress->NoToAll)
+            if (OperationProgress->BatchOverwrite == boNone)
             {
               Result = false;
             }
-            else if (!OperationProgress->YesToAll && !NoConfirmation)
+            else if ((OperationProgress->BatchOverwrite != boAll) && !NoConfirmation)
             {
               int Answer;
               SUSPEND_OPERATION
@@ -3322,9 +3475,9 @@ bool __fastcall TTerminal::CreateLocalFile(const AnsiString FileName,
                   qaYes | qaNo | qaCancel | qaYesToAll | qaNoToAll, 0);
               );
               switch (Answer) {
-                case qaYesToAll: OperationProgress->YesToAll = true; break;
+                case qaYesToAll: OperationProgress->BatchOverwrite = boAll; break;
                 case qaCancel: OperationProgress->Cancel = csCancel; // continue on next case
-                case qaNoToAll: OperationProgress->NoToAll = true;
+                case qaNoToAll: OperationProgress->BatchOverwrite = boNone;
                 case qaNo: Result = false; break;
               }
             }
@@ -3525,7 +3678,7 @@ void __fastcall TTerminal::CalculateLocalFilesSize(TStrings * FileList,
   __int64 & Size, const TCopyParamType * CopyParam)
 {
   TFileOperationProgressType OperationProgress(&DoProgress, &DoFinished);
-  bool DisconnectWhenComplete = false;
+  TOnceDoneOperation OnceDoneOperation = odoIdle;
   OperationProgress.Start(foCalculateSize, osLocal, FileList->Count);
   try
   {
@@ -3543,7 +3696,7 @@ void __fastcall TTerminal::CalculateLocalFilesSize(TStrings * FileList,
       if (FileSearchRec(FileName, Rec))
       {
         CalculateLocalFileSize(FileName, Rec, &Params);
-        OperationProgress.Finish(FileName, true, DisconnectWhenComplete);
+        OperationProgress.Finish(FileName, true, OnceDoneOperation);
       }
     }
 
@@ -3555,9 +3708,9 @@ void __fastcall TTerminal::CalculateLocalFilesSize(TStrings * FileList,
     OperationProgress.Stop();
   }
 
-  if (DisconnectWhenComplete)
+  if (OnceDoneOperation != odoIdle)
   {
-    CloseOnCompletion();
+    CloseOnCompletion(OnceDoneOperation);
   }
 }
 //---------------------------------------------------------------------------
@@ -3568,6 +3721,7 @@ struct TSynchronizeFileData
   bool IsDirectory;
   TSynchronizeChecklist::TItem::TFileInfo Info;
   TSynchronizeChecklist::TItem::TFileInfo MatchingRemoteFile;
+  TRemoteFile * MatchingRemoteFileFile;
   int MatchingRemoteFileImageIndex;
   FILETIME LocalLastWriteTime;
 };
@@ -3747,6 +3901,7 @@ void __fastcall TTerminal::DoSynchronizeCollectDirectory(const AnsiString LocalD
               assert(!FileData->MatchingRemoteFile.Directory.IsEmpty());
               ChecklistItem->Remote = FileData->MatchingRemoteFile;
               ChecklistItem->ImageIndex = FileData->MatchingRemoteFileImageIndex;
+              ChecklistItem->RemoteFile = FileData->MatchingRemoteFileFile;
             }
             else
             {
@@ -3782,6 +3937,13 @@ void __fastcall TTerminal::DoSynchronizeCollectDirectory(const AnsiString LocalD
             delete ChecklistItem;
           }
         }
+        else
+        {
+          if (FileData->Modified)
+          {
+            delete FileData->MatchingRemoteFileFile;
+          }
+        }
       }
     }
   }
@@ -3850,7 +4012,8 @@ void __fastcall TTerminal::SynchronizeCollectFile(const AnsiString FileName,
         {
           ChecklistItem->Local = LocalData->Info;
 
-          ReduceDateTimePrecision(ChecklistItem->Local.Modification, File->ModificationFmt);
+          ChecklistItem->Local.Modification =
+            ReduceDateTimePrecision(ChecklistItem->Local.Modification, File->ModificationFmt);
 
           bool LocalModified = false;
           // for spTimestamp+spBySize require that the file sizes are the same
@@ -3868,9 +4031,7 @@ void __fastcall TTerminal::SynchronizeCollectFile(const AnsiString FileName,
           {
             TimeCompare = 0;
           }
-          if (TimeCompare &&
-              (CompareFileTime(ChecklistItem->Local.Modification,
-                 ChecklistItem->Remote.Modification) < 0))
+          if (TimeCompare < 0)
           {
             if ((FLAGCLEAR(Data->Params, spTimestamp) && FLAGCLEAR(Data->Params, spMirror)) ||
                 (Data->Mode == smBoth) || (Data->Mode == smLocal))
@@ -3882,9 +4043,7 @@ void __fastcall TTerminal::SynchronizeCollectFile(const AnsiString FileName,
               LocalModified = true;
             }
           }
-          else if (TimeCompare &&
-                   (CompareFileTime(ChecklistItem->Local.Modification,
-                      ChecklistItem->Remote.Modification) > 0))
+          else if (TimeCompare > 0)
           {
             if ((FLAGCLEAR(Data->Params, spTimestamp) && FLAGCLEAR(Data->Params, spMirror)) ||
                 (Data->Mode == smBoth) || (Data->Mode == smRemote))
@@ -3909,6 +4068,9 @@ void __fastcall TTerminal::SynchronizeCollectFile(const AnsiString FileName,
             LocalData->Modified = true;
             LocalData->MatchingRemoteFile = ChecklistItem->Remote;
             LocalData->MatchingRemoteFileImageIndex = ChecklistItem->ImageIndex;
+            // we need this for custom commands over checklist only,
+            // not for sync itself
+            LocalData->MatchingRemoteFileFile = File->Duplicate();
           }
         }
         else if (FLAGCLEAR(Data->Params, spNoRecurse))
@@ -3957,7 +4119,7 @@ void __fastcall TTerminal::SynchronizeCollectFile(const AnsiString FileName,
 
         if (ChecklistItem->Action != TSynchronizeChecklist::saNone)
         {
-          ChecklistItem->FRemoteFile = File->Duplicate();
+          ChecklistItem->RemoteFile = File->Duplicate();
           Data->Checklist->Add(ChecklistItem);
           ChecklistItem = NULL;
         }
@@ -3983,7 +4145,12 @@ void __fastcall TTerminal::SynchronizeApply(TSynchronizeChecklist * Checklist,
     FLAGMASK(FLAGSET(Params, spNoConfirmation), cpNoConfirmation);
 
   TCopyParamType SyncCopyParam = *CopyParam;
-  SyncCopyParam.PreserveTime = true;
+  // when synchronizing by time, we force preserving time,
+  // otherwise it does not make any sense
+  if (FLAGCLEAR(Params, spNotByTime))
+  {
+    SyncCopyParam.PreserveTime = true;
+  }
 
   TStringList * DownloadList = new TStringList();
   TStringList * DeleteRemoteList = new TStringList();
@@ -4055,14 +4222,14 @@ void __fastcall TTerminal::SynchronizeApply(TSynchronizeChecklist * Checklist,
                 DownloadList->AddObject(
                   UnixIncludeTrailingBackslash(ChecklistItem->Remote.Directory) +
                     ChecklistItem->Remote.FileName,
-                  ChecklistItem->FRemoteFile);
+                  ChecklistItem->RemoteFile);
                 break;
 
               case TSynchronizeChecklist::saDeleteRemote:
                 DeleteRemoteList->AddObject(
                   UnixIncludeTrailingBackslash(ChecklistItem->Remote.Directory) +
                     ChecklistItem->Remote.FileName,
-                  ChecklistItem->FRemoteFile);
+                  ChecklistItem->RemoteFile);
                 break;
 
               case TSynchronizeChecklist::saUploadNew:
@@ -4248,6 +4415,21 @@ AnsiString __fastcall TTerminal::GetPassword()
   return Result;
 }
 //---------------------------------------------------------------------
+AnsiString __fastcall TTerminal::GetTunnelPassword()
+{
+  AnsiString Result;
+  // FTunnelPassword is empty also when stored password was used
+  if (FTunnelPassword.IsEmpty())
+  {
+    Result = SessionData->TunnelPassword;
+  }
+  else
+  {
+    Result = DecryptPassword(FTunnelPassword, SessionData->SessionName);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------
 bool __fastcall TTerminal::GetStoredCredentialsTried()
 {
   bool Result;
@@ -4276,7 +4458,7 @@ bool __fastcall TTerminal::CopyToRemote(TStrings * FilesToCopy,
   assert(IsCapable[fcNewerOnlyUpload] || FLAGCLEAR(Params, cpNewerOnly));
 
   bool Result = false;
-  bool DisconnectWhenComplete = false;
+  TOnceDoneOperation OnceDoneOperation = odoIdle;
 
   try
   {
@@ -4293,8 +4475,6 @@ bool __fastcall TTerminal::CopyToRemote(TStrings * FilesToCopy,
     OperationProgress.Start((Params & cpDelete ? foMove : foCopy), osLocal,
       FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit);
 
-    OperationProgress.YesToNewer = FLAGSET(Params, cpNewerOnly);
-
     FOperationProgress = &OperationProgress;
     try
     {
@@ -4315,7 +4495,7 @@ bool __fastcall TTerminal::CopyToRemote(TStrings * FilesToCopy,
         }
 
         FFileSystem->CopyToRemote(FilesToCopy, UnlockedTargetDir,
-          CopyParam, Params, &OperationProgress, DisconnectWhenComplete);
+          CopyParam, Params, &OperationProgress, OnceDoneOperation);
       }
       __finally
       {
@@ -4340,10 +4520,13 @@ bool __fastcall TTerminal::CopyToRemote(TStrings * FilesToCopy,
   catch (Exception &E)
   {
     CommandError(&E, LoadStr(TOREMOTE_COPY_ERROR));
-    DisconnectWhenComplete = false;
+    OnceDoneOperation = odoIdle;
   }
 
-  if (DisconnectWhenComplete) CloseOnCompletion();
+  if (OnceDoneOperation != odoIdle)
+  {
+    CloseOnCompletion(OnceDoneOperation);
+  }
 
   return Result;
 }
@@ -4357,7 +4540,7 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
 
   bool Result = false;
   bool OwnsFileList = (FilesToCopy == NULL);
-  bool DisconnectWhenComplete = false;
+  TOnceDoneOperation OnceDoneOperation = odoIdle;
 
   try
   {
@@ -4393,8 +4576,6 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
       OperationProgress.Start((Params & cpDelete ? foMove : foCopy), osRemote,
         FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit);
 
-      OperationProgress.YesToNewer = FLAGSET(Params, cpNewerOnly);
-
       FOperationProgress = &OperationProgress;
       try
       {
@@ -4408,7 +4589,7 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
           try
           {
             FFileSystem->CopyToLocal(FilesToCopy, TargetDir, CopyParam, Params,
-              &OperationProgress, DisconnectWhenComplete);
+              &OperationProgress, OnceDoneOperation);
           }
           __finally
           {
@@ -4421,7 +4602,7 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
         catch (Exception &E)
         {
           CommandError(&E, LoadStr(TOLOCAL_COPY_ERROR));
-          DisconnectWhenComplete = false;
+          OnceDoneOperation = odoIdle;
         }
 
         if (OperationProgress.Cancel == csContinue)
@@ -4448,7 +4629,10 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
     if (OwnsFileList) delete FilesToCopy;
   }
 
-  if (DisconnectWhenComplete) CloseOnCompletion();
+  if (OnceDoneOperation != odoIdle)
+  {
+    CloseOnCompletion(OnceDoneOperation);
+  }
 
   return Result;
 }
@@ -4456,7 +4640,8 @@ bool __fastcall TTerminal::CopyToLocal(TStrings * FilesToCopy,
 __fastcall TSecondaryTerminal::TSecondaryTerminal(TTerminal * MainTerminal,
   TSessionData * ASessionData, TConfiguration * Configuration, const AnsiString & Name) :
   TTerminal(ASessionData, Configuration),
-  FMainTerminal(MainTerminal), FMasterPasswordTried(false)
+  FMainTerminal(MainTerminal), FMasterPasswordTried(false),
+  FMasterTunnelPasswordTried(false)
 {
   Log->Parent = FMainTerminal->Log;
   Log->Name = Name;
@@ -4487,19 +4672,34 @@ bool __fastcall TSecondaryTerminal::DoPromptUser(TSessionData * Data,
 {
   bool AResult = false;
 
-  if (!FMasterPasswordTried && (Prompts->Count == 1) && !bool(Prompts->Objects[0]) &&
+  if ((Prompts->Count == 1) && !bool(Prompts->Objects[0]) &&
       ((Kind == pkPassword) || (Kind == pkPassphrase) || (Kind == pkKeybInteractive) ||
        (Kind == pkTIS) || (Kind == pkCryptoCard)))
   {
-    // let's expect that the main session is already authenticated and its password
-    // is not written after, so no locking is necessary
-    // (no longer true, once the main session can be reconnected)
-    Results->Strings[0] = FMainTerminal->Password;
-    if (!Results->Strings[0].IsEmpty())
+    bool & PasswordTried =
+      FTunnelOpening ? FMasterTunnelPasswordTried : FMasterPasswordTried;
+    if (!PasswordTried)
     {
-      AResult = true;
+      // let's expect that the main session is already authenticated and its password
+      // is not written after, so no locking is necessary
+      // (no longer true, once the main session can be reconnected)
+      AnsiString Password;
+      if (FTunnelOpening)
+      {
+        Password = FMainTerminal->TunnelPassword;
+      }
+      else
+      {
+        Password = FMainTerminal->Password;
+      }
+      Results->Strings[0] = Password;
+      if (!Results->Strings[0].IsEmpty())
+      {
+        LogEvent("Using remembered password of the main session.");
+        AResult = true;
+      }
+      PasswordTried = true;
     }
-    FMasterPasswordTried = true;
   }
 
   if (!AResult)

+ 19 - 7
core/Terminal.h

@@ -8,6 +8,7 @@
 #include "Interface.h"
 #include "FileOperationProgress.h"
 #include "FileMasks.h"
+#include "Exceptions.h"
 //---------------------------------------------------------------------------
 class TCopyParamType;
 class TFileOperationProgressType;
@@ -103,6 +104,8 @@ const cpDelete = 0x01;
 const cpTemporary = 0x04;
 const cpNoConfirmation = 0x08;
 const cpNewerOnly = 0x10;
+const cpAppend = 0x20;
+const cpResume = 0x40;
 //---------------------------------------------------------------------------
 const ccApplyToDirectories = 0x01;
 const ccRecursive = 0x02;
@@ -176,6 +179,7 @@ private:
   bool * FClosedOnCompletion;
   TSessionStatus FStatus;
   AnsiString FPassword;
+  AnsiString FTunnelPassword;
   TTunnelThread * FTunnelThread;
   TSecureShell * FTunnel;
   TSessionData * FTunnelData;
@@ -183,7 +187,6 @@ private:
   TTunnelUI * FTunnelUI;
   int FTunnelLocalPortNumber;
   AnsiString FTunnelError;
-  bool FTunnelOpening;
   TQueryUserEvent FOnQueryUser;
   TPromptUserEvent FOnPromptUser;
   TDisplayBannerEvent FOnDisplayBanner;
@@ -213,11 +216,13 @@ private:
   bool __fastcall GetResolvingSymlinks();
   bool __fastcall GetActive();
   AnsiString __fastcall GetPassword();
+  AnsiString __fastcall GetTunnelPassword();
   bool __fastcall GetStoredCredentialsTried();
 
 protected:
   bool FReadCurrentDirectoryPending;
   bool FReadDirectoryPending;
+  bool FTunnelOpening;
 
   void __fastcall DoStartReadDirectory();
   void __fastcall DoReadDirectoryProgress(int Progress, bool & Cancel);
@@ -268,9 +273,13 @@ protected:
     const TSearchRec Rec, /*__int64*/ void * Size);
   void __fastcall CalculateLocalFilesSize(TStrings * FileList, __int64 & Size,
     const TCopyParamType * CopyParam = NULL);
+  TBatchOverwrite __fastcall EffectiveBatchOverwrite(
+    int Params, TFileOperationProgressType * OperationProgress, bool Special);
+  bool __fastcall CheckRemoteFile(int Params, TFileOperationProgressType * OperationProgress);
   int __fastcall ConfirmFileOverwrite(const AnsiString FileName,
-    const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * Params,
-    TOperationSide Side, TFileOperationProgressType * OperationProgress);
+    const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * QueryParams,
+    TOperationSide Side, int Params, TFileOperationProgressType * OperationProgress,
+    AnsiString Message = "");
   void __fastcall DoSynchronizeCollectDirectory(const AnsiString LocalDirectory,
     const AnsiString RemoteDirectory, TSynchronizeMode Mode,
     const TCopyParamType * CopyParam, int Params,
@@ -313,10 +322,11 @@ protected:
     AnsiString Name, AnsiString Instructions, TStrings * Prompts, TStrings * Results);
   virtual void __fastcall DisplayBanner(const AnsiString & Banner);
   virtual void __fastcall Closed();
+  virtual void __fastcall HandleExtendedException(Exception * E);
   bool __fastcall IsListenerFree(unsigned int PortNumber);
   void __fastcall DoProgress(TFileOperationProgressType & ProgressData, TCancelStatus & Cancel);
   void __fastcall DoFinished(TFileOperation Operation, TOperationSide Side, bool Temp,
-    const AnsiString & FileName, bool Success, bool & DisconnectWhenComplete);
+    const AnsiString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
   void __fastcall RollbackAction(TSessionAction & Action,
     TFileOperationProgressType * OperationProgress, Exception * E = NULL);
   void __fastcall DoAnyCommand(const AnsiString Command, TCaptureOutputEvent OutputEvent,
@@ -333,11 +343,11 @@ public:
   void __fastcall Reopen(int Params);
   virtual void __fastcall DirectoryModified(const AnsiString Path, bool SubDirs);
   virtual void __fastcall DirectoryLoaded(TRemoteFileList * FileList);
-  virtual void __fastcall ShowExtendedException(Exception * E);
+  void __fastcall ShowExtendedException(Exception * E);
   void __fastcall Idle();
   bool __fastcall AllowedAnyCommand(const AnsiString Command);
   void __fastcall AnyCommand(const AnsiString Command, TCaptureOutputEvent OutputEvent);
-  void __fastcall CloseOnCompletion(const AnsiString Message = "");
+  void __fastcall CloseOnCompletion(TOnceDoneOperation Operation = odoDisconnect, const AnsiString Message = "");
   AnsiString __fastcall AbsolutePath(AnsiString Path, bool Local);
   void __fastcall BeginTransaction();
   void __fastcall ReadCurrentDirectory();
@@ -448,6 +458,7 @@ public:
   __property TStrings * FixedPaths = { read = GetFixedPaths };
   __property bool ResolvingSymlinks = { read = GetResolvingSymlinks };
   __property AnsiString Password = { read = GetPassword };
+  __property AnsiString TunnelPassword = { read = GetTunnelPassword };
   __property bool StoredCredentialsTried = { read = GetStoredCredentialsTried };
   __property TQueryUserEvent OnQueryUser = { read = FOnQueryUser, write = FOnQueryUser };
   __property TPromptUserEvent OnPromptUser = { read = FOnPromptUser, write = FOnPromptUser };
@@ -474,6 +485,7 @@ protected:
 
 private:
   bool FMasterPasswordTried;
+  bool FMasterTunnelPasswordTried;
   TTerminal * FMainTerminal;
 };
 //---------------------------------------------------------------------------
@@ -581,13 +593,13 @@ public:
     TFileInfo Remote;
     int ImageIndex;
     bool Checked;
+    TRemoteFile * RemoteFile;
 
     const AnsiString& GetFileName() const;
 
     ~TItem();
 
   private:
-    TRemoteFile * FRemoteFile;
     FILETIME FLocalLastWriteTime;
 
     TItem();

+ 22 - 0
filezilla/ApiLog.cpp

@@ -80,6 +80,10 @@ void CApiLog::LogMessage(int nMessageType, LPCTSTR pMsgFormat, ...) const
 	text.FormatV(pMsgFormat, ap);
 	va_end(ap);
 	
+#ifdef MPEXT
+	if (nMessageType>=FZ_LOG_DEBUG)
+		return;
+#endif
 	SendLogMessage(nMessageType, text);
 }
 
@@ -90,6 +94,10 @@ void CApiLog::LogMessageRaw(int nMessageType, LPCTSTR pMsg) const
 	if (nMessageType>=FZ_LOG_APIERROR && (nMessageType-FZ_LOG_APIERROR)>=m_pApiLogParent->m_nDebugLevel)
 		return;
 	
+#ifdef MPEXT
+	if (nMessageType>=FZ_LOG_DEBUG)
+		return;
+#endif
 	SendLogMessage(nMessageType, pMsg);
 }
 
@@ -110,6 +118,10 @@ void CApiLog::LogMessage(int nMessageType, UINT nFormatID, ...) const
 	text.FormatV(str, ap);
 	va_end(ap);
 	
+#ifdef MPEXT
+	if (nMessageType>=FZ_LOG_DEBUG)
+		return;
+#endif
 	SendLogMessage(nMessageType, text);
 }
 
@@ -131,6 +143,11 @@ void CApiLog::LogMessage(CString SourceFile, int nSourceLine, void *pInstance, i
 	text.FormatV(pMsgFormat, ap);
 	va_end(ap);
 
+#ifdef MPEXT
+	if (nMessageType>=FZ_LOG_DEBUG)
+		return;
+#endif
+
 	CString msg;
 	msg.Format(_T("%s(%d): %s   caller=0x%08x"), SourceFile, nSourceLine, text, (int)this);
 	
@@ -154,6 +171,11 @@ void CApiLog::LogMessageRaw(CString SourceFile, int nSourceLine, void *pInstance
 	if (pos!=-1)
 		SourceFile=SourceFile.Mid(pos+1);
 	
+#ifdef MPEXT
+	if (nMessageType>=FZ_LOG_DEBUG)
+		return;
+#endif
+
 	CString msg;
 	msg.Format(_T("%s(%d): %s   caller=0x%08x"), SourceFile, nSourceLine, pMsg, (int)this);
 	

+ 51 - 31
filezilla/FileZillaIntf.cpp

@@ -76,7 +76,7 @@ void __fastcall TFileZillaIntf::Destroying()
 bool __fastcall TFileZillaIntf::SetCurrentPath(const char * APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->SetCurrentPath(Path), "setcurrentpath");
 }
 //---------------------------------------------------------------------------
@@ -159,7 +159,7 @@ bool __fastcall TFileZillaIntf::CustomCommand(const char * Command)
 bool __fastcall TFileZillaIntf::MakeDir(const char* APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->MakeDir(Path), "makedir");
 }
 //---------------------------------------------------------------------------
@@ -167,21 +167,21 @@ bool __fastcall TFileZillaIntf::Chmod(int Value, const char* FileName,
   const char* APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->Chmod(Value, FileName, Path), "chmod");
 }
 //---------------------------------------------------------------------------
 bool __fastcall TFileZillaIntf::Delete(const char* FileName, const char* APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->Delete(FileName, Path), "delete");
 }
 //---------------------------------------------------------------------------
 bool __fastcall TFileZillaIntf::RemoveDir(const char* FileName, const char* APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->RemoveDir(FileName, Path), "removedir");
 }
 //---------------------------------------------------------------------------
@@ -189,8 +189,8 @@ bool __fastcall TFileZillaIntf::Rename(const char* OldName,
   const char* NewName, const char* APath, const char* ANewPath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
-  CServerPath NewPath(ANewPath);
+  CServerPath Path(APath, FServer->nServerType);
+  CServerPath NewPath(ANewPath, FServer->nServerType);
   return Check(FFileZillaApi->Rename(OldName, NewName, Path, NewPath), "rename");
 }
 //---------------------------------------------------------------------------
@@ -203,7 +203,7 @@ bool __fastcall TFileZillaIntf::List()
 bool __fastcall TFileZillaIntf::List(const char * APath)
 {
   ASSERT(FFileZillaApi != NULL);
-  CServerPath Path(APath);
+  CServerPath Path(APath, FServer->nServerType);
   return Check(FFileZillaApi->List(Path), "list");
 }
 //---------------------------------------------------------------------------
@@ -215,7 +215,7 @@ bool __fastcall TFileZillaIntf::FileTransfer(const char * LocalFile,
 
   Transfer.localfile = LocalFile;
   Transfer.remotefile = RemoteFile;
-  Transfer.remotepath = CServerPath(RemotePath);
+  Transfer.remotepath = CServerPath(RemotePath, FServer->nServerType);
   Transfer.get = Get;
   Transfer.size = Size;
   Transfer.server = *FServer;
@@ -294,18 +294,29 @@ bool __fastcall TFileZillaIntf::HandleMessage(WPARAM wParam, LPARAM lParam)
     case FZ_MSG_ASYNCREQUEST:
       if (FZ_MSG_PARAM(wParam) == FZ_ASYNCREQUEST_OVERWRITE)
       {
-        COverwriteRequestData * Data = (COverwriteRequestData *)lParam;
-        ASSERT(Data != NULL);
         int RequestResult;
         char FileName1[MAX_PATH];
-        strncpy(FileName1, Data->FileName1, sizeof(FileName1));
-        FileName1[sizeof(FileName1) - 1] = '\0';
-        Result = HandleAsynchRequestOverwrite(
-          FileName1, sizeof(FileName1), Data->FileName2, Data->path1, Data->path2,
-          Data->size1, Data->size2, Data->time1->GetTime(), Data->time2->GetTime(),
-          (Data->time1->GetHour() != 0) || (Data->time1->GetMinute() != 0),
-          (Data->time2->GetHour() != 0) || (Data->time2->GetMinute() != 0),
-          reinterpret_cast<void*>(Data->pTransferFile->nUserData), RequestResult);
+        COverwriteRequestData * Data = (COverwriteRequestData *)lParam;
+        try
+        {
+          ASSERT(Data != NULL);
+          strncpy(FileName1, Data->FileName1, sizeof(FileName1));
+          FileName1[sizeof(FileName1) - 1] = '\0';
+          Result = HandleAsynchRequestOverwrite(
+            FileName1, sizeof(FileName1), Data->FileName2, Data->path1, Data->path2,
+            Data->size1, Data->size2,
+            (Data->time1 != NULL) ? Data->time1->GetTime() : 0,
+            (Data->time2 != NULL) ? Data->time2->GetTime() : 0,
+            (Data->time1 != NULL) && ((Data->time1->GetHour() != 0) || (Data->time1->GetMinute() != 0)),
+            (Data->time2 != NULL) && ((Data->time2->GetHour() != 0) || (Data->time2->GetMinute() != 0)),
+            reinterpret_cast<void*>(Data->pTransferFile->nUserData), RequestResult);
+        }
+        catch(...)
+        {
+          FFileZillaApi->SetAsyncRequestResult(FILEEXISTS_SKIP, Data);
+          throw;
+        }
+
         if (Result)
         {
           Data->FileName1 = FileName1;
@@ -315,19 +326,28 @@ bool __fastcall TFileZillaIntf::HandleMessage(WPARAM wParam, LPARAM lParam)
       }
       else if (FZ_MSG_PARAM(wParam) == FZ_ASYNCREQUEST_VERIFYCERT)
       {
-        CVerifyCertRequestData * AData = (CVerifyCertRequestData *)lParam;
-        ASSERT(AData != NULL);
         int RequestResult;
-        TFtpsCertificateData Data;
-        CopyContact(Data.Subject, AData->pCertData->subject);
-        CopyContact(Data.Issuer, AData->pCertData->issuer);
-        CopyValidityTime(Data.ValidFrom, AData->pCertData->validFrom);
-        CopyValidityTime(Data.ValidUntil, AData->pCertData->validUntil);
-        Data.Hash = AData->pCertData->hash;
-        Data.VerificationResult = AData->pCertData->verificationResult;
-        Data.VerificationDepth = AData->pCertData->verificationDepth;
-        
-        Result = HandleAsynchRequestVerifyCertificate(Data, RequestResult);
+        CVerifyCertRequestData * AData = (CVerifyCertRequestData *)lParam;
+        try
+        {
+          ASSERT(AData != NULL);
+          TFtpsCertificateData Data;
+          CopyContact(Data.Subject, AData->pCertData->subject);
+          CopyContact(Data.Issuer, AData->pCertData->issuer);
+          CopyValidityTime(Data.ValidFrom, AData->pCertData->validFrom);
+          CopyValidityTime(Data.ValidUntil, AData->pCertData->validUntil);
+          Data.Hash = AData->pCertData->hash;
+          Data.VerificationResult = AData->pCertData->verificationResult;
+          Data.VerificationDepth = AData->pCertData->verificationDepth;
+
+          Result = HandleAsynchRequestVerifyCertificate(Data, RequestResult);
+        }
+        catch(...)
+        {
+          FFileZillaApi->SetAsyncRequestResult(0, AData);
+          throw;
+        }
+
         if (Result)
         {
           Result = Check(FFileZillaApi->SetAsyncRequestResult(RequestResult, AData),

+ 26 - 1
filezilla/FtpControlSocket.cpp

@@ -2295,6 +2295,10 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
 			else if (nError&CSMODE_TRANSFERTIMEOUT)
 				DoClose();
 			else
+				// MPEXT: we may get here when connection was closed, when the closure
+				// was first detected while reading/writing,
+				// when we abort file transfer with regular error,
+				// possibly preventing automatic reconnect
 				ResetOperation(FZ_REPLY_ERROR);
 			return;
 		}
@@ -2789,7 +2793,17 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
 
 				if (m_pOwner->GetCurrentPath() != pData->transferfile.remotepath)
 				{
-					LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Real path and requested remote path do not match: \"%s\"  \"%s\""), m_pOwner->GetCurrentPath().GetSafePath(), pData->transferfile.remotepath.GetSafePath());
+#ifdef MPEXT
+					// More user-friendly message when the actual paths differ
+					if (m_pOwner->GetCurrentPath().GetPath() != pData->transferfile.remotepath.GetPath())
+					{
+						LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Real path and requested remote path do not match: \"%s\"  \"%s\""), m_pOwner->GetCurrentPath().GetPath(), pData->transferfile.remotepath.GetPath());
+					}
+					else
+#endif
+					{
+						LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Real path and requested remote path do not match: \"%s\"  \"%s\""), m_pOwner->GetCurrentPath().GetSafePath(), pData->transferfile.remotepath.GetSafePath());
+					}
 					nReplyError = FZ_REPLY_CRITICALERROR;
 				}
 				else
@@ -4399,6 +4413,17 @@ void CFtpControlSocket::ResetOperation(int nSuccessful /*=FALSE*/)
 	}
 	else
 	{
+#ifdef MPEXT
+		// When control socket is waiting for reply
+		// to keepalive (!IsReady), while new command comes,
+		// its execution is postponed
+		// (CMainThread::m_pPostKeepAliveCommand),
+		// but the main thread
+		// is set to busy state already (CMainThread::Command).
+		// if connection is closed before without receiving reply,
+		// main thread would stay busy forever.
+		m_pOwner->SetBusy(FALSE);
+#endif
 		//No operation in progress
 		nSuccessful&=FZ_REPLY_DISCONNECTED|FZ_REPLY_CANCEL;
 		if (!nSuccessful)

+ 8 - 0
filezilla/MainThread.cpp

@@ -324,6 +324,14 @@ void CMainThread::SetConnected(BOOL bConnected /*=TRUE*/)
 {
 	ECS;
 	m_bConnected=bConnected;
+#ifdef MPEXT
+	if (!bConnected)
+	{
+		// when we loose connection
+		// reset pending commands as we cannot fulfill them anyway
+		m_pPostKeepAliveCommand = 0;
+	}
+#endif
 	LCS;
 }
 

+ 20 - 0
forms/About.cpp

@@ -141,6 +141,26 @@ __fastcall TAboutDialog::TAboutDialog(TComponent * AOwner,
   ThirdPartyBox->VertScrollBar->Range = ThirdPartyBox->VertScrollBar->Range - FileZillaHeight;
   #endif
 
+  #ifdef NO_COMPONENTS
+  int ComponentsHeight = ThirdPartyBox->VertScrollBar->Range - Label1->Top;
+  Label1->Visible = false;
+  Label2->Visible = false;
+  Toolbar2000HomepageLabel->Visible = false;
+  Label5->Visible = false;
+  Label6->Visible = false;
+  TBXHomepageLabel->Visible = false;
+  Label8->Visible = false;
+  Label10->Visible = false;
+
+  ThirdPartyBox->VertScrollBar->Range = ThirdPartyBox->VertScrollBar->Range - ComponentsHeight;
+  #endif
+
+  #ifdef NO_FILEZILLA
+  #ifdef NO_COMPONENTS
+  ThirdPartyBox->VertScrollBar->Range = ThirdPartyBox->ClientHeight;
+  #endif
+  #endif
+
   LicenseButton->Visible = AllowLicense;
   LoadData();
 }

+ 3425 - 94
forms/About.dfm

@@ -63,100 +63,3431 @@ object AboutDialog: TAboutDialog
     Height = 32
     Center = True
     Picture.Data = {
-      055449636F6E0000010002002020000100000000A80800002600000020201000
-      00000000E8020000CE0800002800000020000000400000000100080000000000
-      0004000000000000000000000001000000000000000000000000800000800000
-      00808000800000008000800080800000C0C0C000C0DCC000F0CAA600F0FBFF00
-      A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000
-      FFFFFF0060C0EE00582000000000000000000000000000000000000001000100
-      0000000068E0EE00E0DFEE0001000000000000000000000078544C0060C0EE00
-      2020000000000000A0D7EE0048E0EE00C848EC0000000000000000002000CC00
-      00000000D01F4200A8DFEE00AC1F4200A8DFEE00000000000000000000000000
-      0000000000000000000000000000000000000000A8DFEE002A07000056070000
-      78544C0060C0EE00B81F000008E14100E0DFEE00F014EC0018E0EE0004000000
-      78544C0060C0EE00981F00000000000000000000000000000000000000000000
-      20000000200000001000000001000400D490E300280000002000000020000000
-      0100040000000000000200000000000000000000100000000000000000000000
-      00000000000000000000000000000000000000000000000078544C0060C0EE00
-      201F000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000088E1EE00
-      000000000000000000010000010000000000000038E1EE0038E1EE0098010000
-      A86B430000E0EE00B80FEC000000000008000000600000000000000060E1EE00
-      60E1EE007001000000000000000000000000000000000000D478430000E0EE00
-      84E1EE0084E1EE004C01000000000000F0E1EE0018E2EE005CDFEE0000000000
-      000000002000CC00000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000E0EE00
-      0000000000000000ECE1EE00ECE1EE00E4000000E8E0410088E1EE00B80FEC00
-      C0E1EE000800000060000000280000002300000064B841000000000008E14100
-      88E1EE00F014EC00C0E1EE000400000034E2EE0034E2EE009C000000F017EC00
-      6874000048E2EE0048E2EE008800000000000000000000000000000000000000
-      D4784300649EEE006CE2EE006CE2EE00640000000000000000000000301BEC00
-      0000000088E2EE0088E2EE0048000000E8E0410070A0EE00B80FEC00A8A0EE00
-      0800000060000000280000002300000064B841000000000008E1410070A0EE00
-      F014EC00A8A0EE00700C00001F00000090E746000000000000000000F0E2EE00
-      0000000000000000ECE2EE00ECE2EE005C060000000000000000000018000000
-      04E3EE0004E3EE00440600004C616200140000003F0100001873420000000000
-      0000000000000000000000000000000000000000000000000800010000000000
-      807B43001CE3EE000800000040000000200000004E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4EEE4E4E4E4E4E4E4E4E4E4E014E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E0101030303030303030303C40C4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E0103030303030303030303D001D04E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E01C4C4C4C4C4C4C4C4C4C42503014E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E01C490EBEB90FC262614D0ABC4010C4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E014E010101010101010101012503EE4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4ED001030101010101010101010103D0014E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E0C0103C4D0D0D0252525C403C40101014E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4EEE01010C0C0C0C0C0CC4ABC4C4034E634E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E0101EE0B0B0C0CEEEE23C4D0C4C4010C4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E01010B07070B0C0CEEEEC4D0C4C4010C4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E4E4E4EE5070B0CEEEEC4D0C4C4010C4E4E4E4E4E4E4E4E4E4EEEEEEE
-      EEEEEEEEEEEE4E4E1D070CEEEEC4C4D0C4010C4E4E4E4E4E4E4E4E4E4EEE4E7C
-      7C7C7C7C7CEE4E07070BEEEEEEC4C4D0C401EE4E4E4E0B63232323234EEE4E0F
-      EEEEEE0F7CEE4E0101010101010303D0C401EE4E4E4EEE7B898989894EEE4E0F
-      0FEE0F0F7CEE4EC4C4C4C4C4C4C4C425C401EE4E4E4EEE89898989894EEE4E0F
-      EEEEEE0F7CEE4EBCFCEB90B782722D1DD001EE4E4E4EEE0B090909094EEE4E0F
-      0FEE0F0F7CEE4ED0D0D0D0D0D0D0D0D01DC4EE4E4E4EEE63212121154EEE4E4E
-      4E4E4E4E4EEE4ED0D0C4D0D0D0D0D0D0D025EE4E4E4E217B7B7B7B894EEEEEEE
-      EEEEEEEEEEEE4E0101010101010101010101EE4E4E4E217B0B0B0B0B0B4EEE4E
-      214E4E4EEE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E0B15210B0C0CEE234EEE4E
-      21EE4E4EEE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E0C150B08070B0CEE4EEE4E
-      7BEE4E4EEE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E21150713E5070CEE0C4EEE
-      4E4E4EEE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E21210BE51D070CEE21894E
-      EEEEEE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E2189212121212121218909
-      4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E21090909090909090909A5
-      7B214E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E0C0C8F090909098F8F8FE2
-      07154E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E0C0C0909090909090909
-      E20C4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4EEEEEEEEEEEEEEEEE15
-      21EE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-      4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4EFFFFFFFFFFFF000FFFFF0007
-      FFFF0003FFFF0003FFFF0001FFFF0001FFFE0001FFFE0001FFFE0001FFFE0001
-      FFFE0001FFFFE001FF803001FFA02001C0A02001C0A02001C0A02001C0A02001
-      C0BFA001C0802001C0537FFF80537FFF80537FFF802EFFFF8011FFFF800FFFFF
-      8003FFFF8003FFFFC003FFFFE003FFFFFFFFFFFF280000002000000040000000
-      0100040000000000000200000000000000000000100000000000000000000000
-      00008000008000000080800080000000800080008080000080808000C0C0C000
-      0000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000
-      0000000000000000000000000000000000000000711111111111000000000000
-      0000000011111711171870000000000000000000177777777778180000000000
-      000000001777777777787100000000000000000018BBBBBBBB88717000000000
-      0000000011111111111187100000000000000007111111111111181000000000
-      0000000717888888887811100000000000000001117777777888111000000000
-      0000000117777774188871700000000000000001178887771888717000000000
-      0000000000088777488871700000000004747474770888777878717000000000
-      070BBBBBB70887771778717000711111070B477BB40111111178717000777777
-      040BB7BBB70888888888717000777877070B777BB70BBBBBB888811000778888
-      070BB7BBB7088888888888100071444407000000070888888888887000477777
-      0777777774011111111111700047788886704100700000000000000007477777
-      4640740040000000000000000748887746707400700000000000000007488887
-      4767000700000000000000000778888777767470000000000000000004777774
-      7778000000000000000000000488888888887400000000000000000007788888
-      8888840000000000000000000077888888888700000000000000000000074774
-      44444700000000000000000000000000000000000000000000000000FFFFFFFF
-      FFFF000FFFFF0007FFFF0003FFFF0003FFFF0001FFFF0001FFFE0001FFFE0001
-      FFFE0001FFFE0001FFFE0001FFFFE001FF802001FFA02001C0A02001C0A02001
-      C0A02001C0A02001C0BFA001C0802001C0137FFF80137FFF80137FFF800EFFFF
-      8001FFFF800FFFFF8003FFFF8003FFFFC003FFFFE003FFFFFFFFFFFF}
+      055449636F6E0000010007001010000001002000680400007600000018180000
+      0100200088090000DE0400002020000001002000A8100000660E00002A2A0000
+      01002000081D00000E1F00003030000001002000A8250000163C000040400000
+      0100200028420000BE610000808000000100200028080100E6A3000028000000
+      1000000020000000010020000000000000000000000000000000000000000000
+      000000006A6A6AED696969FF696969FF696969FF696969FF696969FF6A6A6AED
+      45DC45C954E254FF5EE75FFF69EC69FF73F074FF7EF37EFF88F788FF83F983E2
+      6BFA6B58696969FFCACACAFFC4C4C4FFBBBBBBFFB2B2B2FFA8A8A8FF696969FF
+      32D4346145DC45FC14D715FF03D904FF03DE04FF03E304FF04E804FF2DF02DFF
+      83F983E2696969FFC1C1C1FF8F8F8FFF8F8F8FFF8F8F8FFF9A9A9AFF696969FF
+      E6441E0032D4346144DC45FC07D508FF00D901FF00DE01FF00E301FF04E804FF
+      88F788FF696969FFB2B2B2FFA8A8A8FF9F9F9FFF969696FF8F8F8FFF696969FF
+      E6441E0030D0323B3DD73EF309D10AFF00D401FF00D901FF00DE01FF03E304FF
+      7EF37EFF6A6A6AED696969FF696969FF696969FF696969FF696969FF6A6A6AED
+      1EC3203729CA2AF110C912FF00CA02FF00CF01FF00D401FF00D901FF03DE04FF
+      73F074FFE6441E00666666FFBFBFBFFFE6441E00BFBFBFFF666666FF5D9C0D5B
+      1CB915FD09BD0BFF00C002FF00C502FF00CA02FF09D10AFF07D508FF03D904FF
+      69EC69FFD2752509666666FFBFBFBFFFE6441E00BFBFBFFF666666FF5D970BF7
+      03B306FF00B703FF00BB02FF00C002FF10C912FF3DD73EF444DC45FB14D715FF
+      5EE75FFFDA7D38C3666666FFBFBFBFFFBFBFBFFFBFBFBFFF666666FFAE7A09FF
+      2F9E02FF00B203FF00B703FF09BD0BFF28CA2AF22DCF2E4035D5375B45DC46FB
+      54E254FFDF7F41FE847367FE666666FF666666FF666666FF7F715EFFB66F00FF
+      AB7600FF2D9F02FF03B306FF1ABA15FD1CC21E3CE6441E00E6441E0035D5375B
+      44DC45CAE48047FFD76114FFDA7D39FAD57F35F2C96C11FFC06600FFBB6A00FF
+      B66F00FFAE7B09FF5A970BF8589D0C5EE6441E00E6441E00E6441E00E6441E00
+      32D4330EE8804DFFDA5205FFD55808FFD15E09FFCA5D00FFC56100FFC06600FF
+      BE720DFFBF801EF1B8801539E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E00EC8152FFDF4D05FFD94F00FFD45300FFCF5800FFCA5D00FFC96C11FF
+      CA7F2AF1C47D213AE6441E00E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E00F08258FFE44905FFDE4A00FFD94F00FFD45300FFD15E09FFD57F35F2
+      CF7D2D3AE6441E00E6441E00E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E00F4845EFFE84505FFE34500FFDE4A00FFD94F00FFD55808FFDA7D39FA
+      D47D3254E6441E00E6441E00E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E00F77E5BD9F05825FFE84505FFE44905FFDF4D05FFDA5205FFD76114FF
+      DA7E3AFAD47B3053E6441E00E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E00F9724F4FF77E5BD9F4845EFFF08258FFEC8152FFE8804DFFE48047FF
+      DF7F41FEDA7D38C3D2752509E6441E00E6441E00E6441E00E6441E00E6441E00
+      E6441E0000010000010000000180000001800000010000009200000090000000
+      000C0000001E0000003F0000007F000000FF000001FF000001FF000000FF0000
+      807F000028000000180000003000000001002000000000000000000000000000
+      000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00000000040000000C0000001300000017000000190000001C0000001C
+      000000180000000C00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      80D580066FDC737552D356BA4DD251C24CD350C54CD750C64BDA50C84CDD51C9
+      59CB60A7273D273A0000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      8080800262D266990BB10BFE00B600FF00C100FF00CB00FF00D600FF00E100FF
+      1FEF20FF6DDB72BC00000015FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      000000050000000C0000000E0000000E0000000E0000000E0000000E0000000E
+      0000000E101010105EC961A00BB10BFE00B600FF00C100FF00CB00FF17DA17FF
+      3EE83EFF6DEA72E000000019FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000005
+      4343432237373741313131493131314934343449343434493737374A3737374A
+      3737374A3939394C526C54613EBC41EA00AB00FF00B600FF12C512FF34D634FF
+      3EE03EFF6EE871E100000018FFFFFF00FFFFFF00FFFFFF00FFFFFF00A7A7A720
+      747474DE5C5C5CFA676767F9666666FA6D6D6DF9777777F67A7A7AF6797979F6
+      7D7D7DF6858A85F656A958FC039604FF00A000FF0DAF0DFF2AC22AFF33CD33FF
+      3DD73DFF6DE571E000000016FFFFFF00FFFFFF00FFFFFF00FFFFFF00B1B1B12B
+      444444FE282828FF323232FF3F3F3FFF3F3F3FFF3D3D3DFF454545FF434343FF
+      4B4D4BFF497D4AFF208521FF118E12FF0B990CFF1FAC1FFF29B929FF33C533FF
+      3CD03CFF6EE171DF00000014FFFFFF00FFFFFF00FFFFFF00FFFFFF00B1B1B12B
+      4A4A4AFD2C2C2CFF373737FF474747FF484848FF454545FF505050FF4D4D4DFF
+      495D49FF3F7540FF368437FF278A28FF279A28FF21A322FD43BD44F43BC13BFE
+      3CC73CFF6EDE71DE00000011FFFFFF00FFFFFF00FFFFFF00FFFFFF00AFAFAF2A
+      474747FD333333FF3E3E3EFF4E4E4EFF515151FF4D4D4DFF5C5C5CFF565656FF
+      595D59FF567357FF518652FF428D43FF3A963BFF4CB24EEB6BBE6E6676D778A6
+      44C344FE70DC73DA0000000AFFFFFF00FFFFFF00FFFFFF00FFFFFF00ADADAD29
+      414141FD393939FF444444FF545454FF595959FF535353FF666666FF5F5F5FFF
+      646464FF707470FF6F8C70FF5A8D5BFF5C9A5DFF97B397B10000001180808002
+      7ADC7DA57DE381B300000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00ADADAD29
+      4B4B4BFC404040FF494949FF5A5A5AFF606060FF585858FF707070FF686868FF
+      6B6B6BFF7D7D7DFF929692FF778F78FF788179FF9898989E00000010FFFFFF00
+      FFFFFF01A0F5AB18FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AAAAAA28
+      4F4F4FFC474747FF4D4D4DFF5F5F5FFF636363FF5D5D5DFF7A7A7AFF717171FF
+      737373FF868686FFA5A5A5FF939493FF787878FF8C8C8CA400000010FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B0B0B026
+      505050FB4D4D4DFF525252FF626262FF656565FF616161FF838383FF787878FF
+      7C7C7CFF8F8F8FFFB3B3B3FF9E9E9EFF848484FF9494949B0000000EFFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00000000010000000200000001FFFFFF00CCCCCC1F
+      5A5A5AF6545454FF565656FF656565FF676767FF666666FF8B8B8BFF7F7F7FFF
+      848484FF979797FFBEBEBEFFA5A5A5FF8F8F8FFCB4B4B47600000007FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0075645707302924100000000700000002A4A4A40B
+      A09E9C778B8A88F2A6A6A6FFA2A2A2FFA3A3A3CDB6B6B6B7C0C0C0B0999999C0
+      8E8E8EC6ADADADFDC3C3C3FFA7A7A7F6B2B2B298C3C3C32200000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00EFAA7566E9A166A11A16141E0000000C967C621B
+      E09D4372776C5AD3CFCFCFFF8B8B8BFF47443C590000000C0000000200000001
+      000000098A8A8AF8AFAFAFFF656565E10000001A00000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00F89652A9FA7106EBE19B61A9725C493AE798469B
+      E17D00927C6D57DBDDDDDDFF8B8B8BFF6C58306A52462B1200000001FFFFFF00
+      000000098F8F8FF9AFAFAFFF656565E10000001A00000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00F28E4CADFF6900FEF87006ECF09140CFEC7600C1
+      E57800AB816D55E1E2E2E2FF8B8B8BFF8A6E3B81806F4F1E0000000400000003
+      0000000D888888F7AFAFAFFF656565E10000001800000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00EB8947ADF36400FFFF6900FEF86D00EBF27200D7
+      EC7806C38B6E4FE3DBDBDBFF9F9F9FFF716A609C000000270000001C0000001C
+      1B1B1B2F7F7F7FF9ADADADFF636363DE0000001400000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00E48343ADE66000FFF36400FFFF6900FEF87208EC
+      F3780AD8C87D31D5A9A9A9FFD2D2D2FF8A8A8AF76B6B6BEA6A6A6AEA6A6A6AEA
+      717171F2A8A8A8FF8B8B8BFF5E5E5EB10000000DFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00DD7D3EAEDA5B00FFE66000FFF36A0AFFFF710EFE
+      F8730AECF28E34D88E8C89EDD8D8D8FFDBDBDBFFBABABAFFAFAFAFFFAFAFAFFF
+      AFAFAFFF9F9F9FFF676767EE0000001800000004FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00D8793BAACD5600FFDC640DFFE86C13FFF46D0FFF
+      FF6F0AFEF8740EECE4A673B27A7A79C4818181EC929292F2858585EE747474E9
+      6C6C6CE7656565CF2B2B2B1700000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00DE814A72C75F13FFD26618FFDD6814FFE76A0FFF
+      F46B0BFFFF6D06FEFA7208EAEBA266A728211D12000000090000000800000008
+      000000070000000400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00E08C6308DE844E8CDB7F44C6E08042CAE68442C9
+      ED8742C9F48A42C7FB8D43C5F9A16297E4B5941C00000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFE0300FFFC0100FFFE0100FFFF0100
+      F8000100F8000100F8000100F8001100F8001900F8001F00F8001F00F8001F00
+      F8003F00FC003F00BC7C7F00107C7F00003C7F00003C7F0000007F000000FF00
+      0001FF00807FFF00807FFF002800000020000000400000000100200000000000
+      0000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      000000040000000A0000000F0000001100000013000000140000001500000017
+      00000017000000150000000E0000000600000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000002
+      152B150C74C37B516CBB716867B36E6D65B06C6F63AD6A7161A967745FA66576
+      5CA163741B2F1F410000002A0000001500000006FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0099F0A23E
+      68DD6CD52AC42CFA22C824FF22CF24FF22D524FF22DB24FF22E124FF22E825FF
+      24EE26FE51ED56E669D570B1000000280000000DFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000100000001
+      00000001000000010000000100000001000000010000000100000001669A6605
+      77DE7CA313B213FC00B000FF00B900FF00C100FF00C900FF00D100FF00D900FF
+      00E100FF17EB17FF6DF370F3406C465000000013FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000100000004000000070000000900000009
+      0000000900000009000000090000000900000009000000090000000900000009
+      283B280D74DA79A713B213FC00B000FF00B900FF00C100FF00C900FF00D100FF
+      15DC15FF3DE83DFF49F049FF7BDE82AF00000015FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000010000000700000014000000210000002500000026
+      0000002600000026000000260000002600000026000000260000002600000026
+      000000260C120C2B71D074BD0BAE0BFF00B000FF00B900FF00C100FF12CD12FF
+      35DB35FF3CE23CFF44E944FF7EE184BA00000014FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000027272721D8282825E7676768F7A7A7A9276767695
+      767676977A7A7A937F7F7F8F8181818E8282828E8181818E8383838E8484848F
+      8686868F8C9E8EA14FBA51ED00A000FF00A800FF00B000FF0FBD0FFF2DCC2DFF
+      35D435FF3CDC3CFF44E344FF7FE285B800000013FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000003A1A1A172545454FE464646FF505050FF525252FF
+      505050FF565656FF5F5F5FFF656565FF676767FF666666FF6A6A6AFF6F6F6FFF
+      777D77FF55A557FF0B930CFF009800FF00A000FF0CAC0CFF26BC26FF2DC52DFF
+      34CE34FF3CD63CFF43DD43FF80E184B700000012FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004868686B3313131FF262626FF303030FF363636FF
+      3E3E3EFF3D3D3DFF3B3B3BFF3F3F3FFF444444FF424242FF464646FF515551FF
+      4A854BFF208521FF148B15FF09910AFF099C09FF1EAB1EFF26B526FF2DBE2DFF
+      34C734FF3BCF3BFF43D743FF81E185B600000010FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000048E8E8EAD343434FF272727FF333333FF3A3A3AFF
+      464646FF454545FF414141FF464646FF4D4D4DFF4A4A4AFF4B4C4BFF486B49FF
+      367837FF2F8330FF228723FF1A8E1BFF219D22FF1EA41EFF25AE25FF2CB72CFF
+      34C034FF3BC93BFF42D142FF82E286B50000000FFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004909090A8373737FF2B2B2BFF393939FF3E3E3EFF
+      4B4B4BFF4D4D4DFF474747FF4E4E4EFF555555FF505050FF4F574FFF49664AFF
+      477748FF418342FF358836FF319032FF2E9B2FFF29A52AF939B239F985E189D3
+      42C143FD3BC23BFF42CB42FF84E388B20000000DFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004878787AE353535FF303030FF404040FF434343FF
+      515151FF545454FF4C4C4CFF535353FF5D5D5DFF585858FF595959FF5B665BFF
+      5A775BFF568657FF498A4AFF3F8E40FF3D993EFF4AB04CF176C3788E3B4F3B0D
+      86E589AF49C44AFD43C543FF84E78AAA00000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000047A7A7AB7313131FF343434FF464646FF464646FF
+      565656FF5A5A5AFF505050FF5A5A5AFF646464FF5E5E5EFF5F5F5FFF676767FF
+      6E796EFF6E8B6FFF5C8B5DFF4E8D4FFF569D57FF9EC3A0D00000001E00000005
+      80C0800488E48BB173DA74F585DE893F00000003FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004818181AF363636FF383838FF4B4B4BFF4A4A4AFF
+      5A5A5AFF5F5F5FFF555555FF5F5F5FFF6C6C6CFF656565FF666666FF6D6D6DFF
+      7D7D7DFF879287FF728E73FF648F65FF7F927FFFAAAAAAB70000001D00000004
+      FFFFFF0080C0800496F09C860000000200000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004909090A33C3C3CFF3D3D3DFF515151FF4D4D4DFF
+      5E5E5EFF636363FF585858FF656565FF747474FF6A6A6AFF6C6C6CFF727272FF
+      848484FF9D9D9DFF8A948AFF828A82FF767676FFA2A2A2BC0000001D00000004
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000004929292A03C3C3CFF404040FF585858FF4F4F4FFF
+      616161FF656565FF5C5C5CFF6A6A6AFF7B7B7BFF717171FF727272FF777777FF
+      8C8C8CFFA7A7A7FF9A9A9AFF8A8A8AFF777777FF979797C10000001D00000004
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000039292929D3D3D3DFF454545FF5E5E5EFF505050FF
+      636363FF676767FF5E5E5EFF6E6E6EFF818181FF777777FF787878FF7E7E7EFF
+      939393FFB3B3B3FFA3A3A3FF909090FF848484FFA0A0A0B90000001C00000004
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000039595959A3E3E3EFF4B4B4BFF646464FF525252FF
+      666666FF6A6A6AFF5F5F5FFF737373FF878787FF7C7C7CFF7C7C7CFF848484FF
+      9A9A9AFFBEBEBEFFADADADFF959595FF8D8D8DFFAFAFAFAC0000001600000003
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000300000004
+      00000002FFFFFF0000000002B2B2B264666666FD626262FF7B7B7BFF656565FF
+      787878FF7B7B7BFF707070FF858585FF959595FF808080FF7D7D7DFF8F8F8FFF
+      A7A7A7FFC8C8C8FFB9B9B9FFA2A2A2FFA6A6A6FDC5C5C5790000000B00000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000048A7668190000000E
+      000000080000000200000002B5B5B517A9A6A1729A948AD0A3A3A3FFB0B0B0FF
+      9F9F9FFF9F9F9FBAB7B7B793C4C4C48DCACACA88AEAEAE96929292A5999999C5
+      B7B7B7FFC2C2C2FFA6A6A6FFA2A2A2B0B6B6B673B4B4B42200000002FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AF927D1BF9BA89CD9E7E6544
+      000000160000000B00000008AF937428E2A24A7595743F9DA6A6A6FFAFAFAFFF
+      7E7E7EFF4B494370000000160000000600000002000000020000000563636371
+      A0A0A0FFAEAEAEFF787878FF1F1F1F520000001800000004FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F4AE7E8AFB7308E9F29F5BCD
+      91755E4B0000001BA8886A38EAA24E96DD7F00879D753BA9AAAAAAFFB9B9B9FF
+      7E7E7EFF60553C7A3629091C0000000500000001FFFFFF000000000263636371
+      A5A5A5FFAEAEAEFF787878FF1F1F1F510000001700000003FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F5A36DA1FE6B00F9F96D00EA
+      EF9D5ACDBD977971EC9D4FB6E87A00A9E07B009AA57637B5ACACACFFC5C5C5FF
+      7E7E7EFF725E3786926B1A307C73610A00000001FFFFFF000000000263636371
+      A7A7A7FFAEAEAEFF787878FF1F1F1F510000001700000003FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F19E68A1F96600FFFD6A00FA
+      F86D00EBF5892FDDEF7300CCEB7700BCE57800ACAC7735C0AEAEAEFFC8C8C8FF
+      7E7E7EFF866B3D969B845C3A0000000700000004000000040000000661616174
+      9A9A9AFFAEAEAEFF787878FF2020204F0000001600000003FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EE9963A2EF6300FFF96600FF
+      FD6A00FAF86D00EBF47100DCEF7300CCEA7906BEBB772CC6ACACACFFCFCFCFFF
+      8D8D8DFF7E7465AA0000002D0000001C00000019000000190000001C5E5E5E93
+      919191FFAEAEAEFF767676FE141414410000001300000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA955EA2E66000FFEF6300FF
+      F96600FFFD6A00FAF86D00EBF47507DDEF7809CEE97D0FC29D9C9CFEE3E3E3FF
+      B6B6B6FF767676F45B5B5BAB5252529B5353539A5353539A575757AA656565F4
+      ADADADFFAEAEAEFF6C6C6CF70000002C0000000D00000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E6905AA3DD5C00FFE66000FF
+      EF6300FFF96600FFFD6F09FAF8740DECF47609DDEF7F16D08D857DF9F1F1F1FF
+      D5D5D5FFB9B9B9FF9A9A9AFF8E8E8EFF8E8E8EFF8E8E8EFF949494FFADADADFF
+      AFAFAFFFA2A2A2FF646464E00000001A0000000600000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E48B55A3D35900FFDD5C00FF
+      E66000FFF06A0BFFF96F10FFFD710CFAF87209ECF68322E1D5B092BFA1A1A1FB
+      EDEDEDFFDEDEDEFFC9C9C9FFB2B2B2FFAEAEAEFFAEAEAEFFAEAEAEFFAEAEAEFF
+      A0A0A0FF676767F62B2B2B300000000B00000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E38851A1CA5500FFD35900FF
+      DF650EFFE86C14FFF06D10FFF96E0DFFFD7009FAF8740BEBF1A96ED4A494897B
+      818181E8929292F9959595FF909090FF848484FF787878FF757575FE6D6D6DF3
+      656565DA2B2B2B240000000900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E68B5877C75A0BFECD6010FF
+      D76818FFE06914FFE86A11FFF06B0DFFF96C0AFFFD6E06FAF97409EAF4A66AD3
+      B49882565A5A5A1F0F0F0F110F0F0F110F0F0F11000000100000000F0000000D
+      000000090000000400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CD815B0AE1864FDCCA671EFF
+      CF6518FFD76615FFDF6711FFE7690EFFF0690AFFF96A07FFFE6D03F9FC6F00E8
+      FAAB6DD1D7AD9035000000040000000200000002000000020000000200000002
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EC93661CE78D5A99
+      E2884FC2E48950C4E78C51C3EC8F53C3F09255C3F39456C2F89657C1FB9F61B6
+      F6B2836FB4927C0A00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFE003
+      FFFFE003FFFFF001FFFFF801FF000001FE000001FC000001FC000001FC000001
+      FC000021FC000073FC00007BFC00007FFC00007FFC00007FFC00007FFE0000FF
+      FF0001FFBF0FE3FF1C0FE3FF0807E3FF0007E3FF0007C3FF000003FF000003FF
+      000007FF00200FFF801FFFFF800FFFFFC01FFFFF280000002A00000054000000
+      01002000000000000000000000000000000000000000000000000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      00000003000000070000000B0000000E00000010000000100000001100000013
+      00000013000000140000001500000015000000130000000E0000000800000003
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00000000020000000700000010000000180000001E0000002200000024
+      00000026000000280000002A0000002C0000002E0000002F0000002C00000024
+      000000170000000B00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000001000000038DDC913A81EA87B67DEC83D27CEB82D4
+      7BE982D57BEA82D67AEA82D67AEB81D77AEB81D879EC82D879EB81D97BEC83D8
+      73D97CB8355438520000002C0000001700000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009FF4A47867DB6AEE0DB30EFF
+      00B300FF00B900FF00BF00FF00C500FF00CB00FF00D200FF00D800FF00DE00FF
+      00E400FF00EA00FF19F31BFF82F48AEC48744E5C000000220000000DFFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000180C08008
+      88E88CAF23B824FB00AC00FF00B300FF00B900FF00BF00FF00C500FF00CB00FF
+      00D200FF00D800FF00DE00FF00E400FF16EC16FF4AF54BFF8CEE93DA00000029
+      00000011FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000020000000300000004000000050000000500000005
+      0000000500000005000000050000000500000005000000050000000500000005
+      00000005000000055681560C87E68BB021B823FB00AC00FF00B300FF00B900FF
+      00BF00FF00C500FF00CB00FF00D200FF00D800FF14E114FF3DEA3DFF43F043FF
+      8EF594ED060B062D00000013FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF000000000100000003000000070000000D0000001100000013
+      0000001300000013000000130000001300000013000000130000001300000013
+      0000001300000013000000130000001300000014263A261B83E188B420B722FC
+      00AC00FF00B300FF00B900FF00BF00FF00C500FF00CB00FF12D512FF37E037FF
+      3DE63DFF43EB43FF8CF591EF1A2A1A3100000013FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000002000000090000001500000023
+      0000002C0000002F000000300000003000000030000000300000003000000030
+      0000003000000030000000300000003000000030000000300000003000000031
+      161F163A86E28BDC09AB09FF00AC00FF00B300FF00B900FF00BF00FF10C910FF
+      31D531FF37DC37FF3DE13DFF42E742FF8CF391EF1B2B1B3000000012FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000544444417
+      868686467575755E6A6A6A6A6868686E6868686E6A6A6A6F6C6C6C6F6C6C6C6F
+      6D6D6D706D6D6D706F6F6F717070707270707072727272727373737373737373
+      757575747777777689C38ABD2EB130F900A000FF00A600FF00AC00FF00B300FF
+      0EBD0EFF2CCA2CFF32D032FF37D637FF3DDD3DFF42E242FF8CF290EF1C2D1C2E
+      00000011FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      00000006C4C4C44D747474EE5D5D5DFE636363FE6D6D6DFE6D6D6DFE686868FD
+      5E5E5EFE707070FD7F7F7FFD848484FD898989FC898989FC888888FC8A8A8AFC
+      8D8D8DFB8F8F8FFB929292FB96B696FD3BAA3CFF069607FF009A00FF00A000FF
+      00A600FF0CB00CFF26BE26FF2CC52CFF31CB31FF37D137FF3CD73CFF42DE42FF
+      8CF090EF1D2F1D2C00000010FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF000000000100000007A7A7A787474747FF1F1F1FFF2A2A2AFF313131FF
+      343434FF3D3D3DFF3E3E3EFF3C3C3CFF383838FF383838FF3F3F3FFF404040FF
+      3E3E3EFF414141FF444444FF494A49FF657B65FF389239FF148A15FF0B8F0CFF
+      049405FF009A00FF0AA40AFF20B120FF26B826FF2CC02CFF31C631FF36CD36FF
+      3CD33CFF42D842FF8CF190EE1E311E2A0000000FFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000001000000079E9E9E96484848FF1E1E1EFF
+      292929FF303030FF333333FF3D3D3DFF414141FF404040FF3C3C3CFF3D3D3DFF
+      454545FF464646FF444444FF464646FF4A4A4AFF5A685BFF3D823EFF268127FF
+      1E871FFF158B16FF0C900DFF0B970CFF1AA41AFF20AC20FF26B326FF2BBA2BFF
+      31C231FF36C836FF3CCE3CFF41D441FF8BEE8FEE203320280000000EFFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000100000007A4A4A491
+      4C4C4CFF1E1E1EFF2B2B2BFF343434FF373737FF414141FF484848FF454545FF
+      414141FF414141FF4B4B4BFF4C4C4CFF4A4A4AFF4B4B4BFF505750FF426F43FF
+      367637FF328033FF2B862CFF1F8820FF1B8F1CFF1F9920FF20A121FF20A720FF
+      25AE25FF2BB52BFF30BC30FF36C336FF3CC93CFF41CF41FF8BED90EE22362226
+      0000000DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      00000007A4A4A48F535353FF202020FF303030FF383838FF393939FF454545FF
+      4E4E4EFF4B4B4BFF454545FF464646FF525252FF535353FF4F4F4FFF4F514FFF
+      495E49FF456946FF437544FF408041FF388639FF2D872EFF2D902EFF289529FF
+      2EA62FFE22A423FA27AA27FF7BDC7EEA4BC54CFB36BD36FF3BC53BFF41CB41FF
+      8CEC90ED243A24230000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF000000000100000007A1A1A1904E4E4EFF222222FF343434FF3D3D3DFF
+      3D3D3DFF4A4A4AFF525252FF505050FF494949FF4A4A4AFF575757FF595959FF
+      555555FF545454FF545C54FF526852FF517552FF4F8150FF478748FF3F8A40FF
+      398E3AFF319232FF3CA73DFD2DA72EEF75CE77DB84C688428FE993B64FC750FB
+      3BBF3BFF40C640FF8CEC8FED2D482D1C00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00000000010000000797979795464646FF242424FF
+      383838FF424242FF404040FF4E4E4EFF565656FF565656FF4D4D4DFF4E4E4EFF
+      5D5D5DFF5F5F5FFF5A5A5AFF5A5A5AFF5D5D5DFF5F675FFF5E745EFF5F8360FF
+      598B5AFF4D8B4EFF458F46FF3C903DFF4AAA4BFC7BC97DD8648D68450000000B
+      568F560993EC97B654C955FB40C140FF8FED93E72030201000000005FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001000000079090909A
+      3F3F3FFF262626FF3C3C3CFF474747FF434343FF515151FF5A5A5AFF5A5A5AFF
+      505050FF515151FF636363FF666666FF5F5F5FFF5F5F5FFF626262FF686868FF
+      6E766EFF718771FF6A8D6BFF5A8A5BFF518E52FF478E48FF8BC18CFA9DAA9E84
+      00000020000000090000000293B7930794ED98B761CE63FC8EF092BC00000006
+      00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      0000000795959595484848FF272727FF404040FF4B4B4BFF444444FF545454FF
+      5D5D5DFF5F5F5FFF545454FF555555FF696969FF6B6B6BFF636363FF656565FF
+      656565FF6D6D6DFF797979FF858D85FF7E937EFF698C6AFF608F61FF6F9670FF
+      A5A9A6F5939393720000001F0000000900000001FFFFFF0092DB92079CF19EBD
+      99F39E3900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000001000000079C9C9C8D515151FF292929FF454545FF505050FF
+      464646FF575757FF616161FF616161FF575757FF575757FF6E6E6EFF717171FF
+      696969FF696969FF6A6A6AFF717171FF7F7F7FFF939393FF929A92FF798E79FF
+      7A917AFF787A78FF939393F6929292710000001F0000000900000001FFFFFF00
+      FFFFFF0099FF9905FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000100000007A1A1A188555555FF2B2B2BFF
+      484848FF545454FF474747FF595959FF646464FF646464FF595959FF5A5A5AFF
+      747474FF777777FF6E6E6EFF6E6E6EFF6F6F6FFF767676FF848484FF9C9C9CFF
+      A3A3A3FF8D938DFF878887FF787878FF858585F8929292710000001F00000009
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000100000007A1A1A186
+      555555FF2D2D2DFF4D4D4DFF595959FF494949FF5B5B5BFF666666FF656565FF
+      5C5C5CFF5C5C5CFF797979FF7C7C7CFF727272FF737373FF757575FF797979FF
+      8A8A8AFFA3A3A3FFAAAAAAFF979797FF8E8E8EFF7A7A7AFF838383F892929270
+      0000001F0000000900000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      00000007A1A1A185575757FF2E2E2EFF505050FF606060FF4B4B4BFF5E5E5EFF
+      696969FF676767FF5E5E5EFF5F5F5FFF7E7E7EFF818181FF767676FF767676FF
+      787878FF7D7D7DFF8F8F8FFFABABABFFB3B3B3FF9E9E9EFF929292FF7D7D7DFF
+      919191F69191916E0000001E0000000800000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF000000000100000006A5A5A582575757FF303030FF555555FF656565FF
+      4C4C4CFF5F5F5FFF6A6A6AFF676767FF5E5E5EFF616161FF838383FF858585FF
+      7A7A7AFF7B7B7BFF7D7D7DFF828282FF939393FFB2B2B2FFBBBBBBFFA5A5A5FF
+      979797FF7F7F7FFFA2A2A2F3999999690000001A0000000700000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000100000001
+      00000001FFFFFF00FFFFFF00FFFFFF0000000004AEAEAE7A595959FF323232FF
+      595959FF6A6A6AFF4B4B4BFF606060FF6B6B6BFF696969FF5D5D5DFF626262FF
+      868686FF8A8A8AFF7F7F7FFF7F7F7FFF828282FF878787FF989898FFBABABAFF
+      C0C0C0FFA8A8A8FF999999FF7C7C7CFFB2B2B2EEABABAB5C0000001200000005
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      0000000300000005000000050000000200000001FFFFFF0000000002E5E5E53E
+      7A7A7AF65A5A5AFF7A7A7AFF878787FF6A6A6AFF7D7D7DFF868686FF838383FF
+      797979FF808080FFA0A0A0FF9C9C9CFF828282FF727272FF828282FF949494FF
+      ABABABFFC7C7C7FFCDCDCDFFBABABAFFACACACFF999999FFC2C2C2CDBFBFBF43
+      0000000900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00000000022B25200A0000000D0000000D000000080000000300000001
+      00000002C0C0C017CBCBCB44A5A199AC95938FEDAFAFAFFFB6B6B6FFB6B6B6FF
+      9A9A9AFEA9A9A9A6B9B9B99AC7C7C794CECECE8FCCCCCC8FB7B7B799A4A4A4A5
+      9E9E9EA89E9E9EDCBABABAFFC6C6C6FFC5C5C5FFA5A5A5FEABABABADB8B8B890
+      CECECE4B929292100000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000005F5BF969ACFA4815E0000001A00000012
+      0000000900000005000000050000000AD6B28450D692296F766E5FD4B2B2B2FF
+      BEBEBEFFADADADFF666565FC000000370000001A0000000A0000000500000004
+      000000030000000400000009656565A79F9F9FFFAFAFAFFFACACACFF686868FC
+      00000043000000220000000B00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00967B6A13FAAB6ED3F7A059D5
+      BC9575690000001F000000150000000E0000000EDFB68863E6982E87D37D0075
+      796E5DD8B4B4B4FFC7C7C7FFADADADFF666665FC302100400000001A00000009
+      0000000200000001FFFFFF000000000100000006656565A6A3A3A3FFAFAFAFFF
+      ACACACFF686868FC00000042000000200000000900000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F0B58E67
+      FD8329F2FA6F00E6F49F59D8B891736D000000220000001BDEB2877AEC9530A3
+      E17E008FD67B00847C6F5CDBB5B5B5FFCFCFCFFFAEAEAEFF666665FC573B004C
+      513800262827240B00000002FFFFFF00FFFFFF000000000100000005656565A6
+      A7A7A7FFAFAFAFFFACACACFF686868FC00000042000000200000000900000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00F1AF847AFF791BFEFC6C00F2F86E00E7F39E59D9B58F716FDAAB8391
+      EF9131BCE87A00A9E37B009EDA7A00937E6F5ADFB7B7B7FFD6D6D6FFAEAEAEFF
+      666665FC744C005883590133AE98681B00000002FFFFFF00FFFFFF0000000001
+      00000006656565A6AAAAAAFFAFAFAFFFACACACFF686868FC0000004100000020
+      0000000900000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00EFAB807AF9751AFFFF6900FEFB6B00F3F76E00E8
+      F49E59DBF28D32D4ED7500C4EA7700B7E67900ABDF7900A0816F59E3B9B9B9FF
+      D9D9D9FFAEAEAEFF666665FD8B5A0164B391544D6E6659120000000300000002
+      000000020000000200000007656565A7A2A2A2FFAEAEAEFFACACACFF686868FC
+      000000410000001F0000000900000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EEA77B7AF37219FFF86600FF
+      FF6900FEFB6B00F3F76E00E8F47000DDF07300D1ED7500C4E97700B8E37904AE
+      847058E6BABABAFFDBDBDBFFAFAFAFFF686766FDAB874E824B433A3100000012
+      0000000B00000009000000090000000B00000010636363AA919191FFAEAEAEFF
+      ACACACFF686868FC0000003D0000001D0000000800000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EDA4777A
+      ED7018FFF16300FFF86600FFFF6900FEFB6B00F3F76E00E8F47000DDF07300D1
+      EC7806C5E87A08BB937451E2B0B0B0FFE5E5E5FFB6B6B6FF777777FE57534E77
+      04040439000000290000002300000021000000210000002300000028626262D3
+      979797FFAFAFAFFFACACACFF666666FA00000037000000190000000700000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00EB9F727BE76D18FFEA6100FFF16300FFF86600FFFF6900FEFB6B00F3
+      F76E00E8F47408DEF1790AD3ED7808C6CD8031CD939393FFF3F3F3FFBEBEBEFF
+      9E9E9EFF717171F3595959A34545458447474782474747814747478147474782
+      5E5E5EC1666666FBACACACFFAFAFAFFFA7A7A7FF646464F10000002D00000012
+      00000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00E89B6E7BE16A17FFE25E00FFEA6100FFF16300FF
+      F86600FFFF6900FEFB7009F3F7750DE9F4760ADEF07A0ED3ED841ECB807E7DFE
+      F3F3F3FFDEDEDEFFC4C4C4FFACACACFF858585FF777777FF767676FF767676FF
+      767676FF767676FF898989FFA9A9A9FFAEAEAEFFAEAEAEFF868686FF626262C9
+      0000001F0000000B00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7976A7BDB6716FFDB5C00FF
+      E25E00FFEA6100FFF16300FFF86C0AFFFF720FFEFB720DF4F7740AE9F4780FDF
+      F1841FD6BBA088E8ABABABFFFBFBFBFFE0E0E0FFC0C0C0FFB8B8B8FFB0B0B0FF
+      AEAEAEFFADADADFFADADADFFADADADFFAEAEAEFFAFAFAFFFAFAFAFFF9F9F9FFF
+      636363F706060629000000110000000500000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E795667B
+      D56415FFD45900FFDB5C00FFE25E00FFEB690CFFF26E12FFF86F0FFFFF700DFE
+      FB710AF3F7740CE9F7984AE5DCB99EA78C8C8CD3A6A6A6FEE9E9E9FFEFEFEFFF
+      E1E1E1FFCECECEFFBABABAFFB0B0B0FFAEAEAEFFADADADFFACACACFFAAAAAAFF
+      8B8B8BFF626262F953535365000000130000000700000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E892627ACF6214FFCD5600FFD45900FFDD650EFFE46B15FFEB6C12FF
+      F26D10FFF86E0DFFFF6F0AFEFB7008F3F77812E9F5A86BDFCEAE958C81818186
+      7C7C7CF1818181FB848484FF838383FF828282FF7C7C7CFF727272FF707070FF
+      6A6A6AFD656565F5656565D51F1F1F210000000E0000000600000002FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00EB94655DCD641BFEC65400FFD06010FFD86818FF
+      DE6A15FFE46A13FFEB6B10FFF26B0DFFF86C0BFFFF6E08FEFB7009F3F87710E8
+      F6A566DED1AC9184646464316D6D6D26656565326B6B6B40696969416565653F
+      5858583D5555553C202020180000000F0000000B000000070000000400000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DE8C631CDF7E43E3C35D11FF
+      CC661BFFD26618FFD86716FFDE6813FFE46810FFEB690EFFF26A0BFFF86B08FF
+      FF6C06FEFC6E03F2FA7207E6F8A25DD9DFB18E711111110F0000000700000005
+      0000000500000005000000050000000500000004000000030000000200000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001
+      EC915F7DDB834BEDC7651CFFCB6419FFD16516FFD76613FFDD6711FFE4670EFF
+      EB680BFFF16809FFF86A06FFFF6B04FEFE6D01F0FD8221E7FDC299E0D8B29928
+      000000030000000100000001000000010000000100000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000001EB916242ED9361A8EA925EB9EB9460BAED9662B9
+      EF9864B9F09A66B9F39E69B8F5A06BB8F7A26DB7F9A56FB6FCAA75B7F8B68A77
+      C29A81100000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFC00000FFFFFFFFFFC00000FFFFFFC0
+      03C00000FFFFFF8001C00000FFFFFF8000C00000FFFFFFC000C00000FFFFFFE0
+      00C00000FFFFFFF000C00000FFFFFFE000C00000FF80000000C00000FF000000
+      00C00000FF00000000C00000FF00000000C00000FF00000000C00000FF000000
+      20C00000FF00000070C00000FF00000078C00000FF000000FDC00000FF000000
+      FFC00000FF000000FFC00000FF000000FFC00000FF000000FFC00000FF000000
+      FFC00000FF800000FFC00000FF800000FFC00000FFC00001FFC00000BFE0FF07
+      FFC000009FA0FF07FFC000008F00FF07FFC000008400FF07FFC000008000FF07
+      FFC0000080007F07FFC000008000FF07FFC0000080000007FFC0000080000007
+      FFC000008000000FFFC000008000001FFFC000008000003FFFC000008001FFFF
+      FFC000008001FFFFFFC00000C000FFFFFFC00000E003FFFFFFC0000028000000
+      3000000060000000010020000000000000000000000000000000000000000000
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000020000000500000008
+      0000000B0000000D0000000E0000000F00000010000000110000001100000012
+      000000130000001300000013000000130000000F0000000B0000000600000002
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001000000040000000A00000011
+      000000170000001B0000001E0000002000000021000000230000002500000026
+      00000028000000290000002A00000028000000230000001B0000001000000007
+      00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000002000000067ECB833981DA8870
+      7CD7818478D07E8876CD7C8A75CC7A8C73CA7B8D73C87A8F71C6789070C57791
+      6FC276936EC375946EBF75925B93617117261B43000000300000001F0000000F
+      00000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF009FE89F158EED93AE65DE69E83BCD3DFC
+      31CD33FF31D033FF31D434FF31D834FF31DB34FF31DF34FF31E334FF31E734FF
+      31EA34FF31EF34FF33F236FF51F457F582F38BE957955D730000002F00000019
+      00000009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0E0A00890EC94AF2ABC2CFA00AB00FF
+      00B000FF00B600FF00BB00FF00C100FF00C600FF00CB00FF00D100FF00D600FF
+      00DC00FF00E100FF00E700FF00EC00FF1EF41EFF95F79CF0395F405000000021
+      0000000DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      000000010000000100000001000000010000000281B4810A90EB94B02ABC2CFA
+      00AB00FF00B000FF00B600FF00BB00FF00C100FF00C600FF00CB00FF00D100FF
+      00D600FF00DC00FF00E100FF14E914FF40F140FF64F865FF7EDB85B100000025
+      00000010FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000200000003000000050000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000007000000075679560F8FE991B3
+      2ABB2CFA00AB00FF00B000FF00B600FF00BB00FF00C100FF00C600FF00CB00FF
+      00D100FF00D600FF12DE12FF3BE83BFF41ED41FF4BF24BFF90F299DE00000026
+      00000010FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000002000000060000000C000000100000001300000015
+      0000001500000015000000150000001500000015000000150000001500000015
+      000000150000001500000015000000150000001500000015000000152B3D2B1D
+      8AE28EB92BBB2CFB00AB00FF00B000FF00B600FF00BB00FF00C100FF00C600FF
+      00CB00FF10D410FF36DF36FF3CE43CFF40E940FF45EE45FF95F49CE400000025
+      00000010FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000002000000060000000F0000001C000000270000002C0000002E
+      0000002F0000002F0000002F0000002F0000002F0000002F0000002F0000002F
+      0000002F0000002F0000002F0000002F0000002F0000002F0000002F00000030
+      172017398CE390D618B319FF00AB00FF00B000FF00B600FF00BB00FF00C100FF
+      0FC90FFF31D531FF36DB36FF3BE03BFF40E540FF45E945FF95F49DE400000024
+      00000010FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00000000030000000C40404024595959444C4C4C544747475A4545455D
+      4747475D4747475D4747475D4949495E4949495E4949495E4B4B4B5F4B4B4B5F
+      4B4B4B5F4D4D4D5F4D4D4D5F4D4D4D5F5050506050505060505050604F4F4F61
+      7FB1829E53C455F100A000FF00A600FF00AB00FF00B000FF00B600FF0DBE0DFF
+      2CCC2CFF31D131FF36D636FF3BDC3BFF40E040FF45E545FF95F49DE400000023
+      0000000FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000005A6A6A62BA3A3A3967C7C7CEF7D7D7DF6888888F6909090F4
+      8A8A8AF5828282F7797979F9898989F6999999F2A6A6A6F0A6A6A6EFA9A9A9EE
+      A9A9A9EFA8A8A8EFA9A9A9EEABABABEFACACACEEAEAEAEEEB1B1B1EEB0C7B1F4
+      5DBF5FFD049705FF009B00FF00A000FF00A600FF00AB00FF0BB40BFF27C127FF
+      2CC72CFF31CD31FF36D236FF3BD73BFF40DC40FF44E144FF95F59CE300000021
+      0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000006CCCCCC4C686868F92E2E2EFF2A2A2AFF333333FF373737FF
+      3B3B3BFF414141FF424242FF424242FF3E3E3EFF3F3F3FFF404040FF434343FF
+      434343FF424242FF454545FF474747FF4B4B4BFF4F4F4FFF677768FF4EA250FF
+      108D11FF09910AFF029503FF009B00FF00A000FF0AA90AFF22B622FF27BC27FF
+      2CC32CFF31C831FF36CE36FF3AD33AFF3FD83FFF44DD44FF95F49CE30000001F
+      0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007CDCDCD50616161FD1A1A1AFF232323FF2D2D2DFF313131FF
+      343434FF3C3C3CFF3E3E3EFF3E3E3EFF3A3A3AFF393939FF3C3C3CFF424242FF
+      434343FF414141FF434343FF454545FF4A4A4AFF5D685DFF4B904DFF1F8420FF
+      188919FF108D11FF09910AFF029503FF089E08FF1DAB1DFF22B222FF27B827FF
+      2CBE2CFF31C431FF35C935FF3ACF3AFF3FD43FFF44D944FF96F49CE30000001E
+      0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007CCCCCC4F686868FD191919FF232323FF2D2D2DFF313131FF
+      343434FF3E3E3EFF434343FF444444FF3E3E3EFF3E3E3EFF404040FF484848FF
+      484848FF464646FF474747FF4B4B4BFF575C57FF497E4AFF2D7B2EFF29822AFF
+      228723FF198A1AFF118E12FF0F9410FF1A9F1BFF1DA61DFF22AD22FF27B327FF
+      2CB92CFF30BF30FF35C535FF3ACA3AFF3FD03FFF44D544FF96F39BE20000001C
+      0000000DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007CBCBCB4E6F6F6FFC191919FF242424FF313131FF353535FF
+      383838FF424242FF484848FF4A4A4AFF424242FF414141FF454545FF4D4D4DFF
+      4E4E4EFF4B4B4BFF4B4B4BFF4D504DFF476948FF3A703BFF387A39FF338134FF
+      2C852DFF228723FF1E8D1FFF239624FF239E24FF20A221FE21A821FF26AE26FF
+      2CB62CFF30BB30FF35C035FF3AC73AFF3FCC3FFF44D144FF96F49CE20000001B
+      0000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007CBCBCB4E757575FB1B1B1BFF272727FF353535FF383838FF
+      3B3B3BFF454545FF4C4C4CFF4F4F4FFF454545FF464646FF494949FF535353FF
+      545454FF505050FF505050FF4C5A4CFF486549FF456E46FF437944FF3F8140FF
+      388639FF2F8730FF2F8F30FF2A922BFF2C9E2DFF2AA52BFB22A423FC2FAF2FFF
+      8FE792EC53C953FB35BC35FF3AC23AFF3EC83EFF43CD43FF97F39CE100000018
+      0000000BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007CACACA4D6F6F6FFC1C1C1CFF292929FF393939FF3C3C3CFF
+      3E3E3EFF494949FF515151FF545454FF4A4A4AFF494949FF4D4D4DFF585858FF
+      595959FF545454FF545454FF555955FF526352FF506D51FF507951FF4D834EFF
+      468847FF3F8A40FF398E3AFF329033FF369D37FF36A837F82FA930F084D987D9
+      84C4883C94ED98BA56CA57FB39BE39FF3EC33EFF43C943FF96F39DE000000014
+      00000009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C9C9C94C646464FC1D1D1DFF2C2C2CFF3D3D3DFF3F3F3FFF
+      414141FF4C4C4CFF545454FF595959FF4C4C4CFF4C4C4CFF515151FF5D5D5DFF
+      5E5E5EFF595959FF595959FF5A5A5AFF5E625EFF5C6D5CFF5D7A5EFF5B845CFF
+      568B57FF4A894BFF448E45FF3B8E3CFF419D42FF48AE49F481CE84D1688E6C3B
+      0000000C5E8D750B98EF9DBA5ACC5BFB3EBF3EFF44C545FF97F49DDB0000000E
+      00000006FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C9C9C94C585858FD1D1D1DFF2E2E2EFF424242FF434343FF
+      434343FF4F4F4FFF585858FF5F5F5FFF505050FF505050FF555555FF636363FF
+      636363FF5D5D5DFF5E5E5EFF5E5E5EFF656565FF686C68FF6A7B6AFF6B886CFF
+      648D65FF568B57FF508F51FF448D45FF4F9F50FF94CC97ED7C897E610000001B
+      00000009000000028FC88F0998F09CBC5ECD5FFB57CC58FF90F194B300000008
+      00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C8C8C84B5B5B5BFD1E1E1EFF313131FF464646FF464646FF
+      444444FF525252FF5A5A5AFF626262FF535353FF525252FF575757FF696969FF
+      686868FF616161FF626262FF626262FF696969FF6F6F6FFF7A7E7AFF7B8C7BFF
+      749175FF638B64FF5C8F5DFF508D51FF83AC84FFBBBEBBD36363634E0000001A
+      000000090000000200000001A0E0A0089AF29EBD98EE9BF08FEC974200000003
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C7C7C74A686868FB1F1F1FFF333333FF4A4A4AFF4A4A4AFF
+      464646FF555555FF5D5D5DFF656565FF565656FF555555FF5B5B5BFF6D6D6DFF
+      6E6E6EFF656565FF666666FF666666FF6D6D6DFF747474FF828282FF8E928EFF
+      869786FF718D72FF6A916BFF739073FF858685FFB0B0B0D36363634E0000001A
+      0000000900000002FFFFFF00FFFFFF00A0E0A008A5FDAB5A0000000100000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C6C6C649737373FA212121FF353535FF4E4E4EFF4D4D4DFF
+      484848FF575757FF5F5F5FFF676767FF585858FF575757FF5E5E5EFF727272FF
+      737373FF6A6A6AFF6B6B6BFF6B6B6BFF717171FF777777FF878787FF999999FF
+      989C98FF7F907FFF819281FF797979FF797979FFA7A7A7D66060604D0000001A
+      0000000900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C6C6C649767676FA212121FF383838FF535353FF505050FF
+      4A4A4AFF595959FF616161FF6A6A6AFF5B5B5BFF595959FF616161FF777777FF
+      787878FF6E6E6EFF6E6E6EFF6E6E6EFF757575FF7B7B7BFF8D8D8DFFA0A0A0FF
+      A3A3A3FF909390FF8E8E8EFF787878FF717171FF9E9E9ED96060604D0000001A
+      0000000900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000007C5C5C548767676FA222222FF3A3A3AFF585858FF545454FF
+      4B4B4BFF5B5B5BFF646464FF6C6C6CFF5B5B5BFF5C5C5CFF636363FF7B7B7BFF
+      7C7C7CFF727272FF727272FF727272FF797979FF7E7E7EFF929292FFA7A7A7FF
+      AAAAAAFF979797FF929292FF7B7B7BFF787878FF9B9B9BDB6161614C0000001A
+      0000000900000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000006C4C4C447767676FA222222FF3D3D3DFF5C5C5CFF575757FF
+      4C4C4CFF5D5D5DFF656565FF6E6E6EFF5A5A5AFF5E5E5EFF666666FF7F7F7FFF
+      818181FF767676FF767676FF767676FF7D7D7DFF828282FF979797FFAEAEAEFF
+      B1B1B1FF9D9D9DFF989898FF7D7D7DFF828282FFA4A4A4D56262624B00000019
+      0000000800000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000100000005CBCBCB45787878F9242424FF404040FF606060FF5B5B5BFF
+      4D4D4DFF5D5D5DFF686868FF707070FF5B5B5BFF5F5F5FFF686868FF848484FF
+      848484FF797979FF7A7A7AFF7A7A7AFF818181FF868686FF9D9D9DFFB5B5B5FF
+      B9B9B9FFA3A3A3FF9D9D9DFF7F7F7FFF8C8C8CFFAFAFAFCE6666664600000016
+      0000000700000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001FFFFFF00FFFFFF00FFFFFF00
+      0000000100000004D4D4D441787878F9262626FF434343FF656565FF5F5F5FFF
+      4D4D4DFF606060FF6A6A6AFF737373FF5A5A5AFF616161FF6A6A6AFF898989FF
+      898989FF7D7D7DFF7E7E7EFF7E7E7EFF868686FF898989FFA2A2A2FFBCBCBCFF
+      C0C0C0FFA8A8A8FFA2A2A2FF7D7D7DFF939393FFB9B9B9C57575753D00000011
+      0000000500000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00000000010000000200000003000000030000000200000001FFFFFF00
+      FFFFFF0000000002E3E3E33A838383F02B2B2BFF464646FF6A6A6AFF626262FF
+      4D4D4DFF616161FF6A6A6AFF737373FF5A5A5AFF606060FF6C6C6CFF8D8D8DFF
+      8D8D8DFF808080FF818181FF818181FF898989FF898989FFA3A3A3FFBDBDBDFF
+      C0C0C0FFA9A9A9FFA1A1A1FF7B7B7BFF9D9D9DFFC6C6C6A6919191300000000A
+      00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000002000000050000000800000009000000070000000300000001
+      FFFFFF0000000002DFDFDF23A6A6A692878787EF8E8E8DFAA0A09FFE9F9F9FFF
+      989898FFA3A3A3FFA6A6A6FFACACACF9A1A1A1F6A7A7A7F5B0B0B0F4C1C1C1F1
+      B4B4B4F2939393F67A7A7AF9797979F9969696F6AEAEAEFEC9C9C9FFD4D4D4FF
+      D5D5D5FFC7C7C7FFC4C4C4F7B5B5B5F2C1C1C1D1DDDDDD674545450F00000004
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000004927C6C167060541B000000130000000F0000000900000004
+      000000020000000225252507A4A4A41FD1C2AF55D5B0757E7E7D7CF8DDDDDDFF
+      C0C0C0FFB8B8B8FF838383FF787878938787874AADADAD3AC8C8C833D3D3D330
+      D4D4D431D5D5D532D5D5D532CECECE34B8B8B83C7F7F7FFBCFCFCFFFBDBDBDFF
+      B9B9B9FF828282FF737373788E8E8E55B1B1B13E888888150000000400000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000006F6BF94A4F5BD90BD4C4139290000001A000000110000000A
+      00000006000000070000000BCFB08C44E3A44C7CC37800676A6966F7DCDCDCFF
+      BBBBBBFFADADADFF6E6E6EFF4D4C478100000025000000100000000600000003
+      000000020000000200000002000000050000000D656565FAC9C9C9FFAFAFAFFF
+      AAAAAAFF676767FF1D1D1D590000002A000000120000000600000002FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00BD9B841CFCAC71DCFA7E18E0F0B98EC2403730300000001D00000013
+      0000000E0000000FD4B28E53ECA85193DA7F007AC97800756A6966F7DFDFDFFF
+      C2C2C2FFAEAEAEFF6E6E6EFF595344881F160029000000100000000500000002
+      00000001FFFFFF0000000001000000030000000C656565FACECECEFFAFAFAFFF
+      AAAAAAFF676767FF1D1D1D5800000029000000100000000500000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E6B99D46FE9141F1FB6E00E9F87E19E2EEB88DC53F352E3200000020
+      0000001AD2AD8A64EFA654AAE37E0091DB7E0088CE7800816B6966F8E1E1E1FF
+      CBCBCBFFAEAEAEFF6E6E6EFF6559408E53390034433106160000000600000002
+      FFFFFF00FFFFFF00FFFFFF00000000020000000B666666FAD3D3D3FFAFAFAFFF
+      AAAAAAFF676767FF1D1D1D5800000029000000100000000500000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00EAB99B4EFF8836FEFD6C00F3F96D00EAF67E1AE4EEB88EC73C332C35
+      CBA38378F1A457C0E97A00A9E47B009EDE7C0094D379008D6B6966F9E3E3E3FF
+      D2D2D2FFAFAFAFFF6E6E6EFF6E5E3E95775000408C650F239B90770E00000002
+      FFFFFF00FFFFFF00FFFFFF00000000020000000C676767FAD7D7D7FFAFAFAFFF
+      AAAAAAFF676767FF1D1D1D5800000029000000100000000500000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E8B4954FFB8535FFFF6900FEFC6C00F4F96D00EBF67E1BE4F3BE95D7
+      F2A15AD2ED7600C1EA7800B6E67900ABE17A00A0D77800996C6965F9E5E5E5FF
+      D5D5D5FFAFAFAFFF6E6E6EFF78623B9B9162064DC1A268395F5B540900000002
+      000000010000000100000002000000040000000D686868FACCCCCCFFAFAFAFFF
+      AAAAAAFF676767FF1D1D1D5700000028000000100000000400000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E8B1914FF78333FFF96600FFFF6900FEFB6B00F4F86D00EBF6750CE3
+      F27200D7EF7300CCEC7500C2E97800B7E57800ACDD7904A46C6965FAE6E6E6FF
+      D7D7D7FFAFAFAFFF6E6E6EFF81673BA4B2935E694D48401D0000000A00000007
+      0000000500000005000000060000000900000013676767FAB6B6B6FFAFAFAFFF
+      AAAAAAFF676767FF1E1E1E56000000260000000F0000000400000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E6AC8C50F28032FFF36400FFF96600FFFF6900FEFB6B00F4F86D00EB
+      F56F00E1F27200D7EF7300CCEC7500C2E97A06B9E27906AF6C6964FAE6E6E6FF
+      DBDBDBFFB5B5B5FF757575FF918066BA332F2941000000230000001800000014
+      0000001300000013000000140000001700000021636363F9A9A9A9FFAFAFAFFF
+      AAAAAAFF676767FF1A1A1A4E000000230000000D00000003FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E6A98750EE7E30FFEC6200FFF36400FFF96600FFFF6900FEFB6B00F4
+      F86D00EBF56F00E1F27200D7EF7707CDEC7A09C4E77906BA7D7368F5CFCFCFFF
+      E6E6E6FFBABABAFF939393FF6F6F6EDC1717174D0000003A000000310000002D
+      0000002C0000002C0000002D00000030313131586A6A6AFEAAAAAAFFAFAFAFFF
+      A9A9A9FF636363FC0000003A0000001E0000000B00000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E4A48251EA7A2FFFE66000FFEC6200FFF36400FFF96600FFFF6900FE
+      FB6B00F4F86D00EBF57408E2F3780BD8EF7809CDEC7D0FC69A7E62EAAFAFAFFF
+      F3F3F3FFC3C3C3FFB3B3B3FF777777FD6E6E6EE85C5C5CBD5B5B5BBA5B5B5BB9
+      5B5B5BB85B5B5BB85B5B5BB9616161D0626262F98D8D8DFFAEAEAEFFAFAFAFFF
+      9F9F9FFF626262F500000030000000170000000800000002FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E4A27E51E6782DFFE05D00FFE66000FFEC6200FFF36400FFF96600FF
+      FF6900FEFB710AF4F8740DECF5750BE2F27709D8EF7F14D0D1863DD6828181FF
+      F8F8F8FFE3E3E3FFC7C7C7FFB5B5B5FF9C9C9CFF838383FF7C7C7CFF7C7C7CFF
+      7C7C7CFF7C7C7CFF7B7B7BFF868686FFA3A3A3FFADADADFFAFAFAFFFADADADFF
+      7B7B7BFF616161D0000000230000000F0000000500000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E49E7951E1762CFFDA5B00FFE05D00FFE66000FFEC6200FFF36400FF
+      F96C0BFFFF720FFEFB730DF5F8730BECF5750AE2F37E16DAF18A2BD59C9289F5
+      BABABAFFFAFAFAFFE4E4E4FFC3C3C3FFBBBBBBFFB6B6B6FFAFAFAFFFADADADFF
+      ADADADFFADADADFFADADADFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFF969696FF
+      626262F80606062C000000150000000800000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E49B7551DD722AFFD35900FFDA5B00FFE05D00FFE66000FFED6A0DFF
+      F46F11FFF96F0FFFFF710DFEFB710BF4F87209ECF67A14E3F8BE90E6AF9F9472
+      919191F4B7B7B7FFF1F1F1FFECECECFFDDDDDDFFD1D1D1FFC2C2C2FFB8B8B8FF
+      B3B3B3FFB0B0B0FFAFAFAFFFAEAEAEFFAEAEAEFFA9A9A9FF888888FF626262FC
+      5555556F000000170000000A0000000400000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00E6997250D97029FFCD5600FFD35900FFDA5B00FFE2660EFFE86D14FF
+      ED6D12FFF46D10FFF96E0DFFFF6F0BFEFB7009F4F87610ECF78A30E7F2C29FD6
+      8F898559898989CB808080FD979797FFAFAFAFFFBFBFBFFFBDBDBDFFB9B9B9FF
+      A9A9A9FF989898FF939393FF8D8D8DFF787878FF666666FF626262EC43434339
+      000000130000000A0000000400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00EB99704BD66F2AFCC75400FFCD5600FFD66310FFDD6A17FFE26A14FF
+      E86B12FFED6C10FFF46C0EFFF96D0BFFFF6E09FEFC7109F4F97712ECF8892FE6
+      F4C29ED687807B4D7A7A7A477F7F7F90757575CC6C6C6CE16B6B6BE26A6A6AE2
+      686868E0656565DF636363DF656565D46565659D4C4C4C3C000000120000000C
+      000000070000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00DD8D6521DE7E42E7C15200FFCB6012FFD26719FFD76817FFDD6815FF
+      E26913FFE86A10FFED6B0EFFF46B0CFFF96C09FFFF6D07FEFC7108F4F9760EEB
+      F88527E5F5C19BD17D726C395252521F2B2B2B120000000B0000000A0000000A
+      0000000A0000000A0000000A0000000A00000009000000070000000500000003
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000003F09360CAC4621BFFC8651CFFCD651AFFD26618FFD76715FF
+      DD6713FFE26811FFE7690EFFED690CFFF36A0AFFF96A07FFFF6C05FEFD6E03F3
+      FB6F03E9FB811CE1F8C096CA816B5C1D00000008000000040000000200000002
+      00000002000000020000000200000002000000020000000200000001FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000001EC946823F09767D7D3783BFCCA671FFFCC6418FFD16416FF
+      D66613FFDC6611FFE2660FFFE7680CFFED680AFFF36908FFF96905FFFF6B03FE
+      FE6D01F2FD7D19EAFDB57FE1F2C2A0650000000400000001FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF0000000001C87D5809F095656EF19867B1F29A69BDF29D6CBD
+      F39E6FBDF4A171BCF5A374BCF6A577BCF7A879BCF9AA7CBBFAAD7FBBFBAF82BA
+      FCB384B9FAB68A90E7B6972E0000000300000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFE003F0000FFFFFFF0
+      000F0000FFFFFFF000070000FFFFFFF800030000FFFFFFFC00030000FFFFFFFE
+      00030000FFFFFFFF00030000FFFFFFFE00030000FFC0000000030000FFC00000
+      00030000FFC0000000030000FFC0000000030000FFC0000000030000FFC00000
+      00030000FFC0000001030000FFC0000003830000FFC0000007C30000FFC00000
+      07E70000FFC0000007FF0000FFC0000007FF0000FFC0000007FF0000FFC00000
+      07FF0000FFC0000007FF0000FFC0000007FF0000FFC0000007FF0000FFC00000
+      07FF0000FFC000000FFF0000FFF81FF07FFF00009FF81FF07FFF00008FD81FF0
+      7FFF000087801FF07FFF000083001FF07FFF000080001FF07FFF000080001FF0
+      7FFF000080001FF07FFF000080001FF07FFF0000800000007FFF000080000000
+      7FFF000080000000FFFF000080020001FFFF000080010003FFFF00008000C00F
+      FFFF000080007FFFFFFF000080003FFFFFFF0000C0003FFFFFFF0000F0007FFF
+      FFFF000028000000400000008000000001002000000000000000000000000000
+      000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000
+      00000001000000020000000400000007000000080000000A0000000B0000000C
+      0000000D0000000D0000000E0000000E0000000E0000000F0000001000000010
+      000000100000001000000010000000100000000E0000000C0000000900000005
+      000000030000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      0000000200000005000000080000000D00000010000000140000001600000017
+      000000190000001A0000001A0000001B0000001C0000001D0000001E0000001F
+      000000200000002100000021000000200000001D00000019000000130000000C
+      000000070000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      00000003000000070000000D000000130000001A0000001E0000002200000024
+      0000002600000028000000290000002B0000002C0000002E0000002F00000031
+      000000320000003300000033000000330000002F0000002A0000002100000017
+      0000000E0000000700000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      000000045171511088DB8E538DE893878AE891A488E48EA786E18CA985DF8BAA
+      85E08BAB84DF8AAC83DD8BAD83DC8AAE82DB89AF81DA89AF81D988B080D888B1
+      80D987B27FD886B27ED487AE6EB2758B416A465E0000003B0000003100000023
+      000000160000000C00000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      A5F2AA3C98F69ED579E97EEF55DA59FA45D548FF45D848FF45DA48FF45DC48FF
+      45DE48FF45E148FF45E348FF45E549FF45E749FF45EA49FF45EC49FF45EE49FF
+      45F049FF45F349FF48F54DFF68F76FF792FC9CF87FDA87BB192B1D4700000030
+      0000001F0000001100000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000ABD5AB06
+      A4F6A9AE65D868FA00A800FF00AC00FF00B000FF00B400FF00B900FF00BD00FF
+      00C100FF00C500FF00C900FF00CD00FF00D100FF00D500FF00D900FF00DD00FF
+      00E100FF00E500FF00E900FF00ED00FF07F308FF6EFA74FA8FED98D70404043A
+      00000027000000160000000AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000001
+      9ADFAB0F9AF1A0B94ECD51F800A800FF00AC00FF00B000FF00B400FF00B900FF
+      00BD00FF00C100FF00C500FF00C900FF00CD00FF00D100FF00D500FF00D900FF
+      00DD00FF00E100FF00E500FF00E900FF13EE13FF42F542FF9AFBA1F973BC7A8C
+      0000002C0000001A0000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000000000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000002
+      0000000291D1A1109BF2A1BA4FCD51F800A800FF00AC00FF00B000FF00B400FF
+      00B900FF00BD00FF00C100FF00C500FF00C900FF00CD00FF00D100FF00D500FF
+      00D900FF00DD00FF00E100FF12E712FF3EEE3EFF43F243FF68F86BFF91EF99D9
+      0000002F0000001C0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000
+      0000000100000002000000020000000400000004000000050000000500000005
+      0000000500000005000000050000000500000005000000050000000500000005
+      0000000500000005000000050000000500000005000000050000000500000005
+      000000050000000682A9821499F09EBC4FCD51F800A800FF00AC00FF00B000FF
+      00B400FF00B900FF00BD00FF00C100FF00C500FF00C900FF00CD00FF00D100FF
+      00D500FF00D900FF11DF11FF3AE83AFF3FEB3FFF42EF42FF50F350FFA4FDAEF8
+      0000002F0000001D0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      0000000200000005000000080000000A0000000C0000000D0000000D0000000E
+      0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E
+      0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E
+      0000000E0000000E0000000E5A765A1C97EF9DBE4FCE52F900A800FF00AC00FF
+      00B000FF00B400FF00B900FF00BD00FF00C100FF00C500FF00C900FF00CD00FF
+      00D100FF10D810FF36E136FF3BE53BFF3FE83FFF42EC42FF46EF46FFABFFB5FF
+      0000002F0000001D0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000003
+      000000070000000C00000012000000170000001A0000001C0000001D0000001D
+      0000001D0000001D0000001D0000001D0000001D0000001D0000001D0000001D
+      0000001D0000001D0000001D0000001D0000001D0000001D0000001D0000001D
+      0000001D0000001D0000001E0000001E3A4B3A2C94E898C44FCE52F900A800FF
+      00AC00FF00B000FF00B400FF00B900FF00BD00FF00C100FF00C500FF00C900FF
+      0FD00FFF32DA32FF37DE37FF3BE23BFF3EE53EFF42E942FF46EC46FFABFFB4FF
+      0000002E0000001C0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000006
+      0000000C0000001600000020000000290000002E000000310000003200000032
+      0000003200000032000000320000003200000032000000320000003200000032
+      0000003200000032000000320000003200000032000000320000003200000032
+      0000003200000032000000330000003300000035374F374A98ED9DE72DBC2FFF
+      00A800FF00AC00FF00B000FF00B400FF00B900FF00BD00FF00C100FF0DC80DFF
+      2FD32FFF33D733FF37DB37FF3BDF3BFF3EE23EFF42E642FF46E946FFABFFB4FF
+      0000002C0000001C0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000300000009
+      00000014070707230F0F0F330C0C0C3E0B0B0B460A0A0A490A0A0A4A0A0A0A4A
+      0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A
+      0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4A
+      0A0A0A4A0A0A0A4A0A0A0A4A0A0A0A4B1C221C5287CC8BBD52C755F801A001FF
+      00A400FF00A800FF00AC00FF00B000FF00B400FF00B900FF0CC00CFF2BCB2BFF
+      30D030FF33D433FF37D837FF3ADC3AFF3EDF3EFF42E342FF45E645FFABFFB4FF
+      0000002B0000001B0000000DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001000000052222220F
+      AFAFAF46B8B8B86FA1A1A19A979797B8999999BB9C9C9CBB9C9C9CBB9C9C9CBC
+      9D9D9DBE9A9A9AC09A9A9AC09E9E9EBDA1A1A1BBA6A6A6B9A7A7A7B7A7A7A7B7
+      A9A9A9B6A9A9A9B6A9A9A9B7AAAAAAB7AAAAAAB7AAAAAAB8ACACACB8ADADADB8
+      ADADADB9AEAEAEB9AFAFAFB9B2B5B2BCA9D9ACE153C156FB019801FF009C00FF
+      00A000FF00A400FF00A800FF00AC00FF00B000FF0BB70BFF27C427FF2CC82CFF
+      2FCC2FFF33D133FF37D537FF3AD83AFF3EDC3EFF42E042FF45E345FFABFFB4FF
+      0000002A0000001A0000000DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000006AFAFAF2D
+      CBCBCB696E6E6EF95E5E5EFF5C5C5CFF636363FF696969FF6E6E6EFF6C6C6CFF
+      686868FF616161FF575757FF676767FF737373FF7F7F7FFF8A8A8AFF8A8A8AFF
+      8D8D8DFF8D8D8DFF8D8D8DFF8C8C8CFF8E8E8EFF8E8E8EFF909090FF929292FF
+      939393FF969696FF9A9B9BFF9FC0A1FF58BA5AFF0F9710FF069607FF009800FF
+      009C00FF00A000FF00A400FF00A800FF0AAF0AFF23BB23FF28C028FF2CC52CFF
+      2FC92FFF33CD33FF36D136FF3AD53AFF3ED93EFF41DD41FF45E045FFABFFB3FF
+      00000029000000190000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CDCDCD44
+      868686CA4D4D4DFF1B1B1BFF232323FF2A2A2AFF313131FF323232FF353535FF
+      3B3B3BFF3E3E3EFF3F3F3FFF3F3F3FFF3A3A3AFF393939FF383838FF383838FF
+      3D3D3DFF3D3D3DFF3E3E3EFF3C3C3CFF3D3D3DFF404040FF424242FF454545FF
+      474747FF4E4E4EFF738C74FF4CA34DFF138A14FF0E8E0FFF09910AFF049405FF
+      009800FF009C00FF00A000FF09A709FF1FB31FFF24B824FF28BC28FF2BC12BFF
+      2FC62FFF33CA33FF36CE36FF3AD23AFF3ED63EFF41DA41FF45DD45FFABFFB3FF
+      00000027000000180000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CCCCCC46
+      797979EA434343FF1B1B1BFF222222FF292929FF313131FF313131FF333333FF
+      3A3A3AFF3E3E3EFF3E3E3EFF3E3E3EFF3A3A3AFF393939FF393939FF3A3A3AFF
+      414141FF424242FF424242FF404040FF414141FF444444FF464646FF494949FF
+      4E4E4EFF6B7E6CFF4C974DFF1E831FFF1A881BFF148B15FF0E8E0FFF09910AFF
+      049405FF009800FF089F08FF1CAA1CFF20AF20FF24B424FF28B928FF2BBD2BFF
+      2FC22FFF32C732FF36CB36FF3ACF3AFF3DD33DFF41D741FF45DA45FFABFFB3FF
+      00000026000000170000000CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CCCCCC46
+      7D7D7DE8464646FF1A1A1AFF222222FF292929FF313131FF303030FF323232FF
+      3A3A3AFF3F3F3FFF414141FF424242FF3E3E3EFF3C3C3CFF3D3D3DFF3D3D3DFF
+      454545FF464646FF464646FF434343FF444444FF474747FF494949FF4D4D4DFF
+      616E61FF4A884BFF297D2AFF258126FF218622FF1A881BFF148B15FF0F8F10FF
+      09910AFF0B970CFF18A218FF1CA71CFF20AC20FF23B123FF27B527FF2BBA2BFF
+      2FBE2FFF32C332FF36C836FF3ACC3AFF3DD03DFF41D441FF44D744FFABFFB3FF
+      00000025000000170000000BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CBCBCB45
+      838383E4484848FF191919FF222222FF292929FF323232FF323232FF343434FF
+      3D3D3DFF424242FF454545FF474747FF414141FF3F3F3FFF3F3F3FFF404040FF
+      494949FF4A4A4AFF4B4B4BFF484848FF484848FF4A4A4AFF4D4D4DFF586158FF
+      477848FF327433FF317C32FF2D812EFF29852AFF228723FF1B891CFF158C16FF
+      139114FF1C991DFF1EA01FFF1CA31CFF20A820FF23AD23FF27B227FF2BB72BFF
+      2EBB2EFF32C032FF36C436FF39C939FF3DCD3DFF41D141FF44D444FFABFFB2FF
+      00000023000000160000000BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CBCBCB45
+      878787E24A4A4AFF1A1A1AFF242424FF2C2C2CFF363636FF343434FF373737FF
+      404040FF454545FF494949FF4B4B4BFF444444FF424242FF424242FF434343FF
+      4D4D4DFF4E4E4EFF4F4F4FFF4B4B4BFF4B4B4BFF4D4D4DFF4D524DFF476948FF
+      3C6C3DFF3A733BFF397B3AFF368137FF318532FF2A862BFF228723FF208C21FF
+      249325FF239824FF249F25FF22A323FE1FA51FFF23AA23FF27AF27FF2CB42CFF
+      2EB82EFF32BC32FF36C136FF39C539FF3DCA3DFF40CE40FF44D244FFABFFB2FF
+      00000021000000150000000AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CACACA44
+      8B8B8BE04E4E4EFF1B1B1BFF262626FF2F2F2FFF393939FF373737FF393939FF
+      434343FF484848FF4D4D4DFF4F4F4FFF474747FF454545FF454545FF464646FF
+      515151FF535353FF535353FF4F4F4FFF4F4F4FFF505250FF4A5C4AFF466347FF
+      446A45FF437344FF417A42FF3F8140FF3A853BFF328633FF2D882EFF309031FF
+      2B922CFF289529FF2CA02DFF2BA52CFC23A424FA23A623FF29AD29FF7FDF83F6
+      6FD872FA32B932FF35BD35FF39C239FF3DC63DFF40CB40FF44CF44FFABFFB2FF
+      0000001F0000001300000009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007CACACA44
+      8B8B8BDF4D4D4DFF1C1C1CFF272727FF323232FF3D3D3DFF3A3A3AFF3C3C3CFF
+      454545FF4B4B4BFF505050FF535353FF4A4A4AFF484848FF484848FF494949FF
+      555555FF575757FF575757FF525252FF525252FF525352FF505B50FF506450FF
+      4C694DFF4B714CFF4A7A4BFF488149FF448645FF3C863DFF3A8B3BFF378E38FF
+      318F32FF2D932EFF34A035FF33A834FA28A529F327A627F879D67BF39BEAA0A1
+      9DF3A2C671D974FA35BA35FF39BE39FF3CC33CFF40C740FF44CC44FFABFFB2FF
+      0000001C0000001100000008FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C9C9C943
+      828282E3484848FF1D1D1DFF292929FF343434FF404040FF3C3C3CFF3D3D3DFF
+      484848FF4D4D4DFF535353FF575757FF4D4D4DFF4A4A4AFF4B4B4BFF4B4B4BFF
+      595959FF5A5A5AFF5B5B5BFF565656FF575757FF565656FF585958FF586358FF
+      546854FF547155FF557B56FF538354FF508851FF488949FF418942FF3F8F40FF
+      388E39FF349135FF3CA03DFF3CAA3DF830A730ED73CE75E99ADE9C951D2B1D12
+      76A676169FF4A4C774D976FA38BB38FF3CC03CFF40C440FF44C844FFABFFB1FF
+      000000170000000E00000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C9C9C943
+      7A7A7AE6444444FF1E1E1EFF2B2B2BFF373737FF444444FF3F3F3FFF3F3F3FFF
+      4A4A4AFF505050FF555555FF5B5B5BFF515151FF4D4D4DFF4D4D4DFF4D4D4DFF
+      5D5D5DFF5F5F5FFF5F5F5FFF595959FF595959FF595959FF5B5B5BFF606160FF
+      5C675CFF5D715DFF5F7C60FF5E845FFF5B8A5CFF518952FF4B8B4CFF478E48FF
+      3F8E40FF3B903CFF45A046FF47AC48F677CA79E792CA948E121C121C0000000B
+      000000058FC98F129FF5A4C776DA78FA3CBD3CFF40C140FF46C647FFA9FFAFFC
+      000000110000000A00000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C8C8C842
+      717171EA404040FF1E1E1EFF2D2D2DFF3A3A3AFF474747FF414141FF404040FF
+      4C4C4CFF525252FF585858FF5E5E5EFF535353FF4F4F4FFF4F4F4FFF505050FF
+      616161FF626262FF636363FF5D5D5DFF5E5E5EFF5D5D5DFF5E5E5EFF646464FF
+      666766FF677267FF6A7E6AFF69866AFF678D68FF5A895BFF548B55FF508E51FF
+      468C47FF428F43FF4EA14FFF81C883F5AACDABAD0B0B0B2D0000001700000009
+      0000000400000002A0E1A010A0F6A5C778DB7AFA40BE40FF5ACE5BFF9CF7A0E2
+      0000000B0000000700000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C8C8C842
+      6D6D6DEC404040FF1F1F1FFF2E2E2EFF3D3D3DFF4B4B4BFF444444FF424242FF
+      4E4E4EFF535353FF5A5A5AFF616161FF565656FF525252FF515151FF535353FF
+      656565FF666666FF676767FF606060FF606060FF606060FF616161FF676767FF
+      696969FF707170FF768176FF768A76FF739074FF668B67FF5D8B5EFF588F59FF
+      4E8C4FFF4A8F4BFF7AB57CFFB9CEBAE59C9E9C780000002A0000001600000009
+      00000003000000010000000197E397119FF6A6C87BDC7EFA84E286FA95F79C9A
+      000000060000000400000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C7C7C741
+      767676E8444444FF1F1F1FFF313131FF3F3F3FFF4F4F4FFF464646FF434343FF
+      4F4F4FFF565656FF5C5C5CFF626262FF585858FF545454FF535353FF545454FF
+      686868FF6A6A6AFF6B6B6BFF636363FF636363FF646464FF646464FF6A6A6AFF
+      6D6D6DFF747474FF818281FF838E83FF819581FF738F74FF678B68FF629063FF
+      578C58FF6B9C6CFF97A498FFB4B4B4DB9C9C9C770000002A0000001500000009
+      0000000300000001000000000000000197E39711A2F7A7C8A4F9A9E681DB8E14
+      000000020000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C7C7C741
+      7D7D7DE3494949FF202020FF313131FF424242FF535353FF484848FF454545FF
+      525252FF585858FF5E5E5EFF656565FF5B5B5BFF555555FF555555FF565656FF
+      6B6B6BFF6E6E6EFF6E6E6EFF666666FF676767FF676767FF666666FF6D6D6DFF
+      707070FF787878FF868686FF909190FF8F9A8FFF7F927FFF728E73FF6D916EFF
+      6D936EFF7F877FFF848484FFACACACDE9B9B9B770000002A0000001500000009
+      0000000300000001FFFFFF000000000000000000A0F0A010A8FCAC3A00000001
+      000000010000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C6C6C640
+      868686DF4F4F4FFF212121FF343434FF454545FF565656FF494949FF454545FF
+      545454FF5A5A5AFF606060FF686868FF5D5D5DFF575757FF585858FF585858FF
+      707070FF717171FF727272FF696969FF6A6A6AFF6B6B6BFF6A6A6AFF707070FF
+      737373FF7B7B7BFF8A8A8AFF969696FF9D9E9DFF8C968CFF7C8F7CFF7C947CFF
+      7F837FFF767676FF7C7C7CFFA4A4A4E19B9B9B770000002A0000001500000009
+      0000000300000001FFFFFF00FFFFFF00FFFFFF00000000000000000000000000
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C6C6C640
+      8A8A8ADC505050FF212121FF353535FF484848FF5A5A5AFF4C4C4CFF464646FF
+      545454FF5B5B5BFF626262FF6A6A6AFF5E5E5EFF595959FF595959FF5B5B5BFF
+      727272FF757575FF767676FF6D6D6DFF6D6D6DFF6D6D6DFF6C6C6CFF737373FF
+      757575FF7F7F7FFF8E8E8EFF9B9B9BFFA3A3A3FF989998FF8A938AFF8C8E8CFF
+      7C7C7CFF777777FF747474FF9D9D9DE49A9A9A760000002A0000001500000009
+      0000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C5C5C540
+      8B8B8BDB515151FF232323FF373737FF4A4A4AFF5F5F5FFF4E4E4EFF474747FF
+      565656FF5D5D5DFF646464FF6A6A6AFF5E5E5EFF5B5B5BFF5A5A5AFF5C5C5CFF
+      767676FF797979FF797979FF6F6F6FFF707070FF707070FF707070FF767676FF
+      787878FF818181FF939393FFA0A0A0FFAAAAAAFF9E9E9EFF939393FF929292FF
+      7F7F7FFF787878FF6E6E6EFF959595E79A9A9A760000002A0000001500000009
+      0000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C5C5C540
+      8B8B8BDA515151FF222222FF393939FF4D4D4DFF636363FF505050FF484848FF
+      595959FF5F5F5FFF666666FF6D6D6DFF5F5F5FFF5D5D5DFF5D5D5DFF5D5D5DFF
+      797979FF7C7C7CFF7D7D7DFF727272FF737373FF737373FF737373FF797979FF
+      7A7A7AFF848484FF979797FFA6A6A6FFB0B0B0FFA2A2A2FF979797FF969696FF
+      818181FF7B7B7BFF787878FF979797E699999974000000290000001500000009
+      0000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000007C5C5C540
+      8C8C8CD9525252FF232323FF3B3B3BFF505050FF676767FF525252FF484848FF
+      595959FF606060FF676767FF6F6F6FFF5F5F5FFF5D5D5DFF5D5D5DFF5F5F5FFF
+      7C7C7CFF808080FF808080FF767676FF767676FF767676FF757575FF7C7C7CFF
+      7C7C7CFF878787FF9B9B9BFFABABABFFB6B6B6FFA8A8A8FF9C9C9CFF9A9A9AFF
+      848484FF7C7C7CFF828282FF9F9F9FE29A9A9A74000000280000001500000008
+      0000000300000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000006C9C9C93D
+      8C8C8CD8535353FF242424FF3D3D3DFF525252FF6B6B6BFF545454FF494949FF
+      5B5B5BFF616161FF696969FF707070FF606060FF5D5D5DFF5F5F5FFF5F5F5FFF
+      808080FF838383FF838383FF787878FF797979FF797979FF797979FF808080FF
+      808080FF8A8A8AFFA0A0A0FFAFAFAFFFBBBBBBFFADADADFFA1A1A1FF9F9F9FFF
+      868686FF7E7E7EFF8C8C8CFFA6A6A6DD9B9B9B71000000260000001300000008
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000200000005CECECE3B
+      8E8E8ED6535353FF252525FF3F3F3FFF555555FF707070FF565656FF494949FF
+      5B5B5BFF636363FF6A6A6AFF717171FF606060FF5E5E5EFF616161FF626262FF
+      838383FF868686FF868686FF7A7A7AFF7B7B7BFF7B7B7BFF7B7B7BFF838383FF
+      818181FF8D8D8DFFA4A4A4FFB5B5B5FFC0C0C0FFB2B2B2FFA6A6A6FFA4A4A4FF
+      888888FF7F7F7FFF949494FFAFAFAFD8A2A2A26C000000220000001100000007
+      0000000200000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000100000001
+      0000000100000000FFFFFF00FFFFFF00000000000000000100000004D6D6D638
+      8F8F8FD4545454FF272727FF414141FF585858FF747474FF595959FF494949FF
+      5C5C5CFF636363FF6A6A6AFF737373FF606060FF5C5C5CFF616161FF636363FF
+      868686FF8A8A8AFF898989FF7D7D7DFF7E7E7EFF7F7F7FFF7F7F7FFF868686FF
+      858585FF8F8F8FFFA7A7A7FFBABABAFFC5C5C5FFB5B5B5FFA8A8A8FFA5A5A5FF
+      868686FF7C7C7CFF9C9C9CFFB9B9B9D1ADADAD640000001B0000000E00000005
+      0000000200000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000000000001000000020000000200000002
+      00000002000000010000000100000000000000000000000100000003E0E0E036
+      949494C05E5E5EFF282828FF444444FF5B5B5BFF797979FF5A5A5AFF494949FF
+      5D5D5DFF656565FF6C6C6CFF737373FF616161FF5C5C5CFF606060FF636363FF
+      888888FF8D8D8DFF8D8D8DFF7F7F7FFF808080FF808080FF818181FF898989FF
+      878787FF909090FFA9A9A9FFBBBBBBFFC5C5C5FFB5B5B5FFA8A8A8FFA5A5A5FF
+      848484FF7A7A7AFFA3A3A3FFC3C3C3BCBEBEBE5B000000130000000900000004
+      00000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000100000002000000040000000600000006
+      00000005000000030000000200000001000000000000000100000002E1E1E125
+      D3D3D359848484FB616161FF6E6E6EFF818181FF999999FF808080FF717171FF
+      818181FF888888FF8D8D8DFF939393FF838383FF818181FF848484FF888888FF
+      A6A6A6FFA9A9A9FF9C9C9CFF868686FF797979FF6E6E6EFF7A7A7AFF8C8C8CFF
+      989898FFA9A9A9FFBCBCBCFFCBCBCBFFD3D3D3FFC7C7C7FFBEBEBEFFBBBBBBFF
+      A3A3A3FFA2A2A2FFBDBDBDF7D4D4D47AC1C1C13F0000000B0000000500000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000200000005000000080000000B0000000C
+      0000000A000000070000000500000002000000010000000100000002A4A4A40B
+      E6E6E640CDCDCD5C989898BE9E9D9BDDA09E9BF09E9E9EFFB6B6B6FFB0B0B0FF
+      B4B4B4FFB6B6B6FFA8A8A8FFB1B1B1E3B5B5B5D0BABABACCC0C0C0CAC6C6C6C8
+      CECECEC2CECECEC2C5C5C5C5AFAFAFCEA0A0A0D4919191DC929292DBA2A2A2D5
+      A9A9A9F0B3B3B3FFD1D1D1FFCFCFCFFFD0D0D0FFCACACAFFB6B6B6FFBFBFBFDD
+      BCBCBCD1C0C0C0BED6D6D679E0E0E05E7B7B7B13000000050000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000400000008C9AB953714110F1400000014
+      000000120000000E000000090000000500000002000000020000000300000005
+      0000000995939322DAC5AB64D7AB667D8F836CBA787878FFE6E6E6FFC4C4C4FF
+      B7B7B7FFB0B0B0FF727272FF6D6D6D995F5F5F467E7E7E37A0A0A02BB6B6B626
+      C6C6C624CBCBCB23CBCBCB23CBCBCB23CDCDCD24CDCDCD24C3C3C326ABABAB2B
+      7E7E7EC2838383FFCBCBCBFFB9B9B9FFB8B8B8FFAFAFAFFF707070FF6363637E
+      646464528181813F9191912A0000000A00000005000000020000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000005AD907D1FFCCBA6DFEEC09E9F0D0C0A1E
+      0000001B000000150000000F0000000900000006000000050000000600000009
+      26221F0FDFC09B61E4A54A7EC67A0066847255B76B6B6BFFE8E8E8FFC3C3C3FF
+      B0B0B0FFA7A7A7FF626262FF52504D8F0000002F0000001C0000000E00000007
+      000000040000000300000002000000020000000200000003000000050000000B
+      676767B9747474FFC6C6C6FFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF3030306A
+      00000036000000210000001100000007000000020000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000006F8C39EADFC8D34E6FAA45FDFE7BB99A5
+      0B0908250000001E00000017000000100000000C0000000A0000000B29252111
+      E5C39F70EBA74E8FD9800073CA7A0070877353BB6B6B6BFFEBEBEBFFC8C8C8FF
+      B1B1B1FFA7A7A7FF626262FF5A554B93191200330000001B0000000E00000006
+      0000000200000001000000010000000000000000000000010000000300000009
+      686868B9767676FFC8C8C8FFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF3030306A
+      000000360000002000000010000000060000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000007FDC7A2E6FC6F01E8F97000E0F8A45FE1
+      E4B997A80A090828000000200000001900000013000000111E1A1715E7C39E80
+      EEA64FA1E1810085D87E007ECD79007A8A7451BF6B6B6BFFEDEDEDFFCECECEFF
+      B3B3B3FFA7A7A7FF626262FF605948983C2A003B271C00200000000E00000006
+      000000020000000100000000FFFFFF00FFFFFF00000000010000000300000009
+      686868B8777777FFCACACAFFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF3030306A
+      00000035000000200000000F000000060000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0096786513FDBF94EAFD6C00F0FB6E00E9F87000E2
+      F7A45FE3E3B897AB0A090829000000220000001D1915131EE8C19E91F1A450B3
+      E57E0096E07E008FDB7D0088D07900838D7450C36B6B6BFFF0F0F0FFD3D3D3FF
+      B4B4B4FFA7A7A7FF626262FF685D469C573B0044563C00294430031400000007
+      000000030000000100000000FFFFFF00FFFFFF00000000010000000300000009
+      686868B8797979FFCCCCCCFFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF3030306A
+      00000035000000200000000F000000060000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00AE8A7317FDB98DEBFE6B00F9FC6C00F1F96E00EA
+      F76F00E2F7A460E3E2B796AD0A08072C14110F2AE7BD9AA2F2A351C3E97A00A9
+      E67B00A1E17C0099DC7C0092D479008D90744EC76B6B6BFFF2F2F2FFD9D9D9FF
+      B5B5B5FFA7A7A7FF626262FF6E6045A06F4B004C77510031845E091DA2957812
+      000000030000000100000000FFFFFF00FFFFFF00000000010000000300000009
+      686868B97B7B7BFFCECECEFFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF3030306A
+      00000035000000200000000F000000060000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A7826C18FCB689EBFD6800FFFE6A00F9FB6B00F1
+      F96D00EBF66F00E3F7A460E4E2B796AEE6BB99B2F3A053D1EC7700BBEA7900B3
+      E67900ABE37A00A3DE7A009BD779009593754DCB6B6B6BFFF4F4F4FFDCDCDCFF
+      B6B6B6FFA7A7A7FF626262FF746243A4815500539061013AC09E5A349B928212
+      0000000300000001000000000000000000000000000000010000000300000009
+      676767B97D7D7DFFC6C6C6FFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF30303069
+      000000350000001F0000000F000000060000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A7806A18FBB487EBF96600FFFD6800FFFD6A00F9
+      FB6B00F2F86D00EBF66F00E3F7A460E4F59F54DEF07400CBED7500C4EB7700BC
+      E87800B4E57800ABE17900A4DA78009E96754CCF6B6B6BFFF5F5F5FFDDDDDDFF
+      B6B6B6FFA7A7A7FF626262FF796441A98E5C005CBD985457B0A2892D05040408
+      000000040000000200000002000000020000000200000003000000050000000C
+      676767BA7B7B7BFFB8B8B8FFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF31313168
+      000000340000001E0000000E000000050000000200000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A77F6718FAB284EBF46500FFF96600FFFD6800FF
+      FD6A00FAFB6B00F2F86D00EBF66F00E3F47100DCF27300D4EF7300CCED7500C4
+      EB7700BCE87800B4E47800ACE07A04A799764BD36B6B6BFFF7F7F7FFDEDEDEFF
+      B6B6B6FFA7A7A7FF626262FF7E663FAEB68F507C9B8C764A030303140000000C
+      0000000800000007000000060000000600000007000000070000000A00000011
+      666666BB747474FFADADADFFAFAFAFFFAEAEAEFFA4A4A4FF5C5C5CFF31313168
+      000000320000001D0000000E000000050000000100000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A77D6518FAAF81EBEF6300FFF46500FFF96600FF
+      FD6800FFFD6A00FAFB6B00F2F86D00EBF66F00E3F47100DCF17200D4EF7300CC
+      EC7500C4EA7600BCE87B06B6E37A06AF9C7549D66B6B6BFFF8F8F8FFE1E1E1FF
+      B9B9B9FFAAAAAAFF656565FF937F61C28D7D696B0000002C0000001E00000016
+      000000120000001100000010000000100000001000000012000000150000001C
+      656565BE6E6E6EFFABABABFFAFAFAFFFAEAEAEFFA3A3A3FF5C5C5CFF32323265
+      0000002F0000001A0000000C000000040000000100000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A1775F19F9AD7EEBEB6100FFEF6300FFF46500FF
+      F96600FFFD6800FFFD6A00FAFB6B00F2F86D00EBF66F00E3F47100DCF17200D4
+      EF7300CCED7907C5EB7B08BFE77A06B7B57733CB666666FFF8F8F8FFEAEAEAFF
+      BEBEBEFFB0B0B0FF737373FF797672DD0E0E0E4B0000003A0000002E00000027
+      000000230000002200000021000000210000002200000023000000260000002D
+      636363E5737373FFACACACFFAFAFAFFFAEAEAEFF9C9C9CFF5D5D5DFF0B0B0B45
+      0000002B000000170000000A0000000300000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A1755D19F8AA7BEBE66000FFEB6100FFEF6300FF
+      F46500FFF96600FFFD6800FFFD6A00FAFB6B00F2F86D00EBF66F00E3F47100DC
+      F17608D5F0790ACEED7A08C6EA7B0AC0E58013BC6A6969FFE5E5E5FFF2F2F2FF
+      C4C4C4FFB7B7B7FF898989FF6E6E6EFB2A2A2A601010104E000000420000003C
+      0000003900000038000000380000003800000038000000390000003C1414144B
+      5F5F5FFE898989FFAEAEAEFFAFAFAFFFAEAEAEFF8C8C8CFF616161FA0000003A
+      0000002500000013000000080000000200000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A1735B19F7A778EBE15E00FFE66000FFEB6100FF
+      EF6300FFF46500FFF96600FFFD6800FFFD6A00FAFB6B00F2F86D00EBF67409E4
+      F5780CDDF2780AD5EF7809CDED7D10C8E98219C4757371FDC5C5C5FFF9F9F9FF
+      D3D3D3FFBEBEBEFFB1B1B1FF777777FF6C6C6CFE6B6B6BE5606060D15F5F5FD0
+      606060D0606060D0606060D0606060D0606060D0606060CF626262EA5E5E5EFE
+      6E6E6EFFAAAAAAFFAFAFAFFFAFAFAFFFACACACFF7A7A7AFF626262EA00000032
+      0000001E0000000F000000060000000200000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF009B6E561AF6A575EBDD5C00FFE15E00FFE66000FF
+      EB6100FFEF6300FFF46500FFF96600FFFD6800FFFD6A00FAFB710AF2F8750DEC
+      F6760CE4F4770ADDF1780BD5EF7E14D0ED841CCA897D71F68D8D8DFFFAFAFAFF
+      F0F0F0FFCECECEFFBEBEBEFFB4B4B4FF939393FF7D7D7DFF727272FF6E6E6EFF
+      6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF757575FF8B8B8BFF
+      AAAAAAFFAFAFAFFFAFAFAFFFAEAEAEFFA3A3A3FF636363FF5E5E5EB800000028
+      000000170000000A0000000400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF009B6C531AF5A272EBD85A00FFDD5C00FFE15E00FF
+      E66000FFEB6100FFEF6300FFF46500FFF96600FFFD6E0BFFFD730FFAFB730DF3
+      F8740CECF6750AE4F4780DDEF27E16D8F0841FD2E48C36D27E7D7CFFCACACAFF
+      FAFAFAFFEBEBEBFFD0D0D0FFBEBEBEFFB9B9B9FFB3B3B3FFAFAFAFFFAAAAAAFF
+      AAAAAAFFAAAAAAFFAAAAAAFFAAAAAAFFAAAAAAFFABABABFFADADADFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAEAEAEFFABABABFF787878FF616161F60000002D0000001C
+      0000000F000000070000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF009B6A511AF4A06FEBD35900FFD85A00FFDD5C00FF
+      E15E00FFE66000FFEB6100FFEF6300FFF56C0CFFF97010FFFD710FFFFD720DFA
+      FB720CF3F8730AECF6760DE4F57D15DFF28420D9F6B983E1B2A69CD8959595FF
+      EBEBEBFFF9F9F9FFEEEEEEFFD2D2D2FFC6C6C6FFC0C0C0FFBABABAFFB4B4B4FF
+      B2B2B2FFB0B0B0FFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAAAAAAFF8B8B8BFF5E5E5EFE484848630000001F00000012
+      00000009000000040000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF009B694F1AF49E6CEBCF5700FFD35900FFD85A00FF
+      DD5C00FFE15E00FFE66000FFEC690DFFF06E12FFF56F11FFF96F0FFFFD700DFF
+      FD710CFAFB710AF2F8740CECF67A14E5F89B4EE8F7CFB3E57E7E7D54969696DB
+      989898FFC6C6C6FFF4F4F4FFF1F1F1FFE9E9E9FFE0E0E0FFD7D7D7FFCCCCCCFF
+      C3C3C3FFBCBCBCFFB6B6B6FFB1B1B1FFAEAEAEFFAEAEAEFFAEAEAEFFAFAFAFFF
+      ADADADFFA3A3A3FF767676FF5E5E5EFE626262AA0000001E000000130000000A
+      000000050000000200000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00A76F5318F39B69EBCA5500FFCF5700FFD35900FF
+      D85A00FFDD5C00FFE3670FFFE86D14FFEC6D13FFF06D11FFF56E0FFFF96E0DFF
+      FD6F0CFFFD700AFAFB710AF2F87711EDF77D19E6F8B177E9EAC4AAC281818054
+      9696969A858585FC888888FFAAAAAAFFC3C3C3FFDBDBDBFFE3E3E3FFE0E0E0FF
+      DBDBDBFFD0D0D0FFBEBEBEFFADADADFFA4A4A4FFA3A3A3FF9B9B9BFF8A8A8AFF
+      797979FF636363FF626262F44D4D4D560000001A000000110000000A00000005
+      000000020000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00AE725417F29967EBC55300FFCA5500FFCF5700FF
+      D35900FFDA6410FFE06A16FFE36B15FFE86C13FFEC6C11FFF06C0FFFF56D0EFF
+      F96D0CFFFD6E0AFFFD6F09FAFB720CF2F87813ECF77E1BE5F8B077E9ECC5A9C2
+      7877774C8181814D828282C67B7B7BEC727272FA676767FF5E5E5EFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5E5E5EFE626262F6
+      656565E1656565A600000018000000130000000D000000080000000400000002
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00754C370BF59B6AEBC15200FFC55300FFCA5500FF
+      D26211FFD76918FFDB6917FFE06915FFE36A13FFE86B11FFEC6B10FFF06C0EFF
+      F56C0CFFF96C0BFFFD6D09FFFD6E07FAFB720DF2F97813ECF87C17E4F9AF73E7
+      EDC5A7BF6D6B6A3F6A6A6A356C6C6C2D646464244848481C2222221722222217
+      2222221722222217171717160C0C0C1500000014000000140000001300000012
+      000000100000000E0000000B0000000800000005000000030000000100000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000004F69A6ADDBF5405FFC15200FFC96013FF
+      CF671AFFD46719FFD76817FFDB6815FFE06813FFE36912FFE86A10FFEC6A0EFF
+      F06B0DFFF46C0BFFF96B09FFFD6C07FFFE6E07F9FB710AF1FA760EEBF87911E3
+      F9AC6DE6EFC3A4BA5B5A582C5252521F3E3E3E150000000C0000000900000008
+      0000000800000008000000080000000800000008000000080000000700000007
+      00000006000000050000000400000003000000020000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000002F296667EDC7B3EF3C15E14FFC8651CFF
+      CB651BFFCF6619FFD36617FFD76715FFDB6714FFDF6812FFE36810FFE7690FFF
+      EC690DFFF06A0BFFF46B09FFF96B08FFFD6B06FFFE6E04F9FC6F05F1FB7106E9
+      FA7507E1FBA968E4F3C4A3B4302C2A150000000B000000070000000400000003
+      0000000200000002000000020000000200000002000000020000000200000002
+      0000000200000002000000010000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000166402D05F89D6CD4D77E45FAC4641DFF
+      C8641BFFCB6419FFCF6517FFD36516FFD66614FFDB6612FFDF6711FFE3670FFF
+      E7680DFFEC680BFFF0690AFFF46A08FFF96A06FFFD6B04FFFE6D03F9FD6D01F0
+      FC6F00E7FC7100DEFDB279E8F7C8A69F00000007000000040000000200000001
+      0000000100000000000000000000000000000000000000000000000000000000
+      000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000000000001D1835D10F59A6AAAF19A6BED
+      E08750F8D97C3DFFDB7C3CFFDE7C3BFFE17D3AFFE37E3AFFE67F39FFE98038FF
+      EB8138FFEF8238FFF28237FFF48337FFF78436FFFB8536FFFE8635FFFF8935FA
+      FE954BF2FEB07AE6FDC39CCADFB59A2900000004000000020000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000002E6906623
+      F69C705AF49D6D8DF39E6F90F39E7191F3A07491F4A27691F4A47991F5A77B91
+      F6A97E90F6AB8190F7AD838FF7AF868FF8B1888FF9B38A8FF9B58D8FFAB8908D
+      F6BD9A6AECB999350000000400000002000000020000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF00007FFFFFFFFFFC00001FFFFFFFFFF800000FFFFFFFFF
+      FC000007FFFFFFFFFE000007FFFFFFFFFF000007FFFFFFFFFF800007FFFFFFFF
+      FFC00007FFFFFFFFFFE00007FFFFFFFFFFC00007FFFE000000000007FFFC0000
+      00000007FFF8000000000007FFF8000000000007FFF8000000000007FFF80000
+      00000007FFF8000000000007FFF8000000000007FFF8000000000007FFF80000
+      00000C07FFF8000000001E07FFF8000000003F07FFF8000000007F87FFF80000
+      00007FCFFFF8000000007FFFFFF8000000007FFFFFF8000000007FFFFFF80000
+      00007FFFFFF8000000007FFFFFF8000000007FFFFFF8000000007FFFFFF80000
+      00007FFFFFF8000000007FFFFFF8000000007FFFFFFC00000000FFFFFFFE0000
+      0001FFFFFFFF807FF80FFFFFCFFF807FF80FFFFF87FD807FF80FFFFF83F1807F
+      F80FFFFF81E0007FF80FFFFF80C0007FF80FFFFF8000007FF80FFFFF8000007F
+      F80FFFFF8000007FF80FFFFF8000007FF80FFFFF8000007FF80FFFFF8000007F
+      F80FFFFF80000000000FFFFF80000000000FFFFF80000000001FFFFF80000000
+      003FFFFF80001000003FFFFF8000080000FFFFFF8000060001FFFFFF800003FF
+      FFFFFFFF800001FFFFFFFFFFC00000FFFFFFFFFFC000007FFFFFFFFFE00000FF
+      FFFFFFFFFC0007FFFFFFFFFF2800000080000000000100000100200000000000
+      0000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000001
+      0000000100000002000000020000000300000004000000050000000600000007
+      0000000700000008000000080000000900000009000000090000000A0000000A
+      0000000A0000000A0000000B0000000B0000000B0000000B0000000C0000000C
+      0000000C0000000C0000000C0000000C0000000D0000000D0000000D0000000D
+      0000000D0000000E0000000E0000000E0000000D0000000D0000000C0000000C
+      0000000B0000000A000000090000000700000006000000050000000300000002
+      00000002000000010000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000001
+      0000000200000002000000030000000500000006000000070000000800000009
+      0000000B0000000C0000000C0000000D0000000E0000000E0000000E0000000F
+      0000000F00000010000000100000001000000010000000100000001100000011
+      0000001100000012000000120000001300000013000000130000001300000013
+      0000001400000014000000140000001400000014000000130000001300000012
+      000000100000000F0000000D0000000B00000009000000070000000600000004
+      0000000300000002000000010000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000100000002
+      00000002000000030000000500000006000000080000000A0000000C0000000E
+      0000000F00000010000000110000001300000013000000140000001400000015
+      0000001500000016000000160000001700000017000000170000001700000018
+      0000001800000019000000190000001A0000001A0000001A0000001B0000001B
+      0000001C0000001C0000001C0000001C0000001C0000001B0000001A00000019
+      000000170000001600000013000000110000000E0000000B0000000900000007
+      0000000500000003000000020000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000000000000000000010000000100000002
+      000000030000000500000006000000080000000B0000000D0000001000000012
+      000000140000001600000017000000180000001A0000001A0000001B0000001C
+      0000001C0000001C0000001D0000001E0000001E0000001F0000001F00000020
+      0000002000000021000000210000002200000022000000230000002300000024
+      0000002400000025000000250000002500000025000000240000002300000022
+      000000200000001E0000001B0000001700000014000000100000000D00000009
+      0000000700000005000000030000000200000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000000000000000000010000000200000002
+      0000000400000006000000080000000A0000000E000000100000001300000016
+      000000190000001B0000001D0000001E00000020000000210000002200000023
+      0000002300000024000000250000002500000026000000260000002700000028
+      00000028000000290000002A0000002A0000002B0000002C0000002C0000002D
+      0000002E0000002E0000002F0000002F0000002F0000002E0000002D0000002C
+      0000002A00000027000000230000001F0000001B00000016000000120000000D
+      0000000A00000007000000050000000300000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000000000000000000010000000200000003
+      0000000500000007000000090000000C0000001000000013000000170000001A
+      0000001D00000020000000220000002400000025000000270000002800000029
+      0000002A0000002B0000002C0000002C0000002D0000002E0000002F0000002F
+      0000003000000031000000320000003300000033000000340000003500000036
+      0000003600000037000000380000003800000038000000380000003700000036
+      00000033000000300000002C00000028000000220000001D0000001700000012
+      0000000D00000009000000060000000400000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000000000001000000010000000200000003
+      00000005000000070000000A0000000E000000120000001531533725588C5C3A
+      5486583D5081543F4D7B51424B784F4449754D4648744C4647724B4746704949
+      456E484A446D484B446D484B436C474C436B464D4269454D4168444E4067444F
+      406643503F6542513E6441523E6341533E6341533C613F543C603F553C603F55
+      3B5F3E563B5E3D573A5D3D583A5D3D581F301F4A000000400000003F0000003E
+      0000003C0000003900000035000000300000002A000000240000001D00000017
+      000000110000000C000000080000000500000003FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000000000001000000010000000200000003
+      00000005000000077EC6842B97EE9B7898F59EAB9AFBA1DC9DFFA4FD9DFFA4FF
+      9DFFA4FF9DFFA4FF9DFFA4FF9DFFA4FF9DFFA4FF9DFFA5FF9DFFA5FF9DFFA5FF
+      9DFFA5FF9DFFA5FF9DFFA5FF9DFFA5FF9DFFA6FF9DFFA6FF9DFFA6FF9DFFA6FF
+      9DFFA6FF9DFFA6FF9DFFA6FF9DFFA6FF9DFFA7FF9DFFA7FF9DFFA7FF9DFFA7FF
+      9DFFA7FF9DFFA7FF9DFFA7FF9DFFA8FF9CFFA7FE96F3A0E489DD92BE75BE7C98
+      436E4864000000410000003D00000038000000310000002B000000230000001C
+      000000150000000F0000000A0000000700000004FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000000000000000000010000000200000003
+      40604008A1F5A86DA3FEAAE29EFCA4F69CFDA2FB9CFEA3FF93FA99FF85F48BFF
+      85F48BFF85F48BFF85F58BFF85F58BFF85F58BFF85F68BFF85F68CFF85F68CFF
+      85F68CFF85F78CFF85F78CFF85F78CFF85F88CFF85F88DFF85F88DFF85F98DFF
+      85F98DFF85F98DFF85F98DFF85FA8DFF85FA8DFF85FA8DFF85FB8DFF85FB8DFF
+      85FB8DFF85FC8DFF85FC8DFF85FC8DFF93FE9DFF9DFFA8FF9DFFA8FF9DFFA8FF
+      9DFEA7FC7DCA84A60B120B480000003F00000038000000310000002900000021
+      0000001A000000130000000D0000000900000005FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF0000000000000000000000000100000002A8F0AE2B
+      ACFDB2ACA1FAA7E696F69BFB5EDB62FF33C635FF14B815FF00B000FF00B200FF
+      00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF00C100FF00C300FF
+      00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF00D100FF00D300FF
+      00D500FF00D700FF00D900FF00DB00FF00DD00FF00DF00FF00E100FF00E300FF
+      00E500FF00E700FF00E900FF00EB00FF00ED00FF16F118FF37F73BFF5FFB66FF
+      9BFFA6FF9DFFA8FF94F09EDE4A774F670000003E000000370000002F00000026
+      0000001E000000160000000F0000000A00000006FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001ABF5AB18B1FEB6C0
+      9DF5A2E588EC8DFF23B925FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF
+      00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF00C100FF
+      00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF00D100FF
+      00D300FF00D500FF00D700FF00D900FF00DB00FF00DD00FF00DF00FF00E100FF
+      00E300FF00E500FF00E700FF00E900FF00EB00FF00ED00FF00EF00FF00F200FF
+      22F624FF84FE8DFFA1FFABFF9CFCA7F9426A45600000003B000000330000002A
+      0000002100000019000000120000000C00000007FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000001B0F8B83C
+      AFFCB2C793F098F54DCC4FFF00A600FF00A800FF00AA00FF00AC00FF00AE00FF
+      00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF
+      00C100FF00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF
+      00D100FF00D300FF00D500FF00D700FF00D900FF00DB00FF00DD00FF00DF00FF
+      00E100FF00E300FF00E500FF00E700FF00E900FF00EB00FF00ED00FF00EF00FF
+      00F200FF0EF40FFF89FD8FFFABFFB5FF93ED9CD8080C0841000000370000002E
+      000000240000001B000000130000000D00000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000001
+      B1F9B53DAEFBB3C894F099F54CCC4FFF00A600FF00A800FF00AA00FF00AC00FF
+      00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF
+      00BF00FF00C100FF00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF
+      00CF00FF00D100FF00D300FF00D500FF00D700FF00D900FF00DB00FF00DD00FF
+      00DF00FF00E100FF00E300FF00E500FF00E700FF00E900FF00EB00FF00ED00FF
+      0AF00AFF3CF53CFF49F749FFA8FEAFFFA4FFAEFF79C6839C0000003A00000030
+      000000270000001D000000150000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000001
+      00000002AFF5B33DAEFBB3C894F098F54CCC4FFF00A600FF00A800FF00AA00FF
+      00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF
+      00BD00FF00BF00FF00C100FF00C300FF00C500FF00C700FF00C900FF00CB00FF
+      00CD00FF00CF00FF00D100FF00D300FF00D500FF00D700FF00D900FF00DB00FF
+      00DD00FF00DF00FF00E100FF00E300FF00E500FF00E700FF00E900FF0AEC0AFF
+      3AF13AFF42F342FF44F544FF62F964FFB4FFBDFF9DFDA8FB3659395100000032
+      000000280000001F00000017000000100000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000010000000100000001
+      0000000200000002AFF5B33DACFBB3C994F199F54CCC4FFF00A600FF00A800FF
+      00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF
+      00BB00FF00BD00FF00BF00FF00C100FF00C300FF00C500FF00C700FF00C900FF
+      00CB00FF00CD00FF00CF00FF00D100FF00D300FF00D500FF00D700FF00D900FF
+      00DB00FF00DD00FF00DF00FF00E100FF00E300FF00E500FF09E809FF38EE38FF
+      40F040FF42F242FF44F344FF46F646FF94FD9AFFA5FFB0FF6CAF748000000033
+      0000002A0000002000000017000000100000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000000000000000000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000020000000200000002
+      000000020000000200000003A8F0AC40ACFCB3C994F199F54DCD4FFF00A600FF
+      00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF
+      00B900FF00BB00FF00BD00FF00BF00FF00C100FF00C300FF00C500FF00C700FF
+      00C900FF00CB00FF00CD00FF00CF00FF00D100FF00D300FF00D500FF00D700FF
+      00D900FF00DB00FF00DD00FF00DF00FF00E100FF09E409FF36EB36FF3EED3EFF
+      40EF40FF42F042FF44F244FF45F345FF7AFA7DFFABFFB5FF84D58DA700000034
+      0000002A0000002100000018000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000
+      0000000100000001000000010000000200000002000000020000000200000002
+      0000000300000003000000030000000300000003000000030000000300000003
+      0000000300000003000000030000000300000003000000030000000300000003
+      0000000300000003000000030000000300000003000000030000000300000003
+      0000000300000003000000030000000300000003000000030000000300000003
+      0000000300000003000000030000000300000003000000030000000300000003
+      00000003000000040000000400000005A6EDAA41ACFCB1CB94F099F64DCD4FFF
+      00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF
+      00B600FF00B900FF00BB00FF00BD00FF00BF00FF00C100FF00C300FF00C500FF
+      00C700FF00C900FF00CB00FF00CD00FF00CF00FF00D100FF00D300FF00D500FF
+      00D700FF00D900FF00DB00FF00DD00FF09E009FF35E735FF3CEA3CFF3EEB3EFF
+      40ED40FF42EF42FF43F043FF45F245FF62F664FFB1FFBAFF92EC9CCE00000034
+      0000002B0000002100000018000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000100000001
+      0000000100000002000000020000000300000004000000040000000500000005
+      0000000500000005000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000070000000700000008A0E5A443ACFBB1CB94F099F6
+      4DCD4FFF00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF
+      00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF00C100FF00C300FF
+      00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF00D100FF00D300FF
+      00D500FF00D700FF00D900FF08DC08FF33E433FF3AE63AFF3CE83CFF3EEA3EFF
+      40EB40FF42ED42FF43EF43FF45F045FF4CF34CFFB6FFBEFF9AFCA6F400000034
+      0000002B0000002100000019000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000010000000100000002
+      0000000200000003000000050000000500000007000000070000000800000009
+      00000009000000090000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000B0000000B0000000C97D89B47AAF9AFCD
+      94F198F74DCD4FFF00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF
+      00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF00C100FF
+      00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF00D100FF
+      00D300FF00D500FF08D808FF31E031FF38E338FF3AE53AFF3CE73CFF3EE83EFF
+      40EA40FF41EC41FF43ED43FF45EF45FF47F147FFB6FFBDFF9DFFA8FF00000034
+      0000002A0000002100000019000000110000000CFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF000000000000000001000000010000000200000003
+      000000040000000600000007000000090000000B0000000C0000000D0000000E
+      0000000F0000000F000000100000001000000010000000100000001000000010
+      0000001000000010000000100000001000000010000000100000001000000010
+      0000001000000010000000100000001000000010000000100000001000000010
+      0000001000000010000000100000001000000010000000100000001000000010
+      0000001000000010000000100000001000000010000000100000001000000010
+      000000100000001000000010000000100000001100000011000000128ECB924B
+      A9F8AECF94F198F74DCD50FF00A600FF00A800FF00AA00FF00AC00FF00AE00FF
+      00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF00BF00FF
+      00C100FF00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF00CF00FF
+      00D100FF08D408FF30DD30FF36E036FF38E138FF3AE33AFF3CE53CFF3EE73EFF
+      40E840FF41EA41FF43EC43FF45ED45FF47EF47FFB6FEBDFF9DFFA8FF00000033
+      0000002A0000002100000018000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000000000001000000020000000300000005
+      00000007000000090000000B0000000E00000010000000120000001400000015
+      0000001600000017000000170000001700000017000000170000001700000017
+      0000001700000017000000170000001700000017000000170000001700000017
+      0000001700000017000000170000001700000017000000170000001700000017
+      0000001700000017000000170000001700000017000000170000001700000017
+      0000001700000017000000170000001700000017000000170000001700000017
+      0000001700000017000000180000001800000018000000190000001A0000001A
+      84BC8751A7F6ADD194F099F74DCD50FF00A600FF00A800FF00AA00FF00AC00FF
+      00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF00BD00FF
+      00BF00FF00C100FF00C300FF00C500FF00C700FF00C900FF00CB00FF00CD00FF
+      07D007FF2ED92EFF34DC34FF36DE36FF38E038FF3AE23AFF3CE33CFF3EE53EFF
+      3FE73FFF41E941FF43EA43FF45EC45FF47EE47FFB6FEBCFF9DFFA7FF00000033
+      0000002A0000002100000018000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00000000000000000100000002000000030000000500000007
+      000000090000000D0000001000000014000000170000001A0000001C0000001E
+      0000001F00000020000000210000002100000021000000210000002100000021
+      0000002100000021000000210000002100000021000000210000002100000021
+      0000002100000021000000210000002100000021000000210000002100000021
+      0000002100000021000000210000002100000021000000210000002100000021
+      0000002100000021000000210000002100000021000000210000002100000021
+      0000002100000021000000210000002100000021000000220000002300000023
+      0000002576AC7C5BA5F4AAD393F098F84DCD50FF00A600FF00A800FF00AA00FF
+      00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF00BB00FF
+      00BD00FF00BF00FF00C100FF00C300FF00C500FF00C700FF00C900FF07CC07FF
+      2CD62CFF32D832FF34DA34FF36DC36FF38DE38FF3AE03AFF3CE23CFF3EE43EFF
+      3FE53FFF41E741FF43E943FF45EB45FF47EC47FFB6FEBCFF9DFFA7FF00000032
+      000000290000002000000018000000110000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000000000000000000000100000002000000040000000700000009
+      0000000D00000012000000160000001B0000001F000000230000002600000028
+      0000002A0000002B0000002C0000002C0000002C0000002C0000002C0000002C
+      0000002C0000002C0000002C0000002C0000002C0000002C0000002C0000002C
+      0000002C0000002C0000002C0000002C0000002C0000002C0000002C0000002C
+      0000002C0000002C0000002C0000002C0000002C0000002C0000002C0000002C
+      0000002C0000002C0000002C0000002C0000002C0000002C0000002C0000002C
+      0000002C0000002C0000002C0000002C0000002C0000002D0000002D0000002E
+      0000002F000000316B9C7064A4F1A9D794F099F94DCD50FF00A600FF00A800FF
+      00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF00B900FF
+      00BB00FF00BD00FF00BF00FF00C100FF00C300FF00C500FF07C907FF2AD22AFF
+      31D531FF32D732FF34D934FF36DB36FF38DD38FF3ADF3AFF3CE03CFF3DE23DFF
+      3FE43FFF41E641FF43E743FF45E945FF46EB46FFB6FEBCFF9DFFA7FF00000031
+      000000280000002000000017000000100000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF000000000000000001000000020000000300000005000000090000000D
+      00000012000000170000001D00000023000000280000002D0000003000000033
+      0000003500000036000000370000003800000038000000380000003800000038
+      0000003800000038000000380000003800000038000000380000003800000038
+      0000003800000038000000380000003800000038000000380000003800000038
+      0000003800000038000000380000003800000038000000380000003800000038
+      0000003800000038000000380000003800000038000000380000003800000038
+      0000003800000038000000380000003800000038000000380000003900000039
+      0000003A0000003B46644957A2EAA7CB94EE99F362D665FF02A502FF00A600FF
+      00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF00B600FF
+      00B900FF00BB00FF00BD00FF00BF00FF00C100FF07C507FF29CE29FF2FD12FFF
+      31D331FF32D532FF34D734FF36D936FF38DB38FF3ADD3AFF3CDF3CFF3DE13DFF
+      3FE23FFF41E441FF43E643FF45E845FF46E946FFB6FEBCFF9DFFA7FF00000031
+      000000280000001F00000017000000100000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000B00000010
+      000000160000001D000000240000002B00000031000000370000003B0000003E
+      0000004000000041000000420000004300000043000000430000004300000043
+      0000004300000043000000430000004300000043000000430000004300000043
+      0000004300000043000000430000004300000043000000430000004300000043
+      0000004300000043000000430000004300000043000000430000004300000043
+      0000004300000043000000430000004300000043000000430000004300000043
+      0000004300000043000000430000004300000044000000440000004400000044
+      000000453F58425D9FDFA5C390E895F15DD160FF02A102FF00A200FF00A400FF
+      00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF00B400FF
+      00B600FF00B900FF00BB00FF00BD00FF06C106FF27CA27FF2DCE2DFF2FD02FFF
+      30D230FF32D432FF34D634FF36D836FF38DA38FF3ADB3AFF3BDD3BFF3DDF3DFF
+      3FE13FFF41E341FF43E443FF44E644FF46E846FFB6FEBCFF9DFFA7FF00000030
+      000000270000001E00000017000000100000000BFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000000000000010000000300000005000000090000000D00000013
+      0000001A040404222626263123232339212121401E1E1E461D1D1D4A1B1B1B4E
+      1B1B1B501A1A1A521A1A1A531A1A1A531A1A1A531A1A1A531A1A1A531A1A1A53
+      1B1B1B531B1B1B531B1B1B531B1B1B531B1B1B531B1B1B531B1B1B531B1B1B53
+      1B1B1B531B1B1B531B1B1B531B1B1B531B1B1B531D1D1D541D1D1D541D1D1D54
+      1D1D1D541D1D1D541D1D1D541D1D1D541D1D1D541D1D1D541D1D1D541D1D1D54
+      1D1D1D541D1D1D541D1D1D541E1E1E541E1E1E541E1E1E541E1E1E541E1E1E54
+      1E1E1E541E1E1E541E1E1E541E1E1E541E1E1E541E1E1E551E1E1E551F1F1F55
+      4C5D4C69A1DAA5C08DE190EF59CB5BFF029D02FF009E00FF00A000FF00A200FF
+      00A400FF00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF00B200FF
+      00B400FF00B600FF00B900FF06BD06FF25C725FF2BCA2BFF2DCC2DFF2FCE2FFF
+      30D030FF32D232FF34D434FF36D636FF38D838FF3ADA3AFF3BDC3BFF3DDE3DFF
+      3FDF3FFF41E141FF43E343FF44E544FF46E646FFB6FEBCFF9DFFA7FF0000002F
+      000000270000001E00000016000000100000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      00000000000000010000000200000003000000060000000A0000000F57575720
+      B7B7B751BDBDBD6BB9B9B976B0B0B07CAAAAAA81A5A5A586A2A2A28AA0A0A08C
+      9E9E9E8E9D9D9D8F9D9D9D909D9D9D919D9D9D929E9E9E929E9E9E929F9F9F92
+      9F9F9F93A0A0A093A0A0A093A1A1A194A1A1A194A1A1A194A2A2A294A2A2A295
+      A2A2A295A3A3A395A3A3A395A3A3A396A4A4A496A4A4A496A5A5A597A5A5A597
+      A5A5A597A6A6A697A6A6A697A7A7A798A7A7A798A8A8A898A8A8A898A8A8A899
+      A9A9A999A9A9A999AAAAAA9AAAAAAA9AAAAAAA9AABABAB9AABABAB9BABABAB9B
+      ACACAC9BACACAC9CACACAC9CADADAD9CADADAD9CAEAEAE9DAEAEAE9DB3BCB3A7
+      B9E5BBD790DF94F356C658FE029902FF009A00FF009C00FF009E00FF00A000FF
+      00A200FF00A400FF00A600FF00A800FF00AA00FF00AC00FF00AE00FF00B000FF
+      00B200FF00B400FF05B805FF23C323FF29C629FF2BC82BFF2DCA2DFF2ECC2EFF
+      30CE30FF32D032FF34D234FF36D436FF38D638FF39D839FF3BDA3BFF3DDC3DFF
+      3FDE3FFF41E041FF42E142FF44E344FF46E546FFB6FEBCFF9DFFA7FF0000002E
+      000000260000001E00000016000000100000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      00000000000000010000000200000004000000070000000C81818120D2D2D261
+      C9C9C96BBEBEBE72B1B1B17C959595B5888888DA8A8A8ADD8C8C8CDE8E8E8EDD
+      929292DE949494DD979797DC999999DC969696DB969696DC959595DD949494DE
+      939393DF919191E08E8E8EE28D8D8DE3919191E0959595DF989898DD9B9B9BDC
+      9E9E9EDAA1A1A1D8A6A6A6D6A7A7A7D4A7A7A7D5A7A7A7D5A7A7A7D4A9A9A9D4
+      A9A9A9D4AAAAAAD3A9A9A9D3A9A9A9D4A9A9A9D4A9A9A9D4A9A9A9D4A9A9A9D4
+      A9A9A9D4AAAAAAD4ABABABD4ABABABD4ABABABD4ACACACD4ADADADD4ADADADD4
+      AEAEAED3AFAFAFD3AFAFAFD3B1B1B1D4B2B2B2D4B3B3B3D4B7BEB9DABFE0C1EC
+      92DC95F958C35AFD09990AFD029703FF009800FF009A00FF009C00FF009E00FF
+      00A000FF00A200FF00A400FF00A600FF00A800FF00AA00FF00AC00FF00AE00FF
+      00B000FF05B405FF21BE21FF27C127FF29C429FF2BC62BFF2DC92DFF2ECB2EFF
+      30CD30FF32CF32FF34D134FF36D336FF38D538FF39D739FF3BD93BFF3DDA3DFF
+      3FDC3FFF41DE41FF42E042FF44E244FF46E346FFB6FEBBFF9DFFA7FF0000002D
+      000000250000001D000000160000000F0000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      00000000000000010000000200000005000000071313130DD4D4D453D2D2D266
+      C5C5C56D919191B7686868FE636363FF666666FF6A6A6AFF6D6D6DFF717171FF
+      757575FF797979FF7C7C7CFF808080FF7F7F7FFF7D7D7DFF7A7A7AFF777777FF
+      737373FF6C6C6CFF666666FF5E5E5EFF636363FF6D6D6DFF767676FF7F7F7FFF
+      888888FF909090FF999999FFA2A2A2FFA2A2A2FFA1A1A1FFA2A2A2FFA4A4A4FF
+      A5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FF
+      A6A6A6FFA6A6A6FFA7A7A7FFA7A7A7FFA8A8A8FFA8A8A8FFAAAAAAFFABABABFF
+      ABABABFFACACACFFADADADFFAFAFAFFFB0B0B0FFB3B7B3FFBDD7BFFF91D693FF
+      5AC15CFF149B15FF0C980DFF079708FF029703FF009800FF009A00FF009C00FF
+      009E00FF00A000FF00A200FF00A400FF00A600FF00A800FF00AA00FF00AC00FF
+      05B005FF20BA20FF25BD25FF27BF27FF29C229FF2BC52BFF2CC72CFF2EC92EFF
+      30CB30FF32CD32FF34CF34FF36D136FF37D337FF39D539FF3BD73BFF3DD93DFF
+      3FDB3FFF40DD40FF42DE42FF44E044FF46E246FFB6FEBBFF9DFFA6FF0000002D
+      000000250000001D000000150000000F0000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      00000000000000010000000200000005000000088C8C8C1BDBDBDB61D0D0D066
+      A0A0A0985C5C5CFF5B5B5BFF5D5D5DFF4C4C4CFF4B4B4BFF4E4E4EFF505050FF
+      545454FF575757FF595959FF5C5C5CFF5C5C5CFF5C5C5CFF5B5B5BFF5C5C5CFF
+      5B5B5BFF5A5A5AFF595959FF555555FF555555FF595959FF5F5F5FFF626262FF
+      636363FF666666FF696969FF6C6C6CFF6E6E6EFF6E6E6EFF6E6E6EFF727272FF
+      727272FF727272FF727272FF727272FF717171FF707070FF717171FF717171FF
+      727272FF737373FF747474FF757575FF757575FF777777FF787878FF797979FF
+      7A7A7AFF7C7C7CFF7D7D7DFF7E7E7EFF868986FFA1B6A2FF85C687FF56B857FF
+      169517FF109411FF0C940DFF09950AFF059506FF019602FF009800FF009A00FF
+      009C00FF009E00FF00A000FF00A200FF00A400FF00A600FF00A800FF05AC05FF
+      1EB61EFF23B923FF25BB25FF27BE27FF29C029FF2BC22BFF2CC52CFF2EC72EFF
+      30C930FF32CC32FF34CE34FF36D036FF37D237FF39D439FF3BD53BFF3DD73DFF
+      3ED93EFF40DB40FF42DD42FF44DF44FF46E146FFB6FEBBFF9DFFA6FF0000002C
+      000000240000001C000000150000000F0000000AFFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000500000009B6B6B62BDADADA61CDCDCD67
+      6D6D6DF6555555FF4A4A4AFF1C1C1CFF1D1D1DFF212121FF252525FF272727FF
+      2C2C2CFF303030FF323232FF333333FF303030FF333333FF363636FF3A3A3AFF
+      3D3D3DFF3F3F3FFF3E3E3EFF3F3F3FFF3E3E3EFF3F3F3FFF3F3F3FFF3C3C3CFF
+      393939FF393939FF393939FF383838FF383838FF383838FF383838FF3C3C3CFF
+      3D3D3DFF3D3D3DFF3D3D3DFF3D3D3DFF3C3C3CFF3A3A3AFF3B3B3BFF3C3C3CFF
+      3D3D3DFF3F3F3FFF404040FF404040FF414141FF444444FF454545FF454545FF
+      474747FF4A4A4AFF4B4B4BFF575A57FF849585FF75B276FF50AD52FF158B16FF
+      108B11FF0E8E0FFF0B8F0CFF089009FF069207FF049405FF019602FF009800FF
+      009A00FF009C00FF009E00FF00A000FF00A200FF00A400FF04A704FF1CB21CFF
+      21B521FF23B723FF25BA25FF27BC27FF29BE29FF2AC02AFF2CC32CFF2EC62EFF
+      30C830FF32CA32FF34CC34FF35CE35FF37D037FF39D239FF3BD43BFF3DD63DFF
+      3ED83EFF40DA40FF42DB42FF44DD44FF46DF46FFB6FEBBFF9DFFA6FF0000002B
+      000000230000001C000000150000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009BBBBBB2EDADADA61CDCDCD67
+      646464FE5B5B5BFF282828FF1A1A1AFF1C1C1CFF212121FF252525FF272727FF
+      2C2C2CFF2F2F2FFF313131FF333333FF303030FF323232FF363636FF3A3A3AFF
+      3C3C3CFF3E3E3EFF3E3E3EFF3E3E3EFF3E3E3EFF3F3F3FFF3F3F3FFF3C3C3CFF
+      393939FF393939FF383838FF383838FF373737FF373737FF373737FF3D3D3DFF
+      3E3E3EFF3E3E3EFF3F3F3FFF3F3F3FFF3F3F3FFF3D3D3DFF3D3D3DFF3E3E3EFF
+      3F3F3FFF404040FF414141FF434343FF434343FF454545FF474747FF484848FF
+      494949FF4C4C4CFF565856FF7F8D80FF71AA73FF4EA650FF19871AFF168917FF
+      148B15FF118C12FF0E8E0FFF0B8F0CFF09910AFF069207FF049405FF019602FF
+      009800FF009A00FF009C00FF009E00FF00A000FF04A304FF1AAD1AFF1FB11FFF
+      21B321FF23B623FF25B825FF27BA27FF29BD29FF2ABF2AFF2CC12CFF2EC32EFF
+      30C630FF32C832FF34CA34FF35CC35FF37CE37FF39D039FF3BD23BFF3CD43CFF
+      3ED63EFF40D840FF42DA42FF44DC44FF46DE46FFB6FEBBFF9DFFA6FF0000002A
+      000000230000001B000000140000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009BABABA2DD8D8D861CBCBCB67
+      646464FE5F5F5FFF181818FF1A1A1AFF1C1C1CFF202020FF242424FF272727FF
+      2C2C2CFF2F2F2FFF313131FF323232FF2F2F2FFF323232FF353535FF393939FF
+      3B3B3BFF3D3D3DFF3E3E3EFF3E3E3EFF3F3F3FFF3E3E3EFF3E3E3EFF3B3B3BFF
+      383838FF383838FF393939FF383838FF383838FF393939FF393939FF3F3F3FFF
+      404040FF414141FF414141FF414141FF414141FF3F3F3FFF3F3F3FFF404040FF
+      414141FF424242FF434343FF454545FF454545FF484848FF484848FF4A4A4AFF
+      4C4C4CFF565756FF7A857AFF6DA26EFF4EA04FFF1E831FFF1B851CFF19871AFF
+      168917FF148B15FF118C12FF0E8E0FFF0B8F0CFF09910AFF069207FF049405FF
+      019602FF009800FF009A00FF009C00FF049F04FF19A919FF1DAD1DFF1FAF1FFF
+      21B221FF23B423FF25B625FF27B927FF28BB28FF2ABD2AFF2CBF2CFF2EC12EFF
+      30C430FF32C732FF33C933FF35CB35FF37CD37FF39CF39FF3BD13BFF3CD33CFF
+      3ED53EFF40D740FF42D842FF44DA44FF46DC46FFB6FEBBFF9DFFA6FF0000002A
+      000000230000001B000000140000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B7B7B72ED7D7D760CBCBCB67
+      686868FE626262FF181818FF1A1A1AFF1C1C1CFF202020FF242424FF262626FF
+      2C2C2CFF2F2F2FFF313131FF323232FF2F2F2FFF313131FF353535FF393939FF
+      3B3B3BFF3D3D3DFF3E3E3EFF3E3E3EFF3E3E3EFF3E3E3EFF3F3F3FFF3C3C3CFF
+      393939FF393939FF3A3A3AFF3A3A3AFF3A3A3AFF3A3A3AFF3B3B3BFF414141FF
+      424242FF434343FF444444FF434343FF434343FF404040FF414141FF414141FF
+      434343FF444444FF454545FF464646FF474747FF494949FF4B4B4BFF4C4C4CFF
+      545554FF747D75FF679868FF4C984DFF248025FF208121FF1F8420FF1D871EFF
+      1A881BFF178A18FF148B15FF118C12FF0E8E0FFF0C900DFF09910AFF069207FF
+      049405FF019602FF009800FF049B04FF17A517FF1BA81BFF1DAB1DFF1FAD1FFF
+      21B021FF23B223FF25B525FF27B727FF28B928FF2ABB2AFF2CBE2CFF2EC02EFF
+      30C230FF32C432FF33C733FF35C935FF37CB37FF39CD39FF3ACF3AFF3CD13CFF
+      3ED33EFF40D540FF42D742FF44D944FF46DB46FFB6FEBBFF9DFFA6FF00000029
+      000000220000001A000000140000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B7B7B72ED7D7D760CBCBCB67
+      6C6C6CFE666666FF171717FF1A1A1AFF1B1B1BFF202020FF242424FF262626FF
+      2C2C2CFF2F2F2FFF313131FF323232FF2E2E2EFF313131FF343434FF383838FF
+      3A3A3AFF3D3D3DFF3F3F3FFF3F3F3FFF404040FF414141FF414141FF3E3E3EFF
+      3B3B3BFF3B3B3BFF3B3B3BFF3B3B3BFF3C3C3CFF3C3C3CFF3C3C3CFF434343FF
+      444444FF454545FF454545FF454545FF454545FF424242FF424242FF434343FF
+      444444FF454545FF474747FF484848FF494949FF4B4B4BFF4D4D4DFF525352FF
+      6E736EFF628E63FF4A904BFF287C29FF267E27FF248025FF238424FF218622FF
+      1E881FFF1B891CFF178A18FF148B15FF118C12FF0F8F10FF0C900DFF09910AFF
+      069207FF049405FF049705FF15A115FF1AA41AFF1BA71BFF1DA91DFF1FAC1FFF
+      21AE21FF23B023FF25B325FF26B526FF28B728FF2ABA2AFF2CBC2CFF2EBE2EFF
+      30C030FF31C231FF33C533FF35C835FF37CA37FF39CC39FF3ACE3AFF3CD03CFF
+      3ED23EFF40D440FF42D542FF44D744FF45D945FFB6FEBBFF9DFFA6FF00000028
+      000000210000001A000000130000000E00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B6B6B62ED7D7D760CBCBCB67
+      707070FE686868FF171717FF191919FF1B1B1BFF202020FF242424FF262626FF
+      2C2C2CFF2F2F2FFF313131FF323232FF2E2E2EFF303030FF353535FF383838FF
+      3C3C3CFF3E3E3EFF414141FF424242FF424242FF434343FF444444FF404040FF
+      3D3D3DFF3E3E3EFF3D3D3DFF3D3D3DFF3D3D3DFF3E3E3EFF3E3E3EFF454545FF
+      464646FF474747FF474747FF474747FF474747FF454545FF454545FF454545FF
+      454545FF474747FF484848FF494949FF4B4B4BFF4D4D4DFF525352FF686B68FF
+      5C845DFF49894AFF2D782EFF2B7B2CFF2A7E2BFF277F28FF278328FF248525FF
+      228723FF1E881FFF1A881BFF178A18FF158C16FF128D13FF0F8F10FF0C900DFF
+      09910AFF09930AFF179C18FF19A01AFF19A219FF1BA51BFF1DA71DFF1FAA1FFF
+      21AC21FF23AF23FF25B125FF26B326FF28B628FF2AB82AFF2CBA2CFF2EBC2EFF
+      30BF30FF31C131FF33C333FF35C535FF37C837FF38CA38FF3ACC3AFF3CCE3CFF
+      3ED03EFF40D240FF42D442FF44D644FF45D845FFB5FEBAFF9DFFA6FF00000028
+      000000210000001A000000130000000D00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B6B6B62ED7D7D760CACACA66
+      757575FE6D6D6DFF171717FF191919FF1A1A1AFF1F1F1FFF232323FF262626FF
+      2D2D2DFF303030FF323232FF333333FF2F2F2FFF323232FF353535FF3A3A3AFF
+      3D3D3DFF3F3F3FFF424242FF444444FF454545FF464646FF464646FF424242FF
+      3E3E3EFF3F3F3FFF3F3F3FFF3F3F3FFF3E3E3EFF3F3F3FFF3F3F3FFF474747FF
+      484848FF494949FF494949FF4A4A4AFF494949FF474747FF474747FF474747FF
+      474747FF494949FF494949FF4B4B4BFF4C4C4CFF525252FF626462FF577A58FF
+      488149FF337434FF307731FF2F7A30FF2F7F30FF2B7F2CFF2B832CFF288429FF
+      268727FF228723FF1D871EFF1B891CFF188B19FF158C16FF128D13FF0F8F10FF
+      0E900FFF1A981BFF1B9B1CFF1B9D1CFF1BA21CFF1BA31BFF1DA61DFF1FA81FFF
+      21AA21FF23AD23FF24AF24FF26B226FF28B428FF2AB62AFF2CB92CFF2EBB2EFF
+      2FBD2FFF31BF31FF33C133FF35C335FF37C637FF38C838FF3ACA3AFF3CCD3CFF
+      3ECF3EFF40D140FF42D242FF43D443FF45D645FFB5FEBAFF9DFFA5FF00000027
+      0000002000000019000000130000000D00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B6B6B62ED7D7D75FCACACA66
+      787878FE707070FF171717FF181818FF1A1A1AFF202020FF242424FF262626FF
+      2E2E2EFF323232FF343434FF353535FF303030FF333333FF383838FF3C3C3CFF
+      3F3F3FFF414141FF444444FF454545FF474747FF474747FF474747FF444444FF
+      404040FF404040FF404040FF404040FF404040FF414141FF414141FF494949FF
+      4B4B4BFF4B4B4BFF4B4B4BFF4C4C4CFF4B4B4BFF494949FF484848FF4A4A4AFF
+      494949FF4A4A4AFF4C4C4CFF4D4D4DFF4E4E4EFF5A5B5AFF527153FF467847FF
+      366F37FF357336FF337534FF337A34FF327D33FF2F7F30FF2F8330FF2C842DFF
+      2A862BFF268727FF218622FF1E881FFF1B891CFF188B19FF168D17FF148E15FF
+      1D951EFF1E981FFF1E9A1FFF1C9C1DFF1FA120FF1DA21EFF1DA41DFF1FA61FFF
+      21A921FF22AB22FF24AE24FF26B026FF28B228FF2AB52AFF2CB72CFF2EB92EFF
+      2FBB2FFF31BE31FF33C033FF35C235FF36C436FF38C638FF3AC93AFF3CCB3CFF
+      3ECD3EFF40CF40FF42D142FF43D343FF45D545FFB5FEBAFF9DFFA5FF00000026
+      0000001F00000018000000120000000D00000009FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B6B6B62ED7D7D75FCACACA66
+      7D7D7DFE747474FF171717FF191919FF1B1B1BFF202020FF252525FF282828FF
+      2F2F2FFF333333FF363636FF373737FF313131FF343434FF383838FF3D3D3DFF
+      404040FF434343FF454545FF484848FF484848FF494949FF4A4A4AFF454545FF
+      414141FF424242FF424242FF414141FF424242FF424242FF434343FF4C4C4CFF
+      4D4D4DFF4D4D4DFF4E4E4EFF4D4D4DFF4E4E4EFF4A4A4AFF4A4A4AFF4A4A4AFF
+      4A4A4AFF4B4B4BFF4D4D4DFF4E4E4EFF535453FF4C654DFF446E45FF3B6B3CFF
+      396E3AFF39723AFF377538FF377938FF377E38FF337E34FF338334FF318532FF
+      2E862FFF2A862BFF258626FF228723FF1F8920FF1C8A1DFF1B8D1CFF239324FF
+      229423FF219722FF209821FF1F9B20FF23A124FF22A323FF1EA31FFE1FA41FFF
+      21A721FF22A922FF24AC24FF26AE26FF28B128FF2AB32AFF2CB52CFF2DB72DFF
+      2FBA2FFF31BC31FF33BE33FF35C035FF36C236FF38C538FF3AC73AFF3CC93CFF
+      3ECB3EFF40CD40FF41CF41FF43D143FF45D345FFB5FEBAFF9DFFA5FF00000025
+      0000001E00000018000000120000000C00000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B5B5B52DD6D6D65FC9C9C965
+      818181FE787878FF171717FF191919FF1B1B1BFF212121FF262626FF292929FF
+      313131FF353535FF373737FF383838FF323232FF363636FF3A3A3AFF3F3F3FFF
+      414141FF444444FF474747FF4A4A4AFF4B4B4BFF4B4B4BFF4B4B4BFF474747FF
+      434343FF434343FF434343FF434343FF444444FF444444FF454545FF4D4D4DFF
+      4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4C4C4CFF4D4D4DFF4C4C4CFF
+      4C4C4CFF4D4D4DFF4E4E4EFF505050FF475B47FF446645FF406641FF3E693FFF
+      3D6D3EFF3D723EFF3B743CFF3B793CFF3B7D3CFF387F39FF388339FF358536FF
+      328633FF2E862FFF29852AFF268727FF238824FF218A22FF289029FF279328FF
+      259426FF249525FF239924FF219922FF29A42AFF26A327FF22A423FB20A421FE
+      20A520FF22A822FF24AA24FF26AC26FF28AF28FF2AB12AFF33B833FF2DB62DFF
+      2FB82FFF31BA31FF33BC33FF34BF34FF36C136FF38C338FF3AC53AFF3CC73CFF
+      3ECA3EFF40CC40FF41CE41FF43D043FF45D245FFB5FEBAFF9DFFA5FF00000024
+      0000001E00000017000000110000000C00000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B5B5B52DD6D6D65EC9C9C965
+      848484FE7B7B7BFF181818FF1A1A1AFF1C1C1CFF222222FF272727FF2A2A2AFF
+      323232FF373737FF393939FF3A3A3AFF333333FF373737FF3A3A3AFF404040FF
+      434343FF464646FF484848FF4B4B4BFF4D4D4DFF4D4D4DFF4E4E4EFF4A4A4AFF
+      444444FF454545FF454545FF444444FF454545FF454545FF454545FF4F4F4FFF
+      515151FF515151FF525252FF525252FF525252FF4E4E4EFF4E4E4EFF4E4E4EFF
+      4E4E4EFF4E4E4EFF505050FF4A584AFF455E45FF466347FF446645FF436944FF
+      416C42FF417142FF3F7440FF407941FF3F7D40FF3C7E3DFF3D843EFF39843AFF
+      368637FF328633FF2C842DFF2A862BFF278828FF2D8E2EFF2C902DFF2A912BFF
+      289329FF279528FF259626FF249925FF2EA52FFF2BA62CFF25A426F924A425FB
+      21A422FD22A622FF24A824FF26AB26FF28AD28FF35B635FF92EA96FF6ED871FF
+      2FB62FFF31B931FF33BB33FF34BD34FF36BF36FF38C138FF3AC33AFF3CC63CFF
+      3EC83EFF3FCA3FFF41CC41FF43CE43FF45D045FFB5FEBAFF9DFFA5FF00000023
+      0000001D00000016000000100000000C00000008FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B5B5B52DD6D6D65EC9C9C964
+      858585FE7C7C7CFF181818FF1A1A1AFF1C1C1CFF232323FF282828FF2B2B2BFF
+      343434FF393939FF3B3B3BFF3C3C3CFF343434FF373737FF3C3C3CFF414141FF
+      444444FF474747FF4A4A4AFF4D4D4DFF4E4E4EFF4F4F4FFF505050FF4B4B4BFF
+      464646FF464646FF454545FF454545FF464646FF464646FF474747FF515151FF
+      535353FF545454FF545454FF545454FF545454FF505050FF505050FF505050FF
+      505050FF505050FF4D544DFF4A5A4AFF495D49FF496249FF49664AFF466847FF
+      466C47FF467147FF437344FF437844FF447D45FF407E41FF418342FF3E853FFF
+      3C873DFF378738FF308431FF2F8730FF328B33FF318E32FF308F31FF2D902EFF
+      2B912CFF29942AFF289529FF279728FF33A734FF30A731FF28A429F626A527F9
+      22A423F922A423FD24A724FF26A926FF32B133FF8EE691FFA5F6ABEEA5F5A9FA
+      6FD872FF31B731FF32B932FF34BB34FF36BE36FF38C038FF3AC23AFF3CC43CFF
+      3EC63EFF3FC83FFF41CB41FF43CD43FF45CF45FFB5FEBAFF9DFFA5FF00000021
+      0000001B00000015000000100000000B00000007FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B4B4B42DD6D6D65EC9C9C964
+      868686FE7C7C7CFF181818FF1B1B1BFF1D1D1DFF242424FF292929FF2C2C2CFF
+      363636FF3A3A3AFF3C3C3CFF3D3D3DFF353535FF383838FF3C3C3CFF424242FF
+      464646FF494949FF4C4C4CFF4E4E4EFF515151FF515151FF525252FF4D4D4DFF
+      474747FF474747FF474747FF474747FF474747FF474747FF484848FF535353FF
+      555555FF565656FF565656FF565656FF565656FF525252FF525252FF515151FF
+      525252FF525352FF505650FF4E594EFF4E5E4EFF4E624EFF4D664DFF4A674BFF
+      496B4AFF4A704BFF487349FF477748FF487D49FF457E46FF478548FF438544FF
+      408741FF3C873DFF368637FF388939FF378C38FF358D36FF349035FF319032FF
+      2E902FFF2C922DFF2B952CFF2A962BFF37A638FF36A837FF2BA62CF429A62AF6
+      24A325F523A424F724A625FD31AD31FF89E18CFFA5F3A9E6A8F7ADB5A9FBAFD8
+      A6F6AAFA71D873FF32B832FF34BA34FF36BC36FF38BE38FF3AC03AFF3CC23CFF
+      3DC43DFF3FC73FFF41C941FF43CB43FF45CD45FFB5FEBAFF9DFFA5FF0000001F
+      0000001A000000140000000F0000000A00000007FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B4B4B42DD5D5D55DC8C8C864
+      808080FE787878FF191919FF1B1B1BFF1E1E1EFF242424FF2B2B2BFF2D2D2DFF
+      373737FF3C3C3CFF3E3E3EFF3F3F3FFF363636FF393939FF3E3E3EFF434343FF
+      474747FF494949FF4C4C4CFF4F4F4FFF525252FF535353FF535353FF4E4E4EFF
+      484848FF494949FF484848FF494949FF494949FF494949FF494949FF565656FF
+      575757FF575757FF595959FF585858FF575757FF535353FF535353FF545454FF
+      545454FF545454FF535453FF535953FF515C51FF526252FF506450FF4E674EFF
+      4D6A4EFF4E704FFF4D734EFF4D784EFF4D7D4EFF497E4AFF4C854DFF488649FF
+      458746FF418742FF3E873FFF3D8A3EFF3B8C3CFF398D3AFF388F39FF359036FF
+      319032FF2F9130FF2E932FFF2D962EFF3DA83EFF3AA83BFE2EA62FF12CA72DF3
+      26A427F124A325F32FAB30F883DB87FEA3EEA7E1AAF2AEA24B704B1B98DD9C4A
+      A8FCAED8A7F6ABFA72D874FF34B834FF36BA36FF38BD38FF3ABF3AFF3BC13BFF
+      3DC33DFF3FC53FFF41C741FF43C943FF44CC44FFB5FEBAFF9DFFA5FF0000001D
+      00000018000000130000000E0000000A00000006FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B4B4B42DD5D5D55DC8C8C864
+      797979FE727272FF191919FF1C1C1CFF1E1E1EFF252525FF2C2C2CFF2E2E2EFF
+      393939FF3E3E3EFF404040FF414141FF363636FF3A3A3AFF3F3F3FFF454545FF
+      484848FF4B4B4BFF4E4E4EFF515151FF535353FF565656FF565656FF505050FF
+      4A4A4AFF4A4A4AFF4A4A4AFF4A4A4AFF4B4B4BFF4B4B4BFF4B4B4BFF575757FF
+      595959FF5A5A5AFF595959FF5A5A5AFF5A5A5AFF555555FF555555FF555555FF
+      555555FF565656FF555555FF565756FF565C56FF566156FF566656FF536753FF
+      516A51FF537054FF517352FF527853FF537E54FF4E7E4FFF518652FF4E874FFF
+      4A884BFF488949FF428743FF408941FF3F8C40FF3D8D3EFF3C8F3DFF388E39FF
+      359036FF339134FF319232FF309431FF41A942FF3FA940FE31A732EE30A831F0
+      27A329ED2EAA2FEE81D884F9A2EAA5DAABEDAF9B4863481C0000000D0000000A
+      A0E9A446A8FCAED7A7F6ACFA73D975FF36B936FF38BB38FF3ABD3AFF3BBF3BFF
+      3DC13DFF3FC43FFF41C641FF43C843FF44CA44FFB5FEB9FF9DFFA4FF0000001A
+      00000016000000110000000D0000000900000006FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B4B4B42DD5D5D55DC8C8C864
+      737373FE6D6D6DFF1A1A1AFF1C1C1CFF1E1E1EFF262626FF2D2D2DFF303030FF
+      3B3B3BFF404040FF424242FF424242FF373737FF3A3A3AFF3F3F3FFF464646FF
+      4A4A4AFF4C4C4CFF4F4F4FFF525252FF565656FF575757FF585858FF525252FF
+      4C4C4CFF4C4C4CFF4B4B4BFF4B4B4BFF4C4C4CFF4C4C4CFF4C4C4CFF595959FF
+      5B5B5BFF5B5B5BFF5C5C5CFF5C5C5CFF5B5B5BFF565656FF565656FF575757FF
+      565656FF585858FF575757FF585858FF585958FF5A605AFF596459FF566656FF
+      576B57FF587158FF557256FF567857FF587E59FF547F55FF578758FF548955FF
+      528A53FF4E8A4FFF468747FF448945FF438B44FF418D42FF408F41FF3B8E3CFF
+      388E39FF369037FF359236FF339334FF46A947FF43AA44FE35A836EB33A834EE
+      33AA34EA7FD481F49FE4A0D4ABE5AE94404F4020000000100000000B00000008
+      00000006A6F1A944A9FDAFD8A8F7ADFA74D977FF38B938FF39BC39FF3BBE3BFF
+      3DC03DFF3FC23FFF41C441FF42C642FF44C844FFB5FEB9FF9DFFA4FF00000017
+      000000130000000F0000000B0000000800000005FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B3B3B32CD5D5D55CC8C8C863
+      6D6D6DFE676767FF1A1A1AFF1C1C1CFF1E1E1EFF262626FF2E2E2EFF313131FF
+      3C3C3CFF424242FF444444FF444444FF383838FF3C3C3CFF414141FF464646FF
+      4B4B4BFF4E4E4EFF505050FF535353FF575757FF5A5A5AFF5A5A5AFF545454FF
+      4C4C4CFF4D4D4DFF4C4C4CFF4C4C4CFF4D4D4DFF4D4D4DFF4E4E4EFF5B5B5BFF
+      5D5D5DFF5D5D5DFF5E5E5EFF5E5E5EFF5E5E5EFF595959FF585858FF595959FF
+      595959FF595959FF585858FF5A5A5AFF5B5B5BFF5E5F5EFF5D635DFF5B665BFF
+      5A6A5AFF5B6F5BFF5A735AFF5B785CFF5D7F5EFF597F5AFF5C875DFF5A8A5BFF
+      578B58FF538B54FF4B884CFF49894AFF478B48FF468D47FF448F45FF3F8E40FF
+      3B8D3CFF3A8F3BFF389139FF379338FF4BAA4CFF49AC4AFE38A839E940AE41EC
+      7CD17EF19BDC9DCEA7DAAA902E422E27000000150000000E0000000900000006
+      0000000500000004A5F4A944A9FDAFD9A9F7ADFA76DA78FF39BA39FF3BBC3BFF
+      3DBE3DFF3FC03FFF41C341FF42C542FF44C744FFB5FEB9FF9DFFA4FF00000014
+      000000110000000D000000090000000700000005FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B3B3B32CD4D4D45CC7C7C763
+      666666FE616161FF1A1A1AFF1C1C1CFF1F1F1FFF272727FF2F2F2FFF323232FF
+      3D3D3DFF444444FF454545FF454545FF393939FF3D3D3DFF414141FF484848FF
+      4C4C4CFF4F4F4FFF515151FF545454FF575757FF5B5B5BFF5D5D5DFF555555FF
+      4D4D4DFF4E4E4EFF4E4E4EFF4E4E4EFF4E4E4EFF4F4F4FFF4F4F4FFF5C5C5CFF
+      5F5F5FFF5F5F5FFF606060FF5F5F5FFF606060FF5A5A5AFF5A5A5AFF5A5A5AFF
+      5A5A5AFF5A5A5AFF5A5A5AFF5B5B5BFF5D5D5DFF616161FF616261FF606660FF
+      5F6A5FFF617161FF5E725EFF607960FF648165FF5F8160FF628863FF608B61FF
+      5D8C5EFF578B58FF4F8750FF4D894EFF4C8B4DFF4A8D4BFF478E48FF428E43FF
+      3F8E40FF3D8E3EFF3C903DFF3A923BFF52AD53FF4DAC4EFE44AD45E77FD080F2
+      9DDB9FD0A0CDA48C2631262F0000001C000000140000000D0000000800000005
+      000000030000000200000002A7F7AB43A8FDAED9A9F8AEFA77DB7AFF3BBB3BFF
+      3DBD3DFF3FBF3FFF40C140FF42C342FF4ECA4EFFB5FFBAFF9BFDA3E600000011
+      0000000E0000000B000000080000000500000004FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B3B3B32CD4D4D45CC7C7C762
+      5F5F5FFE5B5B5BFF1B1B1BFF1D1D1DFF1F1F1FFF282828FF303030FF323232FF
+      3F3F3FFF454545FF474747FF484848FF393939FF3E3E3EFF424242FF4A4A4AFF
+      4C4C4CFF505050FF535353FF565656FF595959FF5C5C5CFF5E5E5EFF565656FF
+      4E4E4EFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF505050FF5E5E5EFF
+      616161FF606060FF626262FF616161FF616161FF5C5C5CFF5C5C5CFF5C5C5CFF
+      5D5D5DFF5D5D5DFF5C5C5CFF5C5C5CFF5E5E5EFF636363FF656565FF656665FF
+      626862FF667166FF637363FF657965FF698269FF648165FF688A69FF668C67FF
+      638D64FF5D8C5EFF538754FF528953FF508B51FF4E8D4FFF4C904DFF468D47FF
+      428D43FF418F42FF3F8F40FF3E913FFF55AD56FF58B159FE7ECE80EEA6DDA9DC
+      ACCEAF9D1C252037000000250000001C000000130000000C0000000700000005
+      00000002000000020000000200000002A7F7AE43A9FDAFD9AAF8AFFA78DB7AFF
+      3DBB3DFF3FBD3FFF40BF40FF42C242FF64D466FFB0FFB5FF9AF99FB70000000D
+      0000000B00000009000000060000000500000003FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B22CD4D4D45CC7C7C762
+      585858FF555555FF1B1B1BFF1D1D1DFF202020FF292929FF313131FF343434FF
+      414141FF474747FF494949FF494949FF3A3A3AFF3E3E3EFF434343FF4B4B4BFF
+      4E4E4EFF515151FF545454FF565656FF5A5A5AFF5D5D5DFF5F5F5FFF585858FF
+      505050FF515151FF505050FF4F4F4FFF505050FF505050FF505050FF606060FF
+      626262FF636363FF646464FF646464FF646464FF5E5E5EFF5E5E5EFF5E5E5EFF
+      5E5E5EFF5E5E5EFF5F5F5FFF5E5E5EFF606060FF646464FF666666FF666666FF
+      676867FF6A706AFF697469FF6A7A6AFF6E826EFF6A836AFF6F8C70FF6D8E6EFF
+      698F6AFF638E64FF59885AFF578A58FF558C56FF528E53FF508F51FF4A8D4BFF
+      468C47FF448E45FF439044FF419142FF60B161FF85CB86FEA5D7A7D9C4DBC5BB
+      797B796000000030000000250000001B000000130000000C0000000700000004
+      0000000200000001000000010000000100000002A7F7AE43AAFDAEDAABF9AFFA
+      7ADB7CFF3EBC3EFF40BE40FF42C042FF7CDF7EFFAAFFB0FF96F49C860000000A
+      0000000900000007000000050000000300000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B22CD4D4D45BC6C6C662
+      525252FF535353FF1C1C1CFF1E1E1EFF202020FF292929FF313131FF343434FF
+      424242FF494949FF4B4B4BFF4A4A4AFF3A3A3AFF3F3F3FFF444444FF4B4B4BFF
+      4F4F4FFF525252FF555555FF585858FF5B5B5BFF5F5F5FFF616161FF5A5A5AFF
+      515151FF525252FF505050FF515151FF505050FF525252FF525252FF626262FF
+      646464FF666666FF666666FF666666FF656565FF5F5F5FFF5F5F5FFF5F5F5FFF
+      5F5F5FFF606060FF5F5F5FFF606060FF616161FF656565FF686868FF686868FF
+      6A6A6AFF6F706FFF6E746EFF707B70FF748474FF6F836FFF748D74FF739074FF
+      6E906FFF6A8F6BFF5F8960FF5C8A5DFF5A8D5BFF578E58FF559056FF4F8D50FF
+      498B4AFF488D49FF468F47FF489449FF86C788FFACD3AEFDC1D3C2BAB7BAB996
+      7171715B00000030000000250000001A000000120000000C0000000700000004
+      000000020000000100000000000000010000000100000002A7F7AB43A9FDAEDB
+      ABF9B0FA7BDC7DFF40BC40FF44BF44FFA0F3A4FFA4FFABFF93EC995500000007
+      0000000600000005000000040000000200000002FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B22CD4D4D45BC6C6C661
+      595959FE585858FF1C1C1CFF1E1E1EFF202020FF2A2A2AFF333333FF353535FF
+      444444FF4B4B4BFF4D4D4DFF4D4D4DFF3B3B3BFF3F3F3FFF444444FF4C4C4CFF
+      505050FF535353FF565656FF595959FF5C5C5CFF5F5F5FFF636363FF5B5B5BFF
+      515151FF525252FF525252FF525252FF525252FF535353FF535353FF646464FF
+      666666FF676767FF676767FF686868FF676767FF616161FF616161FF616161FF
+      616161FF616161FF616161FF616161FF626262FF666666FF696969FF696969FF
+      6C6C6CFF717171FF737473FF747A74FF7A857AFF758575FF7C907CFF799279FF
+      769377FF6F9070FF648965FF618A62FF5E8D5FFF5B8E5CFF5A905BFF538D54FF
+      4D8B4EFF4C8D4DFF4D904EFF70AD71FFA7C9A8FFC1CCC2FCB1B3B19AB7B7B792
+      7272725A0000002F000000240000001A000000120000000C0000000700000004
+      00000002000000010000000000000000000000010000000100000002A9F9AD42
+      A9FDAEDAACF9B0FA7CDC7EFF74D876FFAFFEB4FD9DFEA4DD679B670F00000005
+      0000000400000003000000020000000200000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B22CD3D3D35BC6C6C661
+      5F5F5FFE5E5E5EFF1C1C1CFF1E1E1EFF202020FF2B2B2BFF343434FF373737FF
+      464646FF4D4D4DFF4F4F4FFF4E4E4EFF3B3B3BFF404040FF454545FF4D4D4DFF
+      515151FF545454FF585858FF5A5A5AFF5D5D5DFF616161FF646464FF5D5D5DFF
+      535353FF535353FF535353FF535353FF545454FF545454FF555555FF656565FF
+      696969FF6A6A6AFF696969FF6A6A6AFF696969FF626262FF636363FF636363FF
+      626262FF636363FF636363FF636363FF636363FF686868FF6A6A6AFF6C6C6CFF
+      6E6E6EFF737373FF757575FF7B7C7BFF808680FF7C877CFF839383FF7F937FFF
+      7B947BFF769377FF698A6AFF668B67FF638D64FF608E61FF5F9160FF578D58FF
+      518B52FF518D52FF6DA66EFF84A384FFB7BFB8FFB1B2B1FCB0B0B098B7B7B792
+      717171590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF0000000000000000010000000100000002
+      A9F9B042AAFDAFDBADF9B1FAB0F9B5FEA5FEAAF39AF49E440000000400000003
+      0000000300000002000000020000000100000001FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B1B1B12BD3D3D35AC5C5C561
+      666666FE646464FF1C1C1CFF1F1F1FFF202020FF2B2B2BFF343434FF383838FF
+      474747FF4E4E4EFF515151FF505050FF3C3C3CFF404040FF474747FF4E4E4EFF
+      525252FF555555FF595959FF5B5B5BFF5E5E5EFF626262FF656565FF5E5E5EFF
+      545454FF555555FF545454FF545454FF555555FF555555FF555555FF676767FF
+      6B6B6BFF6A6A6AFF6B6B6BFF6B6B6BFF6B6B6BFF646464FF646464FF656565FF
+      656565FF656565FF646464FF666666FF656565FF6A6A6AFF6C6C6CFF6D6D6DFF
+      6F6F6FFF747474FF767676FF7F7F7FFF878887FF828882FF8A958AFF869686FF
+      829682FF7D957DFF6E8A6FFF6B8C6CFF698E6AFF658E66FF649165FF5A8C5BFF
+      578C58FF6C9F6DFF809C81FF878D88FFA5A5A5FFAAAAAAFCAFAFAF98B7B7B792
+      717171590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF0000000000000000000000000100000001
+      00000001A9F9B042A9FEAEDBA8FCAEEFA3FEAA93000000020000000200000002
+      0000000200000001000000010000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B1B1B12BD3D3D35AC5C5C561
+      6D6D6DFE6A6A6AFF1D1D1DFF1F1F1FFF212121FF2C2C2CFF363636FF393939FF
+      484848FF515151FF515151FF515151FF3D3D3DFF404040FF474747FF4F4F4FFF
+      525252FF565656FF595959FF5D5D5DFF606060FF636363FF676767FF5F5F5FFF
+      555555FF555555FF565656FF545454FF555555FF555555FF565656FF696969FF
+      6C6C6CFF6D6D6DFF6D6D6DFF6D6D6DFF6C6C6CFF666666FF656565FF666666FF
+      666666FF656565FF666666FF666666FF666666FF6B6B6BFF6D6D6DFF6E6E6EFF
+      717171FF767676FF787878FF808080FF8A8A8AFF898A89FF8F958FFF8D988DFF
+      899989FF839683FF748C74FF708D71FF6D8E6EFF6B906CFF69926AFF618E62FF
+      6C986DFF7D957EFF868986FF727372FF9D9D9DFFA2A2A2FDAFAFAF97B7B7B792
+      717171590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00000000000000000000000000
+      0000000100000001ABFCAF42A9FFAEC4A0F0A010000000010000000100000001
+      0000000100000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B1B1B12BD3D3D35AC5C5C561
+      737373FE707070FF1D1D1DFF1F1F1FFF212121FF2D2D2DFF373737FF3A3A3AFF
+      4A4A4AFF525252FF545454FF535353FF3E3E3EFF424242FF484848FF505050FF
+      535353FF575757FF5A5A5AFF5D5D5DFF606060FF646464FF686868FF606060FF
+      565656FF565656FF575757FF565656FF565656FF565656FF575757FF6B6B6BFF
+      6F6F6FFF6F6F6FFF6E6E6EFF707070FF6F6F6FFF676767FF686868FF686868FF
+      676767FF686868FF686868FF676767FF676767FF6D6D6DFF6E6E6EFF707070FF
+      727272FF787878FF7A7A7AFF828282FF8D8D8DFF8C8C8CFF989998FF949A94FF
+      919C91FF8A998AFF788C78FF768F76FF738F74FF709071FF6F9270FF6F9670FF
+      7B8F7BFF838583FF757575FF737373FF979797FF9B9B9BFDAFAFAF97B6B6B691
+      707070590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000
+      00000000000000000000000095EBAB0C00000001000000010000000100000000
+      000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B0B0B02BD2D2D259C5C5C560
+      7A7A7AFE757575FF1E1E1EFF202020FF212121FF2D2D2DFF383838FF3B3B3BFF
+      4C4C4CFF545454FF575757FF555555FF3E3E3EFF414141FF474747FF515151FF
+      545454FF585858FF5B5B5BFF5F5F5FFF616161FF666666FF696969FF616161FF
+      585858FF585858FF575757FF565656FF575757FF575757FF585858FF6D6D6DFF
+      707070FF707070FF717171FF727272FF717171FF686868FF696969FF696969FF
+      696969FF696969FF696969FF6A6A6AFF696969FF6D6D6DFF717171FF707070FF
+      737373FF7A7A7AFF7A7A7AFF848484FF8F8F8FFF8E8E8EFF9B9B9BFF9B9C9BFF
+      989E98FF909B90FF7E8E7EFF7C907CFF778F77FF779378FF79987AFF7E907EFF
+      808180FF757575FF747474FF747474FF909090FF949494FDAFAFAF97B6B6B691
+      707070590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF0000000000000000000000000000000000000000000000000000000000
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B0B0B02BD2D2D259C4C4C460
+      828282FE7C7C7CFF1E1E1EFF202020FF222222FF2E2E2EFF383838FF3B3B3BFF
+      4E4E4EFF565656FF585858FF575757FF3F3F3FFF434343FF494949FF515151FF
+      555555FF595959FF5C5C5CFF5F5F5FFF626262FF666666FF6A6A6AFF636363FF
+      585858FF595959FF585858FF585858FF585858FF595959FF595959FF6F6F6FFF
+      727272FF737373FF737373FF727272FF727272FF6A6A6AFF6A6A6AFF6A6A6AFF
+      6B6B6BFF6B6B6BFF6C6C6CFF6B6B6BFF6B6B6BFF6F6F6FFF727272FF717171FF
+      747474FF7B7B7BFF7D7D7DFF868686FF919191FF919191FF9E9E9EFFA0A0A0FF
+      9FA09FFF979D97FF859085FF819181FF7F927FFF7C947CFF869386FF858685FF
+      787878FF767676FF747474FF757575FF898989FF8C8C8CFDAEAEAE97B6B6B691
+      707070590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B0B0B02BD2D2D259C4C4C45F
+      848484FE7C7C7CFF1F1F1FFF212121FF232323FF2F2F2FFF3A3A3AFF3C3C3CFF
+      505050FF595959FF5A5A5AFF585858FF3F3F3FFF434343FF484848FF525252FF
+      565656FF595959FF5C5C5CFF606060FF646464FF676767FF6B6B6BFF616161FF
+      595959FF5A5A5AFF585858FF595959FF595959FF595959FF5A5A5AFF707070FF
+      737373FF747474FF747474FF767676FF747474FF6B6B6BFF6C6C6CFF6C6C6CFF
+      6D6D6DFF6C6C6CFF6D6D6DFF6D6D6DFF6D6D6DFF717171FF727272FF747474FF
+      757575FF7C7C7CFF7E7E7EFF878787FF949494FF929292FFA1A1A1FFA2A2A2FF
+      A2A2A2FF9FA09FFF8C928CFF879287FF839283FF879087FF8E8E8EFF818181FF
+      777777FF777777FF767676FF767676FF818181FF848484FEAEAEAE96B5B5B591
+      707070590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B0B0B02BD2D2D258C4C4C45F
+      848484FD7D7D7DFF1F1F1FFF212121FF232323FF2F2F2FFF3B3B3BFF3E3E3EFF
+      515151FF5A5A5AFF5C5C5CFF5A5A5AFF3E3E3EFF434343FF494949FF535353FF
+      575757FF5B5B5BFF5E5E5EFF606060FF646464FF696969FF6B6B6BFF636363FF
+      5A5A5AFF5B5B5BFF5A5A5AFF595959FF5B5B5BFF5B5B5BFF5A5A5AFF717171FF
+      757575FF767676FF767676FF777777FF767676FF6E6E6EFF6D6D6DFF6D6D6DFF
+      6E6E6EFF6E6E6EFF6E6E6EFF6D6D6DFF6D6D6DFF727272FF757575FF747474FF
+      777777FF7E7E7EFF808080FF898989FF969696FF959595FFA4A4A4FFA5A5A5FF
+      A6A6A6FFA2A2A2FF929392FF8D938DFF8C918CFF8F8F8FFF909090FF828282FF
+      787878FF787878FF777777FF777777FF7A7A7AFF7C7C7CFEAEAEAE96B5B5B591
+      6F6F6F590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009AFAFAF2AD1D1D158C3C3C35F
+      858585FD7D7D7DFF1F1F1FFF222222FF232323FF303030FF3B3B3BFF3E3E3EFF
+      525252FF5C5C5CFF5E5E5EFF5C5C5CFF3F3F3FFF434343FF4A4A4AFF535353FF
+      585858FF5B5B5BFF5F5F5FFF626262FF656565FF696969FF6D6D6DFF646464FF
+      5A5A5AFF5C5C5CFF5B5B5BFF595959FF5A5A5AFF5B5B5BFF5B5B5BFF747474FF
+      767676FF787878FF787878FF787878FF787878FF6E6E6EFF6E6E6EFF6F6F6FFF
+      6F6F6FFF707070FF707070FF6F6F6FFF6F6F6FFF757575FF767676FF757575FF
+      787878FF808080FF818181FF8A8A8AFF989898FF979797FFA7A7A7FFA8A8A8FF
+      A8A8A8FFA5A5A5FF959595FF939493FF929292FF909090FF919191FF838383FF
+      7A7A7AFF797979FF777777FF787878FF737373FF757575FEADADAD96B5B5B590
+      6F6F6F590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009AFAFAF2AD1D1D157C3C3C35E
+      848484FD7D7D7DFF1F1F1FFF212121FF242424FF313131FF3D3D3DFF404040FF
+      545454FF5F5F5FFF606060FF5D5D5DFF3F3F3FFF434343FF4A4A4AFF545454FF
+      585858FF5C5C5CFF5F5F5FFF636363FF666666FF6A6A6AFF6E6E6EFF646464FF
+      5A5A5AFF5C5C5CFF5B5B5BFF5C5C5CFF5B5B5BFF5C5C5CFF5D5D5DFF747474FF
+      7A7A7AFF7A7A7AFF797979FF7A7A7AFF7B7B7BFF707070FF6F6F6FFF6F6F6FFF
+      707070FF717171FF717171FF717171FF717171FF767676FF777777FF777777FF
+      7A7A7AFF818181FF838383FF8D8D8DFF9A9A9AFF9A9A9AFFA9A9A9FFACACACFF
+      ABABABFFA8A8A8FF969696FF949494FF949494FF939393FF949494FF848484FF
+      7A7A7AFF7A7A7AFF787878FF787878FF747474FF6E6E6EFEADADAD96B4B4B490
+      6F6F6F590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009AFAFAF2AD1D1D157C3C3C35E
+      858585FD7D7D7DFF202020FF222222FF242424FF323232FF3E3E3EFF414141FF
+      565656FF616161FF626262FF606060FF404040FF444444FF4A4A4AFF555555FF
+      595959FF5D5D5DFF5F5F5FFF636363FF676767FF6B6B6BFF6F6F6FFF646464FF
+      5A5A5AFF5D5D5DFF5C5C5CFF5B5B5BFF5C5C5CFF5C5C5CFF5D5D5DFF767676FF
+      7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF717171FF717171FF727272FF
+      727272FF727272FF737373FF737373FF737373FF797979FF797979FF787878FF
+      7B7B7BFF838383FF858585FF8F8F8FFF9D9D9DFF9C9C9CFFACACACFFAEAEAEFF
+      ADADADFFA9A9A9FF989898FF989898FF969696FF959595FF959595FF878787FF
+      7A7A7AFF7A7A7AFF7A7A7AFF7A7A7AFF7B7B7BFF757575FEADADAD96B4B4B48F
+      6F6F6F590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009AEAEAE2AD1D1D157C2C2C25E
+      858585FD7D7D7DFF202020FF222222FF242424FF333333FF3F3F3FFF424242FF
+      575757FF626262FF656565FF626262FF404040FF444444FF4B4B4BFF555555FF
+      5A5A5AFF5D5D5DFF606060FF656565FF686868FF6B6B6BFF6F6F6FFF656565FF
+      5A5A5AFF5D5D5DFF5D5D5DFF5C5C5CFF5D5D5DFF5C5C5CFF5D5D5DFF777777FF
+      7C7C7CFF7C7C7CFF7D7D7DFF7D7D7DFF7E7E7EFF737373FF737373FF737373FF
+      747474FF747474FF757575FF747474FF747474FF7A7A7AFF7B7B7BFF7A7A7AFF
+      7D7D7DFF848484FF868686FF909090FF9F9F9FFF9E9E9EFFAEAEAEFFB1B1B1FF
+      B2B2B2FFACACACFF9B9B9BFF999999FF999999FF979797FF979797FF888888FF
+      7B7B7BFF7C7C7CFF7A7A7AFF7B7B7BFF828282FF7D7D7DFEACACAC95B4B4B48F
+      6F6F6F590000002F000000240000001A000000120000000C0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B229D0D0D057C2C2C25E
+      858585FD7D7D7DFF202020FF222222FF252525FF333333FF404040FF434343FF
+      585858FF656565FF676767FF636363FF414141FF454545FF4B4B4BFF565656FF
+      5B5B5BFF5F5F5FFF616161FF656565FF696969FF6D6D6DFF6F6F6FFF656565FF
+      5A5A5AFF5D5D5DFF5D5D5DFF5E5E5EFF5D5D5DFF5E5E5EFF5E5E5EFF797979FF
+      7E7E7EFF7E7E7EFF7F7F7FFF808080FF7F7F7FFF747474FF757575FF747474FF
+      757575FF757575FF757575FF747474FF767676FF7A7A7AFF7C7C7CFF7B7B7BFF
+      7E7E7EFF868686FF888888FF929292FFA1A1A1FFA0A0A0FFB2B2B2FFB4B4B4FF
+      B3B3B3FFAEAEAEFF9D9D9DFF9B9B9BFF9B9B9BFF9A9A9AFF999999FF898989FF
+      7D7D7DFF7C7C7CFF7B7B7BFF7B7B7BFF898989FF848484FEACACAC95B4B4B48F
+      6F6F6F570000002F000000240000001A000000110000000B0000000700000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000030000000500000009B2B2B229D2D2D256C3C3C35C
+      868686FD7D7D7DFF212121FF222222FF242424FF353535FF424242FF444444FF
+      5B5B5BFF686868FF696969FF646464FF414141FF444444FF4B4B4BFF565656FF
+      5A5A5AFF5F5F5FFF616161FF656565FF696969FF6D6D6DFF707070FF676767FF
+      595959FF5D5D5DFF5E5E5EFF5D5D5DFF5D5D5DFF5F5F5FFF5F5F5FFF7B7B7BFF
+      7F7F7FFF808080FF818181FF818181FF808080FF767676FF767676FF767676FF
+      777777FF767676FF777777FF767676FF777777FF7C7C7CFF7E7E7EFF7C7C7CFF
+      808080FF878787FF898989FF959595FFA4A4A4FFA2A2A2FFB4B4B4FFB6B6B6FF
+      B6B6B6FFB1B1B1FF9F9F9FFF9E9E9EFF9D9D9DFF9C9C9CFF9C9C9CFF8B8B8BFF
+      7D7D7DFF7D7D7DFF7D7D7DFF7B7B7BFF909090FF8C8C8CFDACACAC94B4B4B48E
+      6F6F6F570000002E0000002300000019000000110000000B0000000600000004
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000500000009B2B2B229D2D2D255C3C3C35C
+      868686FD7D7D7DFF212121FF232323FF252525FF353535FF434343FF454545FF
+      5C5C5CFF686868FF6B6B6BFF666666FF414141FF454545FF4C4C4CFF575757FF
+      5C5C5CFF5F5F5FFF626262FF666666FF6A6A6AFF6E6E6EFF717171FF666666FF
+      595959FF5D5D5DFF5E5E5EFF5E5E5EFF5E5E5EFF5F5F5FFF616161FF7D7D7DFF
+      818181FF838383FF828282FF838383FF828282FF767676FF777777FF767676FF
+      777777FF777777FF777777FF787878FF787878FF7F7F7FFF808080FF7D7D7DFF
+      808080FF888888FF8B8B8BFF969696FFA7A7A7FFA5A5A5FFB7B7B7FFB9B9B9FF
+      B9B9B9FFB4B4B4FFA1A1A1FFA0A0A0FFA0A0A0FF9E9E9EFF9E9E9EFF8C8C8CFF
+      7E7E7EFF7D7D7DFF7C7C7CFF7C7C7CFF989898FF949494FDAEAEAE93B5B5B58E
+      6F6F6F560000002D0000002200000018000000100000000B0000000600000003
+      0000000200000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000500000008B5B5B528D3D3D354C6C6C65A
+      858585FD7D7D7DFF222222FF242424FF252525FF363636FF444444FF464646FF
+      5E5E5EFF6B6B6BFF6E6E6EFF686868FF404040FF454545FF4C4C4CFF585858FF
+      5D5D5DFF5F5F5FFF636363FF666666FF6B6B6BFF6E6E6EFF727272FF666666FF
+      5A5A5AFF5C5C5CFF5E5E5EFF5F5F5FFF606060FF606060FF606060FF7E7E7EFF
+      838383FF838383FF848484FF848484FF838383FF787878FF797979FF787878FF
+      787878FF797979FF7A7A7AFF7A7A7AFF7A7A7AFF7F7F7FFF828282FF7F7F7FFF
+      818181FF8B8B8BFF8C8C8CFF989898FFA9A9A9FFA8A8A8FFBBBBBBFFBCBCBCFF
+      BCBCBCFFB8B8B8FFA4A4A4FFA2A2A2FFA2A2A2FFA0A0A0FFA0A0A0FF8D8D8DFF
+      808080FF7E7E7EFF7E7E7EFF7E7E7EFFA0A0A0FF9C9C9CFDAFAFAF91B7B7B78B
+      717171540000002C0000002100000017000000100000000A0000000600000003
+      0000000100000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000500000007B9B9B927D4D4D453C7C7C759
+      858585FC7E7E7EFF232323FF242424FF252525FF373737FF454545FF474747FF
+      5F5F5FFF6E6E6EFF707070FF6A6A6AFF404040FF444444FF4C4C4CFF595959FF
+      5D5D5DFF606060FF646464FF676767FF6B6B6BFF6E6E6EFF737373FF666666FF
+      595959FF5E5E5EFF5E5E5EFF5F5F5FFF616161FF606060FF616161FF7F7F7FFF
+      848484FF848484FF858585FF868686FF868686FF7A7A7AFF7A7A7AFF7A7A7AFF
+      7B7B7BFF7A7A7AFF7A7A7AFF7B7B7BFF7A7A7AFF818181FF828282FF818181FF
+      828282FF8B8B8BFF8D8D8DFF9B9B9BFFABABABFFAAAAAAFFBDBDBDFFC0C0C0FF
+      BFBFBFFFBBBBBBFFA6A6A6FFA5A5A5FFA4A4A4FFA2A2A2FFA4A4A4FF8F8F8FFF
+      7F7F7FFF7F7F7FFF7E7E7EFF7D7D7DFFA7A7A7FFA4A4A4FCB0B0B08FB8B8B88A
+      75757552000000290000001F000000160000000F000000090000000500000003
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000400000007B9B9B927D8D8D852CACACA58
+      858585FC7D7D7DFF232323FF252525FF262626FF383838FF464646FF494949FF
+      616161FF707070FF727272FF6D6D6DFF404040FF464646FF4D4D4DFF585858FF
+      5E5E5EFF616161FF646464FF686868FF6C6C6CFF707070FF737373FF666666FF
+      5A5A5AFF5D5D5DFF5E5E5EFF5F5F5FFF606060FF606060FF626262FF818181FF
+      868686FF878787FF878787FF888888FF878787FF7B7B7BFF7C7C7CFF7B7B7BFF
+      7C7C7CFF7C7C7CFF7C7C7CFF7C7C7CFF7C7C7CFF838383FF848484FF838383FF
+      848484FF8C8C8CFF8F8F8FFF9C9C9CFFAFAFAFFFADADADFFBFBFBFFFC3C3C3FF
+      C2C2C2FFBEBEBEFFA9A9A9FFA8A8A8FFA6A6A6FFA6A6A6FFA4A4A4FF8F8F8FFF
+      7F7F7FFF7E7E7EFF7E7E7EFF7D7D7DFFAEAEAEFFACACACFBB3B3B38CBCBCBC86
+      7979794F000000260000001D000000150000000E000000090000000500000003
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000001000000020000000300000006C1C1C125DADADA50CFCFCF55
+      858585FC7E7E7EFF242424FF262626FF262626FF383838FF484848FF4B4B4BFF
+      636363FF737373FF747474FF6F6F6FFF414141FF464646FF4D4D4DFF595959FF
+      5E5E5EFF616161FF646464FF686868FF6C6C6CFF717171FF737373FF676767FF
+      595959FF5D5D5DFF5E5E5EFF606060FF616161FF626262FF626262FF838383FF
+      888888FF888888FF8A8A8AFF8A8A8AFF898989FF7C7C7CFF7D7D7DFF7D7D7DFF
+      7D7D7DFF7D7D7DFF7D7D7DFF7D7D7DFF7E7E7EFF858585FF878787FF858585FF
+      858585FF8E8E8EFF8F8F8FFF9D9D9DFFB0B0B0FFB0B0B0FFC2C2C2FFC5C5C5FF
+      C4C4C4FFBFBFBFFFABABABFFA9A9A9FFA7A7A7FFA6A6A6FFA4A4A4FF8F8F8FFF
+      7E7E7EFF7D7D7DFF7C7C7CFF7B7B7BFFB5B5B5FFB4B4B4FBB8B8B888C0C0C083
+      8080804B000000230000001A000000120000000C000000080000000500000002
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000
+      0000000000000001000000010000000100000001000000010000000100000001
+      00000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000000000000020000000300000005C6C6C624E0E0E04ED4D4D453
+      858585FC7E7E7EFF242424FF262626FF272727FF393939FF4A4A4AFF4C4C4CFF
+      646464FF747474FF767676FF717171FF414141FF454545FF4E4E4EFF5A5A5AFF
+      5E5E5EFF626262FF656565FF696969FF6D6D6DFF707070FF757575FF676767FF
+      595959FF5E5E5EFF5E5E5EFF5F5F5FFF616161FF626262FF626262FF848484FF
+      898989FF898989FF8B8B8BFF8A8A8AFF8B8B8BFF7D7D7DFF7D7D7DFF7E7E7EFF
+      7E7E7EFF7E7E7EFF7F7F7FFF7F7F7FFF808080FF888888FF878787FF878787FF
+      858585FF8F8F8FFF919191FF9F9F9FFFB3B3B3FFB1B1B1FFC3C3C3FFC5C5C5FF
+      C5C5C5FFBFBFBFFFABABABFFA9A9A9FFA7A7A7FFA5A5A5FFA5A5A5FF8E8E8EFF
+      7D7D7DFF7B7B7BFF7B7B7BFF7B7B7BFFBCBCBCFFBCBCBCFABDBDBD84C5C5C57F
+      888888460000001E00000016000000100000000A000000070000000400000002
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000
+      0000000100000001000000010000000200000002000000020000000200000002
+      000000010000000100000001000000000000000000000000FFFFFF00FFFFFF00
+      0000000000000000000000010000000200000005D0D0D022E4E4E44CDADADA50
+      868686FB808080FF262626FF272727FF282828FF3A3A3AFF4B4B4BFF4E4E4EFF
+      676767FF777777FF797979FF727272FF414141FF464646FF4D4D4DFF5B5B5BFF
+      5F5F5FFF626262FF666666FF6A6A6AFF6E6E6EFF717171FF767676FF696969FF
+      595959FF5D5D5DFF5E5E5EFF606060FF616161FF636363FF636363FF858585FF
+      8B8B8BFF8C8C8CFF8C8C8CFF8C8C8CFF8C8C8CFF7F7F7FFF7F7F7FFF7F7F7FFF
+      808080FF808080FF818181FF818181FF828282FF888888FF898989FF868686FF
+      878787FF8F8F8FFF919191FFA0A0A0FFB3B3B3FFB1B1B1FFC4C4C4FFC6C6C6FF
+      C5C5C5FFC0C0C0FFABABABFFA9A9A9FFA7A7A7FFA5A5A5FFA4A4A4FF8E8E8EFF
+      7D7D7DFF7B7B7BFF7B7B7BFF7A7A7AFFBDBDBDFFC0C0C0F8C5C5C57FCCCCCC7A
+      9191914100000019000000130000000D00000009000000050000000300000002
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000001
+      0000000200000002000000020000000300000003000000030000000300000003
+      00000002000000020000000100000001000000010000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000003D5D5D521E8E8E84AE0E0E04E
+      888888F0878787FF434343FF272727FF282828FF3C3C3CFF4C4C4CFF4F4F4FFF
+      696969FF797979FF7C7C7CFF747474FF414141FF464646FF4D4D4DFF5A5A5AFF
+      5F5F5FFF626262FF666666FF6A6A6AFF6F6F6FFF727272FF757575FF696969FF
+      585858FF5C5C5CFF5D5D5DFF5F5F5FFF626262FF646464FF636363FF878787FF
+      8C8C8CFF8C8C8CFF8D8D8DFF8F8F8FFF8E8E8EFF7F7F7FFF808080FF808080FF
+      818181FF818181FF808080FF818181FF818181FF888888FF8A8A8AFF878787FF
+      878787FF8E8E8EFF909090FF9F9F9FFFB3B3B3FFB1B1B1FFC4C4C4FFC5C5C5FF
+      C5C5C5FFBFBFBFFFABABABFFA9A9A9FFA8A8A8FFA6A6A6FFA4A4A4FF8D8D8DFF
+      7B7B7BFF7A7A7AFF797979FF909090FFC0C0C0FFC0C0C0EBCCCCCC79D3D3D376
+      9F9F9F3B000000140000000F0000000A00000007000000040000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000100000002
+      0000000200000003000000040000000500000005000000050000000500000005
+      0000000400000003000000020000000200000001000000010000000000000000
+      0000000000000000000000010000000200000003D1D1D119EDEDED48E4E4E44C
+      939393C4878787FF757575FF414141FF2A2A2AFF3D3D3DFF4E4E4EFF505050FF
+      6A6A6AFF7C7C7CFF7E7E7EFF777777FF414141FF454545FF4E4E4EFF5B5B5BFF
+      606060FF636363FF676767FF6B6B6BFF6E6E6EFF727272FF787878FF696969FF
+      595959FF5D5D5DFF5D5D5DFF5F5F5FFF626262FF636363FF646464FF898989FF
+      8E8E8EFF8F8F8FFF8F8F8FFF909090FF909090FF818181FF818181FF828282FF
+      818181FF818181FF818181FF808080FF818181FF888888FF8A8A8AFF888888FF
+      878787FF8E8E8EFF909090FF9E9E9EFFB3B3B3FFB1B1B1FFC4C4C4FFC5C5C5FF
+      C5C5C5FFBFBFBFFFABABABFFA9A9A9FFA7A7A7FFA6A6A6FFA4A4A4FF8D8D8DFF
+      7A7A7AFF7A7A7AFF8C8C8CFFB3B3B3FFBFBFBFFFC4C4C4C2D5D5D574DBDBDB71
+      9C9C9C2E0000000F0000000B0000000800000005000000030000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000200000002
+      0000000300000005000000060000000700000007000000070000000700000007
+      0000000600000005000000040000000200000002000000010000000100000000
+      0000000000000000000000010000000100000002A3A3A30BEFEFEF48E8E8E84A
+      E0E0E04E8B8B8BEE888888FF8A8A8AFF808080FF888888FF949494FF959595FF
+      A5A5A5FFB1B1B1FFB2B2B2FFADADADFF8C8C8CFF8F8F8FFF949494FF9D9D9DFF
+      A0A0A0FFA1A1A1FFA5A5A5FFA7A7A7FFA9A9A9FFACACACFFAEAEAEFFA5A5A5FF
+      9D9D9DFF9F9F9FFF9F9F9FFFA1A1A1FFA2A2A2FFA4A4A4FFA5A5A5FFBABABAFF
+      BEBEBEFFBEBEBEFFBDBDBDFFB2B2B2FFA5A5A5FF939393FF898989FF7F7F7FFF
+      747474FF696969FF656565FF707070FF7C7C7CFF898989FF959595FFA0A0A0FF
+      ABABABFFBABABAFFC0C0C0FFC8C8C8FFD4D4D4FFD4D4D4FFDEDEDEFFDFDFDFFF
+      DFDFDFFFDBDBDBFFD0D0D0FFD0D0D0FFCFCFCFFFCECECEFFCDCDCDFFC1C1C1FF
+      B7B7B7FFB9B9B9FFBFBFBFFFBFBFBFFFC1C1C1E7D7D7D773DEDEDE6FE3E3E36D
+      646464180000000B000000080000000500000004000000020000000100000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000200000003
+      000000050000000600000008000000090000000A0000000B0000000A00000009
+      0000000800000007000000050000000400000003000000020000000100000001
+      000000000000000000000001000000010000000200000003E7E7E72DEDEDED48
+      E6E6E64BDCDCDC4F949494C78C8C8CF28B8B8BFB959595FD9F9F9FFEA0A0A0FE
+      ADADADFEB5B5B5FFB8B8B8FFB4B4B4FF9A9A9AFF9C9C9CFFA1A1A1FFA8A8A8FF
+      ABABABFFADADADFFB0B0B0FFB1B1B1FFB2B2B2FFB6B6B6FEB8B8B8FCB1B1B1FC
+      A8A8A8FCABABABFCABABABFCADADADFCB0B0B0FCB2B2B2FCB1B1B1FCC3C3C3FB
+      C7C7C7FAC6C6C6FAC7C7C7FABDBDBDFBAFAFAFFB9B9B9BFC8F8F8FFD828282FD
+      767676FE696969FE5D5D5DFE676767FE747474FE828282FD909090FD9C9C9CFC
+      A9A9A9FEB9B9B9FFC7C7C7FFCFCFCFFFD8D8D8FFD7D7D7FFE0E0E0FFE1E1E1FF
+      E0E0E0FFDEDEDEFFD4D4D4FFD3D3D3FFD2D2D2FFD2D2D2FDD1D1D1FCC7C7C7FC
+      BFBFBFFBBEBEBEFABFBFBFEBC4C4C4C3D8D8D872DFDFDF6EE6E6E66BD8D8D846
+      0000000A00000007000000050000000400000002000000020000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000020000000300000005
+      00000007000000090000000B0000000C0000000E0000000E0000000E0000000D
+      0000000C0000000A000000080000000600000005000000030000000200000001
+      00000001000000010000000100000001000000020000000369696908E3E3E335
+      E8E8E84ADFDFDF4DD9D9D94FD0D0D054CBCBC95BDCD6CE7FE2D0B09BD7BF9494
+      9B9893E9898989FFA7A7A7FFE7E7E7FFE3E3E3FFD5D5D5FFCCCCCCFFC7C7C7FF
+      C5C5C5FFC5C5C5FFBFBFBFFF979797FF8C8C8CFF979797D99D9D9D7CA7A7A775
+      B1B1B16FBCBCBC69C5C5C565CECECE61D4D4D45ED9D9D95DDDDDDD5CDFDFDF5C
+      E0E0E05BE0E0E05BE1E1E15CE1E1E15CE1E1E15DE1E1E15DE2E2E25EE2E2E25E
+      E2E2E25EE2E2E25FE2E2E25FE1E1E160DEDEDE62DBDBDB63D4D4D467CECECE6B
+      999999F9949494FFB9B9B9FFDCDCDCFFD3D3D3FFCCCCCCFFCBCBCBFFCBCBCBFF
+      CBCBCBFFC9C9C9FFC3C3C3FF989898FF979797FFA2A2A2ACA8A8A88CB0B0B086
+      BABABA80C4C4C47ACECECE75D7D7D770DFDFDF6DE5E5E56AE1E1E14C5C5C5C0E
+      0000000700000005000000040000000200000002000000010000000000000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000020000000400000006
+      000000080000000B0000000E0000001000000012000000130000001200000011
+      0000000F0000000D0000000B0000000800000006000000050000000300000002
+      0000000200000001000000020000000200000003000000040000000500000007
+      B6B6B61DC7C7C72FC6C6C63BC2BFBF44DED3C872E7CDA695DAB77C88C9A5677D
+      8F8C85E77B7B7BFF9D9D9DFFE7E7E7FFE4E4E4FFD2D2D2FFC7C7C7FFC1C1C1FF
+      BEBEBEFFBDBDBDFFB6B6B6FF898989FF7D7D7DFF878787D47F7F7F698A8A8A61
+      98989859A6A6A652B4B4B44CC1C1C147CACACA44D4D4D441D9D9D940DCDCDC3F
+      DDDDDD40E0E0E040E0E0E040E0E0E040E0E0E040E0E0E041E0E0E041E1E1E141
+      E1E1E141E1E1E142DEDEDE42DCDCDC44DADADA45D3D3D347C8C8C84BBFBFBF4F
+      888888F7828282FFADADADFFD6D6D6FFCCCCCCFFC3C3C3FFC2C2C2FFC2C2C2FF
+      C2C2C2FFC0C0C0FFB8B8B8FF868686FF848484FF8989899D898989769292926F
+      9F9F9F67ABABAB60BABABA59C7C7C752C7C7C742B5B5B5280000000900000007
+      00000004000000030000000200000001000000010000000000000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000030000000500000007
+      0000000ABC9F872BF4CEB39A463C321900000016000000170000001700000015
+      00000014000000110000000E0000000C00000009000000070000000500000004
+      0000000300000002000000020000000300000004000000050000000700000009
+      0000000B0000000E4F443917D5C4AC57E7BF8486D7993A73BB76005FAF710862
+      716D65E15C5C5CFF878787FFE4E4E4FFE2E2E2FFCCCCCCFFBBBBBBFFB2B2B2FF
+      AFAFAFFFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF5F5F5FC80000004100000036
+      0000002B0000002100000019000000130000000E0000000B0000000900000007
+      0000000700000006000000060000000600000006000000060000000600000006
+      00000006000000060000000700000007000000090000000C0000001100000017
+      626262F55C5C5CFF979797FFCBCBCBFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397C000000480000003D
+      00000032000000270000001D000000150000000F0000000A0000000700000004
+      000000020000000200000001000000010000000000000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000040000000600000009
+      0000000CF7D0B4AEFDD1B0EAF1CCB0A5372F27200000001B0000001B0000001A
+      0000001800000015000000120000000F0000000C000000090000000700000005
+      000000040000000400000004000000050000000500000007000000090000000A
+      0000000D53534716DEC8B35EEDC58A90E19F3D7ACA7D0064C0760064B4740866
+      726D64E25C5C5CFF878787FFE6E6E6FFE5E5E5FFCFCFCFFFBDBDBDFFB3B3B3FF
+      AFAFAFFFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF60605EC90000004000000035
+      0000002A0000002000000017000000110000000C000000080000000600000005
+      0000000400000004000000030000000300000003000000030000000300000003
+      0000000300000004000000040000000500000007000000090000000E00000014
+      626262F55C5C5CFF9A9A9AFFCDCDCDFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397C000000470000003C
+      00000031000000250000001C000000130000000D000000080000000500000003
+      0000000200000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000040000000700000009
+      E8C2A664FED2B2F0FEC191F5FDCEACF0EEC8AEA930292225000000200000001F
+      0000001D0000001A00000016000000130000000F0000000C0000000900000007
+      0000000600000006000000060000000600000007000000090000000B0000000D
+      5B4F4F17E3CCB468F1C68E9BE7A03F82D581006BCC7C0069C2780068B873076B
+      736D64E35C5C5CFF878787FFE8E8E8FFE8E8E8FFD4D4D4FFBFBFBFFFB4B4B4FF
+      AFAFAFFFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF61605EC9130F004300000034
+      000000290000001F00000017000000100000000B000000070000000500000003
+      0000000200000002000000020000000200000002000000020000000200000002
+      0000000200000002000000020000000300000005000000080000000D00000013
+      626262F55C5C5CFF9D9D9DFFCFCFCFFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      00000030000000240000001A000000120000000C000000070000000400000002
+      000000010000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000500000007AF977F20
+      FDD1B3E7FEC49AF7FB7608DCFCA864EBFDCFADF0EBC7ACAA2A241E2A00000023
+      000000210000001E0000001B0000001700000013000000100000000D0000000B
+      000000090000000800000008000000090000000A0000000C0000000E5E534918
+      E6CDB670F3C791A6EAA5418CDB820072D67F006FCD7D006EC578006DBA76076F
+      736D63E45C5C5CFF888888FFEAEAEAFFEBEBEBFFD8D8D8FFC2C2C2FFB5B5B5FF
+      AFAFAFFFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF63615DCB2116004617120038
+      000000290000001F00000017000000100000000A000000070000000400000003
+      0000000200000001000000010000000100000001000000010000000100000000
+      0000000000000001000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFA0A0A0FFD1D1D1FFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000240000001A000000120000000C000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000500000008F0C7AB76
+      FFD1B3FCFD8E37EBFB7100DFF97200DCFBA865EBFCCEADF1E9C5ABAD28221C2D
+      00000025000000230000001F0000001B0000001700000014000000100000000E
+      0000000C0000000C0000000C0000000C0000000E0000000F61574D1AE8CEB578
+      F5C894B0EDA44395DF81007ADB820078D77F0074CF7A0073C6780072BE760774
+      736D63E45C5C5CFF888888FFEBEBEBFFEDEDEDFFDCDCDCFFC3C3C3FFB6B6B6FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF64625DCC3123004A271A003B
+      1C16002E0000001F00000017000000100000000B000000070000000400000002
+      00000002000000010000000100000000000000000000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFA3A3A3FFD3D3D3FFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000500000009F8CCAEA7
+      FFD1B1FDFD7204E8FB7000E4FA7100E0F87100DDFBA864ECFCCFACF2E8C3A9AF
+      26211B2F0000002700000023000000200000001C000000180000001500000012
+      000000100000000F0000000F0000001000000011604F461DE9CDB581F6C996BB
+      EEA2439FE4820083E0820080DB7F007CD67F007BD07B0078C8760076C1770679
+      746D63E55C5C5CFF888888FFEDEDEDFFEFEFEFFFE0E0E0FFC5C5C5FFB7B7B7FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF65635CCD3E2A004E38280040
+      2E1F0032231C002400000017000000100000000B000000070000000500000003
+      000000020000000100000001000000000000000000000000FFFFFF00FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFA5A5A5FFD5D5D5FFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000600000009FDCEAEDA
+      FFBF92FBFD6E00EBFC6F00E8FA7000E4F97000E1F77100DEFBA763ECFCCFACF3
+      E7C1A7B1251F1A310000002800000024000000210000001D0000001A00000017
+      000000150000001400000013000000145A524A1FEACEB48BF7C899C4F0A346A8
+      E581008CE27F0088E0800085DB7F0083D67C007FD27C007DCA77007CC275067D
+      756E62E65C5C5CFF898989FFEEEEEEFFF0F0F0FFE2E2E2FFC7C7C7FFB7B7B7FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF67635CCE4832005147310044
+      422F00363A2600282D24001D000000110000000C000000070000000500000003
+      00000002000000010000000100000000000000000000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFA8A8A8FFD8D8D8FFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006957C6315FFD0B0FD
+      FFAA6EFAFD6D00F0FC6D00ECFB6F00E9F96F00E5F87000E1F67000DFFAA763EC
+      FCCFADF3E6C2A8B1241F1A320000002800000025000000210000001E0000001C
+      0000001A0000001900000018554E4024EACBB394F8CA9CCDF1A146B2E77F0095
+      E47E0091E27F008EDF7D008ADB7E0088D87D0084D27A0082CC790081C5770681
+      756E62E75C5C5CFF898989FFEFEFEFFFF2F2F2FFE5E5E5FFC7C7C7FFB7B7B7FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF68645CCF5338005651390048
+      5238003B4F38002D473000203B2F00160000000C000000080000000500000003
+      00000002000000010000000100000001000000000000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFABABABFFDADADAFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006CDA68D28FFCDAEFF
+      FF9E59FCFE6C00F4FD6C00F0FB6D00ECFA6E00E9F96F00E6F77000E2F67000DF
+      FAA763EDFCCEAEF4E6C1A7B2241F1A3200000029000000260000002300000021
+      0000001E0000001E52453F29EBCCB29EF8C99ED6F2A047BAE97D009FE67D009B
+      E47D0097E27D0093E07E0090DD7C008CD97C008AD47B0086CE770085C8790685
+      766E62E75C5C5CFF898989FFF0F0F0FFF3F3F3FFE7E7E7FFC8C8C8FFB8B8B8FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF68645BD05E3F005A5E40004C
+      5E42003E62430032614600255A3C00194C3D00114646460B2B2B2B0600000003
+      00000002000000010000000100000001000000000000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFAEAEAEFFDCDCDCFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006C89C8329FFCCACFF
+      FF9C57FEFE6B00F9FD6B00F5FC6C00F1FB6D00EDFA6E00EAF86F00E6F76F00E2
+      F67000DFFAA763EDFCCFAEF4E6C1A8B4231E19330000002A0000002800000025
+      000000234D42372EEAC9B1A7F9CAA0DDF39F48C3EA7B00A8E87B00A4E67C00A1
+      E57C009CE27C0098E07C0094DD7D0091DA7B008DD67A008CD0790089CA770689
+      766E61E85C5C5CFF898989FFF1F1F1FFF4F4F4FFE9E9E9FFC9C9C9FFB8B8B8FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF6A655BD16645005D69460050
+      6C4900426F4D0035734F002A7755001E704A00159C8F5B149696810C00000003
+      00000002000000010000000100000000000000000000000000000000FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFB1B1B1FFDEDEDEFFBCBCBCFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C89C8329FFCBAAFF
+      FE9A56FFFF6900FCFE6B00F9FD6B00F5FC6C00F1FA6D00EDF96E00EAF86F00E7
+      F66F00E3F57000DFFAA762EDFCCEADF5E6C2A7B4231E19340000002C0000002A
+      453B3634EBC8ADB1FACAA2E5F49E49CBEC7A00B2EA7A00ADE87A00A9E77A00A5
+      E57B00A1E37B009DE07B0099DE7B0095DB7B0093D7790090D278008ECC79058E
+      776E61E95C5C5CFF898989FFF2F2F2FFF5F5F5FFEBEBEBFFCACACAFFB8B8B8FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF6B655BD26F4A0060714D0053
+      775000467C5400398059002E8B5F0023916B0A1AC4AB721FB2A2911000000003
+      000000020000000100000001000000000000000000000000FFFFFF00FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFB4B4B4FFDFDFDFFFBBBBBBFFB0B0B0FFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C89C8329FFCAA9FF
+      FD9955FFFD6800FFFF6900FCFE6A00F9FD6B00F5FB6C00F1FA6C00EEF96E00EB
+      F76E00E7F66F00E3F57000E0FAA662EDFCCFAEF5E6C1A7B5221D18354239303A
+      EBC6ACBAFACDA5EAF49D4AD3ED7800BBEB7900B6EA7900B3E87900AEE77A00AA
+      E57A00A6E47B00A2E27B009EDF7A009ADC7A0097D97A0094D4770092CF790592
+      786E61EA5C5C5CFF8A8A8AFFF3F3F3FFF6F6F6FFEDEDEDFFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF6D6659D3764D00637B520057
+      8056004A885B003E91620031986A0026C8A25C2FD2BC98238D8D750B00000003
+      000000020000000100000001000000000000000000000000FFFFFF00FFFFFF00
+      FFFFFF0000000000000000010000000200000004000000070000000C00000012
+      626262F55C5C5CFFB6B6B6FFDEDEDEFFB8B8B8FFAFAFAFFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3939397B000000460000003B
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C89C8329FFC8A7FF
+      FC9854FFFB6700FFFD6800FFFF6900FCFE6A00F9FC6B00F5FB6C00F2FA6C00EE
+      F96E00EBF76E00E7F66F00E3F57000E0FAA762EDFCCFAFF5E6C2A8B7ECC6ACC2
+      FBCDA9F0F69D4BDAEE7600C3ED7600BEEC7800BBEA7800B7E97900B3E87900AF
+      E67900ABE47900A6E37A00A3E17A009FDE7A009BDA790098D6780096D0770596
+      786E60EA5C5C5CFF8A8A8AFFF4F4F4FFF6F6F6FFEEEEEEFFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF6E6659D47E5200678255005A
+      885B004F916200419C680036C8A45840D1BA9037BBB19C190000000500000003
+      0000000200000001000000010000000100000000000000000000000000000000
+      0000000000000001000000010000000200000004000000070000000C00000013
+      626262F55C5C5CFFB9B9B9FFD9D9D9FFB4B4B4FFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3A3A3A7B000000460000003A
+      0000002F000000230000001A000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C4997B2AFFC7A5FF
+      FB9753FFF96600FFFB6700FFFD6800FFFE6900FDFE6A00F9FC6B00F6FB6C00F2
+      FA6C00EEF86E00EBF76E00E7F66F00E3F57000E0FAA662EDFDD0AFF6FDCEABF5
+      F79C4BE0F07300CBEF7500C8ED7500C3EC7500BFEB7700BCEA7800B7E97900B4
+      E77900B0E67900ABE47900A7E27A00A4DF7900A0DC78009DD777009AD379059A
+      796E60EB5C5C5CFF8A8A8AFFF5F5F5FFF7F7F7FFEEEEEEFFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF6E6759D58555006C8959005F
+      8F5D005298650046C5A05353D2B68C49B2AB9D24000000080000000500000003
+      0000000200000002000000010000000100000001000000010000000100000001
+      0000000100000001000000020000000300000005000000080000000D00000013
+      626262F55C5C5CFFBCBCBCFFCFCFCFFFB1B1B1FFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3A3A3A7B000000460000003A
+      0000002F0000002300000019000000110000000B000000070000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C4997B2AFFC5A3FF
+      FA9653FFF66600FFF96600FFFB6700FFFD6800FFFE6900FDFD6A00FAFC6B00F6
+      FB6B00F2F96C00EEF86E00EBF76E00E7F66F00E3F57000E0FAA662EDF89C4DE7
+      F27200D4F17300D0EF7300CCEE7500C8ED7500C4EC7500BFEB7700BCE97700B8
+      E87800B4E77900B0E57800ABE37800A7E17900A4DD7800A1D977009FD57B089E
+      7A6F5FEC5C5C5CFF8B8B8BFFF6F6F6FFF7F7F7FFEFEFEFFFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF706758D68A57006F8F5C0064
+      95610057C29B5266CCB38A5CA89D93310000000D000000090000000600000004
+      0000000300000002000000020000000200000002000000020000000200000002
+      0000000200000002000000030000000400000006000000090000000F00000015
+      626262F55C5C5CFFBCBCBCFFBFBFBFFFB0B0B0FFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3A3A3A7B000000450000003A
+      0000002E0000002300000019000000110000000B000000060000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C4937B2AFFC4A1FF
+      F99552FFF46500FFF66600FFF96600FFFB6700FFFD6800FFFE6900FDFD6A00FA
+      FC6B00F6FB6B00F2F96C00EEF86E00EBF76E00E7F66F00E3F57000E0F47000DC
+      F27200D8F27200D4F07300D0EF7300CCEE7500C8ED7500C4EB7500C0EB7700BC
+      E97700B8E87800B4E67800B0E57800ACE27800A8E07800A5DC7A05A3D87A0AA3
+      7A6F5FED5C5C5CFF8B8B8BFFF6F6F6FFF8F8F8FFF0F0F0FFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF716858D88F5A0074945E0268
+      C1975279C9B087709F92863F000000140000000F0000000B0000000800000006
+      0000000500000005000000050000000400000004000000040000000400000004
+      00000004000000050000000500000007000000090000000C0000001100000017
+      626262F55C5C5CFFADADADFFB7B7B7FFAFAFAFFFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3A3A3A7B0000004400000039
+      0000002D0000002200000019000000100000000A000000060000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C4937B2AFFC3A0FF
+      F79451FFF26400FFF46500FFF66600FFF96600FFFB6700FFFD6800FFFE6900FD
+      FD6A00FAFC6B00F6FB6B00F2F96C00EEF86D00EBF76E00E7F66F00E3F57000E0
+      F47000DCF27100D8F17200D4F07300D0EF7300CCEE7500C9ED7500C4EB7500C0
+      EB7700BCE97700B8E87800B4E67800B0E37800ADE27B06ABDE7B06A9DA7A09A7
+      7B6F5FEE5C5C5CFF8B8B8BFFF7F7F7FFF8F8F8FFF1F1F1FFCACACAFFB9B9B9FF
+      B0B0B0FFADADADFFA4A4A4FF6B6B6BFF5C5C5CFF726857DA955E027ABF95518B
+      C5AA8383968D804E0808001F00000017000000120000000E0000000B00000009
+      0000000800000008000000070000000700000007000000070000000700000007
+      0000000700000008000000090000000A0000000C00000010000000150000001B
+      626262F55C5C5CFF969696FFADADADFFADADADFFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3A3A3A7A0000004400000038
+      0000002C0000002100000018000000100000000A000000060000000300000002
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C4937B2AFFC19EFF
+      F69350FFEF6300FFF26400FFF46500FFF66600FFF96600FFFB6700FFFD6800FF
+      FE6900FDFD6A00FAFC6B00F6FB6B00F2F96C00EEF86D00EBF76E00E7F66F00E3
+      F57000E0F47000DCF27100D8F17200D4F07300D0EF7300CCEE7500C9ED7500C4
+      EB7500C0EB7700BCE97700B8E77800B5E67B06B2E37A07AFE07A06ACDC7A09AB
+      7B6E5FEF5C5C5CFF8B8B8BFFF8F8F8FFF9F9F9FFF2F2F2FFCCCCCCFFBABABAFF
+      B3B3B3FFAEAEAEFFA6A6A6FF6D6D6DFF5D5D5DFF746957DAC092519DC3A88295
+      8E84795F0606062C000000230000001C0000001700000013000000100000000E
+      0000000D0000000D0000000C0000000C0000000C0000000C0000000C0000000C
+      0000000C0000000D0000000E0000000F00000011000000150000001A00000020
+      626262F55C5C5CFF888888FFA9A9A9FFADADADFFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFACACACFFA1A1A1FF5F5F5FFF5C5C5CFF3B3B3B790000004200000037
+      0000002B00000021000000170000001000000009000000060000000300000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C090722AFFC09CFF
+      F5914FFFED6200FFEF6300FFF26400FFF46500FFF66600FFF96600FFFB6700FF
+      FD6800FFFE6900FDFD6A00FAFC6B00F6FB6B00F2F96C00EEF86D00EBF76E00E7
+      F66F00E3F57000E0F47000DCF27100D8F17200D4F07300D0EF7300CCEE7500C9
+      ED7500C4EB7500C0EA7700BCE97B07BAE87C08B7E57A07B3E27A06B0DE7908AE
+      7B6F5FEF5D5D5DFF8B8B8BFFF9F9F9FFFAFAFAFFF3F3F3FFCECECEFFBDBDBDFF
+      B4B4B4FFB1B1B1FFA7A7A7FF707070FF606060FF817769E5C4A984A48A7E736F
+      0404043A0000003100000029000000220000001D000000190000001700000015
+      0000001400000013000000130000001300000013000000130000001300000013
+      00000013000000140000001500000016000000180000001C0000002100000027
+      616161F55C5C5CFF848484FFA8A8A8FFADADADFFAEAEAEFFAFAFAFFFAFAFAFFF
+      AEAEAEFFABABABFFA0A0A0FF5F5F5FFF5C5C5CFF3B3B3B770000004100000036
+      0000002A0000001F000000160000000F00000009000000050000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C090722AFFBF9AFF
+      F4904EFFEB6100FFED6200FFEF6300FFF26400FFF46500FFF66600FFF96600FF
+      FB6700FFFD6800FFFE6900FDFD6A00FAFC6B00F6FB6B00F2F96C00EEF86D00EB
+      F76E00E7F66F00E3F57000E0F47000DCF27100D8F17200D4F07300D0EF7300CC
+      EE7500C9EC7501C4EC7908C2EA7B09BEE97B08BAE77A07B7E47A06B4DF7A07B2
+      84715DEC5F5F5FFF868686FFF9F9F9FFFAFAFAFFF5F5F5FFD4D4D4FFC0C0C0FF
+      B5B5B5FFB3B3B3FFABABABFF797979FF636363FF7D7873EF8E8277800E0E0E4B
+      0000003F00000037000000300000002A00000025000000220000001F0000001E
+      0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C
+      0000001C0000001C0000001D0000001E0000002100000024000000290000002F
+      606060FA5C5C5CFF898989FFA9A9A9FFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFABABABFF9E9E9EFF5D5D5DFF5C5C5CFF252525610000003F00000033
+      000000280000001E000000150000000E00000009000000050000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C090722AFFBD98FF
+      F3904DFFE86000FFEB6100FFED6200FFEF6300FFF26400FFF46500FFF66600FF
+      F96600FFFB6700FFFD6800FFFE6900FDFD6A00FAFC6B00F6FB6B00F2F96C00EE
+      F86D00EBF76E00E7F66F00E3F57000E0F47000DCF27100D8F17200D4F07300D0
+      EF7301CCEE7909CAED7A0AC6EB7909C2EA7B08BFE87907BBE57A06B8E27B0BB7
+      947756E4626262FF7C7C7CFFFAFAFAFFFBFBFBFFF8F8F8FFDDDDDDFFC4C4C4FF
+      B9B9B9FFB4B4B4FFADADADFF878787FF666666FF6F6E6EF62121215C19191953
+      0E0E0E490404044000000039000000330000002F0000002C0000002900000028
+      0000002700000026000000260000002600000026000000260000002600000026
+      000000260000002700000028000000290000002B0000002E0000003200000037
+      5D5D5DFF5C5C5CFF979797FFAAAAAAFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAAAAAAFF979797FF5C5C5CFF5D5D5DFF000000470000003C00000031
+      000000260000001C000000130000000D00000008000000050000000200000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C08A722AFFBC97FF
+      F28E4CFFE66000FFE86000FFEB6100FFED6200FFEF6300FFF26400FFF46500FF
+      F66600FFF96600FFFB6700FFFD6800FFFE6900FDFD6A00FAFC6B00F6FB6B00F2
+      F96C00EEF86D00EBF76E00E7F66F00E3F57000E0F47000DCF27100D8F17201D4
+      F1780AD2EF7A0BCEEE7A0ACAED7A09C6EB7908C2EA7907BFE77B09BCE57D0FBB
+      AD7E4CD9646464FF737373FFFAFAFAFFFBFBFBFFF9F9F9FFE5E5E5FFC8C8C8FF
+      BCBCBCFFB6B6B6FFB1B1B1FF959595FF686868FF696969FE3E3E3E782222225B
+      1C1C1C531111114B000000420000003D00000039000000360000003400000033
+      0000003200000031000000310000003100000031000000310000003100000031
+      0000003100000032000000330000003400000036000000390000003D5D5D5DB4
+      5C5C5CFF606060FFA2A2A2FFACACACFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AEAEAEFFA8A8A8FF909090FF5C5C5CFF5E5E5EFE00000044000000390000002E
+      000000230000001A000000120000000C00000007000000040000000200000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008C08A6C2AFFBB95FF
+      F08D4BFFE45F00FFE66000FFE86000FFEB6100FFED6200FFEF6300FFF26400FF
+      F46500FFF66600FFF96600FFFB6700FFFD6800FFFE6900FDFD6A00FAFC6B00F6
+      FB6B00F2F96C00EEF86D00EBF76E00E7F66F00E3F57000E0F47201DCF3760BD9
+      F2780CD6F17A0BD2EF780ACEEE7A09CAED7908C6EB7A0AC2EA7E0FC1E67F13BF
+      CD8333CB666666FF6B6B6BFFEFEFEFFFFBFBFBFFFAFAFAFFEDEDEDFFCCCCCCFF
+      BFBFBFFFB9B9B9FFB5B5B5FFABABABFF767676FF696969FF6D6D6DF127272762
+      2121215C181818550D0D0D4E000000470000004400000041000000400000003F
+      0000003E0000003D0000003D0000003D0000003D0000003D0000003D0000003D
+      0000003D0000003E0000003E0000003F0000004100000044313131655F5F5FFE
+      5C5C5CFF7D7D7DFFA7A7A7FFAEAEAEFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AEAEAEFFA7A7A7FF848484FF5C5C5CFF5F5F5FFA00000040000000360000002A
+      0000002000000017000000100000000A00000006000000030000000200000001
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008C08A6C2AFFBA93FF
+      EF8C4BFFE15E00FFE45F00FFE66000FFE86000FFEB6100FFED6200FFEF6300FF
+      F26400FFF46500FFF66600FFF96600FFFB6700FFFD6800FFFE6900FDFD6A00FA
+      FC6B00F6FB6B00F2F96C00EEF86D00EBF76E00E7F67001E3F5760AE1F4780DDD
+      F3780CD9F2780BD6F1780AD2EF7809CEEE7A09CAEC7C0EC7EB7E12C4E98115C2
+      E8851DC26E6E6DFE6B6B6BFFC1C1C1FFFBFBFBFFFBFBFBFFF4F4F4FFD3D3D3FF
+      C4C4C4FFBBBBBBFFB8B8B8FFB3B3B3FF9E9E9EFF6D6D6DFF6A6A6AFF6D6D6DF9
+      5858589E1E1E1E5D14141458060606510000004D0000004C0000004A00000049
+      0000004800000048000000480000004800000048000000480000004800000048
+      0000004800000048000000490000004A0F0F0F535C5C5CBD5E5E5EFE5C5C5CFF
+      666666FFA0A0A0FFAAAAAAFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFF
+      ACACACFFA4A4A4FF6E6E6EFF5C5C5CFF616161E10000003C0000003100000027
+      0000001D000000150000000E0000000900000005000000030000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008C08A6C2AFFB891FF
+      EE8B4AFFDF5D00FFE15E00FFE45F00FFE66000FFE86000FFEB6100FFED6200FF
+      EF6300FFF26400FFF46500FFF66600FFF96600FFFB6700FFFD6800FFFE6900FD
+      FD6A00FAFC6B00F6FB6B00F2F96C00EEF86F01EBF7750BE8F6760DE5F5770CE1
+      F4770CDDF3780BD9F2770AD6F07808D2EF790DCFEF7E10CCEC7F14C8EB8118C7
+      E98620C684796EF66D6D6DFF949494FFFCFCFCFFFCFCFCFFF8F8F8FFDFDFDFFF
+      CACACAFFC1C1C1FFBCBCBCFFB7B7B7FFB1B1B1FF959595FF707070FF696969FF
+      686868FF666666FF666666FB636363FA5F5F5FFB606060FB606060FB606060FA
+      606060FA606060FA606060FA606060FA606060FA606060FA606060FA606060FA
+      606060FA606060FA606060FA5F5F5FFD5D5D5DFF5C5C5CFF5C5C5CFF686868FF
+      969696FFA9A9A9FFADADADFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AAAAAAFF9E9E9EFF5F5F5FFF5C5C5CFF5353538F000000370000002C00000023
+      0000001A000000120000000C0000000700000004000000020000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC876A2BFFB790FF
+      ED8A49FFDD5C00FFDF5D00FFE15E00FFE45F00FFE66000FFE86000FFEB6100FF
+      ED6200FFEF6300FFF26400FFF46500FFF66600FFF96600FFFB6700FFFD6800FF
+      FE6900FDFD6A00FAFC6B00F6FB6C01F2FA730CEFF9760EECF7760DE8F6760CE5
+      F5760BE1F4770ADDF37609D9F2770AD6F07A0ED3F07D12CFEE8116CDED841BCA
+      EB851FC8B58859E06F6F6FFF767676FFEEEEEEFFFCFCFCFFFAFAFAFFF0F0F0FF
+      D4D4D4FFC8C8C8FFBFBFBFFFBCBCBCFFB7B7B7FFB2B2B2FFA6A6A6FF7F7F7FFF
+      6D6D6DFF666666FF646464FF606060FF5D5D5DFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF646464FF7F7F7FFFA2A2A2FF
+      A9A9A9FFAEAEAEFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFADADADFF
+      A6A6A6FF848484FF5C5C5CFF5E5E5EFE0000003B00000031000000280000001E
+      000000160000000F0000000A0000000600000003000000020000000100000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC876A2BFFB68EFF
+      EC8948FFDA5B00FFDD5C00FFDF5D00FFE15E00FFE45F00FFE66000FFE86000FF
+      EB6100FFED6200FFEF6300FFF26400FFF46500FFF66600FFF96600FFFB6700FF
+      FD6800FFFE6900FDFD6B01FAFC720CF7FB730FF3FA740EEFF9750DECF7760CE8
+      F6750BE4F5760AE1F4750ADDF3780BD9F27A0FD6F17E14D3EF8018D0EF841CCE
+      ED8621CCEC8C2ACA787674FE737373FFA5A5A5FFFBFBFBFFFBFBFBFFF9F9F9FF
+      E8E8E8FFD4D4D4FFC9C9C9FFC0C0C0FFBCBCBCFFB8B8B8FFB4B4B4FFAFAFAFFF
+      AAAAAAFFA0A0A0FF909090FF8C8C8CFF8A8A8AFF878787FF878787FF878787FF
+      878787FF878787FF878787FF878787FF878787FF878787FF878787FF878787FF
+      888888FF888888FF898989FF8F8F8FFF9B9B9BFFA3A3A3FFA7A7A7FFAAAAAAFF
+      ADADADFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFAAAAAAFF
+      9F9F9FFF646464FF5C5C5CFF626262D8000000350000002C000000220000001A
+      000000130000000C0000000800000005000000020000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC81642BFFB48CFF
+      EB8747FFD85A00FFDA5B00FFDD5C00FFDF5D00FFE15E00FFE45F00FFE66000FF
+      E86000FFEB6100FFED6200FFEF6300FFF26400FFF46500FFF66600FFF96600FF
+      FB6700FFFD6901FFFE700DFDFD730FFAFC730EF7FB730EF3FA730DEFF9750CEC
+      F7750BE8F6750BE4F5750AE1F4780CDDF37A10DAF37E15D7F1811AD4F0841ED1
+      EF8824CFEE8B2BCEB08964E7747474FF7E7E7EFFE8E8E8FFFBFBFBFFFBFBFBFF
+      F7F7F7FFE5E5E5FFD5D5D5FFCACACAFFC1C1C1FFBBBBBBFFB9B9B9FFB6B6B6FF
+      B4B4B4FFB1B1B1FFAEAEAEFFACACACFFAAAAAAFFA8A8A8FFA8A8A8FFA8A8A8FF
+      A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF
+      A8A8A8FFA8A8A8FFA8A8A8FFA9A9A9FFABABABFFACACACFFADADADFFAFAFAFFF
+      AEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFACACACFFA4A4A4FF
+      808080FF5C5C5CFF5E5E5EFE1D1D1D450000002F000000250000001D00000015
+      0000000F0000000A0000000600000004000000020000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC81642BFFB38AFF
+      E98746FFD65900FFD85A00FFDA5B00FFDD5C00FFDF5D00FFE15E00FFE45F00FF
+      E66000FFE86000FFEB6100FFED6200FFEF6300FFF26400FFF46500FFF66600FF
+      F96701FFFB6F0DFFFD7110FFFE720FFDFD720EFAFC730DF7FB720DF3FA730CEF
+      F9740BECF7750BE8F6740AE4F5770DE1F47A11DEF47E16DBF3811BD8F2841FD5
+      F08725D2F08C2AD0EE9034D082807EFE818181FF9E9E9EFFF7F7F7FFFBFBFBFF
+      FAFAFAFFF6F6F6FFE6E6E6FFD6D6D6FFCACACAFFC2C2C2FFBDBDBDFFBABABAFF
+      B8B8B8FFB7B7B7FFB4B4B4FFB1B1B1FFAFAFAFFFADADADFFADADADFFADADADFF
+      ADADADFFADADADFFADADADFFADADADFFADADADFFADADADFFADADADFFADADADFF
+      ADADADFFADADADFFAEAEAEFFAEAEAEFFAFAFAFFFAEAEAEFFAEAEAEFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFACACACFFA7A7A7FF939393FF
+      606060FF5C5C5CFF616161C500000030000000280000001F0000001700000011
+      0000000C000000070000000500000003000000010000000100000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC81642BFFB289FF
+      E88645FFD35900FFD65900FFD85A00FFDA5B00FFDD5C00FFDF5D00FFE15E00FF
+      E45F00FFE66000FFE86000FFEB6100FFED6200FFEF6300FFF26400FFF46601FF
+      F66E0EFFF97011FFFB7010FFFD710FFFFE710EFDFD720DFAFC720CF7FB720DF3
+      FA720CEFF9740BECF7730AE8F6760DE4F57A12E2F57D15DFF4801BDCF38420D9
+      F28625D6F18B2CD4F9BF8DEBD7C0AEF6868686FF909090FFBABABAFFFAFAFAFF
+      FBFBFBFFFAFAFAFFF6F6F6FFE9E9E9FFD8D8D8FFCCCCCCFFC5C5C5FFC1C1C1FF
+      BEBEBEFFBBBBBBFFB8B8B8FFB6B6B6FFB4B4B4FFB2B2B2FFB0B0B0FFB0B0B0FF
+      B0B0B0FFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAEAEAEFFAFAFAFFFACACACFFA8A8A8FF999999FF646464FF
+      5C5C5CFF606060F605050534000000290000002100000019000000130000000D
+      000000090000000600000003000000020000000100000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC81642BFFB087FF
+      E78444FFD15800FFD35900FFD65900FFD85A00FFDA5B00FFDD5C00FFDF5D00FF
+      E15E00FFE45F00FFE66000FFE86000FFEB6100FFED6200FFEF6401FFF36D0FFF
+      F57012FFF77011FFF97010FFFB700FFFFD700EFFFE710DFDFD710DFAFC720CF7
+      FB710CF3FA720BEFF9730AECF7750DE8F67912E5F67C15E3F57F1BDFF48320DC
+      F48727DBFBBE8CEFFCD7BDF6E4CAB7B7999898BE919191FF9D9D9DFFCACACAFF
+      F9F9F9FFFAFAFAFFF9F9F9FFF5F5F5FFEEEEEEFFE0E0E0FFD6D6D6FFD0D0D0FF
+      CBCBCBFFC7C7C7FFC2C2C2FFBEBEBEFFBBBBBBFFB8B8B8FFB5B5B5FFB4B4B4FF
+      B2B2B2FFB1B1B1FFB0B0B0FFB0B0B0FFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF
+      AFAFAFFFAEAEAEFFAEAEAEFFACACACFFA7A7A7FF999999FF696969FF5C5C5CFF
+      5F5F5FFD3030304B00000029000000210000001A000000140000000E0000000A
+      000000070000000400000002000000010000000000000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC81642BFFAF85FF
+      E68344FFCF5700FFD15800FFD35900FFD65900FFD85A00FFDA5B00FFDD5C00FF
+      DF5D00FFE15E00FFE45F00FFE66000FFE86000FFEB6201FFEE6C10FFF06E13FF
+      F36F12FFF56F11FFF77010FFF96F0FFFFB700EFFFD700EFFFE710DFDFD710CFA
+      FC720BF7FB710AF3FA720AEFF9750DECF77813E9F77B16E5F67F1BE3F5831FE0
+      FBBC8BF2FED7BDFBE5C8B3B881817F589D9D9D659D9D9DDD989898FFA0A0A0FF
+      B9B9B9FFF2F2F2FFF7F7F7FFF7F7F7FFF5F5F5FFF1F1F1FFEBEBEBFFE5E5E5FF
+      DFDFDFFFD9D9D9FFD5D5D5FFCFCFCFFFCACACAFFC5C5C5FFC2C2C2FFBEBEBEFF
+      BBBBBBFFB8B8B8FFB5B5B5FFB3B3B3FFB1B1B1FFB0B0B0FFAFAFAFFFAFAFAFFF
+      AFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFAEAEAEFFAEAEAEFF
+      AEAEAEFFADADADFFAAAAAAFFA4A4A4FF919191FF636363FF5C5C5CFF5E5E5EFE
+      5454547300000028000000210000001A000000140000000F0000000B00000007
+      0000000500000003000000020000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000008BC815E2BFFAE83FF
+      E58243FFCC5600FFCF5700FFD15800FFD35900FFD65900FFD85A00FFDA5B00FF
+      DD5C00FFDF5D00FFE15E00FFE45F00FFE66102FFE96A11FFED6D14FFEE6E13FF
+      F06E12FFF36E11FFF56F10FFF76F0FFFF96F0FFFFB6F0EFFFD700DFFFE700CFD
+      FD710BFAFC710AF6FB7109F3FA730CEFF97811EDF77915E9F77D19E6F6801DE3
+      FBB379F1FFD7BEFDEECDB5CB847F7D589090905DA7A7A76BA1A1A1D3969696FF
+      979797FF9F9F9FFFD3D3D3FFF2F2F2FFF4F4F4FFF4F4F4FFF3F3F3FFF1F1F1FF
+      EEEEEEFFEAEAEAFFE7E7E7FFE3E3E3FFDFDFDFFFD9D9D9FFD5D5D5FFD0D0D0FF
+      CBCBCBFFC6C6C6FFC0C0C0FFBBBBBBFFB6B6B6FFB3B3B3FFB1B1B1FFB0B0B0FF
+      AFAFAFFFAFAFAFFFAFAFAFFFAEAEAEFFAEAEAEFFADADADFFAEAEAEFFACACACFF
+      A9A9A9FFA6A6A6FF9E9E9EFF7C7C7CFF5F5F5FFF5C5C5CFF5F5F5FFD5151516D
+      000000250000001F00000019000000140000000F0000000B0000000700000005
+      0000000300000002000000010000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C07E602AFFAC81FF
+      E48142FFCA5500FFCC5600FFCF5700FFD15800FFD35900FFD65900FFD85A00FF
+      DA5B00FFDD5C00FFDF5D00FFE15F02FFE66A11FFE86D15FFEA6C14FFEC6D13FF
+      EE6D12FFF06E11FFF36E10FFF56E10FFF76F0FFFF96E0EFFFB6F0DFFFD6F0CFF
+      FE700BFDFD700AFAFC710AF6FB710BF3FA750FEFF97813EDF87B17E9F77E1CE6
+      F68220E4FBB37AF1FFD9BFFEEFCCB7CD898482599393935FA5A5A568A1A1A1B4
+      8E8E8EFE898989FF848484FF959595FFCCCCCCFFEAEAEAFFEDEDEDFFEDEDEDFF
+      EEEEEEFFECECECFFECECECFFEBEBEBFFE7E7E7FFE4E4E4FFE0E0E0FFDCDCDCFF
+      D7D7D7FFD1D1D1FFCACACAFFC2C2C2FFBABABAFFB3B3B3FFAEAEAEFFACACACFF
+      AAAAAAFFAAAAAAFFABABABFFAAAAAAFFAAAAAAFFA8A8A8FFA6A6A6FFA2A2A2FF
+      9A9A9AFF818181FF636363FF5C5C5CFF5C5C5CFF606060F63535354300000022
+      0000001C00000017000000130000000E0000000B000000070000000500000003
+      00000002000000010000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C07E602AFFAB80FF
+      E28041FFC85400FFCA5500FFCC5600FFCF5700FFD15800FFD35900FFD65900FF
+      D85A00FFDA5B00FFDD5D02FFE16912FFE46C16FFE66C15FFE86C14FFEA6C13FF
+      EC6C12FFEE6D11FFF06D11FFF36E10FFF56E0FFFF66E0EFFF96E0DFFFB6E0CFF
+      FD6F0BFFFE6F0AFDFD700AFAFC710AF6FB730DF3FA7611F0F97A15EDF87C18EA
+      F77F1CE6F68222E4FBB47CF1FFD9BFFEEFCEB7CC878380588E8E8E599696965E
+      9999997A898989EA7A7A7AFF757575FF737373FF7A7A7AFF969696FFB3B3B3FF
+      C2C2C2FFCECECEFFD9D9D9FFDBDBDBFFDBDBDBFFD9D9D9FFD7D7D7FFD4D4D4FF
+      D1D1D1FFCDCDCDFFC6C6C6FFBEBEBEFFB5B5B5FFACACACFFA5A5A5FFA1A1A1FF
+      9F9F9FFF9F9F9FFF9E9E9EFF9B9B9BFF929292FF898989FF7D7D7DFF6C6C6CFF
+      5D5D5DFF5C5C5CFF5C5C5CFF5E5E5EFD646464BC070707250000001E00000019
+      00000015000000110000000D0000000A00000007000000050000000300000002
+      000000010000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000007C481622AFFAA7EFF
+      E17F40FFC55300FFC85400FFCA5500FFCC5600FFCF5700FFD15800FFD35900FF
+      D65900FFD85B02FFDD6713FFE06B17FFE26B16FFE36B15FFE66C14FFE86C13FF
+      EA6B12FFEC6C12FFEE6C11FFF06D10FFF36D0FFFF56E0EFFF66E0DFFF96D0CFF
+      FB6E0CFFFD6E0BFFFE6F0AFDFD6F09FAFC720BF6FB740EF2FA7712F0F97A16ED
+      F87D1AEAF77F1DE6F68321E3FBB47BF0FFD8BEFFEFCEB7CC87827F557D7D7D50
+      8181814F8686864F8989897F7C7C7CEF737373FF6F6F6FFF6D6D6DFF6A6A6AFF
+      686868FF656565FF636363FF606060FF5D5D5DFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5F5F5FFC656565CF2323232A0000001C000000190000001500000012
+      0000000E0000000C000000090000000700000005000000030000000200000001
+      0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006CD866028FFA87CFF
+      E07E3FFFC35300FFC55300FFC85400FFCA5500FFCC5600FFCF5700FFD15800FF
+      D35A02FFD96614FFDC6918FFDD6A17FFE06A16FFE26A15FFE36B14FFE66B13FF
+      E86C13FFEA6B12FFEC6B11FFEE6C10FFF06C0FFFF36D0EFFF56D0DFFF66D0CFF
+      F96D0CFFFB6D0BFFFD6E0AFFFE6E09FDFD700AFAFC720CF6FB7610F3F97714EF
+      F97B17ECF87E1BE9F7811DE6F68220E2FBB37BF0FFD8BDFFF0CDB7CC817C7C51
+      7979794A7B7B7B487C7C7C467E7E7E4484848448808080A1787878E6717171F8
+      6B6B6BFC676767FF616161FF5F5F5FFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF
+      5C5C5CFF5C5C5CFF5C5C5CFF5D5D5DFF5E5E5EFE606060FB616161F4656565CF
+      595959630000001B000000190000001600000014000000110000000F0000000C
+      0000000900000007000000060000000400000003000000020000000100000001
+      00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000005B1735318FFA77AFF
+      E28246FFC15200FFC35300FFC55300FFC85400FFCA5500FFCC5600FFCF5802FF
+      D56515FFD76919FFDA6918FFDC6917FFDD6916FFE06A15FFE26A14FFE36A14FF
+      E66B13FFE86B12FFEA6B11FFEC6B10FFEE6B0FFFF06C0EFFF36C0EFFF56D0DFF
+      F66D0CFFF96D0BFFFB6D0AFFFD6D09FFFE6E08FDFD700AFAFC730EF6FB7611F3
+      FA7714EFF97A16ECF87D19E9F77F1BE6F7811EE2FBB378F1FFD7BDFFF0CEB5CA
+      7D77774C70707042707070407373733C7575753972727235727272317373732E
+      7070702A676767275D5D5D2D5A5A5A34575757335A5A5A345A5A5A345A5A5A34
+      5A5A5A34575757335757573353535332505050314949492F4141412E3C3C3C2D
+      3838382C3838382C3838382C1B1B1B1D00000017000000170000001600000015
+      0000001400000013000000110000000F0000000D0000000C0000000900000008
+      0000000600000005000000030000000200000002000000010000000000000000
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000400000007FCA477E3
+      EF925DFFBE5100FFC15200FFC35300FFC55300FFC85400FFCA5602FFD06416FF
+      D4681AFFD56819FFD76918FFDA6817FFDB6816FFDD6915FFE06914FFE16914FF
+      E36A13FFE66A12FFE86B11FFE96A10FFEC6B0FFFEE6B0EFFF06B0EFFF36C0DFF
+      F56C0CFFF66D0BFFF96C0AFFFB6D09FFFD6D08FFFE6E08FDFD700BFAFC730DF6
+      FB7610F3FA7613EFF97A15ECF97D17E8F87E19E4F77F1BE2FBB278F1FFD6BAFF
+      F1CCB5C9797272446969693A686868366A6A6A326868682C6767672764646424
+      5A5A5A1F4646461A2E2E2E160E0E0E120F0F0F110F0F0F110F0F0F110F0F0F11
+      0F0F0F110F0F0F110F0F0F110F0F0F110F0F0F110F0F0F110000001000000010
+      00000010000000100000001000000010000000100000000F0000000E0000000E
+      0000000D0000000C0000000B0000000900000008000000070000000600000005
+      00000003000000020000000200000001000000010000000000000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000300000006FBA276B2
+      FDA173FDBD5101FFBE5100FFC15200FFC35300FFC55402FFCD6316FFD0671BFF
+      D1671AFFD46719FFD56818FFD76817FFDA6816FFDB6816FFDD6815FFE06914FF
+      E16913FFE36912FFE66A11FFE86A10FFE96A10FFEC6A0FFFEE6A0EFFF06B0DFF
+      F36B0CFFF46C0BFFF66C0AFFF96C0AFFFB6C09FFFD6D08FFFE6E08FDFD700AFA
+      FC720CF6FB750EF3FA7711EEF97913EBF97A15E8F87D16E4F87D17E1FBB076EF
+      FFD5B9FFF2CDB2C9736B6B3B5E5E5E316262622C5D5D5D275D5D5D215454541B
+      474747162D2D2D110000000D0000000C0000000B0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A
+      0000000A0000000A0000000A0000000A0000000A000000090000000900000009
+      0000000800000007000000070000000600000005000000040000000300000002
+      000000020000000100000001000000000000000000000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000200000005F89F7282
+      FFA476FFC65E15FFBC5000FFBE5100FFC25302FFC86317FFCB661CFFCE661BFF
+      CF661AFFD16719FFD46718FFD56717FFD76816FFD96716FFDB6715FFDD6814FF
+      E06813FFE16912FFE36911FFE66910FFE86A10FFE9690FFFEC6A0EFFEE6A0DFF
+      F06A0CFFF36B0BFFF46B0AFFF66C0AFFF96B09FFFB6C08FFFD6C07FFFE6E07FD
+      FE6F09F9FD720AF5FC730DF1FB760FEEFA7710EBF97910E6F87911E3F87B11E0
+      FCAF73EFFFD4B7FFF4CBB1C670666631515151264F4F4F204D4D4D1A3E3E3E15
+      303030100000000B000000090000000800000007000000060000000600000006
+      0000000600000006000000060000000600000006000000060000000600000006
+      0000000600000006000000060000000600000006000000050000000500000005
+      0000000500000004000000040000000300000002000000020000000200000001
+      00000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000200000003EE996A3C
+      FFA375FEE98A52FFBA4F00FFBD5102FFC46118FFC8651DFFCA661CFFCB651BFF
+      CE661AFFCF6619FFD16618FFD36718FFD56717FFD76716FFD96715FFDB6714FF
+      DD6713FFDF6812FFE16812FFE36811FFE66910FFE7690FFFE9690EFFEC690DFF
+      EE6A0CFFF06A0BFFF36A0BFFF46B0AFFF66B09FFF96B08FFFB6B07FFFD6C06FF
+      FE6C05FDFE6E07F9FD6F08F5FC7209F1FB730BEEFA760CEAFA760CE6F9780CE1
+      F8780DDEFCAE70EFFFD3B5FFF5CCB0C269635C263C3C3C1A343434142222220F
+      0000000B00000008000000070000000500000004000000040000000300000003
+      0000000300000003000000030000000300000003000000030000000300000003
+      0000000300000003000000030000000300000003000000030000000200000002
+      0000000200000002000000020000000200000001000000010000000100000000
+      0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000200000004
+      FB9E7297FFA274FFD06D2CFFC16018FFC4641EFFC5651DFFC8651CFFC9651BFF
+      CB651AFFCD6519FFCF6519FFD16618FFD36617FFD56616FFD76715FFD96614FF
+      DB6713FFDD6712FFDF6712FFE16811FFE36810FFE6680FFFE7690EFFE9680DFF
+      EC690CFFEE690CFFF06A0BFFF36A0AFFF46A09FFF66B08FFF96A07FFFB6B06FF
+      FD6B06FFFF6C05FCFE6E05F9FD6E05F5FC6F06F0FC7106ECFB7307E9FB7407E5
+      FA7507E0FA7607DDFDAD6FEDFFD2B4FFF7CCAFC060574E1A0000000E0000000B
+      0000000800000006000000050000000300000002000000020000000200000002
+      0000000100000001000000010000000100000001000000010000000100000001
+      0000000100000001000000010000000100000001000000010000000100000001
+      00000001000000010000000100000000000000000000000000000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000010000000200000003
+      AC67450FFD9F71DDFBA478FDC76C2AFFC2641EFFC4641DFFC5641CFFC8651BFF
+      C9651AFFCB641AFFCD6519FFCF6518FFD16517FFD36616FFD56615FFD76614FF
+      D96614FFDB6613FFDD6612FFDF6711FFE16710FFE3680FFFE6680EFFE7680DFF
+      E9680DFFEC680CFFEE690BFFF0690AFFF26A09FFF46A08FFF66A07FFF96A07FF
+      FB6A06FFFD6B05FFFF6B04FCFE6D03F9FE6D02F4FD6E02F0FC6E01EBFC7002E8
+      FB7102E3FB7302DEFB7301DAFDAA6AECFFD1B2FFFACDAEBD6D60521300000009
+      0000000700000005000000030000000200000001000000010000000100000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000002
+      00000003EF97693DFFA273FCFCA77CFDD98147FFC2631DFFC3631CFFC5641BFF
+      C7641BFFC9641AFFCB6419FFCD6418FFCF6417FFD06516FFD36515FFD56514FF
+      D66614FFD96513FFDB6612FFDC6611FFDF6610FFE1670FFFE3670EFFE5670EFF
+      E7680DFFE9670CFFEC680BFFEE680AFFF06909FFF26908FFF46A08FFF66A07FF
+      F96A06FFFB6A05FFFD6A04FFFF6B03FCFE6C02F9FE6D02F4FD6D01EFFD6E00EB
+      FD6F00E7FC7100E2FC7200DDFD821DDFFFC9A4FBFFD0B2FFF9CDAF9C00000007
+      00000005000000030000000200000001000000010000000000000000FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000000100000001
+      0000000200000003EF976B34FDA070D6FFA87DFFEE9969FFD27638FFC76723FF
+      C5631BFFC7631AFFC96419FFCA6318FFCD6417FFCF6416FFD06416FFD36515FF
+      D56514FFD66513FFD96512FFDB6511FFDC6610FFDF660FFFE1660FFFE3670EFF
+      E5670DFFE7670CFFE9670BFFEC670AFFEE6809FFF06809FFF26908FFF46907FF
+      F66A06FFF96905FFFB6A04FFFD6A03FFFF6A02FCFF6C02F8FE6C01F4FE6D00EF
+      FE6E01EAFE7E1BEAFEA158F0FFCBA9FDFFCEADFDF8CAAC8F987A6B1100000005
+      000000040000000200000002000000010000000000000000FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000001
+      000000010000000200000002A45E460BFB9D708BFFA577FDFFA97FFFFFAD84FF
+      F7A478FDEC9663FFEA935EFFEB935FFFEB945EFFED945FFFED9660FFEE9660FF
+      EE975FFFEF9760FFF09860FFF19861FFF19861FFF29961FFF39962FFF49A62FF
+      F59A62FFF59C63FFF69D63FFF69C64FFF89D63FFF89D64FFF99E64FFFA9F64FF
+      FB9F65FFFCA065FFFDA166FFFEA266FFFEA367FFFFA467FEFFA569FCFFB27FFC
+      FFC4A0FCFFC9A8FFFFCAAAFFFDCAA8D0E5B79C38000000060000000500000003
+      0000000200000002000000010000000100000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000
+      0000000000000001000000020000000200000003EB90662AF79C6F67FBA07297
+      FDA477C8FFA778F6FFA87BFFFFA97CFFFFAA7EFFFFAA7FFFFFAB81FFFFAC82FF
+      FFAD84FFFFAE85FFFFB087FFFFB188FFFFB288FFFFB38AFFFFB48BFFFFB58DFF
+      FFB68EFFFFB790FFFFB891FFFFB993FFFFBA94FFFFBB96FFFFBC97FFFFBD99FF
+      FFBE99FFFFBF9BFFFFC09CFFFFC19EFFFFC29FFFFFC3A0FFFFC5A2FFFEC5A1E7
+      FCC4A3B2F8C2A181F1BF9E4D6040400800000005000000040000000300000002
+      0000000200000001000000010000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      0000000000000000000000010000000100000002000000020000000300000004
+      0000000400000005000000050000000600000006000000070000000700000007
+      0000000700000007000000070000000700000007000000070000000600000006
+      0000000600000006000000060000000600000006000000060000000600000005
+      0000000500000005000000050000000500000005000000050000000500000005
+      0000000400000004000000040000000300000003000000020000000200000001
+      0000000100000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFE000000001FFFFFFFFFFFFFFFFFFFFFF80000
+      000007FFFFFFFFFFFFFFFFFFFFE00000000003FFFFFFFFFFFFFFFFFFFFC00000
+      000001FFFFFFFFFFFFFFFFFFFFE00000000000FFFFFFFFFFFFFFFFFFFFF00000
+      0000007FFFFFFFFFFFFFFFFFFFF800000000007FFFFFFFFFFFFFFFFFFFFC0000
+      0000003FFFFFFFFFFFFFFFFFFFFE00000000003FFFFFFFFFFFFFFFFFFFFF0000
+      0000003FFFFFFFFFFFFFFFFFFFFF80000000003FFFFFFFFFFFFFFFFFFFFFC000
+      0000003FFFFFFFFFFFFFFFFFFFFFE0000000003FFFFFFFFFFFFFFFFFFFFFF000
+      0000003FFFFFFFFFFFFFFFFFFFFFF8000000003FFFFFFFFFFFFFFFFFFFFFFC00
+      0000003FFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFFFFFFFFFFFFFFFFF800
+      0000003FFFFFFFFFFFFFFFFFFFFFF0000000003FFFFFFFFE0000000000000000
+      0000003FFFFFFFFC00000000000000000000003FFFFFFFF00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000000003FFFFFFFE00000000000000000
+      0000003FFFFFFFE000000000000000000060003FFFFFFFE00000000000000000
+      00F0003FFFFFFFE0000000000000000001F8003FFFFFFFE00000000000000000
+      03FC003FFFFFFFE0000000000000000007FE003FFFFFFFE00000000000000000
+      0FFF003FFFFFFFE000000000000000001FFF803FFFFFFFE00000000000000000
+      1FFFC07FFFFFFFE000000000000000001FFFE07FFFFFFFE00000000000000000
+      1FFFF0FFFFFFFFE000000000000000001FFFF8FFFFFFFFE00000000000000000
+      1FFFFDFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000001FFFFFFFFFFFFFE00000000000000000
+      1FFFFFFFFFFFFFE000000000000000003FFFFFFFFFFFFFE00000000000000000
+      7FFFFFFFFFFFFFE000000000000000007FFFFFFFFFFFFFE00000000000000000
+      7FFFFFFFFFFFFFF00000000000000000FFFFFFFFFFFFFFF80000000000000001
+      FFFFFFFFFFFFFFFF80007FFFFFE0000FFFFFFFFFFFFFFFFF20007FFFFFE0007F
+      FFFFFFFFFBFFFFFEE0007FFFFFE000FFFFFFFFFFF1FFFFFDE0007FFFFFE000FF
+      FFFFFFFFF0FFFFF9E0007FFFFFE000FFFFFFFFFFE07FFFF3E0007FFFFFE000FF
+      FFFFFFFFE03FFFE7E0007FFFFFE000FFFFFFFFFFC01FFF83E0007FFFFFE000FF
+      FFFFFFFFC00FFF01E0007FFFFFE000FFFFFFFFFFC007FE0000007FFFFFE000FF
+      FFFFFFFFC003FC0000007FFFFFE000FFFFFFFFFFC001F80000007FFFFFE000FF
+      FFFFFFFFC000F00000007FFFFFE000FFFFFFFFFFC000600000007FFFFFE000FF
+      FFFFFFFFC000000000007FFFFFE000FFFFFFFFFFC000000000007FFFFFE000FF
+      FFFFFFFFC000000000007FFFFFE000FFFFFFFFFFC000000000007FFFFFE000FF
+      FFFFFFFFC000000000004FFFFFE000FFFFFFFFFFC000000000001FFFFFE000FF
+      FFFFFFFFC000000000003FFFFFE000FFFFFFFFFFC000000000003FFFFFE000FF
+      FFFFFFFFC000000000007FFFFFE000FFFFFFFFFFC000000000007FFFFFC000FF
+      FFFFFFFFC000000000003FFFFFC000FFFFFFFFFFC000000000000FFFFF0000FF
+      FFFFFFFFC000000000000000000000FFFFFFFFFFC000000000000000000001FF
+      FFFFFFFFC000000000000000000001FFFFFFFFFFC000000000000000000003FF
+      FFFFFFFFC000000000000000000003FFFFFFFFFFC000000000000000000007FF
+      FFFFFFFFC00000000000000000000FFFFFFFFFFFC00000000300000000001FFF
+      FFFFFFFFC00000000380000000003FFFFFFFFFFFC000000001C0000000007FFF
+      FFFFFFFFC000000000F000000000FFFFFFFFFFFFC0000000007C00000003FFFF
+      FFFFFFFFC0000000003F0000001FFFFFFFFFFFFFC0000000001FFFFFFFFFFFFF
+      FFFFFFFFC0000000000FFFFFFFFFFFFFFFFFFFFFC00000000007FFFFFFFFFFFF
+      FFFFFFFFC00000000003FFFFFFFFFFFFFFFFFFFFE00000000001FFFFFFFFFFFF
+      FFFFFFFFE00000000000FFFFFFFFFFFFFFFFFFFFF000000000007FFFFFFFFFFF
+      FFFFFFFFF800000000003FFFFFFFFFFFFFFFFFFFFC00000000007FFFFFFFFFFF
+      FFFFFFFFFE0000000001FFFFFFFFFFFFFFFFFFFFFFC000000007FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}
     Transparent = True
   end
   object Label3: TLabel

+ 1 - 4
forms/Console.cpp

@@ -217,10 +217,7 @@ void __fastcall TConsoleDialog::CommandEditChange(TObject * /*Sender*/)
 //---------------------------------------------------------------------------
 void __fastcall TConsoleDialog::AddLine(const AnsiString & Line, bool /*StdError*/)
 {
-  if (!Line.IsEmpty())
-  {
-    OutputMemo->Lines->Add(Line);
-  }
+  OutputMemo->Lines->Add(Line);
 }
 //---------------------------------------------------------------------------
 void __fastcall TConsoleDialog::CreateParams(TCreateParams & Params)

+ 12 - 4
forms/Copy.cpp

@@ -167,6 +167,13 @@ void __fastcall TCopyDialog::AdjustControls()
   EnableControl(LocalDirectoryBrowseButton, DirectoryEdit->Enabled);
   DirectoryLabel->FocusControl = DirectoryEdit;
 
+  AnsiString QueueLabel = LoadStr(COPY_BACKGROUND);
+  if (FLAGCLEAR(Options, coNoQueue))
+  {
+    QueueLabel = FMTLOAD(COPY_QUEUE, (QueueLabel));
+  }
+  QueueCheck->Caption = QueueLabel;
+
   AdjustTransferControls();
 
   LocalDirectoryBrowseButton->Visible = !ToRemote &&
@@ -245,7 +252,7 @@ void __fastcall TCopyDialog::SetParams(const TGUICopyParamType & value)
   FCopyParams = value;
   DirectoryEdit->Text = Directory + FParams.FileMask;
   QueueCheck->Checked = FParams.Queue;
-  QueueNoConfirmationCheck->Checked = FParams.QueueNoConfirmation;
+  QueueIndividuallyCheck->Checked = FParams.QueueIndividually;
   NewerOnlyCheck->Checked = FLAGCLEAR(Options, coDisableNewerOnly) && FParams.NewerOnly;
   UpdateControls();
 }
@@ -256,7 +263,7 @@ TGUICopyParamType __fastcall TCopyDialog::GetParams()
   FParams = FCopyParams;
   FParams.FileMask = GetFileMask();
   FParams.Queue = QueueCheck->Checked;
-  FParams.QueueNoConfirmation = QueueNoConfirmationCheck->Checked;
+  FParams.QueueIndividually = QueueIndividuallyCheck->Checked;
   FParams.NewerOnly = FLAGCLEAR(Options, coDisableNewerOnly) && NewerOnlyCheck->Checked;
   return FParams;
 }
@@ -328,8 +335,9 @@ void __fastcall TCopyDialog::UpdateControls()
   bool RemoteTransfer = FLAGSET(FOutputOptions, cooRemoteTransfer);
   EnableControl(QueueCheck,
     ((Options & (coDisableQueue | coTemp)) == 0) && !RemoteTransfer);
-  EnableControl(QueueNoConfirmationCheck,
-    (((Options & coTemp) == 0) && QueueCheck->Checked) && !RemoteTransfer);
+  EnableControl(QueueIndividuallyCheck,
+    QueueCheck->Enabled && QueueCheck->Checked &&
+    FileList && (FileList->Count > 1));
 }
 //---------------------------------------------------------------------------
 void __fastcall TCopyDialog::SetMove(bool value)

+ 3 - 3
forms/Copy.dfm

@@ -90,16 +90,16 @@ object CopyDialog: TCopyDialog
     Top = 135
     Width = 301
     Height = 17
-    Caption = 'Transfer on background (add to transfer &queue)'
+    Caption = 'Transfer on background (add to transfer &queue) X'
     TabOrder = 6
     OnClick = ControlChange
   end
-  object QueueNoConfirmationCheck: TCheckBox
+  object QueueIndividuallyCheck: TCheckBox
     Left = 312
     Top = 135
     Width = 193
     Height = 17
-    Caption = 'No &confirmations'
+    Caption = '&Enqueue each file individually'
     TabOrder = 7
     OnClick = ControlChange
   end

+ 1 - 1
forms/Copy.h

@@ -24,7 +24,7 @@ __published:
   TButton *CancelButton;
   TButton *LocalDirectoryBrowseButton;
   TCheckBox *QueueCheck;
-  TCheckBox *QueueNoConfirmationCheck;
+  TCheckBox *QueueIndividuallyCheck;
   TButton *HelpButton;
   TCheckBox *NewerOnlyCheck;
   TCheckBox *NeverShowAgainCheck;

+ 0 - 1
forms/CopyParamCustom.cpp

@@ -39,7 +39,6 @@ __fastcall TCopyParamCustomDialog::TCopyParamCustomDialog(TComponent * Owner,
   : TForm(Owner)
 {
   UseSystemSettings(this);
-  CopyParamsFrame->Direction = pdAll;
   CopyParamsFrame->CopyParamAttrs = CopyParamAttrs;
 }
 //---------------------------------------------------------------------------

+ 8 - 99
forms/CopyParamCustom.dfm

@@ -1,12 +1,12 @@
 object CopyParamCustomDialog: TCopyParamCustomDialog
-  Left = 264
-  Top = 122
+  Left = 374
+  Top = 167
   HelpType = htKeyword
   HelpKeyword = 'ui_transfer_custom'
   BorderIcons = [biSystemMenu, biMinimize, biMaximize, biHelp]
   BorderStyle = bsDialog
   Caption = 'Transfer settings'
-  ClientHeight = 387
+  ClientHeight = 391
   ClientWidth = 377
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
@@ -19,12 +19,12 @@ object CopyParamCustomDialog: TCopyParamCustomDialog
   OnCloseQuery = FormCloseQuery
   DesignSize = (
     377
-    387)
+    391)
   PixelsPerInch = 96
   TextHeight = 13
   object OkButton: TButton
     Left = 125
-    Top = 354
+    Top = 358
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]
@@ -35,7 +35,7 @@ object CopyParamCustomDialog: TCopyParamCustomDialog
   end
   object CancelButton: TButton
     Left = 209
-    Top = 354
+    Top = 358
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]
@@ -48,104 +48,13 @@ object CopyParamCustomDialog: TCopyParamCustomDialog
     Left = 0
     Top = 0
     Width = 377
-    Height = 345
+    Height = 355
     HelpType = htKeyword
     TabOrder = 0
-    inherited CommonPropertiesGroup: TGroupBox
-      Left = 197
-      Top = 209
-      Height = 73
-      Caption = 'Common options'
-      DesignSize = (
-        173
-        73)
-      inherited CommonPreserveTimestampCheck: TCheckBox
-        Top = 19
-      end
-    end
-    inherited LocalPropertiesGroup: TGroupBox
-      Left = 197
-      Top = 156
-      Height = 48
-      Caption = 'Download options'
-      DesignSize = (
-        173
-        48)
-      inherited PreserveReadOnlyCheck: TCheckBox
-        Top = 20
-      end
-      inherited LocalPreserveTimeCheck: TCheckBox
-        Top = 92
-      end
-    end
-    inherited RemotePropertiesGroup: TGroupBox
-      Left = 8
-      Top = 156
-      Width = 182
-      Height = 126
-      Caption = 'Upload options'
-    end
-    inherited ChangeCaseGroup: TGroupBox
-      Left = 247
-      Top = 8
-      Width = 123
-      DesignSize = (
-        123
-        146)
-      inherited CCLowerCaseShortButton: TRadioButton
-        Width = 110
-      end
-      inherited CCNoChangeButton: TRadioButton
-        Width = 110
-      end
-      inherited CCUpperCaseButton: TRadioButton
-        Width = 110
-      end
-      inherited CCLowerCaseButton: TRadioButton
-        Width = 110
-      end
-      inherited CCFirstUpperCaseButton: TRadioButton
-        Width = 110
-      end
-    end
-    inherited TransferModeGroup: TGroupBox
-      Left = 8
-      Top = 8
-      Width = 231
-      DesignSize = (
-        231
-        146)
-      inherited TMTextButton: TRadioButton
-        Width = 219
-      end
-      inherited TMBinaryButton: TRadioButton
-        Width = 219
-      end
-      inherited TMAutomaticButton: TRadioButton
-        Width = 219
-      end
-      inherited AsciiFileMaskCombo: THistoryComboBox
-        Width = 213
-      end
-    end
-    inherited OtherGroup: TGroupBox
-      Left = 8
-      Top = 284
-      Width = 362
-      DesignSize = (
-        362
-        61)
-      inherited ExcludeFileMaskCombo: THistoryComboBox
-        Width = 217
-      end
-      inherited ExcludeFileMaskHintText: TStaticText
-        Left = 256
-      end
-    end
   end
   object HelpButton: TButton
     Left = 293
-    Top = 354
+    Top = 358
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]

+ 0 - 1
forms/CopyParamPreset.cpp

@@ -38,7 +38,6 @@ __fastcall TCopyParamPresetDialog::TCopyParamPresetDialog(TComponent * Owner,
 {
   SetCorrectFormParent(this);
   UseSystemSettings(this);
-  CopyParamsFrame->Direction = pdAll;
   FMode = Mode;
   FCurrentRuleData = CurrentRuleData;
   Caption = LoadStr(Mode == cpmEdit ? COPY_PARAM_EDIT : COPY_PARAM_ADD);

+ 9 - 99
forms/CopyParamPreset.dfm

@@ -6,7 +6,7 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
   BorderIcons = [biSystemMenu, biMinimize, biMaximize, biHelp]
   BorderStyle = bsDialog
   Caption = 'CopyParamPresetDialog'
-  ClientHeight = 438
+  ClientHeight = 441
   ClientWidth = 632
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
@@ -20,7 +20,7 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
   OnShow = FormShow
   DesignSize = (
     632
-    438)
+    441)
   PixelsPerInch = 96
   TextHeight = 13
   object Label1: TLabel
@@ -33,7 +33,7 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
   end
   object OkButton: TButton
     Left = 380
-    Top = 405
+    Top = 408
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]
@@ -44,7 +44,7 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
   end
   object CancelButton: TButton
     Left = 464
-    Top = 405
+    Top = 408
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]
@@ -66,111 +66,21 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
     Left = 8
     Top = 51
     Width = 377
-    Height = 345
+    Height = 355
+    HelpType = htKeyword
     TabOrder = 1
-    inherited CommonPropertiesGroup: TGroupBox
-      Left = 197
-      Top = 209
-      Height = 73
-      Caption = 'Common options'
-      DesignSize = (
-        173
-        73)
-      inherited CommonPreserveTimestampCheck: TCheckBox
-        Top = 19
-      end
-    end
-    inherited LocalPropertiesGroup: TGroupBox
-      Left = 197
-      Top = 156
-      Height = 48
-      Caption = 'Download options'
-      DesignSize = (
-        173
-        48)
-      inherited PreserveReadOnlyCheck: TCheckBox
-        Top = 20
-      end
-      inherited LocalPreserveTimeCheck: TCheckBox
-        Top = 92
-      end
-    end
-    inherited RemotePropertiesGroup: TGroupBox
-      Left = 8
-      Top = 156
-      Width = 182
-      Height = 126
-      Caption = 'Upload options'
-    end
-    inherited ChangeCaseGroup: TGroupBox
-      Left = 247
-      Top = 8
-      Width = 123
-      DesignSize = (
-        123
-        146)
-      inherited CCLowerCaseShortButton: TRadioButton
-        Width = 110
-      end
-      inherited CCNoChangeButton: TRadioButton
-        Width = 110
-      end
-      inherited CCUpperCaseButton: TRadioButton
-        Width = 110
-      end
-      inherited CCLowerCaseButton: TRadioButton
-        Width = 110
-      end
-      inherited CCFirstUpperCaseButton: TRadioButton
-        Width = 110
-      end
-    end
-    inherited TransferModeGroup: TGroupBox
-      Left = 8
-      Top = 8
-      Width = 231
-      DesignSize = (
-        231
-        146)
-      inherited TMTextButton: TRadioButton
-        Width = 219
-      end
-      inherited TMBinaryButton: TRadioButton
-        Width = 219
-      end
-      inherited TMAutomaticButton: TRadioButton
-        Width = 219
-      end
-      inherited AsciiFileMaskCombo: THistoryComboBox
-        Width = 213
-      end
-    end
-    inherited OtherGroup: TGroupBox
-      Left = 8
-      Top = 284
-      Width = 362
-      DesignSize = (
-        362
-        61)
-      inherited ExcludeFileMaskCombo: THistoryComboBox
-        Width = 217
-      end
-      inherited ExcludeFileMaskHintText: TStaticText
-        Left = 256
-      end
-    end
   end
   object RuleGroup: TGroupBox
     Left = 388
     Top = 91
     Width = 235
-    Height = 305
+    Height = 306
     Anchors = [akLeft, akTop, akRight]
     Caption = 'Autoselection rule'
     TabOrder = 3
     DesignSize = (
       235
-      305)
+      306)
     object Label2: TLabel
       Left = 10
       Top = 20
@@ -281,7 +191,7 @@ object CopyParamPresetDialog: TCopyParamPresetDialog
   end
   object HelpButton: TButton
     Left = 548
-    Top = 405
+    Top = 408
     Width = 75
     Height = 25
     Anchors = [akRight, akBottom]

+ 26 - 52
forms/CopyParams.cpp

@@ -33,10 +33,6 @@ __fastcall TCopyParamsFrame::TCopyParamsFrame(TComponent* Owner)
   FRightsFrame->OnChange = RightsFrameChange;
   RightsEdit->PopupMenu = FRightsFrame->RightsPopup;
 
-  // on start set different value than we want to allow property-setter to proceed
-  FDirection = pdToLocal;
-  Direction = pdToRemote;
-
   FCopyParamAttrs = 0;
   FParams = new TCopyParamType();
   TCopyParamType DefParams;
@@ -46,6 +42,9 @@ __fastcall TCopyParamsFrame::TCopyParamsFrame(TComponent* Owner)
   InstallPathWordBreakProc(ExcludeFileMaskCombo);
   HintLabel(ExcludeFileMaskHintText,
     FORMAT("%s\n \n%s",(LoadStr(MASK_HINT2), LoadStr(PATH_MASK_HINT))));
+  TPoint P(ExcludeFileMaskCombo->Width, 0);
+  P = ExcludeFileMaskHintText->ScreenToClient(ExcludeFileMaskCombo->ClientToScreen(P));
+  ExcludeFileMaskHintText->Left = ExcludeFileMaskHintText->Left + P.x - ExcludeFileMaskHintText->Width;
 }
 //---------------------------------------------------------------------------
 __fastcall TCopyParamsFrame::~TCopyParamsFrame()
@@ -69,7 +68,7 @@ void __fastcall TCopyParamsFrame::SetParams(TCopyParamType value)
     case ncNoChange: CCNoChangeButton->Checked = True; break;
     case ncLowerCase: CCLowerCaseButton->Checked = True; break;
     case ncUpperCase: CCUpperCaseButton->Checked = True; break;
-    case ncFirstUpperCase: CCFirstUpperCaseButton->Checked = True; break;
+    case ncFirstUpperCase: CCNoChangeButton->Checked = True; break; // unsupported
     case ncLowerCaseShort: CCLowerCaseShortButton->Checked = True; break;
   }
 
@@ -82,7 +81,6 @@ void __fastcall TCopyParamsFrame::SetParams(TCopyParamType value)
   IgnorePermErrorsCheck->Checked = value.IgnorePermErrors;
   PreserveReadOnlyCheck->Checked = value.PreserveReadOnly;
 
-  assert(PreserveTimeCheck);
   PreserveTimeCheck->Checked = value.PreserveTime;
 
   CommonCalculateSizeCheck->Checked = value.CalculateSize;
@@ -91,6 +89,8 @@ void __fastcall TCopyParamsFrame::SetParams(TCopyParamType value)
   ExcludeFileMaskCombo->Text = value.ExcludeFileMask.Masks;
   ClearArchiveCheck->Checked = value.ClearArchive;
 
+  SpeedCombo->Text = SetSpeedLimit(value.CPSLimit);
+
   *FParams = value;
 
   UpdateControls();
@@ -112,8 +112,6 @@ TCopyParamType __fastcall TCopyParamsFrame::GetParams()
     else
   if (CCUpperCaseButton->Checked) Result.FileNameCase = ncUpperCase;
     else
-  if (CCFirstUpperCaseButton->Checked) Result.FileNameCase = ncFirstUpperCase;
-    else
   if (CCLowerCaseShortButton->Checked) Result.FileNameCase = ncLowerCaseShort;
     else Result.FileNameCase = ncNoChange;
 
@@ -125,7 +123,6 @@ TCopyParamType __fastcall TCopyParamsFrame::GetParams()
   Result.IgnorePermErrors = IgnorePermErrorsCheck->Checked;
   Result.PreserveReadOnly = PreserveReadOnlyCheck->Checked;
 
-  assert(PreserveTimeCheck);
   Result.PreserveTime = PreserveTimeCheck->Checked;
 
   Result.CalculateSize = CommonCalculateSizeCheck->Checked;
@@ -135,19 +132,11 @@ TCopyParamType __fastcall TCopyParamsFrame::GetParams()
 
   Result.ClearArchive = ClearArchiveCheck->Checked;
 
+  Result.CPSLimit = GetSpeedLimit(SpeedCombo->Text);
+
   return Result;
 }
 //---------------------------------------------------------------------------
-TCheckBox * __fastcall TCopyParamsFrame::GetPreserveTimeCheck()
-{
-  switch (Direction) {
-    case pdToRemote: return RemotePreserveTimeCheck;
-    case pdToLocal: return LocalPreserveTimeCheck;
-    case pdBoth:
-    default: return CommonPreserveTimestampCheck;
-  }
-}
-//---------------------------------------------------------------------------
 void __fastcall TCopyParamsFrame::UpdateControls()
 {
   EnableControl(CommonPropertiesGroup, FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly) && Enabled);
@@ -185,39 +174,6 @@ void __fastcall TCopyParamsFrame::UpdateControls()
     FLAGCLEAR(CopyParamAttrs, cpaExcludeMaskOnly));
 }
 //---------------------------------------------------------------------------
-void __fastcall TCopyParamsFrame::SetDirection(TParamsForDirection value)
-{
-  if (Direction != value)
-  {
-    Boolean APreserveTime = PreserveTimeCheck->Checked;
-    FDirection = value;
-    PreserveTimeCheck->Checked = APreserveTime;
-
-    LocalPropertiesGroup->Visible = (Direction == pdToLocal || Direction == pdAll );
-    RemotePropertiesGroup->Visible = (Direction == pdToRemote || Direction == pdAll );
-    CommonPropertiesGroup->Visible = (Direction == pdBoth || Direction == pdAll );
-    LocalPreserveTimeCheck->Visible = (Direction != pdAll);
-    RemotePreserveTimeCheck->Visible = (Direction != pdAll);
-    ReplaceInvalidCharsCheck->Visible =
-      (Direction == pdToLocal || Direction == pdBoth || Direction == pdAll);
-    CCFirstUpperCaseButton->Visible =
-      (Direction == pdToLocal || Direction == pdToRemote);
-    CCLowerCaseShortButton->Visible =
-      (Direction == pdToRemote || Direction == pdBoth || Direction == pdAll);
-    if (Direction == pdBoth || Direction == pdAll)
-    {
-      CCLowerCaseShortButton->Top = CCFirstUpperCaseButton->Top;
-      IgnorePermErrorsCheck->Top = RemotePreserveTimeCheck->Top;
-    }
-    else
-    {
-      CCLowerCaseShortButton->Top = ReplaceInvalidCharsCheck->Top;
-      IgnorePermErrorsCheck->Top = CCFirstUpperCaseButton->Top;
-    }
-    UpdateControls();
-  }
-}
-//---------------------------------------------------------------------------
 void __fastcall TCopyParamsFrame::ControlChange(TObject * /*Sender*/)
 {
   UpdateControls();
@@ -230,6 +186,7 @@ void __fastcall TCopyParamsFrame::BeforeExecute()
   assert(CustomWinConfiguration);
   AsciiFileMaskCombo->Items = CustomWinConfiguration->History["Mask"];
   ExcludeFileMaskCombo->Items = CustomWinConfiguration->History["ExcludeMask"];
+  SpeedCombo->Items = CustomWinConfiguration->History["SpeedLimit"];
 }
 //---------------------------------------------------------------------------
 void __fastcall TCopyParamsFrame::AfterExecute()
@@ -239,6 +196,8 @@ void __fastcall TCopyParamsFrame::AfterExecute()
   CustomWinConfiguration->History["Mask"] = AsciiFileMaskCombo->Items;
   ExcludeFileMaskCombo->SaveToHistory();
   CustomWinConfiguration->History["ExcludeMask"] = ExcludeFileMaskCombo->Items;
+  SpeedCombo->SaveToHistory();
+  CustomWinConfiguration->History["SpeedLimit"] = SpeedCombo->Items;
 }
 //---------------------------------------------------------------------------
 void __fastcall TCopyParamsFrame::SetCopyParamAttrs(int value)
@@ -315,3 +274,18 @@ void __fastcall TCopyParamsFrame::RightsEditContextPopup(TObject * Sender,
   MenuPopup(Sender, MousePos, Handled);
 }
 //---------------------------------------------------------------------------
+void __fastcall TCopyParamsFrame::SpeedComboExit(TObject * /*Sender*/)
+{
+  try
+  {
+    SpeedCombo->Text = SetSpeedLimit(GetSpeedLimit(SpeedCombo->Text));
+  }
+  catch (Exception & E)
+  {
+    ShowExtendedException(&E);
+    SpeedCombo->SetFocus();
+    SpeedCombo->SelectAll();
+    Abort();
+  }
+}
+//---------------------------------------------------------------------------

+ 111 - 114
forms/CopyParams.dfm

@@ -1,23 +1,32 @@
 object CopyParamsFrame: TCopyParamsFrame
   Left = 0
   Top = 0
-  Width = 508
-  Height = 211
+  Width = 377
+  Height = 355
+  HelpType = htKeyword
   TabOrder = 0
   object CommonPropertiesGroup: TGroupBox
-    Left = 331
-    Top = 0
-    Width = 173
-    Height = 146
-    Caption = 'Attributes'
-    TabOrder = 4
+    Left = 192
+    Top = 156
+    Width = 178
+    Height = 95
+    Caption = 'Common options'
+    TabOrder = 3
     DesignSize = (
-      173
-      146)
-    object CommonPreserveTimestampCheck: TCheckBox
+      178
+      95)
+    object SpeedLabel2: TLabel
+      Left = 11
+      Top = 68
+      Width = 69
+      Height = 13
+      Caption = '&Speed (KiB/s):'
+      FocusControl = SpeedCombo
+    end
+    object PreserveTimeCheck: TCheckBox
       Left = 12
-      Top = 21
-      Width = 156
+      Top = 19
+      Width = 161
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = 'Preserve timesta&mp'
@@ -28,8 +37,8 @@ object CopyParamsFrame: TCopyParamsFrame
     end
     object CommonCalculateSizeCheck: TCheckBox
       Left = 12
-      Top = 45
-      Width = 156
+      Top = 44
+      Width = 161
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&Calculate total size'
@@ -38,50 +47,60 @@ object CopyParamsFrame: TCopyParamsFrame
       TabOrder = 1
       OnClick = ControlChange
     end
+    object SpeedCombo: THistoryComboBox
+      Left = 89
+      Top = 64
+      Width = 80
+      Height = 21
+      AutoComplete = False
+      ItemHeight = 13
+      TabOrder = 2
+      Text = 'SpeedCombo'
+      OnExit = SpeedComboExit
+      Items.Strings = (
+        'Unlimited'
+        '1024'
+        '512'
+        '256'
+        '128'
+        '64'
+        '32'
+        '16'
+        '8')
+    end
   end
   object LocalPropertiesGroup: TGroupBox
-    Left = 331
-    Top = 0
-    Width = 173
-    Height = 145
-    Caption = 'Attributes'
-    TabOrder = 3
+    Left = 192
+    Top = 254
+    Width = 178
+    Height = 43
+    Caption = 'Download options'
+    TabOrder = 4
     DesignSize = (
-      173
-      145)
+      178
+      43)
     object PreserveReadOnlyCheck: TCheckBox
       Left = 12
-      Top = 45
-      Width = 155
+      Top = 17
+      Width = 160
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = 'Preserve rea&d-only'
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 1
-    end
-    object LocalPreserveTimeCheck: TCheckBox
-      Left = 12
-      Top = 21
-      Width = 155
-      Height = 17
-      Anchors = [akLeft, akTop, akRight]
-      Caption = 'Preserve timesta&mp'
-      ParentShowHint = False
-      ShowHint = True
       TabOrder = 0
     end
   end
   object RemotePropertiesGroup: TGroupBox
-    Left = 331
-    Top = 0
-    Width = 173
-    Height = 146
-    Caption = 'Attributes'
+    Left = 8
+    Top = 156
+    Width = 177
+    Height = 141
+    Caption = 'Upload options'
     TabOrder = 2
     object PreserveRightsCheck: TCheckBox
       Left = 12
-      Top = 16
+      Top = 18
       Width = 156
       Height = 17
       Caption = 'Set pe&rmissions:'
@@ -90,20 +109,9 @@ object CopyParamsFrame: TCopyParamsFrame
       TabOrder = 0
       OnClick = ControlChange
     end
-    object RemotePreserveTimeCheck: TCheckBox
-      Left = 12
-      Top = 69
-      Width = 156
-      Height = 17
-      Caption = 'Preserve timesta&mp'
-      ParentShowHint = False
-      ShowHint = True
-      TabOrder = 2
-      OnClick = ControlChange
-    end
     object RightsEdit: TComboEdit
       Left = 30
-      Top = 36
+      Top = 39
       Width = 109
       Height = 21
       ButtonHint = 'Configure permissions'
@@ -118,39 +126,47 @@ object CopyParamsFrame: TCopyParamsFrame
     end
     object IgnorePermErrorsCheck: TCheckBox
       Left = 12
-      Top = 94
+      Top = 67
       Width = 156
       Height = 17
       Caption = 'Ign&ore permission errors'
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 3
+      TabOrder = 2
       OnClick = ControlChange
     end
+    object ClearArchiveCheck: TCheckBox
+      Left = 12
+      Top = 94
+      Width = 156
+      Height = 17
+      Caption = 'Clear '#39'Archi&ve'#39' attribute'
+      TabOrder = 3
+    end
   end
   object ChangeCaseGroup: TGroupBox
-    Left = 206
-    Top = 0
-    Width = 120
+    Left = 247
+    Top = 8
+    Width = 123
     Height = 146
     Caption = 'Filename modification'
     TabOrder = 1
     DesignSize = (
-      120
+      123
       146)
     object CCLowerCaseShortButton: TRadioButton
       Left = 8
-      Top = 119
-      Width = 107
+      Top = 94
+      Width = 110
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = 'Lower case &8.3'
-      TabOrder = 4
+      TabOrder = 3
     end
     object CCNoChangeButton: TRadioButton
       Left = 8
       Top = 19
-      Width = 107
+      Width = 110
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&No change'
@@ -159,7 +175,7 @@ object CopyParamsFrame: TCopyParamsFrame
     object CCUpperCaseButton: TRadioButton
       Left = 8
       Top = 44
-      Width = 107
+      Width = 110
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&Upper case'
@@ -168,40 +184,31 @@ object CopyParamsFrame: TCopyParamsFrame
     object CCLowerCaseButton: TRadioButton
       Left = 8
       Top = 69
-      Width = 107
+      Width = 110
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = 'Lo&wer case'
       TabOrder = 2
     end
-    object CCFirstUpperCaseButton: TRadioButton
-      Left = 8
-      Top = 94
-      Width = 107
-      Height = 17
-      Anchors = [akLeft, akTop, akRight]
-      Caption = '&First upper case'
-      TabOrder = 3
-    end
     object ReplaceInvalidCharsCheck: TCheckBox
       Left = 8
       Top = 120
       Width = 105
       Height = 17
       Caption = 'Replace '#39'\:*?'#39' ...'
-      TabOrder = 5
+      TabOrder = 4
       OnClick = ControlChange
     end
   end
   object TransferModeGroup: TGroupBox
-    Left = 3
-    Top = 0
-    Width = 198
+    Left = 8
+    Top = 8
+    Width = 231
     Height = 146
     Caption = 'Transfer mode'
     TabOrder = 0
     DesignSize = (
-      198
+      231
       146)
     object AsciiFileMaskLabel: TLabel
       Left = 10
@@ -215,7 +222,7 @@ object CopyParamsFrame: TCopyParamsFrame
     object TMTextButton: TRadioButton
       Left = 7
       Top = 22
-      Width = 189
+      Width = 219
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&Text (plain text, html, scripts, ...)'
@@ -225,7 +232,7 @@ object CopyParamsFrame: TCopyParamsFrame
     object TMBinaryButton: TRadioButton
       Left = 7
       Top = 48
-      Width = 189
+      Width = 219
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&Binary (archives, doc, ...)'
@@ -235,7 +242,7 @@ object CopyParamsFrame: TCopyParamsFrame
     object TMAutomaticButton: TRadioButton
       Left = 7
       Top = 74
-      Width = 189
+      Width = 219
       Height = 17
       Anchors = [akLeft, akTop, akRight]
       Caption = '&Automatic'
@@ -245,7 +252,7 @@ object CopyParamsFrame: TCopyParamsFrame
     object AsciiFileMaskCombo: THistoryComboBox
       Left = 9
       Top = 115
-      Width = 180
+      Width = 213
       Height = 21
       AutoComplete = False
       Anchors = [akLeft, akTop, akRight]
@@ -257,18 +264,18 @@ object CopyParamsFrame: TCopyParamsFrame
     end
   end
   object OtherGroup: TGroupBox
-    Left = 3
-    Top = 148
-    Width = 501
-    Height = 61
+    Left = 8
+    Top = 300
+    Width = 362
+    Height = 46
     Caption = 'Other'
     TabOrder = 5
     DesignSize = (
-      501
-      61)
+      362
+      46)
     object ExclusionFileMaskLabel: TLabel
       Left = 90
-      Top = 18
+      Top = 20
       Width = 28
       Height = 13
       Caption = 'mas&k:'
@@ -276,8 +283,8 @@ object CopyParamsFrame: TCopyParamsFrame
     end
     object ExcludeFileMaskCombo: THistoryComboBox
       Left = 136
-      Top = 14
-      Width = 358
+      Top = 16
+      Width = 217
       Height = 21
       AutoComplete = False
       Anchors = [akLeft, akTop, akRight]
@@ -287,17 +294,9 @@ object CopyParamsFrame: TCopyParamsFrame
       Text = 'ExcludeFileMaskCombo'
       OnExit = ValidateMaskComboExit
     end
-    object ClearArchiveCheck: TCheckBox
-      Left = 10
-      Top = 39
-      Width = 231
-      Height = 17
-      Caption = 'Clear source file '#39'Archi&ve'#39' attribute'
-      TabOrder = 3
-    end
     object NegativeExcludeCombo: TComboBox
       Left = 10
-      Top = 14
+      Top = 16
       Width = 76
       Height = 21
       Style = csDropDownList
@@ -307,17 +306,15 @@ object CopyParamsFrame: TCopyParamsFrame
         'Exclude'
         'Include')
     end
-    object ExcludeFileMaskHintText: TStaticText
-      Left = 397
-      Top = 39
-      Width = 97
-      Height = 17
-      Alignment = taRightJustify
-      Anchors = [akTop, akRight]
-      AutoSize = False
-      Caption = 'mask hints'
-      TabOrder = 2
-      TabStop = True
-    end
+  end
+  object ExcludeFileMaskHintText: TStaticText
+    Left = 303
+    Top = 338
+    Width = 54
+    Height = 17
+    Alignment = taCenter
+    Caption = 'mask hints'
+    TabOrder = 6
+    TabStop = True
   end
 end

+ 6 - 11
forms/CopyParams.h

@@ -25,45 +25,42 @@ __published:
   TRadioButton *TMAutomaticButton;
   THistoryComboBox *AsciiFileMaskCombo;
   TGroupBox *RemotePropertiesGroup;
-  TCheckBox *RemotePreserveTimeCheck;
   TGroupBox *LocalPropertiesGroup;
   TCheckBox *PreserveReadOnlyCheck;
-  TCheckBox *LocalPreserveTimeCheck;
   TCheckBox *PreserveRightsCheck;
   TGroupBox *ChangeCaseGroup;
   TRadioButton *CCNoChangeButton;
   TRadioButton *CCUpperCaseButton;
   TRadioButton *CCLowerCaseButton;
-  TRadioButton *CCFirstUpperCaseButton;
   TGroupBox *CommonPropertiesGroup;
-  TCheckBox *CommonPreserveTimestampCheck;
+  TCheckBox *PreserveTimeCheck;
   TCheckBox *ReplaceInvalidCharsCheck;
   TCheckBox *CommonCalculateSizeCheck;
   TGroupBox *OtherGroup;
   TLabel *ExclusionFileMaskLabel;
   THistoryComboBox *ExcludeFileMaskCombo;
   TRadioButton *CCLowerCaseShortButton;
-  TCheckBox *ClearArchiveCheck;
   TComboBox *NegativeExcludeCombo;
-  TStaticText *ExcludeFileMaskHintText;
   TComboEdit *RightsEdit;
   TCheckBox *IgnorePermErrorsCheck;
+  TCheckBox *ClearArchiveCheck;
+  TStaticText *ExcludeFileMaskHintText;
+  TLabel *SpeedLabel2;
+  THistoryComboBox *SpeedCombo;
   void __fastcall ControlChange(TObject *Sender);
   void __fastcall ValidateMaskComboExit(TObject *Sender);
   void __fastcall RightsEditButtonClick(TObject *Sender);
   void __fastcall RightsEditExit(TObject *Sender);
   void __fastcall RightsEditContextPopup(TObject *Sender, TPoint &MousePos,
           bool &Handled);
+  void __fastcall SpeedComboExit(TObject *Sender);
 private:
-  TParamsForDirection FDirection;
   AnsiString FOrigMasks;
   TCopyParamType * FParams;
   int FCopyParamAttrs;
   TRightsExtFrame * FRightsFrame;
   void __fastcall SetParams(TCopyParamType value);
   TCopyParamType __fastcall GetParams();
-  void __fastcall SetDirection(TParamsForDirection value);
-  TCheckBox * __fastcall GetPreserveTimeCheck();
   void __fastcall SetCopyParamAttrs(int value);
   void __fastcall RightsFrameChange(TObject * Sender);
 protected:
@@ -71,7 +68,6 @@ protected:
   virtual void __fastcall SetEnabled(Boolean Value);
   void __fastcall UpdateRightsByStr();
 
-  __property TCheckBox * PreserveTimeCheck = { read = GetPreserveTimeCheck };
 public:
   __fastcall TCopyParamsFrame(TComponent* Owner);
   __fastcall ~TCopyParamsFrame();
@@ -80,7 +76,6 @@ public:
   void __fastcall AfterExecute();
 
   __property int CopyParamAttrs = { read = FCopyParamAttrs, write = SetCopyParamAttrs };
-  __property TParamsForDirection Direction = { read = FDirection, write = SetDirection };
   __property TCopyParamType Params = { read = GetParams, write = SetParams };
 };
 //---------------------------------------------------------------------------

+ 178 - 49
forms/CustomScpExplorer.cpp

@@ -116,6 +116,7 @@ TTransferOperationParam::TTransferOperationParam()
 TCustomCommandParam::TCustomCommandParam()
 {
   Params = 0;
+  Both = false;
 }
 //---------------------------------------------------------------------------
 class TTransferPresetNoteData : public TObject
@@ -245,6 +246,10 @@ __fastcall TCustomScpExplorerForm::TCustomScpExplorerForm(TComponent* Owner):
     FSystemImageList->DrawingStyle = dsTransparent;
   }
 
+  FCustomCommandMenu = CreateTBXPopupMenu(this);
+  FCustomCommandLocalFileList = NULL;
+  FCustomCommandRemoteFileList = NULL;
+
   Application->HookMainWindow(MainWindowHook);
 
   StartUpdates();
@@ -254,6 +259,10 @@ __fastcall TCustomScpExplorerForm::~TCustomScpExplorerForm()
 {
   Application->UnhookMainWindow(MainWindowHook);
 
+  delete FCustomCommandLocalFileList;
+  delete FCustomCommandRemoteFileList;
+  delete FCustomCommandMenu;
+
   delete FSystemImageList;
   FSystemImageList = NULL;
 
@@ -359,7 +368,7 @@ void __fastcall TCustomScpExplorerForm::TerminalChanged()
 {
   RemoteDirView->Terminal = Terminal;
   Caption = Application->Title;
-  NonVisualDataModule->QueueDisconnectOnceEmptyAction->Checked = false;
+  NonVisualDataModule->ResetQueueOnceEmptyOperation();
   if (Terminal)
   {
     if (Terminal->Active)
@@ -444,13 +453,15 @@ void __fastcall TCustomScpExplorerForm::UpdateQueueStatus(bool AppIdle)
 
   bool IsEmpty = (FQueueStatus == NULL) || (FQueueStatus->Count == 0);
 
-  if (NonVisualDataModule->QueueDisconnectOnceEmptyAction->Checked &&
-      IsEmpty && (Terminal != NULL))
+  if (IsEmpty && (Terminal != NULL))
   {
-    NonVisualDataModule->QueueDisconnectOnceEmptyAction->Checked = false;
-    if (AppIdle)
+    TOnceDoneOperation OnceDoneOperation =
+      NonVisualDataModule->CurrentQueueOnceEmptyOperation();
+    NonVisualDataModule->ResetQueueOnceEmptyOperation();
+
+    if ((OnceDoneOperation != odoIdle) && AppIdle)
     {
-      Terminal->CloseOnCompletion(LoadStr(CLOSED_ON_QUEUE_EMPTY));
+      Terminal->CloseOnCompletion(OnceDoneOperation, LoadStr(CLOSED_ON_QUEUE_EMPTY));
     }
   }
 }
@@ -729,24 +740,32 @@ bool __fastcall TCustomScpExplorerForm::CopyParamDialog(
 
   if (Result && CopyParam.Queue && !ToTemp)
   {
-    assert(Queue != NULL);
 
     // these parameter are known only after transfer dialog
     Params |=
       (CopyParam.QueueNoConfirmation ? cpNoConfirmation : 0) |
       (CopyParam.NewerOnly ? cpNewerOnly : 0);
-    TQueueItem * QueueItem;
-    if (Direction == tdToRemote)
+
+    if (CopyParam.QueueIndividually)
     {
-      QueueItem = new TUploadQueueItem(Terminal, FileList, TargetDirectory,
-        &CopyParam, Params);
+      for (int Index = 0; Index < FileList->Count; Index++)
+      {
+        TStrings * FileList1 = new TStringList();
+        try
+        {
+          FileList1->AddObject(FileList->Strings[Index], FileList->Objects[Index]);
+          AddQueueItem(Direction, FileList1, TargetDirectory, CopyParam, Params);
+        }
+        __finally
+        {
+          delete FileList1;
+        }
+      }
     }
     else
     {
-      QueueItem = new TDownloadQueueItem(Terminal, FileList, TargetDirectory,
-        &CopyParam, Params);
+      AddQueueItem(Direction, FileList, TargetDirectory, CopyParam, Params);
     }
-    Queue->AddItem(QueueItem);
     Result = false;
 
     TOperationSide Side = ((Direction == tdToRemote) ? osLocal : osRemote);
@@ -759,6 +778,27 @@ bool __fastcall TCustomScpExplorerForm::CopyParamDialog(
   return Result;
 }
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::AddQueueItem(
+  TTransferDirection Direction, TStrings * FileList,
+  const AnsiString TargetDirectory, const TCopyParamType & CopyParam,
+  int Params)
+{
+  assert(Queue != NULL);
+
+  TQueueItem * QueueItem;
+  if (Direction == tdToRemote)
+  {
+    QueueItem = new TUploadQueueItem(Terminal, FileList, TargetDirectory,
+      &CopyParam, Params);
+  }
+  else
+  {
+    QueueItem = new TDownloadQueueItem(Terminal, FileList, TargetDirectory,
+      &CopyParam, Params);
+  }
+  Queue->AddItem(QueueItem);
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::RestoreFormParams()
 {
 }
@@ -855,7 +895,7 @@ void __fastcall TCustomScpExplorerForm::FileOperationProgress(
         (ProgressData.Operation != foCalculateChecksum) &&
         (FSynchronizeProgressForm == NULL))
     {
-      FProgressForm->DisconnectWhenComplete = true;
+      FProgressForm->OnceDoneOperation = odoDisconnect;
     }
   }
   // operation is finished (or terminated), so we hide progress form
@@ -907,7 +947,7 @@ bool __fastcall TCustomScpExplorerForm::PanelOperation(TOperationSide /*Side*/,
 void __fastcall TCustomScpExplorerForm::DoOperationFinished(
   TFileOperation Operation, TOperationSide Side,
   bool /*Temp*/, const AnsiString & FileName, bool Success,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   if (!FAutoOperation)
   {
@@ -953,17 +993,17 @@ void __fastcall TCustomScpExplorerForm::DoOperationFinished(
 
   if (FProgressForm)
   {
-    DisconnectWhenComplete = FProgressForm->DisconnectWhenComplete;
+    OnceDoneOperation = FProgressForm->OnceDoneOperation;
   }
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::OperationFinished(
   TFileOperation Operation, TOperationSide Side,
   bool Temp, const AnsiString & FileName, Boolean Success,
-  bool & DisconnectWhenComplete)
+  TOnceDoneOperation & OnceDoneOperation)
 {
   DoOperationFinished(Operation, Side, Temp, FileName, Success,
-    DisconnectWhenComplete);
+    OnceDoneOperation);
 }
 //---------------------------------------------------------------------------
 TCustomDirView * __fastcall TCustomScpExplorerForm::DirView(TOperationSide Side)
@@ -1037,7 +1077,7 @@ TTBXPopupMenu * __fastcall TCustomScpExplorerForm::HistoryMenu(
   {
     // In Pascal the size of TTBXPopupMenu is 132, in C++ 136,
     // operator new allocates memory in Pascal code, but calls inline
-    // contructor in C++, leading in problems, the funtion does
+    // contructor in C++, leading in problems, the function does
     // both in Pascal code
     FHistoryMenu[Side == osLocal][Back] = CreateTBXPopupMenu(this);
     UpdateHistoryMenu(Side, Back);
@@ -1060,6 +1100,25 @@ bool __fastcall TCustomScpExplorerForm::CustomCommandRemoteAllowed()
   return (FTerminal->IsCapable[fcSecondaryShell] || FTerminal->IsCapable[fcShellAnyCommand]);
 }
 //---------------------------------------------------------------------------
+int __fastcall TCustomScpExplorerForm::BothCustomCommandState(const AnsiString & Description)
+{
+  AnsiString Command = WinConfiguration->CustomCommands->Values[Description];
+  int Params = WinConfiguration->CustomCommands->Params[Description];
+
+  bool Result = FLAGSET(Params, ccLocal);
+  if (Result)
+  {
+    TLocalCustomCommand LocalCustomCommand;
+    TInteractiveCustomCommand InteractiveCustomCommand(&LocalCustomCommand);
+    AnsiString Cmd = InteractiveCustomCommand.Complete(Command, false);
+
+    Result =
+      LocalCustomCommand.IsFileCommand(Cmd) &&
+      LocalCustomCommand.HasLocalFileName(Cmd);
+  }
+  return Result ? 1 : -1;
+}
+//---------------------------------------------------------------------------
 int __fastcall TCustomScpExplorerForm::CustomCommandState(
   const AnsiString & Command, int Params, bool OnFocused)
 {
@@ -1125,7 +1184,7 @@ int __fastcall TCustomScpExplorerForm::CustomCommandState(
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::CustomCommand(TStrings * FileList,
-  AnsiString Name, AnsiString Command, int Params)
+  AnsiString Name, AnsiString Command, int Params, TStrings * ALocalFileList)
 {
   if (FLAGCLEAR(Params, ccLocal))
   {
@@ -1202,10 +1261,16 @@ void __fastcall TCustomScpExplorerForm::CustomCommand(TStrings * FileList,
 
         if (LocalFileCommand)
         {
-          assert(HasDirView[osLocal]);
-          assert(EnableSelectedOperation[osLocal]);
-
-          LocalFileList = DirView(osLocal)->CreateFileList(false, true, NULL);
+          if (ALocalFileList == NULL)
+          {
+            assert(HasDirView[osLocal]);
+            assert(EnableSelectedOperation[osLocal]);
+            LocalFileList = DirView(osLocal)->CreateFileList(false, true, NULL);
+          }
+          else
+          {
+            LocalFileList = ALocalFileList;
+          }
 
           if (FileListCommand)
           {
@@ -1337,12 +1402,64 @@ void __fastcall TCustomScpExplorerForm::CustomCommand(TStrings * FileList,
       __finally
       {
         delete RemoteFileList;
-        delete LocalFileList;
+        if (LocalFileList != ALocalFileList)
+        {
+          delete LocalFileList;
+        }
       }
     }
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::BothCustomCommand(
+  AnsiString Name, AnsiString Command, int Params)
+{
+  assert(FCustomCommandLocalFileList != NULL);
+  assert(FCustomCommandRemoteFileList != NULL);
+  assert(FCustomCommandLocalFileList->Count == FCustomCommandRemoteFileList->Count);
+
+  TStrings * LocalFileList = new TStringList();
+  TStrings * RemoteFileList = new TStringList();
+  try
+  {
+    for (int Index = 0; Index < FCustomCommandLocalFileList->Count; Index++)
+    {
+      LocalFileList->Clear();
+      LocalFileList->AddObject(
+        FCustomCommandLocalFileList->Strings[Index],
+        FCustomCommandLocalFileList->Objects[Index]);
+      RemoteFileList->Clear();
+      RemoteFileList->AddObject(
+        FCustomCommandRemoteFileList->Strings[Index],
+        FCustomCommandRemoteFileList->Objects[Index]);
+
+      CustomCommand(RemoteFileList, Name, Command, Params, LocalFileList);
+    }
+  }
+  __finally
+  {
+    delete LocalFileList;
+    delete RemoteFileList;
+  }
+}
+//---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::CustomCommandMenu(
+  TObject * Sender, const TPoint & MousePos,
+  TStrings * LocalFileList, TStrings * RemoteFileList)
+{
+  FCustomCommandMenu->Items->Clear();
+  delete FCustomCommandLocalFileList;
+  delete FCustomCommandRemoteFileList;
+  // takeover ownership,
+  // the lists must survive the MenuPopup as OnClick occurs only after it exits
+  FCustomCommandLocalFileList = LocalFileList;
+  FCustomCommandRemoteFileList = RemoteFileList;
+
+  NonVisualDataModule->CreateCustomCommandsMenu(FCustomCommandMenu->Items, false, false, true);
+
+  MenuPopup(FCustomCommandMenu, MousePos, dynamic_cast<TComponent *>(Sender));
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::TerminalCaptureLog(
   const AnsiString & AddedLine, bool /*StdError*/)
 {
@@ -1581,7 +1698,7 @@ void __fastcall TCustomScpExplorerForm::ExecuteFileOperation(TFileOperation Oper
 
       RemoteDirView->SaveSelectedNames();
       TCustomCommandParam * AParam = static_cast<TCustomCommandParam*>(Param);
-      CustomCommand(FileList, AParam->Name, AParam->Command, AParam->Params);
+      CustomCommand(FileList, AParam->Name, AParam->Command, AParam->Params, NULL);
     }
     else if ((Operation == foRemoteMove) || (Operation == foRemoteCopy))
     {
@@ -1883,7 +2000,6 @@ void __fastcall TCustomScpExplorerForm::TemporarilyDownloadFiles(
   // do not forget to add additional options to ExecutedFileChanged, FAR and SS
   CopyParam.FileNameCase = ncNoChange;
   CopyParam.PreserveReadOnly = false;
-  CopyParam.ResumeSupport = rsOff;
   CopyParam.ReplaceInvalidChars = true;
   CopyParam.FileMask = "";
   if (AllFiles)
@@ -2081,7 +2197,6 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(const AnsiString Fil
     // do not forget to add additional options to TemporarilyDownloadFiles, FAR and SS
     CopyParam.FileNameCase = ncNoChange;
     CopyParam.PreserveRights = false;
-    CopyParam.ResumeSupport = rsOff;
     // so i do not need to worry if masking algorithm works in all cases
     // ("" means "copy file name", no masking is actually done)
     if (ExtractFileName(FileName) == Data.OriginalFileName)
@@ -2620,8 +2735,8 @@ void __fastcall TCustomScpExplorerForm::SetProperties(TOperationSide Side, TStri
           }
         }
 
-        // if we haven't collected tokens for all file sin current directory,
-        // make sure we collect all at elast for all selected files.
+        // if we haven't collected tokens for all files in current directory,
+        // make sure we collect them at least for all selected files.
         // (note that so far the files in FileList has to be from current direcotry)
         if (Count < Files->Count)
         {
@@ -3344,6 +3459,15 @@ void __fastcall TCustomScpExplorerForm::DoSynchronize(
         PParams |= TTerminal::spNoRecurse | TTerminal::spUseCache |
           TTerminal::spDelayProgress | TTerminal::spSubDirs;
       }
+      else
+      {
+        // if keepuptodate is non-recursive,
+        // full sync before has to be non-recursive as well
+        if (FLAGCLEAR(Params.Options, soRecurse))
+        {
+          PParams |= TTerminal::spNoRecurse;
+        }
+      }
       Synchronize(LocalDirectory, RemoteDirectory, smRemote, CopyParam,
         PParams, Checklist, Options);
     }
@@ -3541,7 +3665,7 @@ bool __fastcall TCustomScpExplorerForm::DoFullSynchronizeDirectories(
       }
       else if (FLAGCLEAR(Params, spPreviewChanges) ||
                DoSynchronizeChecklistDialog(Checklist, Mode, Params,
-                 LocalDirectory, RemoteDirectory))
+                 LocalDirectory, RemoteDirectory, CustomCommandMenu))
       {
         assert(!FAutoOperation);
         void * BatchStorage;
@@ -4680,7 +4804,7 @@ void __fastcall TCustomScpExplorerForm::RemoteFileControlDDEnd(TObject * Sender)
 
   if (!FDragDropSshTerminate.IsEmpty())
   {
-    throw ESshTerminate(NULL, FDragDropSshTerminate);
+    throw ESshTerminate(NULL, FDragDropSshTerminate, FDragDropOnceDoneOperation);
   }
 }
 //---------------------------------------------------------------------------
@@ -5027,7 +5151,7 @@ bool __fastcall TCustomScpExplorerForm::AllowQueueOperation(
     case qoGoTo:
       return ComponentVisible[fcQueueView];
 
-    case qoDisconnectOnceEmpty:
+    case qoOnceEmpty:
       return !FQueueController->Empty;
 
     default:
@@ -5300,6 +5424,7 @@ void __fastcall TCustomScpExplorerForm::RemoteFileControlDDDragDetect(
   FDragTempDir = WinConfiguration->TemporaryDir();
   FDDTotalSize = 0;
   FDragDropSshTerminate = "";
+  FDragDropOnceDoneOperation = odoIdle;
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::RemoteFileControlDDQueryContinueDrag(
@@ -5320,11 +5445,12 @@ void __fastcall TCustomScpExplorerForm::RemoteFileControlDDQueryContinueDrag(
         assert(E.MoreMessages == NULL); // not supported
         assert(!E.Message.IsEmpty());
         FDragDropSshTerminate = E.Message;
+        FDragDropOnceDoneOperation = E.Operation;
       }
     }
     catch (Exception &E)
     {
-      // If downloading fails we need to cancel drag&drop, othwerwise
+      // If downloading fails we need to cancel drag&drop, otherwise
       // Explorer shows error
       // But by the way exception probably never reach this point as
       // it's catched on way
@@ -6240,22 +6366,25 @@ bool __fastcall TCustomScpExplorerForm::MainWindowHook(TMessage & AMessage)
 void __fastcall TCustomScpExplorerForm::DirViewEditing(
   TObject * Sender, TListItem * /*Item*/, bool & /*AllowEdit*/)
 {
-  TCustomDirView * DirView = dynamic_cast<TCustomDirView *>(Sender);
-  assert(DirView != NULL);
-  HWND Edit = ListView_GetEditControl(DirView->Handle);
-  // OnEditing is called also from TCustomListView::CanEdit
-  if (Edit != NULL)
+  if (!WinConfiguration->RenameWholeName)
   {
-    AnsiString Text;
-    Text.SetLength(GetWindowTextLength(Edit) + 1);
-    GetWindowText(Edit, Text.c_str(), Text.Length());
-
-    int P = Text.LastDelimiter(".");
-    if (P > 0)
+    TCustomDirView * DirView = dynamic_cast<TCustomDirView *>(Sender);
+    assert(DirView != NULL);
+    HWND Edit = ListView_GetEditControl(DirView->Handle);
+    // OnEditing is called also from TCustomListView::CanEdit
+    if (Edit != NULL)
     {
-      // SendMessage does not work, edit control is probably not fully
-      // initialized yet atm
-      PostMessage(Edit, EM_SETSEL, 0, P - 1);
+      AnsiString Text;
+      Text.SetLength(GetWindowTextLength(Edit) + 1);
+      GetWindowText(Edit, Text.c_str(), Text.Length());
+
+      int P = Text.LastDelimiter(".");
+      if (P > 0)
+      {
+        // SendMessage does not work, edit control is probably not fully
+        // initialized yet atm
+        PostMessage(Edit, EM_SETSEL, 0, P - 1);
+      }
     }
   }
 }

+ 15 - 2
forms/CustomScpExplorer.dfm

@@ -232,8 +232,21 @@ object CustomScpExplorerForm: TCustomScpExplorerForm
         end
         object TBXSeparatorItem202: TTBXSeparatorItem
         end
-        object TBXItem210: TTBXItem
-          Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+        object TBXSubmenuItem27: TTBXSubmenuItem
+          Action = NonVisualDataModule.QueueCycleOnceEmptyAction
+          DropdownCombo = True
+          object TBXItem211: TTBXItem
+            Action = NonVisualDataModule.QueueIdleOnceEmptyAction
+            RadioItem = True
+          end
+          object TBXItem225: TTBXItem
+            Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+            RadioItem = True
+          end
+          object TBXItem226: TTBXItem
+            Action = NonVisualDataModule.QueueShutDownOnceEmptyAction
+            RadioItem = True
+          end
         end
         object TBXItem208: TTBXItem
           Action = NonVisualDataModule.QueuePreferencesAction

+ 19 - 4
forms/CustomScpExplorer.h

@@ -54,6 +54,7 @@ struct TCustomCommandParam
   AnsiString Name;
   AnsiString Command;
   int Params;
+  bool Both;
 };
 //---------------------------------------------------------------------------
 class TCustomScpExplorerForm : public TForm
@@ -82,7 +83,10 @@ __published:
   TSplitter *RemotePanelSplitter;
   TTBXItem *TBXItem194;
   TTBXItem *TBXItem195;
-  TTBXItem *TBXItem210;
+  TTBXSubmenuItem *TBXSubmenuItem27;
+  TTBXItem *TBXItem211;
+  TTBXItem *TBXItem225;
+  TTBXItem *TBXItem226;
   void __fastcall RemoteDirViewContextPopup(TObject *Sender,
     const TPoint &MousePos, bool &Handled);
   void __fastcall RemoteDirViewGetSelectFilter(
@@ -182,6 +186,7 @@ private:
   TStrings * FDDFileList;
   __int64 FDDTotalSize;
   AnsiString FDragDropSshTerminate;
+  TOnceDoneOperation FDragDropOnceDoneOperation;
   HINSTANCE FOle32Library;
   HCURSOR FDragMoveCursor;
   AnsiString FDragTempDir;
@@ -206,6 +211,9 @@ private:
   TTrayIcon * FTrayIcon;
   TCustomCommandParam FLastCustomCommand;
   TFileMasks FDirViewMatchMask;
+  TTBXPopupMenu * FCustomCommandMenu;
+  TStrings * FCustomCommandLocalFileList;
+  TStrings * FCustomCommandRemoteFileList;
 
   bool __fastcall GetEnableFocusedOperation(TOperationSide Side, int FilesOnly);
   bool __fastcall GetEnableSelectedOperation(TOperationSide Side, int FilesOnly);
@@ -230,6 +238,9 @@ private:
   void __fastcall ApplicationMinimize(TObject * Sender);
   void __fastcall ApplicationRestore(TObject * Sender);
   bool __fastcall MainWindowHook(TMessage & Message);
+  void __fastcall AddQueueItem(TTransferDirection Direction,
+    TStrings * FileList, const AnsiString TargetDirectory,
+    const TCopyParamType & CopyParam, int Params);
 
 protected:
   TOperationSide FCurrentSide;
@@ -275,7 +286,7 @@ protected:
   virtual void __fastcall FixControlsPlacement();
   void __fastcall SetProperties(TOperationSide Side, TStrings * FileList);
   void __fastcall CustomCommand(TStrings * FileList, AnsiString Name,
-    AnsiString Command, int Params);
+    AnsiString Command, int Params, TStrings * ALocalFileList);
   virtual void __fastcall TerminalChanging();
   virtual void __fastcall TerminalChanged();
   virtual void __fastcall QueueChanged();
@@ -284,7 +295,7 @@ protected:
   virtual void __fastcall UpdateStatusPanelText(TTBXStatusPanel * Panel);
   virtual void __fastcall DoOperationFinished(TFileOperation Operation,
     TOperationSide Side, bool Temp, const AnsiString & FileName, bool Success,
-    bool & DisconnectWhenFinished);
+    TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall DoOpenDirectoryDialog(TOpenDirectoryMode Mode, TOperationSide Side);
   virtual void __fastcall FileOperationProgress(
     TFileOperationProgressType & ProgressData, TCancelStatus & Cancel);
@@ -387,6 +398,8 @@ protected:
   virtual void __fastcall GetTransferPresetAutoSelectData(TCopyParamRuleData & Data);
   int __fastcall CustomCommandState(const AnsiString & Command, int Params, bool OnFocused);
   inline bool __fastcall CustomCommandRemoteAllowed();
+  void __fastcall CustomCommandMenu(TObject * Sender, const TPoint & MousePos,
+    TStrings * LocalFileList, TStrings * RemoteFileList);
   void __fastcall LoadToolbarsLayoutStr(AnsiString LayoutStr);
   AnsiString __fastcall GetToolbarsLayoutStr();
   virtual void __fastcall Dispatch(void * Message);
@@ -438,9 +451,11 @@ public:
   virtual void __fastcall ChangePath(TOperationSide Side) = 0;
   virtual void __fastcall StoreParams();
   int __fastcall CustomCommandState(const AnsiString & Description, bool OnFocused);
+  int __fastcall BothCustomCommandState(const AnsiString & Description);
   bool __fastcall GetLastCustomCommand(bool OnFocused,
     TCustomCommandParam & CustomCommand, int & State);
   void __fastcall LastCustomCommand(bool OnFocused);
+  void __fastcall BothCustomCommand(AnsiString Name, AnsiString Command, int Params);
   void __fastcall LockWindow();
   void __fastcall UnlockWindow();
 
@@ -482,7 +497,7 @@ public:
     AnsiString HelpKeyword, const TMessageParams * Params = NULL,
     TTerminal * Terminal = NULL);
   void __fastcall OperationFinished(TFileOperation Operation, TOperationSide Side,
-    bool Temp, const AnsiString & FileName, bool Success, bool & DisconnectWhenFinished);
+    bool Temp, const AnsiString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
   void __fastcall OperationProgress(TFileOperationProgressType & ProgressData, TCancelStatus & Cancel);
   void __fastcall ShowExtendedException(TTerminal * Terminal, Exception * E);
   void __fastcall InactiveTerminalException(TTerminal * Terminal, Exception * E);

+ 2 - 2
forms/EditorPreferences.cpp

@@ -73,8 +73,8 @@ void __fastcall TEditorPreferencesDialog::Init(TEditorPreferencesMode Mode, bool
     Shift = ExternalEditorEdit->Top - MaskEdit->Top;
     ExternalEditorEdit->Top = MaskEdit->Top;
     ExternalEditorBrowseButton->Top = ExternalEditorBrowseButton->Top - Shift;
-    EditorGroup2->Height =
-      EditorGroup2->Height - Shift - (EditorExternalButton->Top - EditorInternalButton->Top);
+    Shift += (EditorExternalButton->Top - EditorInternalButton->Top);
+    EditorGroup2->Height = EditorGroup2->Height - Shift;
     TLabel * ExternalEditorLabel = new TLabel(this);
     ExternalEditorLabel->Caption = EditorExternalButton->Caption;
     ExternalEditorLabel->Parent = EditorGroup2;

+ 11 - 18
forms/FullSynchronize.cpp

@@ -87,22 +87,19 @@ void __fastcall TFullSynchronizeDialog::UpdateControls()
   }
   if (SynchronizeBothButton->Checked)
   {
+    SynchronizeByTimeCheck->Checked = true;
     SynchronizeBySizeCheck->Checked = false;
     if (MirrorFilesButton->Checked)
     {
       SynchronizeFilesButton->Checked = true;
     }
   }
-  if (MirrorFilesButton->Checked)
-  {
-    SynchronizeByTimeCheck->Checked = true;
-  }
   EnableControl(MirrorFilesButton, !SynchronizeBothButton->Checked);
   EnableControl(SynchronizeDeleteCheck, !SynchronizeBothButton->Checked &&
     !SynchronizeTimestampsButton->Checked);
   EnableControl(SynchronizeExistingOnlyCheck, !SynchronizeTimestampsButton->Checked);
   EnableControl(SynchronizeByTimeCheck, !SynchronizeBothButton->Checked &&
-    !SynchronizeTimestampsButton->Checked && !MirrorFilesButton->Checked);
+    !SynchronizeTimestampsButton->Checked);
   EnableControl(SynchronizeBySizeCheck, !SynchronizeBothButton->Checked);
   EnableControl(SynchronizeSelectedOnlyCheck, FLAGSET(FOptions, fsoAllowSelectedOnly));
 
@@ -145,7 +142,9 @@ int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
         break;
     }
   }
-  return Result | cpaNoPreserveTime;
+  return
+    Result |
+    FLAGMASK(SynchronizeByTimeCheck->Checked, cpaNoPreserveTime);
 }
 //---------------------------------------------------------------------------
 void __fastcall TFullSynchronizeDialog::ControlChange(TObject * /*Sender*/)
@@ -356,21 +355,15 @@ void __fastcall TFullSynchronizeDialog::FormCloseQuery(TObject * /*Sender*/,
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TFullSynchronizeDialog::SynchronizeByTimeSizeCheckClick(
-  TObject * Sender)
-{
-  if (!dynamic_cast<TCheckBox*>(Sender)->Checked)
-  {
-    (Sender == SynchronizeByTimeCheck ? SynchronizeBySizeCheck : SynchronizeByTimeCheck)->
-      Checked = true;
-  }
-  UpdateControls();
-}
-//---------------------------------------------------------------------------
 TCopyParamType __fastcall TFullSynchronizeDialog::GetCopyParams()
 {
   TCopyParamType Result = FCopyParams;
-  Result.PreserveTime = true;
+  // when synchronizing by time, we force preserving time,
+  // otherwise it does not make any sense
+  if (FLAGCLEAR(Params, spNotByTime))
+  {
+    Result.PreserveTime = true;
+  }
   return Result;
 }
 //---------------------------------------------------------------------------

+ 2 - 2
forms/FullSynchronize.dfm

@@ -215,7 +215,7 @@ object FullSynchronizeDialog: TFullSynchronizeDialog
       Height = 17
       Caption = 'M&odification time'
       TabOrder = 0
-      OnClick = SynchronizeByTimeSizeCheckClick
+      OnClick = ControlChange
     end
     object SynchronizeBySizeCheck: TCheckBox
       Left = 11
@@ -224,7 +224,7 @@ object FullSynchronizeDialog: TFullSynchronizeDialog
       Height = 17
       Caption = 'File si&ze'
       TabOrder = 1
-      OnClick = SynchronizeByTimeSizeCheckClick
+      OnClick = ControlChange
     end
   end
   object SaveSettingsCheck: TCheckBox

+ 0 - 1
forms/FullSynchronize.h

@@ -48,7 +48,6 @@ __published:
   void __fastcall TransferSettingsButtonClick(TObject *Sender);
   void __fastcall FormShow(TObject *Sender);
   void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
-  void __fastcall SynchronizeByTimeSizeCheckClick(TObject *Sender);
   void __fastcall CopyParamGroupContextPopup(TObject *Sender,
           TPoint &MousePos, bool &Handled);
   void __fastcall CopyParamGroupDblClick(TObject *Sender);

+ 177 - 46
forms/Glyphs.dfm

@@ -8,8 +8,8 @@ object GlyphsModule: TGlyphsModule
     Left = 32
     Top = 16
     Bitmap = {
-      494C01015D005E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
-      0000000000003600000028000000400000008001000001002000000000000080
+      494C01015F006300040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000009001000001002000000000000090
       0100000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
@@ -26,105 +26,66 @@ object GlyphsModule: TGlyphsModule
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600CCCCCC00CCCCCC00CCCC
-      CC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCC
-      CC00CCCCCC00CCCCCC00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF0000000000000000000000000000000000FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF0086868600FFFFCC00FFFFCC00FFFF9900FFCC330000000000FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF0086868600FFFFCC00FFFFCC00FFFFCC00FFFF9900FFFF9900FFCC33000000
-      0000FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF008686
-      8600FFFFCC00FFFFFF00FFFFFF00FFFFCC00FFFF9900FFFF9900FFFF9900FFCC
-      330000000000FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00868686008686
-      8600868686008686860086868600868686008686860086868600868686008686
-      86008686860086868600CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
-      FF00FFFFFF00FFFFFF00CCCCCC00000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000008000000080000000800000008000
-      0000800000008000000080000000800000008000000080000000800000008000
-      0000800000008000000080000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000FF000000FF993300FF663300FF66
-      3300FF663300FF663300FF663300FF663300FF663300FF663300FF663300FF66
-      3300FF663300FF663300FF663300000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000FF000000FF000000FF000000FF00
-      0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
-      0000FF000000FF000000FF000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
@@ -163,6 +124,173 @@ object GlyphsModule: TGlyphsModule
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008484840084848400848484008484
+      8400848484008484840084848400848484008484840084848400000000000000
+      0000000000000000000000000000000000008484840084848400848484008484
+      8400848484008484840084848400848484008484840084848400000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000C0C0C000C0C0C000C0C0C000C0C0
+      C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C00084848400000000000000
+      000000000000000000000000000000000000C0C0C000C0C0C000C0C0C000C0C0
+      C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C00084848400000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600CCCCCC00CCCCCC00CCCC
+      CC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCCCC00CCCC
+      CC00CCCCCC00CCCCCC00CCCCCC0000000000C0C0C0009CFFFF00848484008484
+      840084848400848484008484840084848400C0C0C00084848400848484008484
+      840084848400000000000000000000000000C0C0C0009CFFFF00848484008484
+      840084848400848484008484840084848400C0C0C00084848400848484008484
+      8400848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000000000000000000000000000000FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF009CFFFF009CFF
+      FF00FFFFFF009CFFFF00FFFFFF009CFFFF00C0C0C00084848400C0C0C000C0C0
+      C00084848400000000000000000000000000C0C0C000FFFFFF009CFFFF009CFF
+      FF00FFFFFF009CFFFF00FFFFFF009CFFFF00C0C0C00084848400C0C0C000C0C0
+      C000848484000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF00848484008484
+      840084848400848484008484840084848400C0C0C00084848400FFFFFF00C0C0
+      C00084848400848484008484840084848400C0C0C000FFFFFF00848484008484
+      840084848400848484008484840084848400C0C0C00084848400FFFFFF00C0C0
+      C000848484008484840084848400848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF009CFFFF009CFF
+      FF00FFFFFF009CFFFF00FFFFFF00FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400C0C0C000C0C0C00084848400C0C0C000FFFFFF009CFFFF009CFF
+      FF00FFFFFF009CFFFF00FFFFFF00FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400C0C0C000C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0086868600FFFFCC00FFCC330000000000FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF00848484008484
+      8400848484008484840084848400FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C00084848400C0C0C000FFFFFF00848484008484
+      8400848484008484840084848400FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF0086868600FFFFCC00FFFFCC00FFFF9900FFCC330000000000FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C00084848400C0C0C000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0C0C00084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF0086868600FFFFCC00FFFFCC00FFFFCC00FFFF9900FFFF9900FFCC33000000
+      0000FFFFFF00FFFFFF00CCCCCC0000000000C0C0C000FFFFFF00848484008484
+      8400848484009CFFFF0084848400848484008484840084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C00084848400C0C0C000FFFFFF00848484008484
+      8400848484009CFFFF0084848400848484008484840084848400FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF008686
+      8600FFFFCC00FFFFFF00FFFFFF00FFFFCC00FFFF9900FFFF9900FFFF9900FFCC
+      330000000000FFFFFF00CCCCCC0000000000C0C0C000FFFFFF000000FF000000
+      9C0000009C0000009C00C0C0C000FFFFFF0084848400FFFFFF00FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C00084848400C0C0C000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00C0C0C000FFFFFF0084848400FFFFFF00FFFFFF00C0C0
+      C00084848400FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00868686008686
+      8600868686008686860086868600868686008686860086868600868686008686
+      86008686860086868600CCCCCC0000000000C0C0C0000000FF0000009C00FFFF
+      FF00FFFFFF000000FF0000009C0084848400FFFFFF0084848400848484008484
+      840084848400FFFFFF00C0C0C00084848400C0C0C000FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00C0C0C00084848400FFFFFF0084848400848484008484
+      840084848400FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000086868600FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00CCCCCC00000000000000FF0000009C00C0C0C000C0C0
+      C000C0C0C000C0C0C0000000FF0000009C00FFFFFF00C0C0C000FFFFFF008484
+      8400FFFFFF00FFFFFF00C0C0C00084848400C0C0C000C0C0C000C0C0C000C0C0
+      C000C0C0C000C0C0C000C0C0C000C0C0C000FFFFFF00C0C0C000FFFFFF008484
+      8400FFFFFF00FFFFFF00C0C0C000848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008000000080000000800000008000
+      0000800000008000000080000000800000008000000080000000800000008000
+      0000800000008000000080000000000000000000FF0000009C00000000000000
+      FF0000009C00FFFFFF000000FF0000009C00FFFFFF00C0C0C00084848400FFFF
+      FF0084848400848484008484840084848400000000000000000000000000C0C0
+      C000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0C0C00084848400FFFF
+      FF00848484008484840084848400848484000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FF000000FF993300FF663300FF66
+      3300FF663300FF663300FF663300FF663300FF663300FF663300FF663300FF66
+      3300FF663300FF663300FF663300000000000000FF0000009C00000000000000
+      FF0000009C00C0C0C0000000FF0000009C00C0C0C000C0C0C000FFFFFF00FFFF
+      FF00C0C0C000FFFFFF008484840000000000000000000000000000000000C0C0
+      C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000FFFFFF00FFFF
+      FF00C0C0C000FFFFFF0084848400000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FF000000FF000000FF000000FF00
+      0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+      0000FF000000FF000000FF00000000000000000000000000FF0000009C000000
+      FF0000009C000000FF0000009C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00C0C0C0008484840000000000000000000000000000000000000000000000
+      00000000000000000000C0C0C000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00C0C0C0008484840000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      FF0000009C0000000000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
+      C000C0C0C0000000000000000000000000000000000000000000000000000000
+      00000000000000000000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
+      C000C0C0C0000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
       000000000000000000000000000000000000CC330000CC330000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000008000000080000000000000000000000000000000000000000000
@@ -3083,12 +3211,16 @@ object GlyphsModule: TGlyphsModule
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       000000000000000000000000000000000000424D3E000000000000003E000000
-      2800000040000000800100000100010000000000000C00000000000000000000
-      000000000000000000000000FFFFFF00FFFF0000000000000000000000000000
+      2800000040000000900100000100010000000000800C00000000000000000000
+      000000000000000000000000FFFFFF0000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000FFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      00000000000000000000000000000000FFFF003F003F00000000003F003F0000
+      0000000700070000000000070007000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000002000E000000000002001E0010000
+      00008003FC030000FFFFE407FC070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
       FFFFFFFFFEABE000FF3FF9FFEFFFE000FF1FF1FFC67FE000910FE113AA3F8000
       9107C113EA1F800091038113E60F80009107C113CE078000910FE113AF038000
       FF1FF1FFAB038000FF3FF9FFC7878003FFFFFFFFEF8F8003FFFFFFFFFFFF8003
@@ -3180,8 +3312,7 @@ object GlyphsModule: TGlyphsModule
       FC01FC018FFFEBFFFC01FC0187F7FFFF00015401C7EFEA7F0001A801E3CFFE3F
       00015401F19FEA1F0001A801F83FFE0F00035403FC7FFE070007A807F83FFF03
       000F500FF19FFF0300F7AAF7C3CFFF8701E355E387E7FF8F03C1ABC18FFBFFFF
-      FEF7FEF7FFFFFFFFFF0FFF0FFFFFFFFF00000000000000000000000000000000
-      000000000000}
+      FEF7FEF7FFFFFFFFFF0FFF0FFFFFFFFF}
   end
   object SessionImages: TImageList
     Left = 32

+ 2 - 0
forms/LogSettings.cpp

@@ -106,6 +106,8 @@ void __fastcall TLoggingFrame::UpdateControls()
     EnableControl(LogToFileCheck, True);
     EnableControl(LogFileNameEdit2, LogToFileCheck->Checked);
     EnableControl(LogFileNameHintText, LogFileNameEdit2->Enabled);
+    EnableControl(LogFileAppendButton, LogFileNameEdit2->Enabled && LoggingOnButton->Checked);
+    EnableControl(LogFileOverwriteButton, LogFileNameEdit2->Enabled && LoggingOnButton->Checked);
     EnableControl(LogFilePanel, LogToFileCheck->Checked);
 
     EnableControl(LogShowWindowCheck, True && EnableLogWindow);

+ 3 - 3
forms/Login.dfm

@@ -99,7 +99,7 @@ object LoginDialog: TLoginDialog
       Width = 361
       Height = 296
       HelpType = htKeyword
-      ActivePage = BasicSheet
+      ActivePage = DirectoriesSheet
       Align = alClient
       MultiLine = True
       Style = tsButtons
@@ -692,9 +692,9 @@ object LoginDialog: TLoginDialog
           object LocalDirectoryDescLabel: TLabel
             Left = 12
             Top = 126
-            Width = 251
+            Width = 233
             Height = 13
-            Caption = 'Local directory is not used with explorer-like interface.'
+            Caption = 'Local directory is not used with Explorer interface.'
           end
           object LocalDirectoryEdit: TDirectoryEdit
             Left = 12

+ 131 - 17
forms/NonVisual.cpp

@@ -431,7 +431,12 @@ void __fastcall TNonVisualDataModule::ExplorerActionsUpdate(
   QUEUEACTION(HideWhenEmpty)
   QUEUEACTION(Hide)
   #undef QUEUEACTION
-  UPD(QueueDisconnectOnceEmptyAction, ScpExplorer->AllowQueueOperation(qoDisconnectOnceEmpty))
+  UPDACT(QueueCycleOnceEmptyAction,
+    QueueCycleOnceEmptyAction->ImageIndex = CurrentQueueOnceEmptyAction()->ImageIndex;
+    QueueCycleOnceEmptyAction->Checked = !QueueIdleOnceEmptyAction->Checked)
+  UPD(QueueIdleOnceEmptyAction, ScpExplorer->AllowQueueOperation(qoOnceEmpty))
+  UPD(QueueDisconnectOnceEmptyAction, ScpExplorer->AllowQueueOperation(qoOnceEmpty))
+  UPD(QueueShutDownOnceEmptyAction, ScpExplorer->AllowQueueOperation(qoOnceEmpty))
   UPDCOMP(CommanderPreferencesBand)
   UPDACT(QueueToolbarAction,
     ((TAction *)Action)->Enabled = ScpExplorer->ComponentVisible[fcQueueView];
@@ -696,7 +701,10 @@ void __fastcall TNonVisualDataModule::ExplorerActionsExecute(
     QUEUEACTION(HideWhenEmpty)
     QUEUEACTION(Hide)
     #undef QUEUEACTION
-    EXE(QueueDisconnectOnceEmptyAction, )
+    EXE(QueueCycleOnceEmptyAction, CycleQueueOnceEmptyAction());
+    EXE(QueueIdleOnceEmptyAction, SetQueueOnceEmptyAction(QueueIdleOnceEmptyAction))
+    EXE(QueueDisconnectOnceEmptyAction, SetQueueOnceEmptyAction(QueueDisconnectOnceEmptyAction))
+    EXE(QueueShutDownOnceEmptyAction, SetQueueOnceEmptyAction(QueueShutDownOnceEmptyAction))
     EXECOMP(QueueToolbar);
     EXE(QueueItemSpeedAction, )
     ;
@@ -854,12 +862,21 @@ void __fastcall TNonVisualDataModule::DoIdle()
 }
 //---------------------------------------------------------------------------
 void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu(
-  TTBCustomItem * Menu, bool OnFocused, bool Toolbar)
+  TTBCustomItem * Menu, bool OnFocused, bool Toolbar, bool Both)
 {
   for (int Index = 0; Index < WinConfiguration->CustomCommands->Count; Index++)
   {
     AnsiString Description = WinConfiguration->CustomCommands->Names[Index];
-    int State = ScpExplorer->CustomCommandState(Description, OnFocused);
+    int State;
+
+    if (!Both)
+    {
+      State = ScpExplorer->CustomCommandState(Description, OnFocused);
+    }
+    else
+    {
+      State = ScpExplorer->BothCustomCommandState(Description);
+    }
 
     if (State >= 0)
     {
@@ -875,6 +892,10 @@ void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu(
       {
         Item->Tag = Item->Tag | 0x0100;
       }
+      if (Both)
+      {
+        Item->Tag = Item->Tag | 0x0200;
+      }
       Item->Hint = FMTLOAD(CUSTOM_COMMAND_HINT, (StripHotkey(Description)));
       Item->OnClick = CustomCommandClick;
 
@@ -883,21 +904,25 @@ void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu(
   }
 
   TTBCustomItem * Item;
-  Item = new TTBXItem(Menu);
-  Item->Action = OnFocused ? CustomCommandsEnterFocusedAction : CustomCommandsEnterAction;
-  Menu->Add(Item);
 
-  Item = new TTBXItem(Menu);
-  Item->Action = OnFocused ? CustomCommandsLastFocusedAction : CustomCommandsLastAction;
-  if (Toolbar)
+  if (!Both)
   {
-    Item->Caption = StripHotkey(LoadStr(CUSTOM_COMMAND_LAST_SHORT));
+    Item = new TTBXItem(Menu);
+    Item->Action = OnFocused ? CustomCommandsEnterFocusedAction : CustomCommandsEnterAction;
+    Menu->Add(Item);
+
+    Item = new TTBXItem(Menu);
+    Item->Action = OnFocused ? CustomCommandsLastFocusedAction : CustomCommandsLastAction;
+    if (Toolbar)
+    {
+      Item->Caption = StripHotkey(LoadStr(CUSTOM_COMMAND_LAST_SHORT));
+    }
+    Menu->Add(Item);
   }
-  Menu->Add(Item);
 
   AddMenuSeparator(Menu);
 
-  if (!Toolbar)
+  if (!Toolbar && !Both)
   {
     Item = new TTBXItem(Menu);
     Item->Action = CustomCommandsBandAction;
@@ -918,7 +943,7 @@ void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu(TAction * Action)
     int PrevCount = Menu->Count;
     bool OnFocused = (Menu == RemoteDirViewCustomCommandsMenu);
 
-    CreateCustomCommandsMenu(Menu, OnFocused, false);
+    CreateCustomCommandsMenu(Menu, OnFocused, false, false);
 
     for (int Index = 0; Index < PrevCount; Index++)
     {
@@ -956,7 +981,7 @@ void __fastcall TNonVisualDataModule::UpdateCustomCommandsToolbar(TTBXToolbar *
     try
     {
       Toolbar->Items->Clear();
-      CreateCustomCommandsMenu(Toolbar->Items, false, true);
+      CreateCustomCommandsMenu(Toolbar->Items, false, true, false);
       assert(CustomCommands->Count == (Toolbar->Items->Count - AdditionalCommands));
     }
     __finally
@@ -987,8 +1012,15 @@ void __fastcall TNonVisualDataModule::CustomCommandClick(TObject * Sender)
   Param.Name = WinConfiguration->CustomCommands->Names[Item->Tag & 0x00FF];
   Param.Command = WinConfiguration->CustomCommands->Values[Param.Name];
   Param.Params = WinConfiguration->CustomCommands->Params[Param.Name];
-  ScpExplorer->ExecuteFileOperation(foCustomCommand, osRemote,
-    (Item->Tag & 0xFF00) != 0, false, &Param);
+  if (FLAGCLEAR(Item->Tag, 0x0200))
+  {
+    ScpExplorer->ExecuteFileOperation(foCustomCommand, osRemote,
+      FLAGSET(Item->Tag, 0x0100), false, &Param);
+  }
+  else
+  {
+    ScpExplorer->BothCustomCommand(Param.Name, Param.Command, Param.Params);
+  }
 }
 //---------------------------------------------------------------------------
 void __fastcall TNonVisualDataModule::CreateSessionListMenu(TAction * Action)
@@ -1349,6 +1381,88 @@ void __fastcall TNonVisualDataModule::QueueSpeedComboBoxItemUpdate(TTBXComboBoxI
   Item->Strings = CustomWinConfiguration->History["SpeedLimit"];
 }
 //---------------------------------------------------------------------------
+void __fastcall TNonVisualDataModule::SetQueueOnceEmptyAction(TAction * Action)
+{
+  TAction * Current = CurrentQueueOnceEmptyAction();
+  if (Current != Action)
+  {
+    Current->Checked = false;
+    Action->Checked = true;
+  }
+}
+//---------------------------------------------------------------------------
+void __fastcall TNonVisualDataModule::CycleQueueOnceEmptyAction()
+{
+  TAction * Current = CurrentQueueOnceEmptyAction();
+  Current->Checked = false;
+  if (Current == QueueIdleOnceEmptyAction)
+  {
+    QueueDisconnectOnceEmptyAction->Checked = true;
+  }
+  else if (Current == QueueDisconnectOnceEmptyAction)
+  {
+    QueueShutDownOnceEmptyAction->Checked = true;
+  }
+  else if (Current == QueueShutDownOnceEmptyAction)
+  {
+    QueueIdleOnceEmptyAction->Checked = true;
+  }
+  else
+  {
+    assert(false);
+  }
+}
+//---------------------------------------------------------------------------
+TAction * __fastcall TNonVisualDataModule::CurrentQueueOnceEmptyAction()
+{
+  TAction * Result;
+  if (QueueIdleOnceEmptyAction->Checked)
+  {
+    Result = QueueIdleOnceEmptyAction;
+  }
+  else if (QueueDisconnectOnceEmptyAction->Checked)
+  {
+    Result = QueueDisconnectOnceEmptyAction;
+  }
+  else if (QueueShutDownOnceEmptyAction->Checked)
+  {
+    Result = QueueShutDownOnceEmptyAction;
+  }
+  else
+  {
+    assert(false);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
+TOnceDoneOperation __fastcall TNonVisualDataModule::CurrentQueueOnceEmptyOperation()
+{
+  TOnceDoneOperation Result;
+  TBasicAction * Current = CurrentQueueOnceEmptyAction();
+  if (Current == QueueIdleOnceEmptyAction)
+  {
+    Result = odoIdle;
+  }
+  else if (Current == QueueDisconnectOnceEmptyAction)
+  {
+    Result = odoDisconnect;
+  }
+  else if (Current == QueueShutDownOnceEmptyAction)
+  {
+    Result = odoShutDown;
+  }
+  else
+  {
+    assert(false);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TNonVisualDataModule::ResetQueueOnceEmptyOperation()
+{
+  SetQueueOnceEmptyAction(QueueIdleOnceEmptyAction);
+}
+//---------------------------------------------------------------------------
 void __fastcall TNonVisualDataModule::InitMenuItem(TTBCustomItem * Item)
 {
   TTBSeparatorItem * Separator = dynamic_cast<TTBSeparatorItem *>(Item);

+ 42 - 5
forms/NonVisual.dfm

@@ -1756,8 +1756,7 @@ object NonVisualDataModule: TNonVisualDataModule
     object QueueDisconnectOnceEmptyAction: TAction
       Tag = 12
       Category = 'Queue'
-      AutoCheck = True
-      Caption = '&Disconnect Once Empty'
+      Caption = '&Disconnect'
       HelpKeyword = 'ui_queue'
       Hint = 'Disconnect the session once the queue is empty'
       ImageIndex = 87
@@ -1786,6 +1785,31 @@ object NonVisualDataModule: TNonVisualDataModule
       Hint = 'Create directory|Create new directory'
       ImageIndex = 5
     end
+    object QueueShutDownOnceEmptyAction: TAction
+      Tag = 12
+      Category = 'Queue'
+      Caption = '&Shut Down'
+      HelpKeyword = 'ui_queue'
+      Hint = 'Shut down the computer once the queue is empty'
+      ImageIndex = 93
+    end
+    object QueueIdleOnceEmptyAction: TAction
+      Tag = 12
+      Category = 'Queue'
+      Caption = '&Stay Idle'
+      Checked = True
+      HelpKeyword = 'ui_queue'
+      Hint = 'Stay idle once the queue is empty'
+      ImageIndex = 94
+    end
+    object QueueCycleOnceEmptyAction: TAction
+      Tag = 12
+      Category = 'Queue'
+      Caption = 'Once &Empty'
+      HelpKeyword = 'ui_queue'
+      Hint = 'Toggle action to perform once the queue list is empty'
+      ImageIndex = 94
+    end
     object QueueItemSpeedAction: TTBEditAction
       Tag = 12
       Category = 'Queue'
@@ -2214,6 +2238,22 @@ object NonVisualDataModule: TNonVisualDataModule
         Action = QueueResumeAllAction
       end
     end
+    object TBXSubmenuItem3: TTBXSubmenuItem
+      Action = QueueCycleOnceEmptyAction
+      DropdownCombo = True
+      object TBXItem28: TTBXItem
+        Action = QueueIdleOnceEmptyAction
+        RadioItem = True
+      end
+      object TBXItem13: TTBXItem
+        Action = QueueDisconnectOnceEmptyAction
+        RadioItem = True
+      end
+      object TBXItem29: TTBXItem
+        Action = QueueShutDownOnceEmptyAction
+        RadioItem = True
+      end
+    end
     object Queue2: TTBXSubmenuItem
       Caption = '&Options'
       HelpKeyword = 'ui_queue'
@@ -2237,9 +2277,6 @@ object NonVisualDataModule: TNonVisualDataModule
       end
       object N65: TTBXSeparatorItem
       end
-      object TBXItem13: TTBXItem
-        Action = QueueDisconnectOnceEmptyAction
-      end
       object Customize3: TTBXItem
         Action = QueuePreferencesAction
       end

+ 13 - 2
forms/NonVisual.h

@@ -490,6 +490,12 @@ __published:    // IDE-managed Components
   TAction *RemoteFilterAction;
   TTBXItem *TBXItem26;
   TTBXItem *TBXItem27;
+  TAction *QueueShutDownOnceEmptyAction;
+  TAction *QueueIdleOnceEmptyAction;
+  TTBXSubmenuItem *TBXSubmenuItem3;
+  TTBXItem *TBXItem28;
+  TTBXItem *TBXItem29;
+  TAction *QueueCycleOnceEmptyAction;
   void __fastcall LogActionsUpdate(TBasicAction *Action, bool &Handled);
   void __fastcall LogActionsExecute(TBasicAction *Action, bool &Handled);
   void __fastcall ExplorerActionsUpdate(TBasicAction *Action, bool &Handled);
@@ -510,8 +516,6 @@ protected:
   void __fastcall CreateSessionListMenu(TAction * Action);
   void __fastcall CreateSessionListMenuLevel(TTBCustomItem * Menu, int Index, int Level);
   void __fastcall CreateCustomCommandsMenu(TAction * Action);
-  void __fastcall CreateCustomCommandsMenu(TTBCustomItem * Menu, bool OnFocused,
-    bool Toolbar);
   void __fastcall CreateOpenedSessionListMenu(TAction * Action);
   TCustomDirView * __fastcall DirView(TOperationSide Side) { return ScpExplorer->DirView(Side); }
   void __fastcall SessionItemClick(TObject * Sender);
@@ -527,6 +531,9 @@ protected:
   AnsiString __fastcall QueueItemSpeed(const AnsiString & Text,
     TTBXComboBoxItem * Item);
   void __fastcall InitMenuItem(TTBCustomItem * Item);
+  void __fastcall CycleQueueOnceEmptyAction();
+  void __fastcall SetQueueOnceEmptyAction(TAction * Action);
+  TAction * __fastcall CurrentQueueOnceEmptyAction();
 
 public:
   __fastcall TNonVisualDataModule(TComponent * Owner);
@@ -539,7 +546,11 @@ public:
   void __fastcall UpdateCustomCommandsToolbar(TTBXToolbar * Toolbar);
   void __fastcall QueueSpeedComboBoxItem(TTBXComboBoxItem * Item);
   void __fastcall QueueSpeedComboBoxItemUpdate(TTBXComboBoxItem * Item);
+  void __fastcall CreateCustomCommandsMenu(TTBCustomItem * Menu, bool OnFocused,
+    bool Toolbar, bool Both);
   void __fastcall InitMenus(TComponent * Component);
+  TOnceDoneOperation __fastcall CurrentQueueOnceEmptyOperation();
+  void __fastcall ResetQueueOnceEmptyOperation();
 
   __property TListColumn * ListColumn = { read = FListColumn, write = FListColumn };
   __property TCustomScpExplorerForm * ScpExplorer = { read = FScpExplorer, write = SetScpExplorer };

+ 11 - 2
forms/Preferences.cpp

@@ -54,7 +54,6 @@ __fastcall TPreferencesDialog::TPreferencesDialog(TComponent* AOwner)
 
   FNoUpdate = 0;
   FPreferencesMode = pmDefault;
-  CopyParamsFrame->Direction = pdAll;
   FEditorFont = new TFont();
   FEditorFont->Color = clWindowText;
   // color tends to reset in object inspector
@@ -158,6 +157,7 @@ void __fastcall TPreferencesDialog::LoadConfiguration()
     BOOLPROP(DDTransferConfirmation);
     BOOLPROP(DDWarnLackOfTempSpace);
     BOOLPROP(ShowHiddenFiles);
+    BOOLPROP(RenameWholeName);
     BOOLPROP(ShowInaccesibleDirectories);
     BOOLPROP(CopyOnDoubleClickConfirmation);
     BOOLPROP(ConfirmTransferring);
@@ -215,6 +215,7 @@ void __fastcall TPreferencesDialog::LoadConfiguration()
     SwappedPanelsCheck->Checked =
       WinConfiguration->ScpCommander.SwappedPanels;
     FullRowSelectCheck->Checked = WinConfiguration->ScpCommander.FullRowSelect;
+    TreeOnLeftCheck->Checked = WinConfiguration->ScpCommander.TreeOnLeft;
     ShowFullAddressCheck->Checked =
       WinConfiguration->ScpExplorer.ShowFullAddress;
     RegistryStorageButton->Checked = (Configuration->Storage == stRegistry);
@@ -238,6 +239,7 @@ void __fastcall TPreferencesDialog::LoadConfiguration()
     ResumeOffButton->Checked = GUIConfiguration->DefaultCopyParam.ResumeSupport == rsOff;
     ResumeThresholdEdit->Value = GUIConfiguration->DefaultCopyParam.ResumeThreshold / 1024;
     SessionReopenAutoCheck->Checked = (Configuration->SessionReopenAuto > 0);
+    SessionReopenAutoIdleCheck->Checked = (GUIConfiguration->SessionReopenAutoIdle > 0);
     SessionReopenAutoEdit->Value = (Configuration->SessionReopenAuto > 0 ?
       (Configuration->SessionReopenAuto / 1000): 5);
 
@@ -264,6 +266,7 @@ void __fastcall TPreferencesDialog::LoadConfiguration()
     QueueTransferLimitEdit->AsInteger = GUIConfiguration->QueueTransfersLimit;
     QueueAutoPopupCheck->Checked = GUIConfiguration->QueueAutoPopup;
     QueueCheck->Checked = GUIConfiguration->DefaultCopyParam.Queue;
+    QueueIndividuallyCheck->Checked = GUIConfiguration->DefaultCopyParam.QueueIndividually;
     QueueNoConfirmationCheck->Checked = GUIConfiguration->DefaultCopyParam.QueueNoConfirmation;
     RememberPasswordCheck->Checked = GUIConfiguration->QueueRememberPassword;
     if (WinConfiguration->QueueView.Show == qvShow)
@@ -386,6 +389,7 @@ void __fastcall TPreferencesDialog::SaveConfiguration()
     BOOLPROP(DDTransferConfirmation);
     BOOLPROP(DDWarnLackOfTempSpace);
     BOOLPROP(ShowHiddenFiles);
+    BOOLPROP(RenameWholeName);
     BOOLPROP(ShowInaccesibleDirectories);
     BOOLPROP(CopyOnDoubleClickConfirmation);
     BOOLPROP(ConfirmTransferring);
@@ -439,6 +443,7 @@ void __fastcall TPreferencesDialog::SaveConfiguration()
     ScpCommander.PreserveLocalDirectory = PreserveLocalDirectoryCheck->Checked;
     ScpCommander.SwappedPanels = SwappedPanelsCheck->Checked;
     ScpCommander.FullRowSelect = FullRowSelectCheck->Checked;
+    ScpCommander.TreeOnLeft = TreeOnLeftCheck->Checked;
     WinConfiguration->ScpCommander = ScpCommander;
 
     TScpExplorerConfiguration ScpExplorer = WinConfiguration->ScpExplorer;
@@ -465,6 +470,8 @@ void __fastcall TPreferencesDialog::SaveConfiguration()
 
     Configuration->SessionReopenAuto =
       (SessionReopenAutoCheck->Checked ? (SessionReopenAutoEdit->Value * 1000) : 0);
+    GUIConfiguration->SessionReopenAutoIdle =
+      (SessionReopenAutoIdleCheck->Checked ? (SessionReopenAutoEdit->Value * 1000) : 0);
 
     WinConfiguration->CustomCommands = FCustomCommands;
 
@@ -477,6 +484,7 @@ void __fastcall TPreferencesDialog::SaveConfiguration()
     GUIConfiguration->QueueTransfersLimit = QueueTransferLimitEdit->AsInteger;
     GUIConfiguration->QueueAutoPopup = QueueAutoPopupCheck->Checked;
     CopyParam.Queue = QueueCheck->Checked;
+    CopyParam.QueueIndividually = QueueIndividuallyCheck->Checked;
     CopyParam.QueueNoConfirmation = QueueNoConfirmationCheck->Checked;
     GUIConfiguration->QueueRememberPassword = RememberPasswordCheck->Checked;
 
@@ -647,7 +655,8 @@ void __fastcall TPreferencesDialog::UpdateControls()
 
     EnableControl(ResumeThresholdEdit, ResumeSmartButton->Checked);
     EnableControl(ResumeThresholdUnitLabel, ResumeThresholdEdit->Enabled);
-    EnableControl(SessionReopenAutoEdit, SessionReopenAutoCheck->Checked);
+    EnableControl(SessionReopenAutoEdit,
+      SessionReopenAutoCheck->Checked || SessionReopenAutoIdleCheck->Checked);
     EnableControl(SessionReopenAutoLabel, SessionReopenAutoEdit->Enabled);
     EnableControl(SessionReopenAutoSecLabel, SessionReopenAutoEdit->Enabled);
 

+ 61 - 112
forms/Preferences.dfm

@@ -361,7 +361,7 @@ object PreferencesDialog: TPreferencesDialog
           353)
         object PanelsRemoteDirectoryGroup: TGroupBox
           Left = 8
-          Top = 208
+          Top = 231
           Width = 357
           Height = 73
           Anchors = [akLeft, akTop, akRight]
@@ -395,13 +395,13 @@ object PreferencesDialog: TPreferencesDialog
           Left = 8
           Top = 8
           Width = 357
-          Height = 119
+          Height = 142
           Anchors = [akLeft, akTop, akRight]
           Caption = 'Common'
           TabOrder = 0
           DesignSize = (
             357
-            119)
+            142)
           object ShowHiddenFilesCheck: TCheckBox
             Left = 16
             Top = 21
@@ -442,10 +442,20 @@ object PreferencesDialog: TPreferencesDialog
             TabOrder = 3
             OnClick = ControlChange
           end
+          object RenameWholeNameCheck: TCheckBox
+            Left = 16
+            Top = 113
+            Width = 325
+            Height = 17
+            Anchors = [akLeft, akTop, akRight]
+            Caption = 'Select &whole name when renaming file'
+            TabOrder = 4
+            OnClick = ControlChange
+          end
         end
         object DoubleClickGroup: TGroupBox
           Left = 8
-          Top = 131
+          Top = 154
           Width = 357
           Height = 72
           Anchors = [akLeft, akTop, akRight]
@@ -492,6 +502,8 @@ object PreferencesDialog: TPreferencesDialog
       object CommanderSheet: TTabSheet
         Tag = 5
         Hint = 'Commander'
+        HelpType = htKeyword
+        HelpKeyword = 'ui_pref_commander'
         Caption = 'Cmd'
         ImageIndex = 3
         TabVisible = False
@@ -512,13 +524,13 @@ object PreferencesDialog: TPreferencesDialog
           Left = 8
           Top = 38
           Width = 357
-          Height = 123
+          Height = 147
           Anchors = [akLeft, akTop, akRight]
           Caption = 'Panels'
           TabOrder = 0
           DesignSize = (
             357
-            123)
+            147)
           object Label8: TLabel
             Left = 16
             Top = 21
@@ -572,10 +584,20 @@ object PreferencesDialog: TPreferencesDialog
             TabOrder = 3
             OnClick = ControlChange
           end
+          object TreeOnLeftCheck: TCheckBox
+            Left = 16
+            Top = 117
+            Width = 325
+            Height = 17
+            Anchors = [akLeft, akTop, akRight]
+            Caption = 'Show &directory tree left of file list'
+            TabOrder = 4
+            OnClick = ControlChange
+          end
         end
         object CommanderMiscGroup: TGroupBox
           Left = 8
-          Top = 170
+          Top = 194
           Width = 357
           Height = 53
           Anchors = [akLeft, akTop, akRight]
@@ -597,7 +619,7 @@ object PreferencesDialog: TPreferencesDialog
         end
         object CompareCriterionsGroup: TGroupBox
           Left = 8
-          Top = 233
+          Top = 257
           Width = 357
           Height = 74
           Anchors = [akLeft, akTop, akRight]
@@ -684,99 +706,9 @@ object PreferencesDialog: TPreferencesDialog
           Left = 0
           Top = 0
           Width = 529
-          Height = 345
+          Height = 353
+          HelpType = htKeyword
           TabOrder = 0
-          inherited CommonPropertiesGroup: TGroupBox
-            Left = 197
-            Top = 209
-            Height = 73
-            Caption = 'Common options'
-            DesignSize = (
-              173
-              73)
-            inherited CommonPreserveTimestampCheck: TCheckBox
-              Top = 19
-            end
-          end
-          inherited LocalPropertiesGroup: TGroupBox
-            Left = 197
-            Top = 156
-            Height = 48
-            Caption = 'Download options'
-            DesignSize = (
-              173
-              48)
-            inherited PreserveReadOnlyCheck: TCheckBox
-              Top = 20
-            end
-            inherited LocalPreserveTimeCheck: TCheckBox
-              Top = 92
-            end
-          end
-          inherited RemotePropertiesGroup: TGroupBox
-            Left = 8
-            Top = 156
-            Width = 182
-            Height = 126
-            Caption = 'Upload options'
-          end
-          inherited ChangeCaseGroup: TGroupBox
-            Left = 247
-            Top = 8
-            Width = 123
-            DesignSize = (
-              123
-              146)
-            inherited CCLowerCaseShortButton: TRadioButton
-              Width = 110
-            end
-            inherited CCNoChangeButton: TRadioButton
-              Width = 110
-            end
-            inherited CCUpperCaseButton: TRadioButton
-              Width = 110
-            end
-            inherited CCLowerCaseButton: TRadioButton
-              Width = 110
-            end
-            inherited CCFirstUpperCaseButton: TRadioButton
-              Width = 110
-            end
-          end
-          inherited TransferModeGroup: TGroupBox
-            Left = 8
-            Top = 8
-            Width = 231
-            DesignSize = (
-              231
-              146)
-            inherited TMTextButton: TRadioButton
-              Width = 219
-            end
-            inherited TMBinaryButton: TRadioButton
-              Width = 219
-            end
-            inherited TMAutomaticButton: TRadioButton
-              Width = 219
-            end
-            inherited AsciiFileMaskCombo: THistoryComboBox
-              Width = 213
-            end
-          end
-          inherited OtherGroup: TGroupBox
-            Left = 8
-            Top = 284
-            Width = 362
-            DesignSize = (
-              362
-              61)
-            inherited ExcludeFileMaskCombo: THistoryComboBox
-              Width = 217
-            end
-            inherited ExcludeFileMaskHintText: TStaticText
-              Left = 256
-            end
-          end
         end
       end
       object EditorSheet: TTabSheet
@@ -1287,7 +1219,7 @@ object PreferencesDialog: TPreferencesDialog
           Left = 8
           Top = 8
           Width = 357
-          Height = 150
+          Height = 174
           Anchors = [akLeft, akTop, akRight]
           Caption = 'Background transfers'
           TabOrder = 0
@@ -1312,11 +1244,11 @@ object PreferencesDialog: TPreferencesDialog
           end
           object QueueAutoPopupCheck: TCheckBox
             Left = 16
-            Top = 98
+            Top = 122
             Width = 337
             Height = 17
             Caption = '&Automatically popup prompts of background transfers when idle'
-            TabOrder = 3
+            TabOrder = 4
           end
           object QueueCheck: TCheckBox
             Left = 16
@@ -1328,24 +1260,32 @@ object PreferencesDialog: TPreferencesDialog
           end
           object RememberPasswordCheck: TCheckBox
             Left = 16
-            Top = 122
+            Top = 146
             Width = 337
             Height = 17
             Caption = 'Remember &password of main session for background transfers'
-            TabOrder = 4
+            TabOrder = 5
           end
           object QueueNoConfirmationCheck: TCheckBox
             Left = 16
-            Top = 74
+            Top = 98
             Width = 337
             Height = 17
             Caption = '&No confirmations for background transfers'
+            TabOrder = 3
+          end
+          object QueueIndividuallyCheck: TCheckBox
+            Left = 16
+            Top = 74
+            Width = 337
+            Height = 17
+            Caption = '&Enqueue each file individually by default'
             TabOrder = 2
           end
         end
         object QueueViewGroup: TGroupBox
           Left = 8
-          Top = 164
+          Top = 188
           Width = 357
           Height = 99
           Anchors = [akLeft, akTop, akRight]
@@ -1364,7 +1304,7 @@ object PreferencesDialog: TPreferencesDialog
             Top = 45
             Width = 337
             Height = 17
-            Caption = 'Hide when &empty'
+            Caption = 'Hide &when empty'
             TabOrder = 1
           end
           object QueueViewHideButton: TRadioButton
@@ -1600,13 +1540,13 @@ object PreferencesDialog: TPreferencesDialog
           Left = 8
           Top = 139
           Width = 357
-          Height = 77
+          Height = 101
           Anchors = [akLeft, akTop, akRight]
           Caption = 'Automatic reconnect'
           TabOrder = 1
           object SessionReopenAutoLabel: TLabel
             Left = 34
-            Top = 48
+            Top = 72
             Width = 77
             Height = 13
             Caption = '&Reconnect after'
@@ -1614,7 +1554,7 @@ object PreferencesDialog: TPreferencesDialog
           end
           object SessionReopenAutoSecLabel: TLabel
             Left = 246
-            Top = 48
+            Top = 72
             Width = 40
             Height = 13
             Caption = 'seconds'
@@ -1631,7 +1571,7 @@ object PreferencesDialog: TPreferencesDialog
           end
           object SessionReopenAutoEdit: TUpDownEdit
             Left = 168
-            Top = 43
+            Top = 67
             Width = 73
             Height = 21
             Alignment = taRightJustify
@@ -1640,7 +1580,16 @@ object PreferencesDialog: TPreferencesDialog
             MinValue = 1
             Value = 5
             MaxLength = 3
+            TabOrder = 2
+          end
+          object SessionReopenAutoIdleCheck: TCheckBox
+            Left = 16
+            Top = 45
+            Width = 337
+            Height = 17
+            Caption = '&Automatically reconnect session, if it breaks while idle'
             TabOrder = 1
+            OnClick = ControlChange
           end
         end
       end

+ 4 - 0
forms/Preferences.h

@@ -220,6 +220,10 @@ __published:
   TGroupBox *UpdatesOptionsGroup;
   TLabel *Label10;
   TComboBox *UpdatesBetaVersionsCombo;
+  TCheckBox *QueueIndividuallyCheck;
+  TCheckBox *SessionReopenAutoIdleCheck;
+  TCheckBox *RenameWholeNameCheck;
+  TCheckBox *TreeOnLeftCheck;
   void __fastcall FormShow(TObject *Sender);
   void __fastcall ControlChange(TObject *Sender);
   void __fastcall EditorFontButtonClick(TObject *Sender);

+ 60 - 11
forms/Progress.cpp

@@ -45,6 +45,8 @@ __fastcall TProgressForm::TProgressForm(TComponent* AOwner)
   FReadOnly = false;
   FShowAsModalStorage = NULL;
   UseSystemSettings(this);
+  ResetOnceDoneOperation();
+
   if (!IsGlobalMinimizeHandler())
   {
     SetGlobalMinimizeHandler(GlobalMinimize);
@@ -75,10 +77,11 @@ void __fastcall TProgressForm::UpdateControls()
     FData.Operation != foRename );
 
   CancelButton->Enabled = !FReadOnly;
-  DisconnectWhenCompleteCheck->Enabled =
+  OnceDoneOperationCombo->Enabled =
     !FReadOnly && (FData.Operation != foCalculateSize) &&
     (FData.Operation != foGetProperties) &&
     (FData.Operation != foCalculateChecksum);
+  OnceDoneOperationLabel->Enabled = OnceDoneOperationCombo->Enabled;
 
   bool TransferOperation =
     ((FData.Operation == foCopy) || (FData.Operation == foMove));
@@ -152,7 +155,6 @@ void __fastcall TProgressForm::UpdateControls()
     SpeedPanel->Visible = TransferOperation;
 
     ClientHeight = ClientHeight + Delta;
-    DisconnectWhenCompleteCheck->Top = DisconnectWhenCompleteCheck->Top + Delta;
 
     Caption = OperationName(FData.Operation);
 
@@ -223,7 +225,6 @@ void __fastcall TProgressForm::SetProgressData(TFileOperationProgressType & ADat
   if (FileLabel->Caption.IsEmpty() && !AData.FileName.IsEmpty())
   {
     InstantUpdate = true;
-    FCPSLimit = AData.CPSLimit;
   }
 
   if (!FAsciiTransferChanged && FData.AsciiTransfer != AData.AsciiTransfer)
@@ -242,6 +243,8 @@ void __fastcall TProgressForm::SetProgressData(TFileOperationProgressType & ADat
   if (!FDataReceived)
   {
     FDataReceived = true;
+    // CPS limit is set set only once from TFileOperationProgressType::Start
+    FCPSLimit = AData.CPSLimit;
     SpeedCombo->Text = SetSpeedLimit(FCPSLimit);
     ShowAsModal(this, FShowAsModalStorage);
   }
@@ -351,14 +354,28 @@ void __fastcall TProgressForm::GlobalMinimize(TObject * /*Sender*/)
   MinimizeApp();
 }
 //---------------------------------------------------------------------------
-void __fastcall TProgressForm::SetDisconnectWhenComplete(bool value)
+void __fastcall TProgressForm::SetOnceDoneOperation(TOnceDoneOperation value)
 {
-  DisconnectWhenCompleteCheck->Checked = value;
-}
-//---------------------------------------------------------------------------
-bool __fastcall TProgressForm::GetDisconnectWhenComplete()
-{
-  return DisconnectWhenCompleteCheck->Checked;
+  int Index = 0;
+  switch (value)
+  {
+    case odoIdle:
+      Index = 0;
+      break;
+
+    case odoDisconnect:
+      Index = 1;
+      break;
+
+    case odoShutDown:
+      Index = 2;
+      break;
+
+    default:
+      assert(false);
+  }
+  OnceDoneOperationCombo->ItemIndex = Index;
+  OnceDoneOperationComboSelect(NULL);
 }
 //---------------------------------------------------------------------------
 bool __fastcall TProgressForm::GetAllowMinimize()
@@ -378,7 +395,7 @@ void __fastcall TProgressForm::SetReadOnly(bool value)
     FReadOnly = value;
     if (!value)
     {
-      DisconnectWhenCompleteCheck->Checked = false;
+      ResetOnceDoneOperation();
     }
     UpdateControls();
   }
@@ -424,3 +441,35 @@ void __fastcall TProgressForm::SpeedComboKeyPress(TObject * /*Sender*/,
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TProgressForm::ResetOnceDoneOperation()
+{
+  OnceDoneOperationCombo->ItemIndex = 0;
+  OnceDoneOperationComboSelect(NULL);
+}
+//---------------------------------------------------------------------------
+void __fastcall TProgressForm::OnceDoneOperationComboSelect(TObject * /*Sender*/)
+{
+  switch (OnceDoneOperationCombo->ItemIndex)
+  {
+    case 0:
+      FOnceDoneOperation = odoIdle;
+      break;
+
+    case 1:
+      FOnceDoneOperation = odoDisconnect;
+      break;
+
+    case 2:
+      FOnceDoneOperation = odoShutDown;
+      break;
+
+    default:
+      assert(false);
+  }
+}
+//---------------------------------------------------------------------------
+void __fastcall TProgressForm::OnceDoneOperationComboCloseUp(TObject * /*Sender*/)
+{
+  CancelButton->SetFocus();
+}
+//---------------------------------------------------------------------------

+ 58 - 41
forms/Progress.dfm

@@ -6,8 +6,8 @@ object ProgressForm: TProgressForm
   BorderIcons = [biSystemMenu, biMinimize, biMaximize, biHelp]
   BorderStyle = bsDialog
   Caption = 'Operation'
-  ClientHeight = 224
-  ClientWidth = 394
+  ClientHeight = 196
+  ClientWidth = 405
   Color = clBtnFace
   ParentFont = True
   OldCreateOrder = False
@@ -15,14 +15,22 @@ object ProgressForm: TProgressForm
   OnHide = FormHide
   OnShow = FormShow
   DesignSize = (
-    394
-    224)
+    405
+    196)
   PixelsPerInch = 96
   TextHeight = 13
+  object OnceDoneOperationLabel: TLabel
+    Left = 322
+    Top = 88
+    Width = 68
+    Height = 13
+    Caption = 'Once &finished:'
+    FocusControl = OnceDoneOperationCombo
+  end
   object Animate: TAnimate
-    Left = 8
+    Left = 10
     Top = 5
-    Width = 299
+    Width = 301
     Height = 60
     Active = False
     Anchors = [akLeft, akTop, akRight]
@@ -30,9 +38,9 @@ object ProgressForm: TProgressForm
     StopFrame = 23
   end
   object CancelButton: TButton
-    Left = 314
+    Left = 320
     Top = 8
-    Width = 73
+    Width = 80
     Height = 25
     Anchors = [akTop, akRight]
     Cancel = True
@@ -41,9 +49,9 @@ object ProgressForm: TProgressForm
     OnClick = CancelButtonClick
   end
   object MinimizeButton: TButton
-    Left = 314
+    Left = 320
     Top = 40
-    Width = 73
+    Width = 80
     Height = 25
     Anchors = [akTop, akRight]
     Caption = '&Minimize'
@@ -51,15 +59,15 @@ object ProgressForm: TProgressForm
     OnClick = MinimizeButtonClick
   end
   object MainPanel: TPanel
-    Left = 8
+    Left = 10
     Top = 65
-    Width = 299
+    Width = 301
     Height = 68
     Anchors = [akLeft, akTop, akRight]
     BevelOuter = bvNone
     TabOrder = 3
     DesignSize = (
-      299
+      301
       68)
     object Label1: TLabel
       Left = 0
@@ -71,7 +79,7 @@ object ProgressForm: TProgressForm
     object FileLabel: TPathLabel
       Left = 56
       Top = 7
-      Width = 243
+      Width = 245
       Height = 13
       IndentHorizontal = 0
       IndentVertical = 0
@@ -89,7 +97,7 @@ object ProgressForm: TProgressForm
     object TargetPathLabel: TPathLabel
       Left = 56
       Top = 23
-      Width = 243
+      Width = 245
       Height = 13
       IndentHorizontal = 0
       IndentVertical = 0
@@ -100,7 +108,7 @@ object ProgressForm: TProgressForm
     object OperationProgress: TProgressBar
       Left = 0
       Top = 42
-      Width = 299
+      Width = 301
       Height = 16
       Anchors = [akLeft, akTop, akRight]
       Min = 0
@@ -111,15 +119,15 @@ object ProgressForm: TProgressForm
     end
   end
   object TransferPanel: TPanel
-    Left = 8
+    Left = 10
     Top = 133
-    Width = 299
+    Width = 301
     Height = 63
     Anchors = [akLeft, akTop, akRight]
     BevelOuter = bvNone
     TabOrder = 4
     DesignSize = (
-      299
+      301
       63)
     object StartTimeLabel: TLabel
       Left = 88
@@ -147,7 +155,7 @@ object ProgressForm: TProgressForm
       Caption = 'Time left:'
     end
     object CPSLabel: TLabel
-      Left = 234
+      Left = 236
       Top = 18
       Width = 65
       Height = 13
@@ -157,7 +165,7 @@ object ProgressForm: TProgressForm
       Caption = '0 KiB/s'
     end
     object TimeElapsedLabel: TLabel
-      Left = 234
+      Left = 236
       Top = 2
       Width = 65
       Height = 13
@@ -176,7 +184,7 @@ object ProgressForm: TProgressForm
       Caption = '0 KiB'
     end
     object Label3: TLabel
-      Left = 162
+      Left = 164
       Top = 2
       Width = 66
       Height = 13
@@ -198,7 +206,7 @@ object ProgressForm: TProgressForm
       Caption = 'Bytes transferred:'
     end
     object Label12: TLabel
-      Left = 162
+      Left = 164
       Top = 18
       Width = 34
       Height = 13
@@ -208,7 +216,7 @@ object ProgressForm: TProgressForm
     object FileProgress: TProgressBar
       Left = 0
       Top = 37
-      Width = 299
+      Width = 301
       Height = 16
       Anchors = [akLeft, akTop, akRight]
       Min = 0
@@ -218,33 +226,26 @@ object ProgressForm: TProgressForm
       TabOrder = 0
     end
   end
-  object DisconnectWhenCompleteCheck: TCheckBox
-    Left = 16
-    Top = 198
-    Width = 289
-    Height = 17
-    Caption = '&Disconnect when operation finishes'
-    TabOrder = 6
-  end
   object SpeedPanel: TPanel
-    Left = 308
-    Top = 89
-    Width = 85
-    Height = 73
+    Left = 314
+    Top = 151
+    Width = 92
+    Height = 41
     Anchors = [akTop, akRight]
     BevelOuter = bvNone
-    TabOrder = 5
+    TabOrder = 6
     object SpeedLabel2: TLabel
       Left = 8
       Top = 0
-      Width = 66
+      Width = 69
       Height = 13
-      Caption = '&Speed (KiB/s)'
+      Caption = '&Speed (KiB/s):'
+      FocusControl = SpeedCombo
     end
     object SpeedCombo: THistoryComboBox
       Left = 6
       Top = 16
-      Width = 73
+      Width = 80
       Height = 21
       AutoComplete = False
       ItemHeight = 13
@@ -265,10 +266,26 @@ object ProgressForm: TProgressForm
         '8')
     end
   end
+  object OnceDoneOperationCombo: TComboBox
+    Left = 320
+    Top = 104
+    Width = 80
+    Height = 21
+    AutoComplete = False
+    Style = csDropDownList
+    ItemHeight = 13
+    TabOrder = 5
+    OnCloseUp = OnceDoneOperationComboCloseUp
+    OnSelect = OnceDoneOperationComboSelect
+    Items.Strings = (
+      'Stay idle'
+      'Disconnect'
+      'Shut down')
+  end
   object UpdateTimer: TTimer
     Enabled = False
     OnTimer = UpdateTimerTimer
     Left = 336
-    Top = 176
+    Top = 168
   end
 end

+ 8 - 4
forms/Progress.h

@@ -41,12 +41,13 @@ __published:
   TLabel *CPSLabel;
   TProgressBar *FileProgress;
   TTimer *UpdateTimer;
-  TCheckBox *DisconnectWhenCompleteCheck;
   TPanel *SpeedPanel;
   TLabel *SpeedLabel2;
   TLabel *TimeLeftLabelLabel;
   TLabel *TimeLeftLabel;
   THistoryComboBox *SpeedCombo;
+  TLabel *OnceDoneOperationLabel;
+  TComboBox *OnceDoneOperationCombo;
   void __fastcall UpdateTimerTimer(TObject *Sender);
   void __fastcall FormShow(TObject *Sender);
   void __fastcall FormHide(TObject *Sender);
@@ -55,6 +56,8 @@ __published:
   void __fastcall SpeedComboExit(TObject *Sender);
   void __fastcall SpeedComboSelect(TObject *Sender);
   void __fastcall SpeedComboKeyPress(TObject *Sender, char &Key);
+  void __fastcall OnceDoneOperationComboSelect(TObject *Sender);
+  void __fastcall OnceDoneOperationComboCloseUp(TObject *Sender);
 private:
   TCancelStatus FCancel;
   TFileOperationProgressType FData;
@@ -70,9 +73,9 @@ private:
   bool FDeleteToRecycleBin;
   bool FReadOnly;
   unsigned long FCPSLimit;
+  TOnceDoneOperation FOnceDoneOperation;
 
-  void __fastcall SetDisconnectWhenComplete(bool value);
-  bool __fastcall GetDisconnectWhenComplete();
+  void __fastcall SetOnceDoneOperation(TOnceDoneOperation value);
   void __fastcall SetAllowMinimize(bool value);
   bool __fastcall GetAllowMinimize();
   void __fastcall SetReadOnly(bool value);
@@ -83,6 +86,7 @@ protected:
   void __fastcall MinimizeApp();
   void __fastcall UpdateControls();
   void __fastcall ApplyCPSLimit();
+  void __fastcall ResetOnceDoneOperation();
 
 public:
   static AnsiString __fastcall OperationName(TFileOperation Operation);
@@ -91,7 +95,7 @@ public:
   void __fastcall SetProgressData(TFileOperationProgressType & AData);
   virtual __fastcall TProgressForm(TComponent * AOwner);
   __property TCancelStatus Cancel = { read = FCancel };
-  __property bool DisconnectWhenComplete = { read=GetDisconnectWhenComplete, write=SetDisconnectWhenComplete };
+  __property TOnceDoneOperation OnceDoneOperation = { read=FOnceDoneOperation, write=SetOnceDoneOperation };
   __property bool AllowMinimize = { read=GetAllowMinimize, write=SetAllowMinimize };
   __property bool DeleteToRecycleBin = { read=FDeleteToRecycleBin, write=FDeleteToRecycleBin };
   __property bool ReadOnly = { read=FReadOnly, write=SetReadOnly };

+ 95 - 17
forms/ScpCommander.cpp

@@ -113,7 +113,7 @@ __fastcall TScpCommanderForm::TScpCommanderForm(TComponent* Owner)
 __fastcall TScpCommanderForm::~TScpCommanderForm()
 {
   delete FInternalDDDownloadList;
-  delete FLocalPathComboBoxPaths;
+  SAFE_DESTROY(FLocalPathComboBoxPaths);
 }
 //---------------------------------------------------------------------------
 void __fastcall TScpCommanderForm::RestoreFormParams()
@@ -139,10 +139,14 @@ void __fastcall TScpCommanderForm::RestoreParams()
     PANEL ## DirView->ColProperties->ParamsStr = WinConfiguration->ScpCommander.PANEL ## Panel.DirViewParams; \
     PANEL ## StatusBar->Visible = WinConfiguration->ScpCommander.PANEL ## Panel.StatusBar; \
     PANEL ## DriveView->Visible = WinConfiguration->ScpCommander.PANEL ## Panel.DriveView; \
-    PANEL ## DriveView->Height = WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight
+    if (PANEL ## DriveView->Align == alTop) \
+      PANEL ## DriveView->Height = WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight; \
+    else \
+      PANEL ## DriveView->Width = WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidth
   RESTORE_PANEL_PARAMS(Local);
   RESTORE_PANEL_PARAMS(Remote);
   #undef RESTORE_PANEL_PARAMS
+  FPanelsRestored = true;
 
   // just to make sure
   LocalDirView->DirColProperties->ExtVisible = false;
@@ -170,7 +174,10 @@ void __fastcall TScpCommanderForm::StoreParams()
       WinConfiguration->ScpCommander.PANEL ## Panel.DirViewParams = PANEL ## DirView->ColProperties->ParamsStr; \
       WinConfiguration->ScpCommander.PANEL ## Panel.StatusBar = PANEL ## StatusBar->Visible; \
       WinConfiguration->ScpCommander.PANEL ## Panel.DriveView = PANEL ## DriveView->Visible; \
-      WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight = PANEL ## DriveView->Height
+      if (PANEL ## DriveView->Align == alTop) \
+        WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight = PANEL ## DriveView->Height; \
+      else \
+        WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidth = PANEL ## DriveView->Width
     STORE_PANEL_PARAMS(Local);
     STORE_PANEL_PARAMS(Remote);
     #undef RESTORE_PANEL_PARAMS
@@ -465,6 +472,8 @@ void __fastcall TScpCommanderForm::ConfigurationChanged()
   LocalDriveView->DimmHiddenDirs = WinConfiguration->DimmHiddenFiles;
   LocalDirView->ShowHiddenFiles = WinConfiguration->ShowHiddenFiles;
   LocalDriveView->ShowHiddenDirs = WinConfiguration->ShowHiddenFiles;
+  LocalDirView->ConfirmOverwrite = WinConfiguration->ConfirmOverwriting;
+  LocalDriveView->ConfirmOverwrite = WinConfiguration->ConfirmOverwriting;
 
   LocalDirView->NortonLike = WinConfiguration->ScpCommander.NortonLikeMode;
   RemoteDirView->NortonLike = WinConfiguration->ScpCommander.NortonLikeMode;
@@ -504,6 +513,53 @@ void __fastcall TScpCommanderForm::ConfigurationChanged()
     SWAP(TShortCut, NonVisualDataModule->LocalChangePathAction->ShortCut,
       NonVisualDataModule->RemoteChangePathAction->ShortCut);
   }
+
+  if ((RemoteDriveView->Align == alLeft) != WinConfiguration->ScpCommander.TreeOnLeft)
+  {
+    TScpCommanderPanelConfiguration LocalPanel = WinConfiguration->ScpCommander.LocalPanel;
+    TScpCommanderPanelConfiguration RemotePanel = WinConfiguration->ScpCommander.RemotePanel;
+
+    bool TreeOnLeft = WinConfiguration->ScpCommander.TreeOnLeft;
+
+    // save value only is it was set yet
+    if (FPanelsRestored)
+    {
+      if (TreeOnLeft)
+      {
+        // want to be on left, so it is on top, saving height
+        LocalPanel.DriveViewHeight = LocalDriveView->Height;
+        RemotePanel.DriveViewHeight = RemoteDriveView->Height;
+      }
+      else
+      {
+        LocalPanel.DriveViewWidth = LocalDriveView->Width;
+        RemotePanel.DriveViewWidth = RemoteDriveView->Width;
+      }
+    }
+
+    TAlign NonClientAlign = (TreeOnLeft ? alLeft : alTop);
+    LocalDriveView->Align = NonClientAlign;
+    LocalPanelSplitter->Align = NonClientAlign;
+    RemoteDriveView->Align = NonClientAlign;
+    RemotePanelSplitter->Align = NonClientAlign;
+    FixControlsPlacement();
+
+    if (TreeOnLeft)
+    {
+      LocalDriveView->Width = LocalPanel.DriveViewWidth;
+      RemoteDriveView->Width = RemotePanel.DriveViewWidth;
+    }
+    else
+    {
+      LocalDriveView->Height = LocalPanel.DriveViewHeight;
+      RemoteDriveView->Height = RemotePanel.DriveViewHeight;
+    }
+
+    // in case it trigges config-changed event (does not),
+    // make sure it does only after we apply the TreeOnLeft change to avoid endless recursion
+    WinConfiguration->ScpCommander.LocalPanel = LocalPanel;
+    WinConfiguration->ScpCommander.RemotePanel = RemotePanel;
+  }
 }
 //---------------------------------------------------------------------------
 TPanel * __fastcall TScpCommanderForm::Panel(bool Left)
@@ -574,14 +630,29 @@ void __fastcall TScpCommanderForm::PanelSplitterDblClick(TObject * Sender)
     OtherDriveView = LocalDriveView;
   }
 
+  bool TreeOnLeft = WinConfiguration->ScpCommander.TreeOnLeft;
   assert(DriveView->Visible);
   if (OtherDriveView->Visible)
   {
-    DriveView->Height = OtherDriveView->Height;
+    if (TreeOnLeft)
+    {
+      DriveView->Width = OtherDriveView->Width;
+    }
+    else
+    {
+      DriveView->Height = OtherDriveView->Height;
+    }
   }
   else
   {
-    OtherDriveView->Height = DriveView->Height;
+    if (TreeOnLeft)
+    {
+      OtherDriveView->Width = DriveView->Width;
+    }
+    else
+    {
+      OtherDriveView->Height = DriveView->Height;
+    }
     OtherDriveView->Visible = true;
   }
 
@@ -673,11 +744,13 @@ void __fastcall TScpCommanderForm::FixControlsPlacement()
     { LocalTopDock, LocalPathLabel, LocalDriveView, LocalPanelSplitter,
       LocalDirView, LocalBottomDock, LocalStatusBar };
   SetVerticalControlsOrder(LocalControlsOrder, LENOF(LocalControlsOrder));
+  SetHorizontalControlsOrder(LocalControlsOrder, LENOF(LocalControlsOrder));
 
   TControl * RemoteControlsOrder[] =
     { RemoteTopDock, RemotePathLabel, RemoteDriveView, RemotePanelSplitter,
       RemoteDirView, RemoteBottomDock, RemoteStatusBar };
   SetVerticalControlsOrder(RemoteControlsOrder, LENOF(RemoteControlsOrder));
+  SetHorizontalControlsOrder(RemoteControlsOrder, LENOF(RemoteControlsOrder));
 
   if (LocalDirView->ItemFocused != NULL)
   {
@@ -1574,20 +1647,25 @@ void __fastcall TScpCommanderForm::LocalPathComboUpdateDrives()
 //---------------------------------------------------------------------------
 void __fastcall TScpCommanderForm::LocalPathComboUpdate()
 {
-  assert(FLocalPathComboBoxPaths->Count == LocalPathComboBox->Strings->Count);
-
-  int Index = 0;
-  while ((Index < FLocalPathComboBoxPaths->Count) &&
-         !ComparePaths(FLocalPathComboBoxPaths->Strings[Index],
-           LocalDirView->Path.SubString(1, FLocalPathComboBoxPaths->Strings[Index].Length())))
+  // this may get called even after destructor finishes
+  // (e.g. from SetDockAllowDrag invoked [indirectly] from StoreParams)
+  if (FLocalPathComboBoxPaths != NULL)
   {
-    Index++;
-  }
+    assert(FLocalPathComboBoxPaths->Count == LocalPathComboBox->Strings->Count);
 
-  assert(Index < FLocalPathComboBoxPaths->Count);
-  if (Index < FLocalPathComboBoxPaths->Count)
-  {
-    LocalPathComboBox->ItemIndex = Index;
+    int Index = 0;
+    while ((Index < FLocalPathComboBoxPaths->Count) &&
+           !ComparePaths(FLocalPathComboBoxPaths->Strings[Index],
+             LocalDirView->Path.SubString(1, FLocalPathComboBoxPaths->Strings[Index].Length())))
+    {
+      Index++;
+    }
+
+    assert(Index < FLocalPathComboBoxPaths->Count);
+    if (Index < FLocalPathComboBoxPaths->Count)
+    {
+      LocalPathComboBox->ItemIndex = Index;
+    }
   }
 }
 //---------------------------------------------------------------------------

+ 15 - 3
forms/ScpCommander.dfm

@@ -531,8 +531,21 @@ inherited ScpCommanderForm: TScpCommanderForm
           object TBXSeparatorItem22: TTBXSeparatorItem
             Hint = 'E'
           end
-          object TBXItem211: TTBXItem
-            Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+          object TBXSubmenuItem8: TTBXSubmenuItem
+            Action = NonVisualDataModule.QueueCycleOnceEmptyAction
+            DropdownCombo = True
+            object TBXItem222: TTBXItem
+              Action = NonVisualDataModule.QueueIdleOnceEmptyAction
+              RadioItem = True
+            end
+            object TBXItem223: TTBXItem
+              Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+              RadioItem = True
+            end
+            object TBXItem224: TTBXItem
+              Action = NonVisualDataModule.QueueShutDownOnceEmptyAction
+              RadioItem = True
+            end
           end
           object TBXItem81: TTBXItem
             Action = NonVisualDataModule.QueuePreferencesAction
@@ -1314,7 +1327,6 @@ inherited ScpCommanderForm: TScpCommanderForm
       OnMatchMask = DirViewMatchMask
       OnGetOverlay = RemoteDirViewGetOverlay
       ConfirmDelete = False
-      ConfirmOverwrite = False
       WatchForChanges = True
       OnFileIconForName = LocalDirViewFileIconForName
       OnHistoryChange = DirViewHistoryChange

+ 5 - 1
forms/ScpCommander.h

@@ -347,7 +347,6 @@ __published:
   TTBXItem *TBXItem24;
   TTBXItem *TBXItem209;
   TTBXItem *TBXItem28;
-  TTBXItem *TBXItem211;
   TTBXToolbar *UploadDownloadToolbar;
   TTBXItem *TBXItem212;
   TTBXItem *TBXItem213;
@@ -376,6 +375,10 @@ __published:
   TTBXComboBoxItem *QueueSpeedComboBoxItem;
   TTBXItem *TBXItem220;
   TTBXItem *TBXItem221;
+  TTBXSubmenuItem *TBXSubmenuItem8;
+  TTBXItem *TBXItem222;
+  TTBXItem *TBXItem223;
+  TTBXItem *TBXItem224;
   void __fastcall SplitterMoved(TObject *Sender);
   void __fastcall SplitterCanResize(TObject *Sender, int &NewSize,
     bool &Accept);
@@ -444,6 +447,7 @@ private:
   unsigned int FSpecialFolders;
   TEdit * FCommandLineComboEdit;
   TWndMethod FToolbarEditOldWndProc;
+  bool FPanelsRestored;
 
   void __fastcall SetLeftPanelWidth(float value);
   float __fastcall GetLeftPanelWidth();

+ 15 - 2
forms/ScpExplorer.dfm

@@ -345,8 +345,21 @@ inherited ScpExplorerForm: TScpExplorerForm
           object TBXSeparatorItem22: TTBXSeparatorItem
             Hint = 'E'
           end
-          object TBXItem3: TTBXItem
-            Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+          object TBXSubmenuItem8: TTBXSubmenuItem
+            Action = NonVisualDataModule.QueueCycleOnceEmptyAction
+            DropdownCombo = True
+            object TBXItem222: TTBXItem
+              Action = NonVisualDataModule.QueueIdleOnceEmptyAction
+              RadioItem = True
+            end
+            object TBXItem223: TTBXItem
+              Action = NonVisualDataModule.QueueDisconnectOnceEmptyAction
+              RadioItem = True
+            end
+            object TBXItem224: TTBXItem
+              Action = NonVisualDataModule.QueueShutDownOnceEmptyAction
+              RadioItem = True
+            end
           end
           object TBXItem81: TTBXItem
             Action = NonVisualDataModule.QueuePreferencesAction

+ 4 - 1
forms/ScpExplorer.h

@@ -261,7 +261,6 @@ __published:
   TTBXItem *TBXItem209;
   TTBXSeparatorItem *TBXSeparatorItem20;
   TTBXItem *TBXItem4;
-  TTBXItem *TBXItem3;
   TTBXToolbar *CustomCommandsToolbar;
   TTBXItem *TBXItem28;
   TTBXColorItem *ColorMenuItem;
@@ -281,6 +280,10 @@ __published:
   TTBXComboBoxItem *UnixPathComboBox;
   TTBXComboBoxItem *QueueSpeedComboBoxItem;
   TTBXItem *TBXItem138;
+  TTBXSubmenuItem *TBXSubmenuItem8;
+  TTBXItem *TBXItem222;
+  TTBXItem *TBXItem223;
+  TTBXItem *TBXItem224;
   void __fastcall RemoteDirViewUpdateStatusBar(TObject *Sender,
           const TStatusFileInfo &FileInfo);
   void __fastcall UnixPathComboBoxBeginEdit(TTBEditItem *Sender,

+ 76 - 5
forms/SynchronizeChecklist.cpp

@@ -23,11 +23,11 @@
 //---------------------------------------------------------------------
 bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
   TSynchronizeMode Mode, int Params, const AnsiString LocalDirectory,
-  const AnsiString RemoteDirectory)
+  const AnsiString RemoteDirectory, TCustomCommandMenuEvent OnCustomCommandMenu)
 {
   bool Result;
   TSynchronizeChecklistDialog * Dialog = new TSynchronizeChecklistDialog(
-    Application, Mode, Params, LocalDirectory, RemoteDirectory);
+    Application, Mode, Params, LocalDirectory, RemoteDirectory, OnCustomCommandMenu);
   try
   {
     Result = Dialog->Execute(Checklist);
@@ -41,7 +41,8 @@ bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
 //---------------------------------------------------------------------
 __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
   TComponent * AOwner, TSynchronizeMode Mode, int Params,
-  const AnsiString LocalDirectory, const AnsiString RemoteDirectory)
+  const AnsiString LocalDirectory, const AnsiString RemoteDirectory,
+  TCustomCommandMenuEvent OnCustomCommandMenu)
   : TForm(AOwner)
 {
   FFormRestored = false;
@@ -49,6 +50,7 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
   FParams = Params;
   FLocalDirectory = ExcludeTrailingBackslash(LocalDirectory);
   FRemoteDirectory = UnixExcludeTrailingBackslash(RemoteDirectory);
+  FOnCustomCommandMenu = OnCustomCommandMenu;
   UseSystemSettings(this);
   FChecklist = NULL;
   FChangingItem = NULL;
@@ -69,6 +71,8 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
   // header images mut be assigned after the small images, so it cannot
   // be done via DFM
   ListView->HeaderImages = ArrowImages;
+
+  CustomCommandsButton->Visible = (FOnCustomCommandMenu != NULL);
 }
 //---------------------------------------------------------------------
 __fastcall TSynchronizeChecklistDialog::~TSynchronizeChecklistDialog()
@@ -120,9 +124,23 @@ void __fastcall TSynchronizeChecklistDialog::UpdateControls()
 
   bool AllChecked = true;
   bool AllUnchecked = true;
+  bool AnyBoth = false;
+  bool AnyNonBoth = false;
   TListItem * Item = ListView->Selected;
   while (Item != NULL)
   {
+    const TSynchronizeChecklist::TItem * ChecklistItem =
+      static_cast<const TSynchronizeChecklist::TItem *>(Item->Data);
+    if ((ChecklistItem->Action == TSynchronizeChecklist::saUploadUpdate) ||
+        (ChecklistItem->Action == TSynchronizeChecklist::saDownloadUpdate))
+    {
+      AnyBoth = true;
+    }
+    else
+    {
+      AnyNonBoth = true;
+    }
+
     if (Item->Checked)
     {
       AllUnchecked = false;
@@ -139,6 +157,8 @@ void __fastcall TSynchronizeChecklistDialog::UpdateControls()
   EnableControl(UncheckButton, !AllUnchecked);
   EnableControl(CheckAllButton, (FChecked[0] < FTotals[0]));
   EnableControl(UncheckAllButton, (FChecked[0] > 0));
+  EnableControl(UncheckAllButton, (FChecked[0] > 0));
+  EnableControl(CustomCommandsButton, AnyBoth && !AnyNonBoth);
 
   CheckItem->Enabled = CheckButton->Enabled;
   UncheckItem->Enabled = UncheckButton->Enabled;
@@ -394,11 +414,15 @@ void __fastcall TSynchronizeChecklistDialog::StatusBarDrawPanel(
       break;
 
     case TSynchronizeChecklist::saUploadUpdate:
-      Possible = ((FMode == smRemote) || (FMode == smBoth));
+      Possible =
+        ((FMode == smRemote) || (FMode == smBoth)) &&
+        (FLAGCLEAR(FParams, spNotByTime) || FLAGSET(FParams, spBySize));
       break;
 
     case TSynchronizeChecklist::saDownloadUpdate:
-      Possible = ((FMode == smLocal) || (FMode == smBoth));
+      Possible =
+        ((FMode == smLocal) || (FMode == smBoth)) &&
+        (FLAGCLEAR(FParams, spNotByTime) || FLAGSET(FParams, spBySize));
       break;
 
     case TSynchronizeChecklist::saDeleteRemote:
@@ -755,3 +779,50 @@ void __fastcall TSynchronizeChecklistDialog::ListViewContextPopup(
   MenuPopup(Sender, MousePos, Handled);
 }
 //---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::CustomCommandsButtonClick(
+  TObject * /*Sender*/)
+{
+  TStrings * LocalFileList = new TStringList();
+  TStrings * RemoteFileList = new TStringList();
+  try
+  {
+    TListItem * Item = ListView->Selected;
+    assert(Item != NULL);
+
+    while (Item != NULL)
+    {
+      const TSynchronizeChecklist::TItem * ChecklistItem =
+        static_cast<const TSynchronizeChecklist::TItem *>(Item->Data);
+
+      assert((ChecklistItem->Action == TSynchronizeChecklist::saUploadUpdate) ||
+             (ChecklistItem->Action == TSynchronizeChecklist::saDownloadUpdate));
+      assert(ChecklistItem->RemoteFile != NULL);
+
+      AnsiString LocalPath =
+        IncludeTrailingBackslash(ChecklistItem->Local.Directory) +
+        ChecklistItem->Local.FileName;
+
+      LocalFileList->Add(LocalPath);
+
+      AnsiString RemotePath =
+        IncludeTrailingBackslash(ChecklistItem->Remote.Directory) +
+        ChecklistItem->Remote.FileName;
+
+      RemoteFileList->AddObject(RemotePath, ChecklistItem->RemoteFile);
+
+      Item = ListView->GetNextItem(Item, sdAll, TItemStates() << isSelected);
+    }
+  }
+  catch(...)
+  {
+    delete LocalFileList;
+    delete RemoteFileList;
+    throw;
+  }
+
+  assert(FOnCustomCommandMenu != NULL);
+  FOnCustomCommandMenu(CustomCommandsButton,
+    CustomCommandsButton->ClientToScreen(TPoint(0, CustomCommandsButton->Height)),
+    LocalFileList, RemoteFileList);
+}
+//---------------------------------------------------------------------------

+ 22 - 12
forms/SynchronizeChecklist.dfm

@@ -47,9 +47,9 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
   PixelsPerInch = 96
   TextHeight = 13
   object Panel: TPanel
-    Left = 602
+    Left = 587
     Top = 0
-    Width = 101
+    Width = 116
     Height = 407
     Align = alRight
     BevelOuter = bvNone
@@ -57,7 +57,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object OkButton: TButton
       Left = 8
       Top = 8
-      Width = 85
+      Width = 100
       Height = 25
       Caption = 'OK'
       Default = True
@@ -67,7 +67,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object CancelButton: TButton
       Left = 8
       Top = 40
-      Width = 85
+      Width = 100
       Height = 25
       Cancel = True
       Caption = 'Cancel'
@@ -77,7 +77,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object CheckAllButton: TButton
       Left = 8
       Top = 182
-      Width = 85
+      Width = 100
       Height = 25
       Caption = 'Check &all'
       TabOrder = 5
@@ -86,7 +86,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object UncheckAllButton: TButton
       Left = 8
       Top = 214
-      Width = 85
+      Width = 100
       Height = 25
       Caption = 'Uncheck a&ll'
       TabOrder = 6
@@ -96,7 +96,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       Tag = 1
       Left = 8
       Top = 118
-      Width = 85
+      Width = 100
       Height = 25
       Caption = '&Check'
       TabOrder = 3
@@ -105,7 +105,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object UncheckButton: TButton
       Left = 8
       Top = 150
-      Width = 85
+      Width = 100
       Height = 25
       Caption = '&Uncheck'
       TabOrder = 4
@@ -114,17 +114,27 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object HelpButton: TButton
       Left = 8
       Top = 72
-      Width = 85
+      Width = 100
       Height = 25
       Caption = '&Help'
       TabOrder = 2
       OnClick = HelpButtonClick
     end
+    object CustomCommandsButton: TButton
+      Tag = 1
+      Left = 8
+      Top = 260
+      Width = 100
+      Height = 25
+      Caption = 'Custom co&mmands'
+      TabOrder = 7
+      OnClick = CustomCommandsButtonClick
+    end
   end
   object ListView: TIEListView
     Left = 0
     Top = 0
-    Width = 602
+    Width = 587
     Height = 407
     Align = alClient
     Checkboxes = True
@@ -149,7 +159,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       item
         Alignment = taRightJustify
         Caption = 'Size'
-        Width = 80
+        Width = 70
       end
       item
         Caption = 'Changed'
@@ -167,7 +177,7 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       item
         Alignment = taRightJustify
         Caption = 'Size'
-        Width = 80
+        Width = 70
       end
       item
         Caption = 'Changed'

+ 4 - 1
forms/SynchronizeChecklist.h

@@ -43,6 +43,7 @@ __published:
   TTimer *UpdateTimer;
   TButton *HelpButton;
   TImageList *ArrowImages;
+  TButton *CustomCommandsButton;
   void __fastcall HelpButtonClick(TObject * Sender);
   void __fastcall FormShow(TObject * Sender);
   void __fastcall ListViewAdvancedCustomDrawSubItem(
@@ -72,11 +73,12 @@ __published:
           int Index, int &SecondaryColumn);
   void __fastcall ListViewContextPopup(TObject *Sender, TPoint &MousePos,
           bool &Handled);
+  void __fastcall CustomCommandsButtonClick(TObject *Sender);
 
 public:
   __fastcall TSynchronizeChecklistDialog(TComponent * AOwner,
     TSynchronizeMode Mode, int Params, const AnsiString LocalDirectory,
-    const AnsiString RemoteDirectory);
+    const AnsiString RemoteDirectory, TCustomCommandMenuEvent OnCustomCommandMenu);
   virtual __fastcall ~TSynchronizeChecklistDialog();
 
   bool __fastcall Execute(TSynchronizeChecklist * Checklist);
@@ -97,6 +99,7 @@ protected:
   bool FChangingItemIgnore;
   bool FChangingItemMass;
   AnsiString FGeneralHint;
+  TCustomCommandMenuEvent FOnCustomCommandMenu;
 
   void __fastcall UpdateControls();
   virtual void __fastcall CreateParams(TCreateParams & Params);

+ 1 - 1
openssl/Makefile

@@ -15,7 +15,7 @@
 
 # Set your compiler options
 CC=bcc32
-CFLAG=-DWIN32_LEAN_AND_MEAN -q -w-ccc -w-rch -w-pia -w-aus -w-par -w-inl -w-eff -w-sus -w-dup -w-spa -w-csu -w-rvl  -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_stricmp=stricmp -D_strnicmp=strnicmp -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_CMS -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_ENGINE -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_DISABLE_OLD_DES_SUPPORT
+CFLAG=-DWIN32_LEAN_AND_MEAN -q -w-ccc -w-rch -w-pia -w-aus -w-par -w-inl -w-eff -w-sus -w-dup -w-spa -w-csu -w-rvl  -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_stricmp=stricmp -D_strnicmp=strnicmp -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_CMS -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_ENGINE -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_DISABLE_OLD_DES_SUPPORT -DNO_CHMOD
 LIB_CFLAG=
 
 # The OpenSSL directory

+ 1 - 1
openssl/crypto/asn1/a_bytes.c

@@ -79,7 +79,7 @@ ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp,
 
 	if (tag >= 32)
 		{
-		i=ASN1_R_TAG_VALUE_TOO_HIGH;;
+		i=ASN1_R_TAG_VALUE_TOO_HIGH;
 		goto err;
 		}
 	if (!(ASN1_tag2bit(tag) & type))

+ 3 - 0
openssl/crypto/asn1/asn1.h

@@ -612,6 +612,7 @@ typedef struct BIT_STRING_BITNAME_st {
 			B_ASN1_GENERALIZEDTIME
 
 #define B_ASN1_PRINTABLE \
+			B_ASN1_NUMERICSTRING| \
 			B_ASN1_PRINTABLESTRING| \
 			B_ASN1_T61STRING| \
 			B_ASN1_IA5STRING| \
@@ -1217,6 +1218,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_BAD_OBJECT_HEADER			 102
 #define ASN1_R_BAD_PASSWORD_READ			 103
 #define ASN1_R_BAD_TAG					 104
+#define ASN1_R_BMPSTRING_IS_WRONG_LENGTH		 210
 #define ASN1_R_BN_LIB					 105
 #define ASN1_R_BOOLEAN_IS_WRONG_LENGTH			 106
 #define ASN1_R_BUFFER_TOO_SMALL				 107
@@ -1306,6 +1308,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_UNABLE_TO_DECODE_RSA_KEY			 157
 #define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY		 158
 #define ASN1_R_UNEXPECTED_EOC				 159
+#define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH		 211
 #define ASN1_R_UNKNOWN_FORMAT				 160
 #define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM		 161
 #define ASN1_R_UNKNOWN_OBJECT_TYPE			 162

+ 2 - 0
openssl/crypto/asn1/asn1_err.c

@@ -195,6 +195,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
 {ERR_REASON(ASN1_R_BAD_OBJECT_HEADER)    ,"bad object header"},
 {ERR_REASON(ASN1_R_BAD_PASSWORD_READ)    ,"bad password read"},
 {ERR_REASON(ASN1_R_BAD_TAG)              ,"bad tag"},
+{ERR_REASON(ASN1_R_BMPSTRING_IS_WRONG_LENGTH),"bmpstring is wrong length"},
 {ERR_REASON(ASN1_R_BN_LIB)               ,"bn lib"},
 {ERR_REASON(ASN1_R_BOOLEAN_IS_WRONG_LENGTH),"boolean is wrong length"},
 {ERR_REASON(ASN1_R_BUFFER_TOO_SMALL)     ,"buffer too small"},
@@ -284,6 +285,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
 {ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_KEY),"unable to decode rsa key"},
 {ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY),"unable to decode rsa private key"},
 {ERR_REASON(ASN1_R_UNEXPECTED_EOC)       ,"unexpected eoc"},
+{ERR_REASON(ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH),"universalstring is wrong length"},
 {ERR_REASON(ASN1_R_UNKNOWN_FORMAT)       ,"unknown format"},
 {ERR_REASON(ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM),"unknown message digest algorithm"},
 {ERR_REASON(ASN1_R_UNKNOWN_OBJECT_TYPE)  ,"unknown object type"},

+ 2 - 0
openssl/crypto/asn1/asn1_par.c

@@ -213,6 +213,8 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offse
 				(tag == V_ASN1_T61STRING) ||
 				(tag == V_ASN1_IA5STRING) ||
 				(tag == V_ASN1_VISIBLESTRING) ||
+				(tag == V_ASN1_NUMERICSTRING) ||
+				(tag == V_ASN1_UTF8STRING) ||
 				(tag == V_ASN1_UTCTIME) ||
 				(tag == V_ASN1_GENERALIZEDTIME))
 				{

+ 0 - 2
openssl/crypto/asn1/asn_mime.c

@@ -152,7 +152,6 @@ static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it)
 
 static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs)
 	{
-	const EVP_MD *md;
 	int i, have_unknown = 0, write_comma, md_nid;
 	have_unknown = 0;
 	write_comma = 0;
@@ -162,7 +161,6 @@ static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs)
 			BIO_write(out, ",", 1);
 		write_comma = 1;
 		md_nid = OBJ_obj2nid(sk_X509_ALGOR_value(mdalgs, i)->algorithm);
-		md = EVP_get_digestbynid(md_nid);
 		switch(md_nid)
 			{
 			case NID_sha1:

+ 1 - 1
openssl/crypto/asn1/t_x509.c

@@ -332,7 +332,7 @@ int X509_signature_print(BIO *bp, X509_ALGOR *sigalg, ASN1_STRING *sig)
 int ASN1_STRING_print(BIO *bp, ASN1_STRING *v)
 	{
 	int i,n;
-	char buf[80],*p;;
+	char buf[80],*p;
 
 	if (v == NULL) return(0);
 	n=0;

+ 33 - 11
openssl/crypto/asn1/tasn_dec.c

@@ -69,7 +69,7 @@ static int asn1_check_eoc(const unsigned char **in, long len);
 static int asn1_find_end(const unsigned char **in, long len, char inf);
 
 static int asn1_collect(BUF_MEM *buf, const unsigned char **in, long len,
-				char inf, int tag, int aclass);
+			char inf, int tag, int aclass, int depth);
 
 static int collect_data(BUF_MEM *buf, const unsigned char **p, long plen);
 
@@ -611,7 +611,6 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val,
 
 	err:
 	ASN1_template_free(val, tt);
-	*val = NULL;
 	return 0;
 	}
 
@@ -758,7 +757,6 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val,
 
 	err:
 	ASN1_template_free(val, tt);
-	*val = NULL;
 	return 0;
 	}
 
@@ -878,7 +876,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
 		 * internally irrespective of the type. So instead just check
 		 * for UNIVERSAL class and ignore the tag.
 		 */
-		if (!asn1_collect(&buf, &p, plen, inf, -1, V_ASN1_UNIVERSAL))
+		if (!asn1_collect(&buf, &p, plen, inf, -1, V_ASN1_UNIVERSAL, 0))
 			{
 			free_cont = 1;
 			goto err;
@@ -1012,6 +1010,18 @@ int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
 		case V_ASN1_SET:
 		case V_ASN1_SEQUENCE:
 		default:
+		if (utype == V_ASN1_BMPSTRING && (len & 1))
+			{
+			ASN1err(ASN1_F_ASN1_EX_C2I,
+					ASN1_R_BMPSTRING_IS_WRONG_LENGTH);
+			goto err;
+			}
+		if (utype == V_ASN1_UNIVERSALSTRING && (len & 3))
+			{
+			ASN1err(ASN1_F_ASN1_EX_C2I,
+					ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH);
+			goto err;
+			}
 		/* All based on ASN1_STRING and handled the same */
 		if (!*pval)
 			{
@@ -1128,8 +1138,18 @@ static int asn1_find_end(const unsigned char **in, long len, char inf)
  * if it is indefinite length.
  */
 
+#ifndef ASN1_MAX_STRING_NEST
+/* This determines how many levels of recursion are permitted in ASN1
+ * string types. If it is not limited stack overflows can occur. If set
+ * to zero no recursion is allowed at all. Although zero should be adequate
+ * examples exist that require a value of 1. So 5 should be more than enough.
+ */
+#define ASN1_MAX_STRING_NEST 5
+#endif
+
+
 static int asn1_collect(BUF_MEM *buf, const unsigned char **in, long len,
-				char inf, int tag, int aclass)
+			char inf, int tag, int aclass, int depth)
 	{
 	const unsigned char *p, *q;
 	long plen;
@@ -1171,13 +1191,15 @@ static int asn1_collect(BUF_MEM *buf, const unsigned char **in, long len,
 		/* If indefinite length constructed update max length */
 		if (cst)
 			{
-#ifdef OPENSSL_ALLOW_NESTED_ASN1_STRINGS
-			if (!asn1_collect(buf, &p, plen, ininf, tag, aclass))
+			if (depth >= ASN1_MAX_STRING_NEST)
+				{
+				ASN1err(ASN1_F_ASN1_COLLECT,
+					ASN1_R_NESTED_ASN1_STRING);
+				return 0;
+				}
+			if (!asn1_collect(buf, &p, plen, ininf, tag, aclass,
+						depth + 1))
 				return 0;
-#else
-			ASN1err(ASN1_F_ASN1_COLLECT, ASN1_R_NESTED_ASN1_STRING);
-			return 0;
-#endif
 			}
 		else if (plen && !collect_data(buf, &p, plen))
 			return 0;

+ 12 - 10
openssl/crypto/bio/bss_mem.c

@@ -284,6 +284,7 @@ static int mem_gets(BIO *bp, char *buf, int size)
 
 	BIO_clear_retry_flags(bp);
 	j=bm->length;
+	if ((size-1) < j) j=size-1;
 	if (j <= 0)
 		{
 		*buf='\0';
@@ -292,17 +293,18 @@ static int mem_gets(BIO *bp, char *buf, int size)
 	p=bm->data;
 	for (i=0; i<j; i++)
 		{
-		if (p[i] == '\n') break;
-		}
-	if (i == j)
-		{
-		BIO_set_retry_read(bp);
-		/* return(-1);  change the semantics 0.6.6a */ 
+		if (p[i] == '\n')
+			{
+			i++;
+			break;
+			}
 		}
-	else
-		i++;
-	/* i is the max to copy */
-	if ((size-1) < i) i=size-1;
+
+	/*
+	 * i is now the max num of bytes to copy, either j or up to
+	 * and including the first newline
+	 */ 
+
 	i=mem_read(bp,buf,i);
 	if (i > 0) buf[i]='\0';
 	ret=i;

+ 5 - 0
openssl/crypto/bio/bss_sock.c

@@ -60,6 +60,9 @@
 #include <errno.h>
 #define USE_SOCKETS
 #include "cryptlib.h"
+
+#ifndef OPENSSL_NO_SOCK
+
 #include <openssl/bio.h>
 
 #ifdef WATT32
@@ -300,3 +303,5 @@ int BIO_sock_non_fatal_error(int err)
 		}
 	return(0);
 	}
+
+#endif  /* #ifndef OPENSSL_NO_SOCK */

+ 2 - 2
openssl/crypto/buildinf.h

@@ -9,11 +9,11 @@
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   #define CFLAGS "cl  /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DAES_ASM -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_BN_ASM_MONT -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE    "
   #define PLATFORM "VC-WIN32"
-  #define DATE "Fri Jan 23 20:29:00 2009"
+  #define DATE "Fri Mar 27 07:25:02 2009"
 #endif
 #ifdef MK1MF_PLATFORM_BC_NT
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   #define CFLAGS "bcc32 -DWIN32_LEAN_AND_MEAN -q -w-ccc -w-rch -w-pia -w-aus -w-par -w-inl  -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_stricmp=stricmp -D_strnicmp=strnicmp -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE    "
   #define PLATFORM "BC-NT"
-  #define DATE "Fri Jan 23 20:29:00 2009"
+  #define DATE "Fri Mar 27 07:25:02 2009"
 #endif

+ 1 - 1
openssl/crypto/evp/enc_min.c

@@ -199,7 +199,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *imp
 			enc = 1;
 		ctx->encrypt = enc;
 		}
-#ifdef OPENSSL_NO_FIPS
+#ifdef OPENSSL_FIPS
 	if(FIPS_selftest_failed())
 		{
 		FIPSerr(FIPS_F_EVP_CIPHERINIT_EX,FIPS_R_FIPS_SELFTEST_FAILED);

+ 3 - 3
openssl/crypto/opensslv.h

@@ -25,11 +25,11 @@
  * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
  *  major minor fix final patch/beta)
  */
-#define OPENSSL_VERSION_NUMBER	0x009080afL
+#define OPENSSL_VERSION_NUMBER	0x009080bfL
 #ifdef OPENSSL_FIPS
-#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8j-fips 07 Jan 2009"
+#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8k-fips 25 Mar 2009"
 #else
-#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8j 07 Jan 2009"
+#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8k 25 Mar 2009"
 #endif
 #define OPENSSL_VERSION_PTEXT	" part of " OPENSSL_VERSION_TEXT
 

+ 4 - 0
openssl/crypto/pem/pem.h

@@ -215,7 +215,9 @@ typedef struct pem_ctx_st
 
 #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/
 #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/
+#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/
 #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/
+#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/
 
 #else
 
@@ -355,6 +357,7 @@ int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
 
 #define DECLARE_PEM_read_fp(name, type) /**/
 #define DECLARE_PEM_write_fp(name, type) /**/
+#define DECLARE_PEM_write_fp_const(name, type) /**/
 #define DECLARE_PEM_write_cb_fp(name, type) /**/
 
 #else
@@ -392,6 +395,7 @@ int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
 
 #define DECLARE_PEM_read_bio(name, type) /**/
 #define DECLARE_PEM_write_bio(name, type) /**/
+#define DECLARE_PEM_write_bio_const(name, type) /**/
 #define DECLARE_PEM_write_cb_bio(name, type) /**/
 
 #endif

+ 3 - 0
openssl/crypto/pkcs12/p12_crt.c

@@ -170,6 +170,9 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
 
 	p12 = PKCS12_add_safes(safes, 0);
 
+	if (!p12)
+		goto err;
+
 	sk_PKCS7_pop_free(safes, PKCS7_free);
 
 	safes = NULL;

+ 1 - 2
openssl/crypto/pkcs7/pk7_smime.c

@@ -229,8 +229,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
 				sk_X509_free(signers);
 				return 0;
 				}
-			X509_STORE_CTX_set_purpose(&cert_ctx,
-						X509_PURPOSE_SMIME_SIGN);
+			X509_STORE_CTX_set_default(&cert_ctx, "smime_sign");
 		} else if(!X509_STORE_CTX_init (&cert_ctx, store, signer, NULL)) {
 			PKCS7err(PKCS7_F_PKCS7_VERIFY,ERR_R_X509_LIB);
 			sk_X509_free(signers);

+ 90 - 0
openssl/crypto/s390xcpuid.S

@@ -0,0 +1,90 @@
+.text
+
+.globl	OPENSSL_cpuid_setup
+.type	OPENSSL_cpuid_setup,@function
+.align	16
+OPENSSL_cpuid_setup:
+	br	%r14		# reserved for future
+.size	OPENSSL_cpuid_setup,.-OPENSSL_cpuid_setup
+
+.globl	OPENSSL_s390x_facilities
+.type	OPENSSL_s390x_facilities,@function
+.align	16
+OPENSSL_s390x_facilities:
+	lghi	%r0,0
+	.long	0xb2b0f010	# stfle	16(%r15)
+	lg	%r2,16(%r15)
+	br	%r14
+.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
+
+.globl	OPENSSL_rdtsc
+.type	OPENSSL_rdtsc,@function
+.align	16
+OPENSSL_rdtsc:
+	stck	16(%r15)
+	lg	%r2,16(%r15)
+	br	%r14
+.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
+
+.globl	OPENSSL_atomic_add
+.type	OPENSSL_atomic_add,@function
+.align	16
+OPENSSL_atomic_add:
+	l	%r1,0(%r2)
+.Lspin:	lr	%r0,%r1
+	ar	%r0,%r3
+	cs	%r1,%r0,0(%r2)
+	brc	4,.Lspin
+	lgfr	%r2,%r0		# OpenSSL expects the new value
+	br	%r14
+.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
+
+.globl	OPENSSL_wipe_cpu
+.type	OPENSSL_wipe_cpu,@function
+.align	16
+OPENSSL_wipe_cpu:
+	xgr	%r0,%r0
+	xgr	%r1,%r1
+	lgr	%r2,%r15
+	xgr	%r3,%r3
+	xgr	%r4,%r4
+	lzdr	%f0
+	lzdr	%f1
+	lzdr	%f2
+	lzdr	%f3
+	lzdr	%f4
+	lzdr	%f5
+	lzdr	%f6
+	lzdr	%f7
+	br	%r14
+.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
+
+.globl	OPENSSL_cleanse
+.type	OPENSSL_cleanse,@function
+.align	16
+OPENSSL_cleanse:
+	lghi	%r4,15
+	lghi	%r0,0
+	clgr	%r3,%r4
+	jh	.Lot
+.Little:
+	stc	%r0,0(%r2)
+	la	%r2,1(%r2)
+	brctg	%r3,.Little
+	br	%r14
+.align	4
+.Lot:	tmll	%r2,7
+	jz	.Laligned
+	stc	%r0,0(%r2)
+	la	%r2,1(%r2)
+	brctg	%r3,.Lot
+.Laligned:
+	srlg	%r4,%r3,3
+.Loop:	stg	%r0,0(%r2)
+	la	%r2,8(%r2)
+	brctg	%r4,.Loop
+	lghi	%r4,7
+	ngr	%r3,%r4
+	jnz	.Little
+	br	%r14
+.size	OPENSSL_cleanse,.-OPENSSL_cleanse

+ 4 - 0
openssl/crypto/symhacks.h

@@ -62,6 +62,10 @@
    VAX. */
 #ifdef OPENSSL_SYS_VMS
 
+/* Hack a long name in crypto/cryptlib.c */
+#undef int_CRYPTO_set_do_dynlock_callback
+#define int_CRYPTO_set_do_dynlock_callback	int_CRYPTO_set_do_dynlock_cb
+
 /* Hack a long name in crypto/ex_data.c */
 #undef CRYPTO_get_ex_data_implementation
 #define CRYPTO_get_ex_data_implementation	CRYPTO_get_ex_data_impl

+ 1 - 0
openssl/crypto/ui/ui_lib.c

@@ -90,6 +90,7 @@ UI *UI_new_method(const UI_METHOD *method)
 
 	ret->strings=NULL;
 	ret->user_data=NULL;
+	ret->flags=0;
 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_UI, ret, &ret->ex_data);
 	return ret;
 	}

+ 2 - 1
openssl/crypto/x509/x509_cmp.c

@@ -288,7 +288,8 @@ int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
 			if (!(nabit & STR_TYPE_CMP) ||
 				!(nbbit & STR_TYPE_CMP))
 				return j;
-			j = asn1_string_memcmp(na->value, nb->value);
+			if (!asn1_string_memcmp(na->value, nb->value))
+				j = 0;
 			}
 		else if (na->value->type == V_ASN1_PRINTABLESTRING)
 			j=nocase_spacenorm_cmp(na->value, nb->value);

+ 13 - 3
openssl/crypto/x509/x509_vpm.c

@@ -74,7 +74,7 @@ static void x509_verify_param_zero(X509_VERIFY_PARAM *param)
 	param->name = NULL;
 	param->purpose = 0;
 	param->trust = 0;
-	param->inh_flags = X509_VP_FLAG_DEFAULT;
+	param->inh_flags = 0;
 	param->flags = 0;
 	param->depth = -1;
 	if (param->policies)
@@ -320,11 +320,21 @@ static const X509_VERIFY_PARAM default_table[] = {
 	0,		/* flags */
 	0,		/* purpose */
 	0,		/* trust */
-	9,		/* depth */
+	100,		/* depth */
 	NULL		/* policies */
 	},
 	{
-	"pkcs7",			/* SSL/TLS client parameters */
+	"pkcs7",			/* S/MIME signing parameters */
+	0,				/* Check time */
+	0,				/* internal flags */
+	0,				/* flags */
+	X509_PURPOSE_SMIME_SIGN,	/* purpose */
+	X509_TRUST_EMAIL,		/* trust */
+	-1,				/* depth */
+	NULL				/* policies */
+	},
+	{
+	"smime_sign",			/* S/MIME signing parameters */
 	0,				/* Check time */
 	0,				/* internal flags */
 	0,				/* flags */

Some files were not shown because too many files changed in this diff