[INFO] Software Protection Platform (SPP) cassé !

Venez ici partager vos infos et nouvelles informatiques !
Répondre
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

[INFO] Software Protection Platform (SPP) cassé !

Message par LaDidi21 »

Bonjour à tous,

Une lecture passionnante : TSforge
L’explication est, certes, ardue techniquement mais passionnante ;)

Bonne lecture

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
Sharko
Grand Habitué
Grand Habitué
Messages : 564
Enregistré le : il y a 15 ans
Localisation : Au milieu de l'eau

Message par Sharko »

Salut LaDidi21,

Merci pour ce partage.

Sharko ^^
« Écouter est une politesse qu'un homme d'esprit fait souvent à un sot mais que celui-ci ne rend jamais »
Avatar du membre
dosibox
Dieu
Dieu
Messages : 2149
Enregistré le : il y a 9 ans

Message par dosibox »

Ah oui, c'est vraiment et sacrément technique :scream:
Merci du partage :thumbsup:
Je vais commencer par : https://massgrave.dev/tsforge suivi du reddit : ^^
Avant de passer à ton url LaDIdi21 8|

MAS est passé en version 3.0, pour y ajouter TSforge : "Méthode d'activation permanente de Windows/ESU/Office".
MAS Changelog
3.0
The Forge Awakens
TSforge:
A new activation method named TSforge is added to MAS.
https://massgrave.dev/changelog


Features
HWID (Digital License) Method to Permanently Activate Windows
Ohook Method to Permanently Activate Office
TSforge Method to Permanently Activate Windows/ESU/Office
KMS38 Method to Activate Windows Till the Year 2038
Online KMS Method to Activate Windows/Office For 180 Days (Lifetime With Renewal Task)

Advanced Activation Troubleshooting
$OEM$ Folders For Preactivation
Change Windows Edition
Change Office Edition
Check Windows/Office Activation Status
Available in All In One and Separate Files Versions
Fully Open Source and Based on Batch Scripts
Fewer Antivirus Detections

Moi, ce que je trouve le comble dans l'histoire, c'est que l'équipe qui gère le site Internet https://massgrave.dev/ etc... font des dépôts sur GitHub qui appartient à Microsoft depuis le 4 juin 2018 ^^
https://fr.wikipedia.org/wiki/GitHub_(entreprise)
✖ Escroc de haut vol et rentier de père en fils depuis 1848. ✖
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@aLL :
Ratiborus a mis à jour son utilitaire pour intégrer l'activation TSforge.
Et c'est génial :thumbsup: .

Pour tester, je viens d'activer un Windows 11 Entreprise 2024 LTSC via clé MAK ;)
Image
 
J'ai, bien sûr, fait toutes les mises à jour dans la foulée pour tester la robustesse :
Image

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
dosibox
Dieu
Dieu
Messages : 2149
Enregistré le : il y a 9 ans

Message par dosibox »

8|
Quel utilitaire ratiborus a t-il mis à jour pour intégrer l'activation TSforge ?
✖ Escroc de haut vol et rentier de père en fils depuis 1848. ✖
Avatar du membre
Lip
Habitué
Habitué
Messages : 393
Enregistré le : il y a 1 an
Localisation : Fly me to the moon...

Message par Lip »

@dosibox :
Activation Program v1.07
J'aimerais aller vivre en Théorie, car en théorie, tout s'y passe bien
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@aLL :
Ratiborus Activation Program 1.07 :

Code : Tout sélectionner

TWL2.3C6D64786E2430313D2D6162776F62707D2E6F69647166796473616D2133 36313F23777F646E69677F2562716774766F637F23777E21637B6162623F2F2A3 3707474786

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
Calimero
Grand Habitué
Grand Habitué
Messages : 986
Enregistré le : il y a 12 ans
Localisation : Chti 59

Message par Calimero »

Bonsoir,
Merci LaDidi21.
Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

Fortiches ces petits gars.
J'ai lu, je n'ai pas tout compris (litote).
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@aLL :
Je viens de tester l’activation d'un Server 2025 DataCenter : OK en retail et en MAK 8|
Sans un seul accès à Internet...

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
dosibox
Dieu
Dieu
Messages : 2149
Enregistré le : il y a 9 ans

Message par dosibox »

Merci à vous 2 Lip et LaDidi21 de m'avoir répondu : Activation Program.
Comme ohook pour Office quoi, il me semble : sans accès à Internet.
✖ Escroc de haut vol et rentier de père en fils depuis 1848. ✖
Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

@LaDidi21,
J'ai 2 questions :
  • Pourquoi tiens-tu à procéder hors-ligne ? Pour que le PC ne soit pas "repéré" par Microsoft avant qu'il ne soit activé ?
  • Pourquoi le Ratiborus et pas le MAS directement ?
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@Joselito :
  • Pour être sûr que l'activation ne nécessite pas, sans le dire, un accès internet. Pour ne pas être repéré, il faudrait ne pas faire de WU...
  • pourquoi pas ^^ ? MAS => un cmd de 600.000 lignes octets et un TSforge de 275.000 lignes octets :pensive:

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

@LaDidi21,
Tu n'exagères pas un peu ?
Moi j'en vois respectivement 16580 et 7400. :hushed:
Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

@All,

Comme précisé d'ailleurs dans la documentation, TSforge ne permet pas d'activer "Microsoft 365".
L'application se retrouve transformée en version "Office 2016 Mondo", pré-version d'Office 2016 anciennement destinée aux "technicial professionals".
Pas de problème avec "Office 2024".
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@Joselito :
Bien vu, il s'agissait d'octets et, non, de lignes ^^

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

tottor
Habitué
Habitué
Messages : 419
Enregistré le : il y a 10 ans

Message par tottor »

Joselito a écrit : il y a 1 semaine @All,

Comme précisé d'ailleurs dans la documentation, TSforge ne permet pas d'activer "Microsoft 365".
L'application se retrouve transformée en version "Office 2016 Mondo", pré-version d'Office 2016 anciennement destinée aux "technicial professionals".
Pas de problème avec "Office 2024".
Merci pour cette information et je confirme que Microsoft Activation Scripts (MAS) 3.0 traite "Microsoft 365".
J'ai fait des tests avec Visio et Project Retail en parallèle, et il y a des problèmes de contrôle de licence.
Cet outil propose une solution utilisant Ohook en choix numéro 2.

Image

La solution existe :
https://github.com/asdcorp/ohook
Dans le cas de certaines éditions Office qui montrent "Il y avait un problème de vérification de l'état de la licence de cet appareil", vous devrez peut-être ajouter ce qui suit au fichier hosts :
0.0.0.0 ols.officeapps.live.com
Décryptage des liens du forum : Thiweb Live
Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

@tottor,
Tu ne dois pas savoir lire, j'ai bien précisé "TSforge" et c'est le sujet du fil de discussion.
Nous savons depuis longtemps qu'Ohook fonctionne.
Tu es le spécialiste du métro de retard.
tottor
Habitué
Habitué
Messages : 419
Enregistré le : il y a 10 ans

Message par tottor »

@ Joselito,

Outre le fait d'être désagréable tu ne lis pas mon post en entier !
J'apporte un complément d'information Ohook.
Libre à toi de supprimer "Tout ce qui ne te convient pas".
:@ :@ :@
Décryptage des liens du forum : Thiweb Live
tottor
Habitué
Habitué
Messages : 419
Enregistré le : il y a 10 ans

Message par tottor »

@ Ladidi21
Je viens de voir la mise à jour d'un petit outil, style "couteau suisse" :
HEU KMS Activator v50.0.0
Image
Image
Image

Il reprends les fonctionnalités listées précédemment et plus encore.
L'avis d'un expert serait utile.
https://github.com/zbezj/HEU_KMS_Activa ... ses/latest
^^ ^^ ^^
Dernière modification par LaDidi21 il y a 4 jours, modifié au total 2 fois.
Raison : Aucun intérêt de crypter un lien public + lien erroné
Décryptage des liens du forum : Thiweb Live
Avatar du membre
Joselito
Modérateur
Modérateur
Messages : 4548
Enregistré le : il y a 11 ans

Message par Joselito »

La version 50.0.0 ?
C'est ce qu'on appelle un produit suivi.
Étrange sur un compte github, même le code source fait sonner Defender.
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@Joselito :
Le code source est... presque vide.
Sont, directement, passés de 42 à 50 !
________________________________________________________________________________

@tottor :
Made in china ?
un script AutoIt UPXé ? Mouais...

Décompilé, le script AutoIt 3 semble sain :

Code : Tout sélectionner

#NoTrayIcon
#Region
	#AutoIt3Wrapper_Icon=heu_kms.ico
	#AutoIt3Wrapper_Outfile=HEU_KMS_Activator_v50.0.0.exe
	#AutoIt3Wrapper_UseUpx=y
	#AutoIt3Wrapper_Res_Comment=KMS/数字权利/KMS38/OEM激活
	#AutoIt3Wrapper_Res_Description=HEU KMS Activator™
	#AutoIt3Wrapper_Res_Fileversion=50.0.0.0
	#AutoIt3Wrapper_Res_ProductVersion=50.0.0.0
	#AutoIt3Wrapper_Res_LegalCopyright=知彼而知己
	#AutoIt3Wrapper_Res_Language=2052
	#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
	#AutoIt3Wrapper_Res_Field=Productname|HEU KMS Activator
	#AutoIt3Wrapper_Res_Field=CompanyName|知彼而知己
	#AutoIt3Wrapper_Res_Field=OriginalFilename|HEU_KMS_Activator_v50.0.0
	#AutoIt3Wrapper_Res_Field=InternalName|HEU_KMS_Activator_v50.0.0
	#Tidy_Parameters=/sci 0
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Dir", @SCRIPTDIR)
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Name", @SCRIPTNAME)
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "UserAgreement", "UA", "NO")
GLOBAL CONST $OPT_COORDSRELATIVE = 0
GLOBAL CONST $OPT_COORDSABSOLUTE = 1
GLOBAL CONST $OPT_COORDSCLIENT = 2
GLOBAL CONST $OPT_ERRORSILENT = 0
GLOBAL CONST $OPT_ERRORFATAL = 1
GLOBAL CONST $OPT_CAPSNOSTORE = 0
GLOBAL CONST $OPT_CAPSSTORE = 1
GLOBAL CONST $OPT_MATCHSTART = 1
GLOBAL CONST $OPT_MATCHANY = 2
GLOBAL CONST $OPT_MATCHEXACT = 3
GLOBAL CONST $OPT_MATCHADVANCED = 4
GLOBAL CONST $CCS_TOP = 1
GLOBAL CONST $CCS_NOMOVEY = 2
GLOBAL CONST $CCS_BOTTOM = 3
GLOBAL CONST $CCS_NORESIZE = 4
GLOBAL CONST $CCS_NOPARENTALIGN = 8
GLOBAL CONST $CCS_NOHILITE = 16
GLOBAL CONST $CCS_ADJUSTABLE = 32
GLOBAL CONST $CCS_NODIVIDER = 64
GLOBAL CONST $CCS_VERT = 128
GLOBAL CONST $CCS_LEFT = 129
GLOBAL CONST $CCS_NOMOVEX = 130
GLOBAL CONST $CCS_RIGHT = 131
GLOBAL CONST $DT_DRIVETYPE = 1
GLOBAL CONST $DT_SSDSTATUS = 2
GLOBAL CONST $DT_BUSTYPE = 3
GLOBAL CONST $PROXY_IE = 0
GLOBAL CONST $PROXY_NONE = 1
GLOBAL CONST $PROXY_SPECIFIED = 2
GLOBAL CONST $OBJID_WINDOW = 0
GLOBAL CONST $OBJID_TITLEBAR = -2
GLOBAL CONST $OBJID_SIZEGRIP = -7
GLOBAL CONST $OBJID_CARET = -8
GLOBAL CONST $OBJID_CURSOR = -9
GLOBAL CONST $OBJID_ALERT = -10
GLOBAL CONST $OBJID_SOUND = -11
GLOBAL CONST $DLG_CENTERONTOP = 0
GLOBAL CONST $DLG_NOTITLE = 1
GLOBAL CONST $DLG_NOTONTOP = 2
GLOBAL CONST $DLG_TEXTLEFT = 4
GLOBAL CONST $DLG_TEXTRIGHT = 8
GLOBAL CONST $DLG_MOVEABLE = 16
GLOBAL CONST $DLG_TEXTVCENTER = 32
GLOBAL CONST $MCID_UNKNOWN = -1
GLOBAL CONST $MCID_HAND = 0
GLOBAL CONST $MCID_APPSTARTING = 1
GLOBAL CONST $MCID_ARROW = 2
GLOBAL CONST $MCID_CROSS = 3
GLOBAL CONST $MCID_HELP = 4
GLOBAL CONST $MCID_IBEAM = 5
GLOBAL CONST $MCID_ICON = 6
GLOBAL CONST $MCID_NO = 7
GLOBAL CONST $MCID_SIZE = 8
GLOBAL CONST $MCID_SIZEALL = 9
GLOBAL CONST $MCID_SIZENESW = 10
GLOBAL CONST $MCID_SIZENS = 11
GLOBAL CONST $MCID_SIZENWSE = 12
GLOBAL CONST $MCID_SIZEWE = 13
GLOBAL CONST $MCID_UPARROW = 14
GLOBAL CONST $MCID_WAIT = 15
GLOBAL CONST $MCID_NONE = 16
GLOBAL CONST $SD_LOGOFF = 0
GLOBAL CONST $SD_SHUTDOWN = 1
GLOBAL CONST $SD_REBOOT = 2
GLOBAL CONST $SD_FORCE = 4
GLOBAL CONST $SD_POWERDOWN = 8
GLOBAL CONST $SD_FORCEHUNG = 16
GLOBAL CONST $SD_STANDBY = 32
GLOBAL CONST $SD_HIBERNATE = 64
GLOBAL CONST $STDIN_CHILD = 1
GLOBAL CONST $STDOUT_CHILD = 2
GLOBAL CONST $STDERR_CHILD = 4
GLOBAL CONST $STDERR_MERGED = 8
GLOBAL CONST $STDIO_INHERIT_PARENT = 16
GLOBAL CONST $RUN_CREATE_NEW_CONSOLE = 65536
GLOBAL CONST $UBOUND_DIMENSIONS = 0
GLOBAL CONST $UBOUND_ROWS = 1
GLOBAL CONST $UBOUND_COLUMNS = 2
GLOBAL CONST $MOUSEEVENTF_ABSOLUTE = 32768
GLOBAL CONST $MOUSEEVENTF_MOVE = 1
GLOBAL CONST $MOUSEEVENTF_LEFTDOWN = 2
GLOBAL CONST $MOUSEEVENTF_LEFTUP = 4
GLOBAL CONST $MOUSEEVENTF_RIGHTDOWN = 8
GLOBAL CONST $MOUSEEVENTF_RIGHTUP = 16
GLOBAL CONST $MOUSEEVENTF_MIDDLEDOWN = 32
GLOBAL CONST $MOUSEEVENTF_MIDDLEUP = 64
GLOBAL CONST $MOUSEEVENTF_WHEEL = 2048
GLOBAL CONST $MOUSEEVENTF_XDOWN = 128
GLOBAL CONST $MOUSEEVENTF_XUP = 256
GLOBAL CONST $REG_NONE = 0
GLOBAL CONST $REG_SZ = 1
GLOBAL CONST $REG_EXPAND_SZ = 2
GLOBAL CONST $REG_BINARY = 3
GLOBAL CONST $REG_DWORD = 4
GLOBAL CONST $REG_DWORD_LITTLE_ENDIAN = 4
GLOBAL CONST $REG_DWORD_BIG_ENDIAN = 5
GLOBAL CONST $REG_LINK = 6
GLOBAL CONST $REG_MULTI_SZ = 7
GLOBAL CONST $REG_RESOURCE_LIST = 8
GLOBAL CONST $REG_FULL_RESOURCE_DESCRIPTOR = 9
GLOBAL CONST $REG_RESOURCE_REQUIREMENTS_LIST = 10
GLOBAL CONST $REG_QWORD = 11
GLOBAL CONST $REG_QWORD_LITTLE_ENDIAN = 11
GLOBAL CONST $HWND_BOTTOM = 1
GLOBAL CONST $HWND_NOTOPMOST = -2
GLOBAL CONST $HWND_TOP = 0
GLOBAL CONST $HWND_TOPMOST = -1
GLOBAL CONST $SWP_NOSIZE = 1
GLOBAL CONST $SWP_NOMOVE = 2
GLOBAL CONST $SWP_NOZORDER = 4
GLOBAL CONST $SWP_NOREDRAW = 8
GLOBAL CONST $SWP_NOACTIVATE = 16
GLOBAL CONST $SWP_FRAMECHANGED = 32
GLOBAL CONST $SWP_DRAWFRAME = 32
GLOBAL CONST $SWP_SHOWWINDOW = 64
GLOBAL CONST $SWP_HIDEWINDOW = 128
GLOBAL CONST $SWP_NOCOPYBITS = 256
GLOBAL CONST $SWP_NOOWNERZORDER = 512
GLOBAL CONST $SWP_NOREPOSITION = 512
GLOBAL CONST $SWP_NOSENDCHANGING = 1024
GLOBAL CONST $SWP_DEFERERASE = 8192
GLOBAL CONST $SWP_ASYNCWINDOWPOS = 16384
GLOBAL CONST $KEYWORD_DEFAULT = 1
GLOBAL CONST $KEYWORD_NULL = 2
GLOBAL CONST $DECLARED_LOCAL = -1
GLOBAL CONST $DECLARED_UNKNOWN = 0
GLOBAL CONST $DECLARED_GLOBAL = 1
GLOBAL CONST $ASSIGN_CREATE = 0
GLOBAL CONST $ASSIGN_FORCELOCAL = 1
GLOBAL CONST $ASSIGN_FORCEGLOBAL = 2
GLOBAL CONST $ASSIGN_EXISTFAIL = 4
GLOBAL CONST $BI_ENABLE = 0
GLOBAL CONST $BI_DISABLE = 1
GLOBAL CONST $BREAK_ENABLE = 1
GLOBAL CONST $BREAK_DISABLE = 0
GLOBAL CONST $CDTRAY_OPEN = "open"
GLOBAL CONST $CDTRAY_CLOSED = "closed"
GLOBAL CONST $SEND_DEFAULT = 0
GLOBAL CONST $SEND_RAW = 1
GLOBAL CONST $DIR_DEFAULT = 0
GLOBAL CONST $DIR_EXTENDED = 1
GLOBAL CONST $DIR_NORECURSE = 2
GLOBAL CONST $DIR_REMOVE = 1
GLOBAL CONST $DT_ALL = "ALL"
GLOBAL CONST $DT_CDROM = "CDROM"
GLOBAL CONST $DT_REMOVABLE = "REMOVABLE"
GLOBAL CONST $DT_FIXED = "FIXED"
GLOBAL CONST $DT_NETWORK = "NETWORK"
GLOBAL CONST $DT_RAMDISK = "RAMDISK"
GLOBAL CONST $DT_UNKNOWN = "UNKNOWN"
GLOBAL CONST $DT_UNDEFINED = 1
GLOBAL CONST $DT_FAT = "FAT"
GLOBAL CONST $DT_FAT32 = "FAT32"
GLOBAL CONST $DT_EXFAT = "exFAT"
GLOBAL CONST $DT_NTFS = "NTFS"
GLOBAL CONST $DT_NWFS = "NWFS"
GLOBAL CONST $DT_CDFS = "CDFS"
GLOBAL CONST $DT_UDF = "UDF"
GLOBAL CONST $DMA_DEFAULT = 0
GLOBAL CONST $DMA_PERSISTENT = 1
GLOBAL CONST $DMA_AUTHENTICATION = 8
GLOBAL CONST $DS_UNKNOWN = "UNKNOWN"
GLOBAL CONST $DS_READY = "READY"
GLOBAL CONST $DS_NOTREADY = "NOTREADY"
GLOBAL CONST $DS_INVALID = "INVALID"
GLOBAL CONST $MOUSE_CLICK_LEFT = "left"
GLOBAL CONST $MOUSE_CLICK_RIGHT = "right"
GLOBAL CONST $MOUSE_CLICK_MIDDLE = "middle"
GLOBAL CONST $MOUSE_CLICK_MAIN = "main"
GLOBAL CONST $MOUSE_CLICK_MENU = "menu"
GLOBAL CONST $MOUSE_CLICK_PRIMARY = "primary"
GLOBAL CONST $MOUSE_CLICK_SECONDARY = "secondary"
GLOBAL CONST $MOUSE_WHEEL_UP = "up"
GLOBAL CONST $MOUSE_WHEEL_DOWN = "down"
GLOBAL CONST $NUMBER_AUTO = 0
GLOBAL CONST $NUMBER_32BIT = 1
GLOBAL CONST $NUMBER_64BIT = 2
GLOBAL CONST $NUMBER_DOUBLE = 3
GLOBAL CONST $OBJ_NAME = 1
GLOBAL CONST $OBJ_STRING = 2
GLOBAL CONST $OBJ_PROGID = 3
GLOBAL CONST $OBJ_FILE = 4
GLOBAL CONST $OBJ_MODULE = 5
GLOBAL CONST $OBJ_CLSID = 6
GLOBAL CONST $OBJ_IID = 7
GLOBAL CONST $EXITCLOSE_NORMAL = 0
GLOBAL CONST $EXITCLOSE_BYEXIT = 1
GLOBAL CONST $EXITCLOSE_BYCLICK = 2
GLOBAL CONST $EXITCLOSE_BYLOGOFF = 3
GLOBAL CONST $EXITCLOSE_BYSHUTDOWN = 4
GLOBAL CONST $PROCESS_STATS_MEMORY = 0
GLOBAL CONST $PROCESS_STATS_IO = 1
GLOBAL CONST $PROCESS_LOW = 0
GLOBAL CONST $PROCESS_BELOWNORMAL = 1
GLOBAL CONST $PROCESS_NORMAL = 2
GLOBAL CONST $PROCESS_ABOVENORMAL = 3
GLOBAL CONST $PROCESS_HIGH = 4
GLOBAL CONST $PROCESS_REALTIME = 5
GLOBAL CONST $RUN_LOGON_NOPROFILE = 0
GLOBAL CONST $RUN_LOGON_PROFILE = 1
GLOBAL CONST $RUN_LOGON_NETWORK = 2
GLOBAL CONST $RUN_LOGON_INHERIT = 4
GLOBAL CONST $SOUND_NOWAIT = 0
GLOBAL CONST $SOUND_WAIT = 1
GLOBAL CONST $SHEX_OPEN = "open"
GLOBAL CONST $SHEX_EDIT = "edit"
GLOBAL CONST $SHEX_PRINT = "print"
GLOBAL CONST $SHEX_PROPERTIES = "properties"
GLOBAL CONST $TCP_DATA_DEFAULT = 0
GLOBAL CONST $TCP_DATA_BINARY = 1
GLOBAL CONST $UDP_OPEN_DEFAULT = 0
GLOBAL CONST $UDP_OPEN_BROADCAST = 1
GLOBAL CONST $UDP_DATA_DEFAULT = 0
GLOBAL CONST $UDP_DATA_BINARY = 1
GLOBAL CONST $UDP_DATA_ARRAY = 2
GLOBAL CONST $TIP_NOICON = 0
GLOBAL CONST $TIP_INFOICON = 1
GLOBAL CONST $TIP_WARNINGICON = 2
GLOBAL CONST $TIP_ERRORICON = 3
GLOBAL CONST $TIP_BALLOON = 1
GLOBAL CONST $TIP_CENTER = 2
GLOBAL CONST $TIP_FORCEVISIBLE = 4
GLOBAL CONST $WINDOWS_NOONTOP = 0
GLOBAL CONST $WINDOWS_ONTOP = 1
GLOBAL CONST $WIN_STATE_EXISTS = 1
GLOBAL CONST $WIN_STATE_VISIBLE = 2
GLOBAL CONST $WIN_STATE_ENABLED = 4
GLOBAL CONST $WIN_STATE_ACTIVE = 8
GLOBAL CONST $WIN_STATE_MINIMIZED = 16
GLOBAL CONST $WIN_STATE_MAXIMIZED = 32
GLOBAL CONST $FW_DONTCARE = 0
GLOBAL CONST $FW_THIN = 100
GLOBAL CONST $FW_EXTRALIGHT = 200
GLOBAL CONST $FW_ULTRALIGHT = 200
GLOBAL CONST $FW_LIGHT = 300
GLOBAL CONST $FW_NORMAL = 400
GLOBAL CONST $FW_REGULAR = 400
GLOBAL CONST $FW_MEDIUM = 500
GLOBAL CONST $FW_SEMIBOLD = 600
GLOBAL CONST $FW_DEMIBOLD = 600
GLOBAL CONST $FW_BOLD = 700
GLOBAL CONST $FW_EXTRABOLD = 800
GLOBAL CONST $FW_ULTRABOLD = 800
GLOBAL CONST $FW_HEAVY = 900
GLOBAL CONST $FW_BLACK = 900
GLOBAL CONST $CF_EFFECTS = 256
GLOBAL CONST $CF_PRINTERFONTS = 2
GLOBAL CONST $CF_SCREENFONTS = 1
GLOBAL CONST $CF_NOSCRIPTSEL = 8388608
GLOBAL CONST $CF_INITTOLOGFONTSTRUCT = 64
GLOBAL CONST $LOGPIXELSX = 88
GLOBAL CONST $LOGPIXELSY = 90
GLOBAL CONST $ANSI_CHARSET = 0
GLOBAL CONST $ARABIC_CHARSET = 178
GLOBAL CONST $BALTIC_CHARSET = 186
GLOBAL CONST $CHINESEBIG5_CHARSET = 136
GLOBAL CONST $DEFAULT_CHARSET = 1
GLOBAL CONST $EASTEUROPE_CHARSET = 238
GLOBAL CONST $GB2312_CHARSET = 134
GLOBAL CONST $GREEK_CHARSET = 161
GLOBAL CONST $HANGEUL_CHARSET = 129
GLOBAL CONST $HEBREW_CHARSET = 177
GLOBAL CONST $JOHAB_CHARSET = 130
GLOBAL CONST $MAC_CHARSET = 77
GLOBAL CONST $OEM_CHARSET = 255
GLOBAL CONST $RUSSIAN_CHARSET = 204
GLOBAL CONST $SHIFTJIS_CHARSET = 128
GLOBAL CONST $SYMBOL_CHARSET = 2
GLOBAL CONST $THAI_CHARSET = 222
GLOBAL CONST $TURKISH_CHARSET = 162
GLOBAL CONST $VIETNAMESE_CHARSET = 163
GLOBAL CONST $OUT_CHARACTER_PRECIS = 2
GLOBAL CONST $OUT_DEFAULT_PRECIS = 0
GLOBAL CONST $OUT_DEVICE_PRECIS = 5
GLOBAL CONST $OUT_OUTLINE_PRECIS = 8
GLOBAL CONST $OUT_PS_ONLY_PRECIS = 10
GLOBAL CONST $OUT_RASTER_PRECIS = 6
GLOBAL CONST $OUT_STRING_PRECIS = 1
GLOBAL CONST $OUT_STROKE_PRECIS = 3
GLOBAL CONST $OUT_TT_ONLY_PRECIS = 7
GLOBAL CONST $OUT_TT_PRECIS = 4
GLOBAL CONST $CLIP_CHARACTER_PRECIS = 1
GLOBAL CONST $CLIP_DEFAULT_PRECIS = 0
GLOBAL CONST $CLIP_DFA_DISABLE = 48
GLOBAL CONST $CLIP_EMBEDDED = 128
GLOBAL CONST $CLIP_LH_ANGLES = 16
GLOBAL CONST $CLIP_MASK = 15
GLOBAL CONST $CLIP_DFA_OVERRIDE = 64
GLOBAL CONST $CLIP_STROKE_PRECIS = 2
GLOBAL CONST $CLIP_TT_ALWAYS = 32
GLOBAL CONST $ANTIALIASED_QUALITY = 4
GLOBAL CONST $DEFAULT_QUALITY = 0
GLOBAL CONST $DRAFT_QUALITY = 1
GLOBAL CONST $NONANTIALIASED_QUALITY = 3
GLOBAL CONST $PROOF_QUALITY = 2
GLOBAL CONST $CLEARTYPE_QUALITY = 5
GLOBAL CONST $DEFAULT_PITCH = 0
GLOBAL CONST $FIXED_PITCH = 1
GLOBAL CONST $VARIABLE_PITCH = 2
GLOBAL CONST $FF_DECORATIVE = 80
GLOBAL CONST $FF_DONTCARE = 0
GLOBAL CONST $FF_MODERN = 48
GLOBAL CONST $FF_ROMAN = 16
GLOBAL CONST $FF_SCRIPT = 64
GLOBAL CONST $FF_SWISS = 32
GLOBAL CONST $FS_REGULAR = 0
GLOBAL CONST $FS_BOLD = 1
GLOBAL CONST $FS_ITALIC = 2
GLOBAL CONST $TAGPOINT = "struct;long X;long Y;endstruct"
GLOBAL CONST $TAGRECT = "struct;long Left;long Top;long Right;long Bottom;endstruct"
GLOBAL CONST $TAGSIZE = "struct;long X;long Y;endstruct"
GLOBAL CONST $TAGMARGINS = "int cxLeftWidth;int cxRightWidth;int cyTopHeight;int cyBottomHeight"
GLOBAL CONST $TAGFILETIME = "struct;dword Lo;dword Hi;endstruct"
GLOBAL CONST $TAGSYSTEMTIME = "struct;word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds;endstruct"
GLOBAL CONST $TAGTIME_ZONE_INFORMATION = "struct;long Bias;wchar StdName[32];word StdDate[8];long StdBias;wchar DayName[32];word DayDate[8];long DayBias;endstruct"
GLOBAL CONST $TAGNMHDR = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct"
GLOBAL CONST $TAGCOMBOBOXEXITEM = "uint Mask;int_ptr Item;ptr Text;int TextMax;int Image;int SelectedImage;int OverlayImage;" & "int Indent;lparam Param"
GLOBAL CONST $TAGNMCBEDRAGBEGIN = $TAGNMHDR & ";int ItemID;wchar szText[260]"
GLOBAL CONST $TAGNMCBEENDEDIT = $TAGNMHDR & ";bool fChanged;int NewSelection;wchar szText[260];int Why"
GLOBAL CONST $TAGNMCOMBOBOXEX = $TAGNMHDR & ";uint Mask;int_ptr Item;ptr Text;int TextMax;int Image;" & "int SelectedImage;int OverlayImage;int Indent;lparam Param"
GLOBAL CONST $TAGDTPRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;" & "word MinSecond;word MinMSecond;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;" & "word MaxMinute;word MaxSecond;word MaxMSecond;bool MinValid;bool MaxValid"
GLOBAL CONST $TAGNMDATETIMECHANGE = $TAGNMHDR & ";dword Flag;" & $TAGSYSTEMTIME
GLOBAL CONST $TAGNMDATETIMEFORMAT = $TAGNMHDR & ";ptr Format;" & $TAGSYSTEMTIME & ";ptr pDisplay;wchar Display[64]"
GLOBAL CONST $TAGNMDATETIMEFORMATQUERY = $TAGNMHDR & ";ptr Format;struct;long SizeX;long SizeY;endstruct"
GLOBAL CONST $TAGNMDATETIMEKEYDOWN = $TAGNMHDR & ";int VirtKey;ptr Format;" & $TAGSYSTEMTIME
GLOBAL CONST $TAGNMDATETIMESTRING = $TAGNMHDR & ";ptr UserString;" & $TAGSYSTEMTIME & ";dword Flags"
GLOBAL CONST $TAGEVENTLOGRECORD = "dword Length;dword Reserved;dword RecordNumber;dword TimeGenerated;dword TimeWritten;dword EventID;" & "word EventType;word NumStrings;word EventCategory;word ReservedFlags;dword ClosingRecordNumber;dword StringOffset;" & "dword UserSidLength;dword UserSidOffset;dword DataLength;dword DataOffset"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_BLUR = "float Radius; bool ExpandEdge"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_BRIGHTNESSCONTRAST = "int BrightnessLevel; int ContrastLevel"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORBALANCE = "int CyanRed; int MagentaGreen; int YellowBlue"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORCURVE = "int Adjustment; int Channel; int AdjustValue"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORLUT = "byte LutB[256]; byte LutG[256]; byte LutR[256]; byte LutA[256]"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_HUESATURATIONLIGHTNESS = "int HueLevel; int SaturationLevel; int LightnessLevel"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_LEVELS = "int Highlight; int Midtone; int Shadow"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_REDEYECORRECTION = "uint NumberOfAreas; ptr Areas"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_SHARPEN = "float Radius; float Amount"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_TINT = "int Hue; int Amount"
GLOBAL CONST $TAGGDIPBITMAPDATA = "uint Width;uint Height;int Stride;int Format;ptr Scan0;uint_ptr Reserved"
GLOBAL CONST $TAGGDIPCOLORMATRIX = "float m[25]"
GLOBAL CONST $TAGGDIPENCODERPARAM = "struct;byte GUID[16];ulong NumberOfValues;ulong Type;ptr Values;endstruct"
GLOBAL CONST $TAGGDIPENCODERPARAMS = "uint Count;" & $TAGGDIPENCODERPARAM
GLOBAL CONST $TAGGDIPRECTF = "struct;float X;float Y;float Width;float Height;endstruct"
GLOBAL CONST $TAGGDIPSTARTUPINPUT = "uint Version;ptr Callback;bool NoThread;bool NoCodecs"
GLOBAL CONST $TAGGDIPSTARTUPOUTPUT = "ptr HookProc;ptr UnhookProc"
GLOBAL CONST $TAGGDIPIMAGECODECINFO = "byte CLSID[16];byte FormatID[16];ptr CodecName;ptr DllName;ptr FormatDesc;ptr FileExt;" & "ptr MimeType;dword Flags;dword Version;dword SigCount;dword SigSize;ptr SigPattern;ptr SigMask"
GLOBAL CONST $TAGGDIPPENCODERPARAMS = "uint Count;byte Params[1]"
GLOBAL CONST $TAGHDITEM = "uint Mask;int XY;ptr Text;handle hBMP;int TextMax;int Fmt;lparam Param;int Image;int Order;uint Type;ptr pFilter;uint State"
GLOBAL CONST $TAGNMHDDISPINFO = $TAGNMHDR & ";int Item;uint Mask;ptr Text;int TextMax;int Image;lparam lParam"
GLOBAL CONST $TAGNMHDFILTERBTNCLICK = $TAGNMHDR & ";int Item;" & $TAGRECT
GLOBAL CONST $TAGNMHEADER = $TAGNMHDR & ";int Item;int Button;ptr pItem"
GLOBAL CONST $TAGGETIPADDRESS = "byte Field4;byte Field3;byte Field2;byte Field1"
GLOBAL CONST $TAGNMIPADDRESS = $TAGNMHDR & ";int Field;int Value"
GLOBAL CONST $TAGLVFINDINFO = "struct;uint Flags;ptr Text;lparam Param;" & $TAGPOINT & ";uint Direction;endstruct"
GLOBAL CONST $TAGLVHITTESTINFO = $TAGPOINT & ";uint Flags;int Item;int SubItem;int iGroup"
GLOBAL CONST $TAGLVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;lparam Param;" & "int Indent;int GroupID;uint Columns;ptr pColumns;ptr piColFmt;int iGroup;endstruct"
GLOBAL CONST $TAGNMLISTVIEW = $TAGNMHDR & ";int Item;int SubItem;uint NewState;uint OldState;uint Changed;" & "struct;long ActionX;long ActionY;endstruct;lparam Param"
GLOBAL CONST $TAGNMLVCUSTOMDRAW = "struct;" & $TAGNMHDR & ";dword dwDrawStage;handle hdc;" & $TAGRECT & ";dword_ptr dwItemSpec;uint uItemState;lparam lItemlParam;endstruct" & ";dword clrText;dword clrTextBk;int iSubItem;dword dwItemType;dword clrFace;int iIconEffect;" & "int iIconPhase;int iPartID;int iStateID;struct;long TextLeft;long TextTop;long TextRight;long TextBottom;endstruct;uint uAlign"
GLOBAL CONST $TAGNMLVDISPINFO = $TAGNMHDR & ";" & $TAGLVITEM
GLOBAL CONST $TAGNMLVFINDITEM = $TAGNMHDR & ";int Start;" & $TAGLVFINDINFO
GLOBAL CONST $TAGNMLVGETINFOTIP = $TAGNMHDR & ";dword Flags;ptr Text;int TextMax;int Item;int SubItem;lparam lParam"
GLOBAL CONST $TAGNMITEMACTIVATE = $TAGNMHDR & ";int Index;int SubItem;uint NewState;uint OldState;uint Changed;" & $TAGPOINT & ";lparam lParam;uint KeyFlags"
GLOBAL CONST $TAGNMLVKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGNMLVSCROLL = $TAGNMHDR & ";int DX;int DY"
GLOBAL CONST $TAGMCHITTESTINFO = "uint Size;" & $TAGPOINT & ";uint Hit;" & $TAGSYSTEMTIME & ";" & $TAGRECT & ";int iOffset;int iRow;int iCol"
GLOBAL CONST $TAGMCMONTHRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds;short Span"
GLOBAL CONST $TAGMCRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds;short MinSet;short MaxSet"
GLOBAL CONST $TAGMCSELRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds"
GLOBAL CONST $TAGNMDAYSTATE = $TAGNMHDR & ";" & $TAGSYSTEMTIME & ";int DayState;ptr pDayState"
GLOBAL CONST $TAGNMSELCHANGE = $TAGNMHDR & ";struct;word BegYear;word BegMonth;word BegDOW;word BegDay;word BegHour;word BegMinute;word BegSecond;word BegMSeconds;endstruct;" & "struct;word EndYear;word EndMonth;word EndDOW;word EndDay;word EndHour;word EndMinute;word EndSecond;word EndMSeconds;endstruct"
GLOBAL CONST $TAGNMOBJECTNOTIFY = $TAGNMHDR & ";int Item;ptr piid;ptr pObject;long Result;dword dwFlags"
GLOBAL CONST $TAGNMTCKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGTVITEM = "struct;uint Mask;handle hItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;int SelectedImage;" & "int Children;lparam Param;endstruct"
GLOBAL CONST $TAGTVITEMEX = "struct;" & $TAGTVITEM & ";int Integral;uint uStateEx;hwnd hwnd;int iExpandedImage;int iReserved;endstruct"
GLOBAL CONST $TAGNMTREEVIEW = $TAGNMHDR & ";uint Action;" & "struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;" & "ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;" & "struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;" & "ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;" & "struct;long PointX;long PointY;endstruct"
GLOBAL CONST $TAGNMTVCUSTOMDRAW = "struct;" & $TAGNMHDR & ";dword DrawStage;handle HDC;" & $TAGRECT & ";dword_ptr ItemSpec;uint ItemState;lparam ItemParam;endstruct" & ";dword ClrText;dword ClrTextBk;int Level"
GLOBAL CONST $TAGNMTVDISPINFO = $TAGNMHDR & ";" & $TAGTVITEM
GLOBAL CONST $TAGNMTVGETINFOTIP = $TAGNMHDR & ";ptr Text;int TextMax;handle hItem;lparam lParam"
GLOBAL CONST $TAGNMTVITEMCHANGE = $TAGNMHDR & ";uint Changed;handle hItem;uint StateNew;uint StateOld;lparam lParam;"
GLOBAL CONST $TAGTVHITTESTINFO = $TAGPOINT & ";uint Flags;handle Item"
GLOBAL CONST $TAGNMTVKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGNMMOUSE = $TAGNMHDR & ";dword_ptr ItemSpec;dword_ptr ItemData;" & $TAGPOINT & ";lparam HitInfo"
GLOBAL CONST $TAGTOKEN_PRIVILEGES = "dword Count;align 4;int64 LUID;dword Attributes"
GLOBAL CONST $TAGIMAGEINFO = "handle hBitmap;handle hMask;int Unused1;int Unused2;" & $TAGRECT
GLOBAL CONST $TAGMENUINFO = "dword Size;INT Mask;dword Style;uint YMax;handle hBack;dword ContextHelpID;ulong_ptr MenuData"
GLOBAL CONST $TAGMENUITEMINFO = "uint Size;uint Mask;uint Type;uint State;uint ID;handle SubMenu;handle BmpChecked;handle BmpUnchecked;" & "ulong_ptr ItemData;ptr TypeData;uint CCH;handle BmpItem"
GLOBAL CONST $TAGREBARBANDINFO = "uint cbSize;uint fMask;uint fStyle;dword clrFore;dword clrBack;ptr lpText;uint cch;" & "int iImage;hwnd hwndChild;uint cxMinChild;uint cyMinChild;uint cx;handle hbmBack;uint wID;uint cyChild;uint cyMaxChild;" & "uint cyIntegral;uint cxIdeal;lparam lParam;uint cxHeader" & ((@OSVERSION = "WIN_XP") ? "" : ";" & $TAGRECT & ";uint uChevronState")
GLOBAL CONST $TAGNMREBARAUTOBREAK = $TAGNMHDR & ";uint uBand;uint wID;lparam lParam;uint uMsg;uint fStyleCurrent;bool fAutoBreak"
GLOBAL CONST $TAGNMRBAUTOSIZE = $TAGNMHDR & ";bool fChanged;" & "struct;long TargetLeft;long TargetTop;long TargetRight;long TargetBottom;endstruct;" & "struct;long ActualLeft;long ActualTop;long ActualRight;long ActualBottom;endstruct"
GLOBAL CONST $TAGNMREBAR = $TAGNMHDR & ";dword dwMask;uint uBand;uint fStyle;uint wID;lparam lParam"
GLOBAL CONST $TAGNMREBARCHEVRON = $TAGNMHDR & ";uint uBand;uint wID;lparam lParam;" & $TAGRECT & ";lparam lParamNM"
GLOBAL CONST $TAGNMREBARCHILDSIZE = $TAGNMHDR & ";uint uBand;uint wID;" & "struct;long CLeft;long CTop;long CRight;long CBottom;endstruct;" & "struct;long BLeft;long BTop;long BRight;long BBottom;endstruct"
GLOBAL CONST $TAGCOLORSCHEME = "dword Size;dword BtnHighlight;dword BtnShadow"
GLOBAL CONST $TAGNMTOOLBAR = $TAGNMHDR & ";int iItem;" & "struct;int iBitmap;int idCommand;byte fsState;byte fsStyle;dword_ptr dwData;int_ptr iString;endstruct" & ";int cchText;ptr pszText;" & $TAGRECT
GLOBAL CONST $TAGNMTBHOTITEM = $TAGNMHDR & ";int idOld;int idNew;dword dwFlags"
GLOBAL CONST $TAGTBBUTTON = "int Bitmap;int Command;byte State;byte Style;dword_ptr Param;int_ptr String"
GLOBAL CONST $TAGTBBUTTONINFO = "uint Size;dword Mask;int Command;int Image;byte State;byte Style;word CX;dword_ptr Param;ptr Text;int TextMax"
GLOBAL CONST $TAGNETRESOURCE = "dword Scope;dword Type;dword DisplayType;dword Usage;ptr LocalName;ptr RemoteName;ptr Comment;ptr Provider"
GLOBAL CONST $TAGOVERLAPPED = "ulong_ptr Internal;ulong_ptr InternalHigh;struct;dword Offset;dword OffsetHigh;endstruct;handle hEvent"
GLOBAL CONST $TAGOPENFILENAME = "dword StructSize;hwnd hwndOwner;handle hInstance;ptr lpstrFilter;ptr lpstrCustomFilter;" & "dword nMaxCustFilter;dword nFilterIndex;ptr lpstrFile;dword nMaxFile;ptr lpstrFileTitle;dword nMaxFileTitle;" & "ptr lpstrInitialDir;ptr lpstrTitle;dword Flags;word nFileOffset;word nFileExtension;ptr lpstrDefExt;lparam lCustData;" & "ptr lpfnHook;ptr lpTemplateName;ptr pvReserved;dword dwReserved;dword FlagsEx"
GLOBAL CONST $TAGBITMAPINFOHEADER = "struct;dword biSize;long biWidth;long biHeight;word biPlanes;word biBitCount;" & "dword biCompression;dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;endstruct"
GLOBAL CONST $TAGBITMAPINFO = $TAGBITMAPINFOHEADER & ";dword biRGBQuad[1]"
GLOBAL CONST $TAGBLENDFUNCTION = "byte Op;byte Flags;byte Alpha;byte Format"
GLOBAL CONST $TAGGUID = "struct;ulong Data1;ushort Data2;ushort Data3;byte Data4[8];endstruct"
GLOBAL CONST $TAGWINDOWPLACEMENT = "uint length;uint flags;uint showCmd;long ptMinPosition[2];long ptMaxPosition[2];long rcNormalPosition[4]"
GLOBAL CONST $TAGWINDOWPOS = "hwnd hWnd;hwnd InsertAfter;int X;int Y;int CX;int CY;uint Flags"
GLOBAL CONST $TAGSCROLLINFO = "uint cbSize;uint fMask;int nMin;int nMax;uint nPage;int nPos;int nTrackPos"
GLOBAL CONST $TAGSCROLLBARINFO = "dword cbSize;" & $TAGRECT & ";int dxyLineButton;int xyThumbTop;" & "int xyThumbBottom;int reserved;dword rgstate[6]"
GLOBAL CONST $TAGLOGFONT = "struct;long Height;long Width;long Escapement;long Orientation;long Weight;byte Italic;byte Underline;" & "byte Strikeout;byte CharSet;byte OutPrecision;byte ClipPrecision;byte Quality;byte PitchAndFamily;wchar FaceName[32];endstruct"
GLOBAL CONST $TAGKBDLLHOOKSTRUCT = "dword vkCode;dword scanCode;dword flags;dword time;ulong_ptr dwExtraInfo"
GLOBAL CONST $TAGPROCESS_INFORMATION = "handle hProcess;handle hThread;dword ProcessID;dword ThreadID"
GLOBAL CONST $TAGSTARTUPINFO = "dword Size;ptr Reserved1;ptr Desktop;ptr Title;dword X;dword Y;dword XSize;dword YSize;dword XCountChars;" & "dword YCountChars;dword FillAttribute;dword Flags;word ShowWindow;word Reserved2;ptr Reserved3;handle StdInput;" & "handle StdOutput;handle StdError"
GLOBAL CONST $TAGSECURITY_ATTRIBUTES = "dword Length;ptr Descriptor;bool InheritHandle"
GLOBAL CONST $TAGWIN32_FIND_DATA = "dword dwFileAttributes;dword ftCreationTime[2];dword ftLastAccessTime[2];dword ftLastWriteTime[2];dword nFileSizeHigh;dword nFileSizeLow;dword dwReserved0;dword dwReserved1;wchar cFileName[260];wchar cAlternateFileName[14]"
GLOBAL CONST $TAGTEXTMETRIC = "long tmHeight;long tmAscent;long tmDescent;long tmInternalLeading;long tmExternalLeading;" & "long tmAveCharWidth;long tmMaxCharWidth;long tmWeight;long tmOverhang;long tmDigitizedAspectX;long tmDigitizedAspectY;" & "wchar tmFirstChar;wchar tmLastChar;wchar tmDefaultChar;wchar tmBreakChar;byte tmItalic;byte tmUnderlined;byte tmStruckOut;" & "byte tmPitchAndFamily;byte tmCharSet"
GLOBAL CONST $MB_OK = 0
GLOBAL CONST $MB_OKCANCEL = 1
GLOBAL CONST $MB_ABORTRETRYIGNORE = 2
GLOBAL CONST $MB_YESNOCANCEL = 3
GLOBAL CONST $MB_YESNO = 4
GLOBAL CONST $MB_RETRYCANCEL = 5
GLOBAL CONST $MB_CANCELTRYCONTINUE = 6
GLOBAL CONST $MB_HELP = 16384
GLOBAL CONST $MB_ICONNONE = 0
GLOBAL CONST $MB_ICONSTOP = 16
GLOBAL CONST $MB_ICONERROR = 16
GLOBAL CONST $MB_ICONHAND = 16
GLOBAL CONST $MB_ICONQUESTION = 32
GLOBAL CONST $MB_ICONEXCLAMATION = 48
GLOBAL CONST $MB_ICONWARNING = 48
GLOBAL CONST $MB_ICONINFORMATION = 64
GLOBAL CONST $MB_ICONASTERISK = 64
GLOBAL CONST $MB_USERICON = 128
GLOBAL CONST $MB_DEFBUTTON1 = 0
GLOBAL CONST $MB_DEFBUTTON2 = 256
GLOBAL CONST $MB_DEFBUTTON3 = 512
GLOBAL CONST $MB_DEFBUTTON4 = 768
GLOBAL CONST $MB_APPLMODAL = 0
GLOBAL CONST $MB_SYSTEMMODAL = 4096
GLOBAL CONST $MB_TASKMODAL = 8192
GLOBAL CONST $MB_DEFAULT_DESKTOP_ONLY = 131072
GLOBAL CONST $MB_RIGHT = 524288
GLOBAL CONST $MB_RTLREADING = 1048576
GLOBAL CONST $MB_SETFOREGROUND = 65536
GLOBAL CONST $MB_TOPMOST = 262144
GLOBAL CONST $MB_SERVICE_NOTIFICATION = 2097152
GLOBAL CONST $MB_RIGHTJUSTIFIED = $MB_RIGHT
GLOBAL CONST $IDTIMEOUT = -1
GLOBAL CONST $IDOK = 1
GLOBAL CONST $IDCANCEL = 2
GLOBAL CONST $IDABORT = 3
GLOBAL CONST $IDRETRY = 4
GLOBAL CONST $IDIGNORE = 5
GLOBAL CONST $IDYES = 6
GLOBAL CONST $IDNO = 7
GLOBAL CONST $IDCLOSE = 8
GLOBAL CONST $IDHELP = 9
GLOBAL CONST $IDTRYAGAIN = 10
GLOBAL CONST $IDCONTINUE = 11
GLOBAL CONST $STR_NOCASESENSE = 0
GLOBAL CONST $STR_CASESENSE = 1
GLOBAL CONST $STR_NOCASESENSEBASIC = 2
GLOBAL CONST $STR_STRIPLEADING = 1
GLOBAL CONST $STR_STRIPTRAILING = 2
GLOBAL CONST $STR_STRIPSPACES = 4
GLOBAL CONST $STR_STRIPALL = 8
GLOBAL CONST $STR_CHRSPLIT = 0
GLOBAL CONST $STR_ENTIRESPLIT = 1
GLOBAL CONST $STR_NOCOUNT = 2
GLOBAL CONST $STR_REGEXPMATCH = 0
GLOBAL CONST $STR_REGEXPARRAYMATCH = 1
GLOBAL CONST $STR_REGEXPARRAYFULLMATCH = 2
GLOBAL CONST $STR_REGEXPARRAYGLOBALMATCH = 3
GLOBAL CONST $STR_REGEXPARRAYGLOBALFULLMATCH = 4
GLOBAL CONST $STR_ENDISSTART = 0
GLOBAL CONST $STR_ENDNOTSTART = 1
GLOBAL CONST $SB_ANSI = 1
GLOBAL CONST $SB_UTF16LE = 2
GLOBAL CONST $SB_UTF16BE = 3
GLOBAL CONST $SB_UTF8 = 4
GLOBAL CONST $SE_UTF16 = 0
GLOBAL CONST $SE_ANSI = 1
GLOBAL CONST $SE_UTF8 = 2
GLOBAL CONST $STR_UTF16 = 0
GLOBAL CONST $STR_UCS2 = 1
#Region Global Variables and Constants
	GLOBAL CONST $FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
	GLOBAL CONST $FORMAT_MESSAGE_IGNORE_INSERTS = 512
	GLOBAL CONST $FORMAT_MESSAGE_FROM_STRING = 1024
	GLOBAL CONST $FORMAT_MESSAGE_FROM_HMODULE = 2048
	GLOBAL CONST $FORMAT_MESSAGE_FROM_SYSTEM = 4096
	GLOBAL CONST $FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192
#EndRegion Global Variables and Constants
FUNC _WINAPI_BEEP($IFREQ = 500, $IDURATION = 1000)
	LOCAL $ACALL = DLLCALL("kernel32.dll", "bool", "Beep", "dword", $IFREQ, "dword", $IDURATION)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
	RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_FORMATMESSAGE($IFLAGS, $PSOURCE, $IMESSAGEID, $ILANGUAGEID, BYREF $PBUFFER, $ISIZE, $VARGUMENTS)
	LOCAL $SBUFFERTYPE = "struct*"
	IF ISSTRING($PBUFFER) THEN $SBUFFERTYPE = "wstr"
	LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "FormatMessageW", "dword", $IFLAGS, "struct*", $PSOURCE, "dword", $IMESSAGEID, "dword", $ILANGUAGEID, $SBUFFERTYPE, $PBUFFER, "dword", $ISIZE, "ptr", $VARGUMENTS)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
	IF NOT $ACALL[0] THEN RETURN SETERROR(10, _WINAPI_GETLASTERROR(), 0)
	IF $SBUFFERTYPE = "wstr" THEN $PBUFFER = $ACALL[5]
	RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_GETERRORMESSAGE($ICODE, $ILANGUAGE = 0, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "FormatMessageW", "dword", BITOR($FORMAT_MESSAGE_FROM_SYSTEM, $FORMAT_MESSAGE_IGNORE_INSERTS), "ptr", 0, "dword", $ICODE, "dword", $ILANGUAGE, "wstr", "", "dword", 4096, "ptr", 0)
	IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(@ERROR, @EXTENDED, "")
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, STRINGREGEXPREPLACE($ACALL[5], "[" & @LF & "," & @CR & "]*\Z", ""))
ENDFUNC
FUNC _WINAPI_GETLASTERROR(CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "GetLastError")
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, $ACALL[0])
ENDFUNC
FUNC _WINAPI_GETLASTERRORMESSAGE(CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	LOCAL $ILASTERROR = _WINAPI_GETLASTERROR()
	LOCAL $TBUFFERPTR = DLLSTRUCTCREATE("ptr")
	LOCAL $NCOUNT = _WINAPI_FORMATMESSAGE(BITOR($FORMAT_MESSAGE_ALLOCATE_BUFFER, $FORMAT_MESSAGE_FROM_SYSTEM, $FORMAT_MESSAGE_IGNORE_INSERTS), 0, $ILASTERROR, 0, $TBUFFERPTR, 0, 0)
	IF @ERROR THEN RETURN SETERROR(-@ERROR, @EXTENDED, "")
	LOCAL $STEXT = ""
	LOCAL $PBUFFER = DLLSTRUCTGETDATA($TBUFFERPTR, 1)
	IF $PBUFFER THEN
		IF $NCOUNT > 0 THEN
			LOCAL $TBUFFER = DLLSTRUCTCREATE("wchar[" & ($NCOUNT + 1) & "]", $PBUFFER)
			$STEXT = DLLSTRUCTGETDATA($TBUFFER, 1)
			IF STRINGRIGHT($STEXT, 2) = @CRLF THEN $STEXT = STRINGTRIMRIGHT($STEXT, 2)
		ENDIF
		DLLCALL("kernel32.dll", "handle", "LocalFree", "handle", $PBUFFER)
	ENDIF
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, $STEXT)
ENDFUNC
FUNC _WINAPI_MESSAGEBEEP($ITYPE = 1)
	LOCAL $ISOUND
	SWITCH $ITYPE
		CASE 1
			$ISOUND = 0
		CASE 2
			$ISOUND = 16
		CASE 3
			$ISOUND = 32
		CASE 4
			$ISOUND = 48
		CASE 5
			$ISOUND = 64
		CASE ELSE
			$ISOUND = -1
	ENDSWITCH
	LOCAL $ACALL = DLLCALL("user32.dll", "bool", "MessageBeep", "uint", $ISOUND)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
	RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_MSGBOX($IFLAGS, $STITLE, $STEXT)
	BLOCKINPUT(0)
	MSGBOX($IFLAGS, $STITLE, $STEXT & "      ")
ENDFUNC
FUNC _WINAPI_SETLASTERROR($IERRORCODE, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	DLLCALL("kernel32.dll", "none", "SetLastError", "dword", $IERRORCODE)
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, NULL)
ENDFUNC
FUNC _WINAPI_SHOWERROR($STEXT, $BEXIT = TRUE)
	BLOCKINPUT(0)
	MSGBOX($MB_SYSTEMMODAL, "Error", $STEXT & "      ")
	IF $BEXIT THEN EXIT
ENDFUNC
FUNC _WINAPI_SHOWLASTERROR($STEXT = "", $BABORT = FALSE, $ILANGUAGE = 0, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	LOCAL $SERROR
	LOCAL $ILASTERROR = _WINAPI_GETLASTERROR()
	WHILE 1
		$SERROR = _WINAPI_GETERRORMESSAGE($ILASTERROR, $ILANGUAGE)
		IF @ERROR AND $ILANGUAGE THEN
			$ILANGUAGE = 0
		ELSE
			EXITLOOP
		ENDIF
	WEND
	IF STRINGSTRIPWS($STEXT, $STR_STRIPLEADING + $STR_STRIPTRAILING) THEN
		$STEXT &= @CRLF & @CRLF
	ELSE
		$STEXT = ""
	ENDIF
	_WINAPI_MSGBOX(BITOR(262144, BITSHIFT(16, -2 * (NOT $ILASTERROR))), $ILASTERROR, $STEXT & $SERROR)
	IF $ILASTERROR THEN
		_WINAPI_SETLASTERROR($ILASTERROR)
		IF $BABORT THEN
			EXIT $ILASTERROR
		ENDIF
	ENDIF
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC _WINAPI_SHOWMSG($STEXT)
	_WINAPI_MSGBOX($MB_SYSTEMMODAL, "Information", $STEXT)
ENDFUNC
FUNC __COMERRORFORMATING(BYREF $OCOMERROR, $SPREFIX = @TAB)
	LOCAL CONST $STR_STRIPTRAILING = 2
	LOCAL $SERROR = "COM Error encountered in " & @SCRIPTNAME & " (" & $OCOMERROR.Scriptline & ") :" & @CRLF & $SPREFIX & "Number        " & @TAB & "= 0x" & HEX($OCOMERROR.Number, 8) & " (" & $OCOMERROR.Number & ")" & @CRLF & $SPREFIX & "WinDescription" & @TAB & "= " & STRINGSTRIPWS($OCOMERROR.WinDescription, $STR_STRIPTRAILING) & @CRLF & $SPREFIX & "Description   " & @TAB & "= " & STRINGSTRIPWS($OCOMERROR.Description, $STR_STRIPTRAILING) & @CRLF & $SPREFIX & "Source        " & @TAB & "= " & $OCOMERROR.Source & @CRLF & $SPREFIX & "HelpFile      " & @TAB & "= " & $OCOMERROR.HelpFile & @CRLF & $SPREFIX & "HelpContext   " & @TAB & "= " & $OCOMERROR.HelpContext & @CRLF & $SPREFIX & "LastDllError  " & @TAB & "= " & $OCOMERROR.LastDllError & @CRLF & $SPREFIX & "Retcode       " & @TAB & "= 0x" & HEX($OCOMERROR.retcode)
	RETURN $SERROR
ENDFUNC
GLOBAL CONST $__MISCCONSTANT_CC_ANYCOLOR = 256
GLOBAL CONST $__MISCCONSTANT_CC_FULLOPEN = 2
GLOBAL CONST $__MISCCONSTANT_CC_RGBINIT = 1
GLOBAL CONST $TAGCHOOSECOLOR = "dword Size;hwnd hWndOwnder;handle hInstance;dword rgbResult;ptr CustColors;dword Flags;lparam lCustData;" & "ptr lpfnHook;ptr lpTemplateName"
GLOBAL CONST $TAGCHOOSEFONT = "dword Size;hwnd hWndOwner;handle hDC;ptr LogFont;int PointSize;dword Flags;dword rgbColors;lparam CustData;" & "ptr fnHook;ptr TemplateName;handle hInstance;ptr szStyle;word FontType;int SizeMin;int SizeMax"
FUNC _CHOOSECOLOR($VRETURNTYPE = 0, $ICOLORREF = 0, $IREFTYPE = 0, $HWNDOWNDER = 0)
	LOCAL $TAGCUSTCOLORS = "dword[16]"
	LOCAL $TCHOOSE = DLLSTRUCTCREATE($TAGCHOOSECOLOR)
	LOCAL STATIC $TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
	LOCAL $IRETURNTYPE, $VRETURN
	IF $VRETURNTYPE = -9 OR $VRETURNTYPE = -10 THEN
		LOCAL $A_TCC = __CHOOSECOLOR_STRUCTTOARRAY($TCC)
		$A_TCC[0] = -1
		IF $VRETURNTYPE = -10 THEN $TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
		RETURN $A_TCC
	ELSEIF $VRETURNTYPE > 9 THEN
		$TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
		$IRETURNTYPE = $VRETURNTYPE - 10
	ELSEIF ISARRAY($VRETURNTYPE) THEN
		IF UBOUND($VRETURNTYPE, $UBOUND_ROWS) = 17 AND UBOUND($VRETURNTYPE, $UBOUND_DIMENSIONS) = 1 THEN
			FOR $N = 1 TO 16
				DLLSTRUCTSETDATA($TCC, 1, $VRETURNTYPE[$N], $N)
			NEXT
			IF $VRETURNTYPE[0] = -9 THEN
				$VRETURNTYPE[0] = 0
				RETURN $VRETURNTYPE
			ENDIF
			IF $VRETURNTYPE[0] > 9 THEN $VRETURNTYPE[0] -= 10
			$IRETURNTYPE = $VRETURNTYPE[0]
		ELSE
			RETURN SETERROR(-5, 0, -1)
		ENDIF
	ELSE
		$IRETURNTYPE = $VRETURNTYPE
	ENDIF
	IF $IRETURNTYPE < 0 OR $IRETURNTYPE > 2 THEN
		IF ISARRAY($VRETURNTYPE) THEN
			$VRETURNTYPE[0] = -1
			RETURN SETERROR(-4, 0, $VRETURNTYPE)
		ENDIF
		RETURN SETERROR(-4, 0, -1)
	ENDIF
	IF $IREFTYPE = 1 THEN
		$ICOLORREF = INT($ICOLORREF)
	ELSEIF $IREFTYPE = 2 THEN
		$ICOLORREF = HEX(STRING($ICOLORREF), 6)
		$ICOLORREF = "0x" & STRINGMID($ICOLORREF, 5, 2) & STRINGMID($ICOLORREF, 3, 2) & STRINGMID($ICOLORREF, 1, 2)
	ENDIF
	DLLSTRUCTSETDATA($TCHOOSE, "Size", DLLSTRUCTGETSIZE($TCHOOSE))
	DLLSTRUCTSETDATA($TCHOOSE, "hWndOwnder", $HWNDOWNDER)
	DLLSTRUCTSETDATA($TCHOOSE, "rgbResult", $ICOLORREF)
	DLLSTRUCTSETDATA($TCHOOSE, "CustColors", DLLSTRUCTGETPTR($TCC))
	DLLSTRUCTSETDATA($TCHOOSE, "Flags", BITOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT))
	LOCAL $ARESULT = DLLCALL("comdlg32.dll", "bool", "ChooseColor", "struct*", $TCHOOSE)
	LOCAL $IERROR = @ERROR
	IF @ERROR THEN
		LOCAL $IEXTENDED = @EXTENDED
		IF ISARRAY($VRETURNTYPE) THEN
			$VRETURNTYPE[0] = -1
			RETURN SETERROR($IERROR, $IEXTENDED, $VRETURNTYPE)
		ENDIF
		RETURN SETERROR($IERROR, $IEXTENDED, -1)
	ENDIF
	IF $ARESULT[0] = 0 THEN
		IF ISARRAY($VRETURNTYPE) THEN
			$VRETURNTYPE[0] = -1
			RETURN SETERROR(-3, 0, $VRETURNTYPE)
		ENDIF
		RETURN SETERROR(-3, 0, -1)
	ENDIF
	LOCAL $SCOLOR_PICKED = DLLSTRUCTGETDATA($TCHOOSE, "rgbResult")
	IF $IRETURNTYPE = 1 THEN
		$VRETURN = "0x" & HEX(STRING($SCOLOR_PICKED), 6)
	ELSEIF $IRETURNTYPE = 2 THEN
		$SCOLOR_PICKED = HEX(STRING($SCOLOR_PICKED), 6)
		$VRETURN = "0x" & STRINGMID($SCOLOR_PICKED, 5, 2) & STRINGMID($SCOLOR_PICKED, 3, 2) & STRINGMID($SCOLOR_PICKED, 1, 2)
	ELSE
		$VRETURN = $SCOLOR_PICKED
	ENDIF
	IF ISARRAY($VRETURNTYPE) THEN
		$VRETURNTYPE = __CHOOSECOLOR_STRUCTTOARRAY($TCC)
		$VRETURNTYPE[0] = $VRETURN
		RETURN $VRETURNTYPE
	ENDIF
	RETURN $VRETURN
ENDFUNC
FUNC __CHOOSECOLOR_STRUCTTOARRAY(BYREF $TSTRUCT)
	LOCAL $AARRAY[17]
	FOR $N = 1 TO 16
		$AARRAY[$N] = DLLSTRUCTGETDATA($TSTRUCT, 1, $N)
	NEXT
	RETURN $AARRAY
ENDFUNC
FUNC _CHOOSEFONT($SFONTNAME = "Courier New", $IPOINTSIZE = 10, $IFONTCOLORREF = 0, $IFONTWEIGHT = 0, $BITALIC = FALSE, $BUNDERLINE = FALSE, $BSTRIKETHRU = FALSE, $HWNDOWNER = 0)
	LOCAL $IITALIC = 0, $IUNDERLINE = 0, $ISTRIKEOUT = 0
	$IFONTCOLORREF = BITOR(BITSHIFT(BITAND($IFONTCOLORREF, 255), -16), BITAND($IFONTCOLORREF, 65280), BITSHIFT(BITAND($IFONTCOLORREF, 16711680), 16))
	LOCAL $HDC = __MISC_GETDC(0)
	LOCAL $IHEIGHT = ROUND(($IPOINTSIZE * __MISC_GETDEVICECAPS($HDC, $LOGPIXELSX)) / 72, 0)
	__MISC_RELEASEDC(0, $HDC)
	LOCAL $TCHOOSEFONT = DLLSTRUCTCREATE($TAGCHOOSEFONT)
	LOCAL $TLOGFONT = DLLSTRUCTCREATE($TAGLOGFONT)
	DLLSTRUCTSETDATA($TCHOOSEFONT, "Size", DLLSTRUCTGETSIZE($TCHOOSEFONT))
	DLLSTRUCTSETDATA($TCHOOSEFONT, "hWndOwner", $HWNDOWNER)
	DLLSTRUCTSETDATA($TCHOOSEFONT, "LogFont", DLLSTRUCTGETPTR($TLOGFONT))
	DLLSTRUCTSETDATA($TCHOOSEFONT, "PointSize", $IPOINTSIZE)
	DLLSTRUCTSETDATA($TCHOOSEFONT, "Flags", BITOR($CF_SCREENFONTS, $CF_PRINTERFONTS, $CF_EFFECTS, $CF_INITTOLOGFONTSTRUCT, $CF_NOSCRIPTSEL))
	DLLSTRUCTSETDATA($TCHOOSEFONT, "rgbColors", $IFONTCOLORREF)
	DLLSTRUCTSETDATA($TCHOOSEFONT, "FontType", 0)
	DLLSTRUCTSETDATA($TLOGFONT, "Height", $IHEIGHT)
	DLLSTRUCTSETDATA($TLOGFONT, "Weight", $IFONTWEIGHT)
	DLLSTRUCTSETDATA($TLOGFONT, "Italic", $BITALIC)
	DLLSTRUCTSETDATA($TLOGFONT, "Underline", $BUNDERLINE)
	DLLSTRUCTSETDATA($TLOGFONT, "Strikeout", $BSTRIKETHRU)
	DLLSTRUCTSETDATA($TLOGFONT, "FaceName", $SFONTNAME)
	LOCAL $ACALL = DLLCALL("comdlg32.dll", "bool", "ChooseFontW", "struct*", $TCHOOSEFONT)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, -1)
	IF $ACALL[0] = 0 THEN RETURN SETERROR(-3, -3, -1)
	LOCAL $SFACENAME = DLLSTRUCTGETDATA($TLOGFONT, "FaceName")
	IF STRINGLEN($SFACENAME) = 0 AND STRINGLEN($SFONTNAME) > 0 THEN $SFACENAME = $SFONTNAME
	IF DLLSTRUCTGETDATA($TLOGFONT, "Italic") THEN $IITALIC = 2
	IF DLLSTRUCTGETDATA($TLOGFONT, "Underline") THEN $IUNDERLINE = 4
	IF DLLSTRUCTGETDATA($TLOGFONT, "Strikeout") THEN $ISTRIKEOUT = 8
	LOCAL $IATTRIBUTES = BITOR($IITALIC, $IUNDERLINE, $ISTRIKEOUT)
	LOCAL $ISIZE = DLLSTRUCTGETDATA($TCHOOSEFONT, "PointSize") / 10
	LOCAL $ICOLORREF = DLLSTRUCTGETDATA($TCHOOSEFONT, "rgbColors")
	LOCAL $IWEIGHT = DLLSTRUCTGETDATA($TLOGFONT, "Weight")
	LOCAL $SCOLOR_PICKED = HEX(STRING($ICOLORREF), 6)
	RETURN STRINGSPLIT($IATTRIBUTES & "," & $SFACENAME & "," & $ISIZE & "," & $IWEIGHT & "," & $ICOLORREF & "," & "0x" & $SCOLOR_PICKED & "," & "0x" & STRINGMID($SCOLOR_PICKED, 5, 2) & STRINGMID($SCOLOR_PICKED, 3, 2) & STRINGMID($SCOLOR_PICKED, 1, 2), ",")
ENDFUNC
FUNC _CLIPPUTFILE($SFILEPATH, $SDELIMITER = "|")
	LOCAL CONST $GMEM_MOVEABLE = 2, $CF_HDROP = 15
	$SFILEPATH &= $SDELIMITER & $SDELIMITER
	LOCAL $NGLOBMEMSIZE = 2 * (STRINGLEN($SFILEPATH) + 20)
	LOCAL $ACALL = DLLCALL("user32.dll", "bool", "OpenClipboard", "hwnd", 0)
	IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(@ERROR + 10, _WINAPI_GETLASTERROR(), FALSE)
	LOCAL $IERROR = 0, $ILASTERROR = 0
	$ACALL = DLLCALL("user32.dll", "bool", "EmptyClipboard")
	IF @ERROR OR NOT $ACALL[0] THEN
		$IERROR = @ERROR + 20
		$ILASTERROR = _WINAPI_GETLASTERROR()
	ELSE
		$ACALL = DLLCALL("kernel32.dll", "handle", "GlobalAlloc", "uint", $GMEM_MOVEABLE, "ulong_ptr", $NGLOBMEMSIZE)
		IF @ERROR OR NOT $ACALL[0] THEN
			$IERROR = @ERROR + 30
			$ILASTERROR = _WINAPI_GETLASTERROR()
		ELSE
			LOCAL $HGLOBAL = $ACALL[0]
			$ACALL = DLLCALL("kernel32.dll", "ptr", "GlobalLock", "handle", $HGLOBAL)
			IF @ERROR OR NOT $ACALL[0] THEN
				$IERROR = @ERROR + 40
				$ILASTERROR = _WINAPI_GETLASTERROR()
			ELSE
				LOCAL $HLOCK = $ACALL[0]
				LOCAL $TDROPFILES = DLLSTRUCTCREATE("dword pFiles;" & $TAGPOINT & ";bool fNC;bool fWide;wchar[" & STRINGLEN($SFILEPATH) + 1 & "]", $HLOCK)
				IF @ERROR THEN RETURN SETERROR(@ERROR + 50, 6, FALSE)
				LOCAL $TSTRUCT = DLLSTRUCTCREATE("dword;long;long;bool;bool")
				DLLSTRUCTSETDATA($TDROPFILES, "pFiles", DLLSTRUCTGETSIZE($TSTRUCT))
				DLLSTRUCTSETDATA($TDROPFILES, "X", 0)
				DLLSTRUCTSETDATA($TDROPFILES, "Y", 0)
				DLLSTRUCTSETDATA($TDROPFILES, "fNC", 0)
				DLLSTRUCTSETDATA($TDROPFILES, "fWide", 1)
				DLLSTRUCTSETDATA($TDROPFILES, 6, $SFILEPATH)
				FOR $I = 1 TO STRINGLEN($SFILEPATH)
					IF DLLSTRUCTGETDATA($TDROPFILES, 6, $I) = $SDELIMITER THEN DLLSTRUCTSETDATA($TDROPFILES, 6, CHR(0), $I)
				NEXT
				$ACALL = DLLCALL("user32.dll", "handle", "SetClipboardData", "uint", $CF_HDROP, "handle", $HGLOBAL)
				IF @ERROR OR NOT $ACALL[0] THEN
					$IERROR = @ERROR + 60
					$ILASTERROR = _WINAPI_GETLASTERROR()
				ENDIF
				$ACALL = DLLCALL("kernel32.dll", "bool", "GlobalUnlock", "handle", $HGLOBAL)
				IF(@ERROR OR NOT $ACALL[0]) AND NOT $IERROR AND _WINAPI_GETLASTERROR() THEN
					$IERROR = @ERROR + 80
					$ILASTERROR = _WINAPI_GETLASTERROR()
				ENDIF
			ENDIF
			$ACALL = DLLCALL("kernel32.dll", "ptr", "GlobalFree", "handle", $HGLOBAL)
			IF(@ERROR OR $ACALL[0]) AND NOT $IERROR THEN
				$IERROR = @ERROR + 90
				$ILASTERROR = _WINAPI_GETLASTERROR()
			ENDIF
		ENDIF
	ENDIF
	$ACALL = DLLCALL("user32.dll", "bool", "CloseClipboard")
	IF(@ERROR OR NOT $ACALL[0]) AND NOT $IERROR THEN RETURN SETERROR(@ERROR + 70, _WINAPI_GETLASTERROR(), FALSE)
	IF $IERROR THEN RETURN SETERROR($IERROR, $ILASTERROR, FALSE)
	RETURN TRUE
ENDFUNC
FUNC _MOUSETRAP($ILEFT = 0, $ITOP = 0, $IRIGHT = 0, $IBOTTOM = 0)
	LOCAL $ACALL
	IF $ILEFT = DEFAULT THEN $ILEFT = 0
	IF $ITOP = DEFAULT THEN $ITOP = 0
	IF $IRIGHT = DEFAULT THEN $IRIGHT = 0
	IF $IBOTTOM = DEFAULT THEN $IBOTTOM = 0
	IF @NUMPARAMS = 0 THEN
		$ACALL = DLLCALL("user32.dll", "bool", "ClipCursor", "ptr", 0)
		IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(1, _WINAPI_GETLASTERROR(), FALSE)
	ELSE
		IF @NUMPARAMS = 2 THEN
			$IRIGHT = $ILEFT + 1
			$IBOTTOM = $ITOP + 1
		ENDIF
		LOCAL $TRECT = DLLSTRUCTCREATE($TAGRECT)
		DLLSTRUCTSETDATA($TRECT, "Left", $ILEFT)
		DLLSTRUCTSETDATA($TRECT, "Top", $ITOP)
		DLLSTRUCTSETDATA($TRECT, "Right", $IRIGHT)
		DLLSTRUCTSETDATA($TRECT, "Bottom", $IBOTTOM)
		$ACALL = DLLCALL("user32.dll", "bool", "ClipCursor", "struct*", $TRECT)
		IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(2, _WINAPI_GETLASTERROR(), FALSE)
	ENDIF
	RETURN TRUE
ENDFUNC
FUNC _SINGLETON($SOCCURRENCENAME, $IFLAG = 0)
	LOCAL CONST $ERROR_ALREADY_EXISTS = 183
	LOCAL CONST $SECURITY_DESCRIPTOR_REVISION = 1
	LOCAL $TSECURITYATTRIBUTES = 0
	IF BITAND($IFLAG, 2) THEN
		LOCAL $TSECURITYDESCRIPTOR = DLLSTRUCTCREATE("byte;byte;word;ptr[4]")
		LOCAL $ACALL = DLLCALL("advapi32.dll", "bool", "InitializeSecurityDescriptor", "struct*", $TSECURITYDESCRIPTOR, "dword", $SECURITY_DESCRIPTOR_REVISION)
		IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
		IF $ACALL[0] THEN
			$ACALL = DLLCALL("advapi32.dll", "bool", "SetSecurityDescriptorDacl", "struct*", $TSECURITYDESCRIPTOR, "bool", 1, "ptr", 0, "bool", 0)
			IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
			IF $ACALL[0] THEN
				$TSECURITYATTRIBUTES = DLLSTRUCTCREATE($TAGSECURITY_ATTRIBUTES)
				DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 1, DLLSTRUCTGETSIZE($TSECURITYATTRIBUTES))
				DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 2, DLLSTRUCTGETPTR($TSECURITYDESCRIPTOR))
				DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 3, 0)
			ENDIF
		ENDIF
	ENDIF
	LOCAL $AHANDLE = DLLCALL("kernel32.dll", "handle", "CreateMutexW", "struct*", $TSECURITYATTRIBUTES, "bool", 1, "wstr", $SOCCURRENCENAME)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
	LOCAL $ALASTERROR = DLLCALL("kernel32.dll", "dword", "GetLastError")
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
	IF $ALASTERROR[0] = $ERROR_ALREADY_EXISTS THEN
		IF BITAND($IFLAG, 1) THEN
			DLLCALL("kernel32.dll", "bool", "CloseHandle", "handle", $AHANDLE[0])
			IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
			RETURN SETERROR($ALASTERROR[0], $ALASTERROR[0], 0)
		ELSE
			EXIT -1
		ENDIF
	ENDIF
	RETURN $AHANDLE[0]
ENDFUNC
FUNC _ISPRESSED($SHEXKEY, $VDLL = "user32.dll")
	LOCAL $ACALL = DLLCALL($VDLL, "short", "GetAsyncKeyState", "int", "0x" & $SHEXKEY)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
	RETURN BITAND($ACALL[0], 32768) <> 0
ENDFUNC
FUNC _VERSIONCOMPARE($SVERSION1, $SVERSION2)
	IF $SVERSION1 = $SVERSION2 THEN RETURN 0
	LOCAL $SSUBVERSION1 = "", $SSUBVERSION2 = ""
	IF STRINGISALPHA(STRINGRIGHT($SVERSION1, 1)) THEN
		$SSUBVERSION1 = STRINGRIGHT($SVERSION1, 1)
		$SVERSION1 = STRINGTRIMRIGHT($SVERSION1, 1)
	ENDIF
	IF STRINGISALPHA(STRINGRIGHT($SVERSION2, 1)) THEN
		$SSUBVERSION2 = STRINGRIGHT($SVERSION2, 1)
		$SVERSION2 = STRINGTRIMRIGHT($SVERSION2, 1)
	ENDIF
	LOCAL $AVERSION1 = STRINGSPLIT($SVERSION1, ".,"), $AVERSION2 = STRINGSPLIT($SVERSION2, ".,")
	LOCAL $IPARTDIFFERENCE = ($AVERSION1[0] - $AVERSION2[0])
	IF $IPARTDIFFERENCE < 0 THEN
		REDIM $AVERSION1[UBOUND($AVERSION2)]
		$AVERSION1[0] = UBOUND($AVERSION1) - 1
		FOR $I = (UBOUND($AVERSION1) - ABS($IPARTDIFFERENCE)) TO $AVERSION1[0]
			$AVERSION1[$I] = "0"
		NEXT
	ELSEIF $IPARTDIFFERENCE > 0 THEN
		REDIM $AVERSION2[UBOUND($AVERSION1)]
		$AVERSION2[0] = UBOUND($AVERSION2) - 1
		FOR $I = (UBOUND($AVERSION2) - ABS($IPARTDIFFERENCE)) TO $AVERSION2[0]
			$AVERSION2[$I] = "0"
		NEXT
	ENDIF
	FOR $I = 1 TO $AVERSION1[0]
		IF STRINGISDIGIT($AVERSION1[$I]) AND STRINGISDIGIT($AVERSION2[$I]) THEN
			IF NUMBER($AVERSION1[$I]) > NUMBER($AVERSION2[$I]) THEN
				RETURN SETEXTENDED(2, 1)
			ELSEIF NUMBER($AVERSION1[$I]) < NUMBER($AVERSION2[$I]) THEN
				RETURN SETEXTENDED(2, -1)
			ELSEIF $I = $AVERSION1[0] THEN
				IF $SSUBVERSION1 > $SSUBVERSION2 THEN
					RETURN SETEXTENDED(3, 1)
				ELSEIF $SSUBVERSION1 < $SSUBVERSION2 THEN
					RETURN SETEXTENDED(3, -1)
				ENDIF
			ENDIF
		ELSE
			IF $AVERSION1[$I] > $AVERSION2[$I] THEN
				RETURN SETEXTENDED(1, 1)
			ELSEIF $AVERSION1[$I] < $AVERSION2[$I] THEN
				RETURN SETEXTENDED(1, -1)
			ENDIF
		ENDIF
	NEXT
	RETURN SETEXTENDED(ABS($IPARTDIFFERENCE), 0)
ENDFUNC
FUNC __MISC_GETDC($HWND)
	LOCAL $ACALL = DLLCALL("user32.dll", "handle", "GetDC", "hwnd", $HWND)
	IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(1, _WINAPI_GETLASTERROR(), 0)
	RETURN $ACALL[0]
ENDFUNC
FUNC __MISC_GETDEVICECAPS($HDC, $IINDEX)
	LOCAL $ACALL = DLLCALL("gdi32.dll", "int", "GetDeviceCaps", "handle", $HDC, "int", $IINDEX)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
	RETURN $ACALL[0]
ENDFUNC
FUNC __MISC_RELEASEDC($HWND, $HDC)
	LOCAL $ACALL = DLLCALL("user32.dll", "int", "ReleaseDC", "hwnd", $HWND, "handle", $HDC)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
	RETURN $ACALL[0] <> 0
ENDFUNC
GLOBAL $VER_MAJOR = "50"
GLOBAL $VER_MINOR = "0"
GLOBAL $VER_REV = "0"
GLOBAL $HEU_VER = $VER_MAJOR & "." & $VER_MINOR & "." & $VER_REV
GLOBAL $HEU_MSGBOX = "HEU KMS Activator " & $HEU_VER
GLOBAL $HEU_KMS = "HKA"
GLOBAL $KMSHOST, $KMSPORT
GLOBAL $SCRIPTDIR = INIREAD(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Dir", "")
GLOBAL $SCRIPTNAME = INIREAD(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Name", "")
GLOBAL $TEMPFOLDER = INIREAD($SCRIPTDIR & "\Set.ini", "Tempfolder", "temp", "")
LOCAL $AARRAY_ENV = STRINGREGEXP($TEMPFOLDER, "%([^%]*?)%", 3)
IF ISARRAY($AARRAY_ENV) THEN
	LOCAL $TEMPFOLDER_ENV = STRINGREPLACE(ENVGET($AARRAY_ENV[0]), "\", "\\")
	$TEMPFOLDER = STRINGREGEXPREPLACE($TEMPFOLDER, "%([^%]*?)%", $TEMPFOLDER_ENV)
ENDIF
IF FILEEXISTS($TEMPFOLDER) = 1 THEN
	$FILEINSTDIR = $TEMPFOLDER & "\" & "_temp_heu168yyds"
ELSE
	$FILEINSTDIR = @TEMPDIR & "\" & "_temp_heu168yyds"
ENDIF
GLOBAL $HEU_DEBUG_TXT = "HEU" & $VER_MAJOR & $VER_MINOR & $VER_REV & "_Debug.txt"
GLOBAL $HEU_DEBUG = @TEMPDIR & "\" & $HEU_DEBUG_TXT
GLOBAL $HEU_DEBUG_SET
GLOBAL $LOGINST = INIREAD($SCRIPTDIR & "\Set.ini", "LogInst", "log", "")
IF FILEEXISTS($LOGINST) = 1 THEN
	$HEU_DEBUG = $LOGINST & "\" & $HEU_DEBUG_TXT
ENDIF
GLOBAL $SETENV = 'set "Path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SystemRoot\System32\WindowsPowerShell\v1.0\"'
GLOBAL $SYSPATH = @WINDOWSDIR & "\System32"
IF FILEEXISTS(@WINDOWSDIR & "\Sysnative\cmd.exe") THEN
	$SYSPATH = @WINDOWSDIR & "\Sysnative"
	$SETENV = 'set "Path=%SystemRoot%;%SystemRoot%\Sysnative;%SystemRoot%\Sysnative\Wbem;%SystemRoot\Sysnative\WindowsPowerShell\v1.0\;%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SystemRoot\System32\WindowsPowerShell\v1.0\"'
ENDIF
GLOBAL $CSCRIPT = $SYSPATH & "\cscript.exe"
GLOBAL $WMI_REP = $FILEINSTDIR & "\xml\wim.xml"
GLOBAL $USERAGREEMENT = "NO"
GLOBAL $OSARCH
IF @OSARCH = "X86" THEN
	$OSARCH = "x86"
ELSE
	LOCAL $PROCESSOR_ARCH = REGREAD("HKLM64\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PROCESSOR_ARCHITECTURE")
	IF @OSARCH = "X64" THEN $OSARCH = "x64"
	IF $PROCESSOR_ARCH = "AMD64" THEN $OSARCH = "x64"
	IF $PROCESSOR_ARCH = "ARM64" THEN $OSARCH = "ARM64"
	IF FILEEXISTS(@WINDOWSDIR & "\SysArm32\cmd.exe") THEN $OSARCH = "ARM64"
ENDIF
IF STRINGINSTR("0804 1004 1404 0004", @OSLANG) THEN
	GLOBAL $STATEMENT[5] = ["【免责声明】", "(1)本软件仅用于学习和研究Windows和Office的激活原理使用。如果使用Windows和Office,请前往微软正规渠道购买正版授权。", "(2)本软件完全免费,任何人不得用于商业用途,且下载后请务必于24小时内删除。任何违规使用造成的法律后果与本人无关。", "如果是付费获得,那么你肯定被骗了!!!", "务必接受上述条款才可继续使用,是否接受?"]
	GLOBAL $ERRORHELP[10] = ["WPA注册表错误,请在WinPE/WinRE下修复", "注册表删除成功", "文件删除成功", "注册表删除失败", "文件删除失败"]
ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) THEN
	GLOBAL $STATEMENT[5] = ["【免責聲明】", "(1)本軟件僅用於學習和研究Windows和Office的激活原理使用。如果使用Windows和Office,請前往微軟正規渠道購買正版授權。 ", "(2)本軟件完全免費,任何人不得用於商業用途,且下載後請務必於24小時內刪除。任何違規使用造成的法律后果與本人無關。", "如果是付費獲得,那麼你肯定被騙了!!! ", "務必接受上述條款才可繼續使用,是否接受? "]
ELSE
	GLOBAL $STATEMENT[5] = ["[Disclaimer]", "(1) This software is only used to learn and study the activation principles of Windows and Office. If you use Windows and Office, please go to the official Microsoft channels to purchase genuine licenses. ", " (2) This software is completely free, no one can use it for commercial purposes, and it must be deleted within 24 hours after downloading.Any legal sanctions caused by illegal use have nothing to do with me.", "If it is paid for, then you must have been cheated. ", "You must accept the above terms before you can continue to use it. Do you accept it? "]
ENDIF
GLOBAL $SLENIPARAMETER[3] = ["/?" & @TAB & "查看静默参数" & @CRLF & "" & "/smart" & @TAB & "智能激活" & @CRLF & "" & "/dig" & @TAB & "数字许可证激活Win10/11" & @CRLF & "" & "/k38" & @TAB & "激活Win10/11至2038年" & @CRLF & "" & "/lok" & @TAB & "添加KMS38保护" & @CRLF & "" & "/wts" & @TAB & "TSForge激活Windows(永久)" & @CRLF & "" & "/ots" & @TAB & "TSForge激活Office(永久)" & @CRLF & "" & "/oem" & @TAB & "OEM激活Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM模式1(默认)" & @CRLF & "" & "/od2" & @TAB & "OEM模式2" & @CRLF & "" & "/kwi" & @TAB & "使用KMS激活Windows(180天)" & @CRLF & "" & "/kof" & @TAB & "使用KMS激活Office(180天)" & @CRLF & "" & "/ohk" & @TAB & "使用Ohook激活Office(永久)" & @CRLF & "" & "/kd1" & @TAB & "KMS模式1(默认)" & @CRLF & "" & "/kd2" & @TAB & "KMS模式2" & @CRLF & "" & "/wxp" & @TAB & "激活Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail转化成Volume" & @CRLF & "" & "/ren" & @TAB & "安装自动续期功能" & @CRLF & "" & "/unr" & @TAB & "卸载自动续期功能" & @CRLF & "" & "/reb" & @TAB & "重启计算机" & @CRLF & "" & "/nologo" & @TAB & "使用静默参数时不显示logo", "/?" & @TAB & "查看靜默參數" & @CRLF & "" & "/smart" & @TAB & "智能激活" & @CRLF & "" & "/dig" & @TAB & "數字許可證激活Win10/11" & @CRLF & "" & "/k38" & @TAB & "激活Win10/11至2038年" & @CRLF & "" & "/lok" & @TAB & "添加KMS38保護" & @CRLF & "" & "/wts" & @TAB & "TSForge激活Windows(永久)" & @CRLF & "" & "/ots" & @TAB & "TSForge激活Office(永久)" & @CRLF & "" & "/oem" & @TAB & "OEM激活Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM模式1(預設)" & @CRLF & "" & "/od2" & @TAB & "OEM模式2" & @CRLF & "" & "/kwi" & @TAB & "使用KMS激活Windows(180天)" & @CRLF & "" & "/kof" & @TAB & "使用KMS激活Office(180天)" & @CRLF & "" & "/ohk" & @TAB & "使用Ohook激活Office(永久)" & @CRLF & "" & "/kd1" & @TAB & "KMS模式1(預設)" & @CRLF & "" & "/kd2" & @TAB & "KMS模式2" & @CRLF & "" & "/wxp" & @TAB & "激活Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail轉化成Volume" & @CRLF & "" & "/ren" & @TAB & "安裝自動續期功能" & @CRLF & "" & "/unr" & @TAB & "卸載自動續期功能" & @CRLF & "" & "/reb " & @TAB & "重啟計算機" & @CRLF & "" & "/nologo" & @TAB & "使用靜默參數時不顯示logo", "/?" & @TAB & "View the silent parameter" & @CRLF & "" & "/smart" & @TAB & "Smart activation" & @CRLF & "" & "/dig" & @TAB & "Digital license to activate Win10/11" & @CRLF & "" & "/k38" & @TAB & "Activate Win10/11 until 2038" & @CRLF & "" & "/lok" & @TAB & "Add KMS38 protection" & @CRLF & "" & "/wts" & @TAB & "Activate Windows with TSForge(Permantent)" & @CRLF & "" & "/ots" & @TAB & "Activate Office with TSForge(Permantent)" & @CRLF & "" & "/oem" & @TAB & "OEM activate Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM mode 1(default)" & @CRLF & "" & "/od2" & @TAB & "OEM mode 2" & @CRLF & "" & "/kwi" & @TAB & "Activate Windows with KMS(180 days)" & @CRLF & "" & "/kof" & @TAB & "Activate Office with KMS(180 days)" & @CRLF & "" & "/ohk" & @TAB & "Activate Office with Ohook(Permantent)" & @CRLF & "" & "/kd1" & @TAB & "KMS mode 1(default)" & @CRLF & "" & "/kd2" & @TAB & "KMS mode 2" & @CRLF & "" & "/wxp" & @TAB & "Activate Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail to Volume" & @CRLF & "" & "/ren" & @TAB & "Install KMS Renewal" & @CRLF & "" & "/unr" & @TAB & "Uninstall KMS Renewal" & @CRLF & "" & "/reb" & @TAB & "Reboot Computer" & @CRLF & "" & "/nologo" & @TAB & "Not display logo of this software"]
FUNC _RUN_BAT_GET_ECHO($COMMAND)
	LOCAL $IPID = RUN(@COMSPEC & " /c " & $COMMAND, @SCRIPTDIR, @SW_HIDE, 8)
	IF @ERROR = 0 THEN
		PROCESSWAITCLOSE($IPID)
		LOCAL $RESULT = BINARYTOSTRING(STDOUTREAD($IPID, 1, 1))
		RETURN $RESULT
	ENDIF
ENDFUNC
FUNC _RUN_BAT_GET_ECHO_WS($COMMAND)
	LOCAL $IPID = RUN(@COMSPEC & " /c " & $COMMAND & " 4>nul 3>nul 2>nul >nul && echo=1||echo=-1", @SCRIPTDIR, @SW_HIDE, 8)
	IF @ERROR = 0 THEN
		PROCESSWAITCLOSE($IPID)
		LOCAL $RESULT = BINARYTOSTRING(STDOUTREAD($IPID, 1, 1))
		IF $RESULT = 1 THEN
			RETURN 1
		ELSE
			RETURN -1
		ENDIF
	ELSE
		RETURN -2
	ENDIF
ENDFUNC
FUNC _ERR_RUN_BAT($A, $B)
	LOCAL $ERR = _RUN_BAT_GET_ECHO($A)
	LOCAL $ERROR
	IF $ERR = 0 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] " & $B)
		RETURN "succeed"
	ELSE
		$ERROR = "0x" & HEX($ERR)
		_FILEWRITEDEBUG($HEU_DEBUG, "[" & $ERROR & "] " & $B)
		RETURN $ERROR
	ENDIF
ENDFUNC
FUNC _CMD_RUN_BAT($A, $B = "")
	LOCAL $RE = _RUN_BAT_GET_ECHO($A)
	IF $B = "" THEN
		_FILEWRITEDEBUG($HEU_DEBUG, $RE)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, $B & ":" & $RE)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _REDUCEMEMORY($I_PID = -1)
	IF $I_PID <> -1 THEN
		LOCAL $AI_HANDLE = DLLCALL("kernel32.dll", "int", "OpenProcess", "int", 2035711, "int", FALSE, "int", $I_PID)
		LOCAL $AI_RETURN = DLLCALL("psapi.dll", "int", "EmptyWorkingSet", "long", $AI_HANDLE[0])
		DLLCALL("kernel32.dll", "int", "CloseHandle", "int", $AI_HANDLE[0])
	ELSE
		LOCAL $AI_RETURN = DLLCALL("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
	ENDIF
	RETURN $AI_RETURN[0]
ENDFUNC
FUNC _FILEFINDALL($SDIR, BYREF $SOUT)
	LOCAL $HSEARCH = FILEFINDFIRSTFILE($SDIR & "\*.*")
	IF $HSEARCH = -1 THEN RETURN
	WHILE 1
		LOCAL $SFILE = FILEFINDNEXTFILE($HSEARCH)
		IF @ERROR THEN EXITLOOP
		IF @EXTENDED THEN CONTINUELOOP _FILEFINDALL($SDIR & "\" & $SFILE, $SOUT)
		$SOUT &= $SDIR & "\" & $SFILE & @CRLF
	WEND
	FILECLOSE($HSEARCH)
	RETURN $SOUT
ENDFUNC
FUNC _DEFINEWMISPP()
	LOCAL $WINMGMTCHECK = _RUN_BAT_GET_ECHO($CSCRIPT & ' //nologo //Job:WmiQuery "' & $WMI_REP & '?.wsf" ' & "Win32_ComputerSystem" & " CreationClassName")
	LOCAL $SPPCHECK = _RUN_BAT_GET_ECHO($CSCRIPT & ' //nologo //Job:WmiQuery "' & $WMI_REP & '?.wsf" ' & "SoftwareLicensingService" & " Version")
	IF STRINGINSTR($WINMGMTCHECK, "ComputerSystem") <> 0 THEN
		$WMI_WINMGMT = 1
	ELSE
		$WMI_WINMGMT = 0
		_FILEWRITEDEBUG($HEU_DEBUG, "WinMgmt [No Response]")
	ENDIF
	LOCAL $AARRAY_SPP = STRINGREGEXP($SPPCHECK, "\d+\.\d+\.\d+\.\d+", 3)
	IF ISARRAY($AARRAY_SPP) THEN
		$WMI_SPPSVC = 1
	ELSE
		$WMI_SPPSVC = 0
		_FILEWRITEDEBUG($HEU_DEBUG, "SPPSVC [No Response]")
	ENDIF
ENDFUNC
FUNC _DATE_TIME()
	LOCAL $_DATE_TIME
	$_DATE_TIME = @CRLF & ">>[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "] "
	RETURN $_DATE_TIME
ENDFUNC
FUNC _FILEWRITEDEBUG($A, $B)
	FILEWRITE($A, _DATE_TIME())
	FILEWRITE($A, $B)
ENDFUNC
FUNC _SILENT_PARAMETERS()
	LOCAL $LANGUAGE = INIREAD($SCRIPTDIR & "\Set.ini", "Language", "lang", "")
	IF $LANGUAGE = "SimplyChinese" OR $LANGUAGE = "TraditionalChinese" OR $LANGUAGE = "English" THEN
		_SILENT_PARAMETERS_MSGBOX($LANGUAGE)
	ELSEIF STRINGINSTR("0804 1004 1404 0004", @OSLANG) THEN
		_SILENT_PARAMETERS_MSGBOX("SimplyChinese")
	ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) THEN
		_SILENT_PARAMETERS_MSGBOX("TraditionalChinese")
	ELSE
		_SILENT_PARAMETERS_MSGBOX("English")
	ENDIF
ENDFUNC
FUNC _SILENT_PARAMETERS_MSGBOX($A)
	IF $A = "SimplyChinese" THEN
		MSGBOX(262144 + 64, "静默参数", $SLENIPARAMETER[0])
	ELSEIF $A = "TraditionalChinese" THEN
		MSGBOX(262144 + 64, "靜默參數", $SLENIPARAMETER[1])
	ELSE
		MSGBOX(262144 + 64, "silent parameter", $SLENIPARAMETER[2])
	ENDIF
ENDFUNC
FUNC _RESULT_TIPS($A)
	IF $A = 1 THEN
		RETURN "[Succeed]"
	ELSE
		RETURN "[Failed]"
	ENDIF
ENDFUNC
FUNC _REGDELETE($A, $B = "")
	LOCAL $RE
	IF $B = "" THEN
		$RE = REGDELETE($A)
	ELSE
		$RE = REGDELETE($A, $B)
	ENDIF
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Delete registry key " & $A & " " & $B)
	ENDIF
	IF $RE = 0 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Not exist registry key] " & $A & " " & $B)
	ENDIF
	IF $RE = 2 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Delete registry key " & $A & " " & $B)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _REGWRITE($A, $B, $C, $D)
	LOCAL $RE
	$RE = REGWRITE($A, $B, $C, $D)
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Write registry key " & $A & "," & $B & "," & $D)
	ENDIF
	IF $RE = 0 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Write registry key " & $A & "," & $B & "," & $D)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _REGREAD($A, $B)
	LOCAL $RE
	$RE = REGREAD($A, $B)
	IF @ERROR = 0 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Read registry " & $A & "," & $B & " = " & $RE)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Read registry " & $A & "," & $B & " = " & $RE)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _FILECOPY($A, $B, $C = 0)
	LOCAL $RE = FILECOPY($A, $B, $C)
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Copy " & $A & " to " & $B)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Copy " & $A & " to " & $B)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _FILEDELETE($A)
	LOCAL $RE = FILEDELETE($A)
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Delete " & $A)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed or Not Exist] Delete " & $A)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _DIRREMOVE($A, $B = 1)
	LOCAL $RE = DIRREMOVE($A, $B)
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Remove " & $A)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed or Not Exist] Remove " & $A)
	ENDIF
	RETURN $RE
ENDFUNC
FUNC _REGENUMKEY($REGPATH, $KEY = "")
	GLOBAL $REGENUMKEY = ""
	LOCAL $RE = ""
	_REKEY($REGPATH, $KEY)
	$RE = $REGENUMKEY
	$REGENUMKEY = ""
	RETURN $RE
ENDFUNC
FUNC _REKEY($REGPATH, $KEY = "")
	LOCAL $I = 1
	WHILE TRUE
		LOCAL $KEYNAME = REGENUMKEY($REGPATH, $I)
		IF @ERROR THEN EXITLOOP
		IF $KEY <> "" THEN
			IF STRINGINSTR($KEYNAME, $KEY) THEN
				$REGENUMKEY &= " " & $KEYNAME
			ENDIF
		ELSE
			$REGENUMKEY &= " " & $KEYNAME
		ENDIF
		IF STRINGLEFT($REGENUMKEY, 1) = " " THEN $REGENUMKEY = STRINGTRIMLEFT($REGENUMKEY, 1)
		_REKEY($REGPATH & "\" & $KEYNAME, $KEY)
		$I += 1
	WEND
ENDFUNC
FUNC _CHANGEMD5($FILE)
	LOCAL $HFILEOPEN, $RE
	LOCAL $CONTENT = " " & @YEAR & @MON & @YDAY & @HOUR & @MIN & @SEC & @MSEC
	$HFILEOPEN = FILEOPEN($FILE, 1)
	$RE = FILEWRITE($HFILEOPEN, $CONTENT)
	FILECLOSE($HFILEOPEN)
	IF $RE = 1 THEN
		_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] to Change Hash:" & $FILE)
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] to Change Hash:" & $FILE)
	ENDIF
ENDFUNC
FUNC _FIXWPA()
	LOCAL $WINPE = 0, $MINNT = "", $PARTITION, $SSUBKEY, $DELREG, $DELFILE, $RE
	IF $OSARCH = "x64" OR $OSARCH = "ARM64" THEN
		$REGHKLM = "HKLM64"
	ELSE
		$REGHKLM = "HKLM"
	ENDIF
	REGREAD($REGHKLM & "\Software\Microsoft\Windows NT\CurrentVersion\WinPE", "")
	IF @ERROR <> 1 AND @ERROR <> 2 THEN
		$WINPE = 1
	ELSE
		$MINNT = REGREAD($REGHKLM & "\SYSTEM\CurrentControlSet\Control", "SystemStartOptions")
		IF STRINGINSTR($MINNT, "MINNT") <> 0 THEN
			$WINPE = 1
		ENDIF
	ENDIF
	IF $WINPE = 1 THEN
		LOCAL $AARRAY
		$PARTITION = _CMD_RUN_BAT($SYSPATH & '\bcdedit | find "osdevice"')
		$AARRAY = STRINGREGEXP($PARTITION, "=(\S*)", 3)
		IF ISARRAY($AARRAY) THEN $PARTITION = $AARRAY[0]
		_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\system32\config\SYSTEM"')
		REGREAD($REGHKLM & "\clean_temp\ControlSet001\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}", "")
		IF @ERROR <> 1 AND @ERROR <> 2 THEN
			$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\ControlSet001\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}")
		ENDIF
		FOR $I = 1 TO 1000
			$SSUBKEY = REGENUMKEY($REGHKLM & "\clean_temp\WPA", $I)
			IF @ERROR THEN EXITLOOP
			IF STRINGINSTR($SSUBKEY, "8DEC0AF1-0341-4b93-85CD-72606C2DF94C") <> 0 THEN
				$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\WPA\" & $SSUBKEY)
			ENDIF
		NEXT
		_CMD_RUN_BAT("reg unload HKLM\clean_temp")
		_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\system32\config\DEFAULT"')
		REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
		IF @ERROR <> 1 AND @ERROR <> 2 THEN
			$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
		ENDIF
		_CMD_RUN_BAT("reg unload HKLM\clean_temp")
		_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\ServiceProfiles\LocalService\NTUSER.DAT"')
		REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
		IF @ERROR <> 1 AND @ERROR <> 2 THEN
			$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
		ENDIF
		_CMD_RUN_BAT("reg unload HKLM\clean_temp")
		_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\ServiceProfiles\NetworkService\NTUSER.DAT"')
		REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
		IF @ERROR <> 1 AND @ERROR <> 2 THEN
			$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
		ENDIF
		_CMD_RUN_BAT("reg unload HKLM\clean_temp")
		IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store_test\2.0") THEN
			$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store_test\2.0\cache", 1)
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store_test\2.0\data.dat")
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store_test\2.0\tokens.dat")
		ENDIF
		IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store\2.0") THEN
			$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store\2.0\cache", 1)
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\2.0\data.dat")
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\2.0\tokens.dat")
		ENDIF
		IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store") THEN
			$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store\cache", 1)
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\data.dat")
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\tokens.dat")
		ENDIF
		IF FILEEXISTS($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform") THEN
			$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform\cache", 1)
			$DELFILE &= _FILEDELETE($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform\tokens.dat")
		ENDIF
	ELSE
		_FILEWRITEDEBUG($HEU_DEBUG, "Not Detcted WinPE")
	ENDIF
	IF STRINGINSTR($DELREG, "2") <> 0 THEN
		$RE &= $ERRORHELP[3] & @CRLF
	ELSE
		$RE &= $ERRORHELP[1] & @CRLF
	ENDIF
	IF STRINGINSTR($DELFILE, "0") <> 0 THEN
		$RE &= $ERRORHELP[4] & @CRLF
	ELSE
		$RE &= $ERRORHELP[2] & @CRLF
	ENDIF
	MSGBOX(64, $HEU_MSGBOX, $RE)
ENDFUNC
GLOBAL CONST $GUI_EVENT_SINGLE = 0
GLOBAL CONST $GUI_EVENT_ARRAY = 1
GLOBAL CONST $GUI_EVENT_NONE = 0
GLOBAL CONST $GUI_EVENT_CLOSE = -3
GLOBAL CONST $GUI_EVENT_MINIMIZE = -4
GLOBAL CONST $GUI_EVENT_RESTORE = -5
GLOBAL CONST $GUI_EVENT_MAXIMIZE = -6
GLOBAL CONST $GUI_EVENT_PRIMARYDOWN = -7
GLOBAL CONST $GUI_EVENT_PRIMARYUP = -8
GLOBAL CONST $GUI_EVENT_SECONDARYDOWN = -9
GLOBAL CONST $GUI_EVENT_SECONDARYUP = -10
GLOBAL CONST $GUI_EVENT_MOUSEMOVE = -11
GLOBAL CONST $GUI_EVENT_RESIZED = -12
GLOBAL CONST $GUI_EVENT_DROPPED = -13
GLOBAL CONST $GUI_RUNDEFMSG = "GUI_RUNDEFMSG"
GLOBAL CONST $GUI_AVISTOP = 0
GLOBAL CONST $GUI_AVISTART = 1
GLOBAL CONST $GUI_AVICLOSE = 2
GLOBAL CONST $GUI_CHECKED = 1
GLOBAL CONST $GUI_INDETERMINATE = 2
GLOBAL CONST $GUI_UNCHECKED = 4
GLOBAL CONST $GUI_DROPACCEPTED = 8
GLOBAL CONST $GUI_NODROPACCEPTED = 4096
GLOBAL CONST $GUI_ACCEPTFILES = $GUI_DROPACCEPTED
GLOBAL CONST $GUI_SHOW = 16
GLOBAL CONST $GUI_HIDE = 32
GLOBAL CONST $GUI_ENABLE = 64
GLOBAL CONST $GUI_DISABLE = 128
GLOBAL CONST $GUI_FOCUS = 256
GLOBAL CONST $GUI_NOFOCUS = 8192
GLOBAL CONST $GUI_DEFBUTTON = 512
GLOBAL CONST $GUI_EXPAND = 1024
GLOBAL CONST $GUI_ONTOP = 2048
GLOBAL CONST $GUI_FONTNORMAL = 0
GLOBAL CONST $GUI_FONTITALIC = 2
GLOBAL CONST $GUI_FONTUNDER = 4
GLOBAL CONST $GUI_FONTSTRIKE = 8
GLOBAL CONST $GUI_DOCKAUTO = 1
GLOBAL CONST $GUI_DOCKLEFT = 2
GLOBAL CONST $GUI_DOCKRIGHT = 4
GLOBAL CONST $GUI_DOCKHCENTER = 8
GLOBAL CONST $GUI_DOCKTOP = 32
GLOBAL CONST $GUI_DOCKBOTTOM = 64
GLOBAL CONST $GUI_DOCKVCENTER = 128
GLOBAL CONST $GUI_DOCKWIDTH = 256
GLOBAL CONST $GUI_DOCKHEIGHT = 512
GLOBAL CONST $GUI_DOCKSIZE = 768
GLOBAL CONST $GUI_DOCKMENUBAR = 544
GLOBAL CONST $GUI_DOCKSTATEBAR = 576
GLOBAL CONST $GUI_DOCKALL = 802
GLOBAL CONST $GUI_DOCKBORDERS = 102
GLOBAL CONST $GUI_GR_CLOSE = 1
GLOBAL CONST $GUI_GR_LINE = 2
GLOBAL CONST $GUI_GR_BEZIER = 4
GLOBAL CONST $GUI_GR_MOVE = 6
GLOBAL CONST $GUI_GR_COLOR = 8
GLOBAL CONST $GUI_GR_RECT = 10
GLOBAL CONST $GUI_GR_ELLIPSE = 12
GLOBAL CONST $GUI_GR_PIE = 14
GLOBAL CONST $GUI_GR_DOT = 16
GLOBAL CONST $GUI_GR_PIXEL = 18
GLOBAL CONST $GUI_GR_HINT = 20
GLOBAL CONST $GUI_GR_REFRESH = 22
GLOBAL CONST $GUI_GR_PENSIZE = 24
GLOBAL CONST $GUI_GR_NOBKCOLOR = -2
GLOBAL CONST $GUI_BKCOLOR_DEFAULT = -1
GLOBAL CONST $GUI_BKCOLOR_TRANSPARENT = -2
GLOBAL CONST $GUI_BKCOLOR_LV_ALTERNATE = -33554432
GLOBAL CONST $GUI_READ_DEFAULT = 0
GLOBAL CONST $GUI_READ_EXTENDED = 1
GLOBAL CONST $GUI_CURSOR_NOOVERRIDE = 0
GLOBAL CONST $GUI_CURSOR_OVERRIDE = 1
GLOBAL CONST $GUI_WS_EX_PARENTDRAG = 1048576
GLOBAL CONST $WC_ANIMATE = "SysAnimate32"
GLOBAL CONST $WC_BUTTON = "Button"
GLOBAL CONST $WC_COMBOBOX = "ComboBox"
GLOBAL CONST $WC_COMBOBOXEX = "ComboBoxEx32"
GLOBAL CONST $WC_DATETIMEPICK = "SysDateTimePick32"
GLOBAL CONST $WC_EDIT = "Edit"
GLOBAL CONST $WC_HEADER = "SysHeader32"
GLOBAL CONST $WC_HOTKEY = "msctls_hotkey32"
GLOBAL CONST $WC_IPADDRESS = "SysIPAddress32"
GLOBAL CONST $WC_LINK = "SysLink"
GLOBAL CONST $WC_LISTBOX = "ListBox"
GLOBAL CONST $WC_LISTVIEW = "SysListView32"
GLOBAL CONST $WC_MONTHCAL = "SysMonthCal32"
GLOBAL CONST $WC_NATIVEFONTCTL = "NativeFontCtl"
GLOBAL CONST $WC_PAGESCROLLER = "SysPager"
GLOBAL CONST $WC_PROGRESS = "msctls_progress32"
GLOBAL CONST $WC_REBAR = "ReBarWindow32"
GLOBAL CONST $WC_SCROLLBAR = "ScrollBar"
GLOBAL CONST $WC_STATIC = "Static"
GLOBAL CONST $WC_STATUSBAR = "msctls_statusbar32"
GLOBAL CONST $WC_TABCONTROL = "SysTabControl32"
GLOBAL CONST $WC_TOOLBAR = "ToolbarWindow32"
GLOBAL CONST $WC_TOOLTIPS = "tooltips_class32"
GLOBAL CONST $WC_TRACKBAR = "msctls_trackbar32"
GLOBAL CONST $WC_TREEVIEW = "SysTreeView32"
GLOBAL CONST $WC_UPDOWN = "msctls_updown32"
GLOBAL CONST $WS_OVERLAPPED = 0
GLOBAL CONST $WS_TILED = $WS_OVERLAPPED
GLOBAL CONST $WS_MAXIMIZEBOX = 65536
GLOBAL CONST $WS_MINIMIZEBOX = 131072
GLOBAL CONST $WS_TABSTOP = 65536
GLOBAL CONST $WS_GROUP = 131072
GLOBAL CONST $WS_SIZEBOX = 262144
GLOBAL CONST $WS_THICKFRAME = $WS_SIZEBOX
GLOBAL CONST $WS_SYSMENU = 524288
GLOBAL CONST $WS_HSCROLL = 1048576
GLOBAL CONST $WS_VSCROLL = 2097152
GLOBAL CONST $WS_DLGFRAME = 4194304
GLOBAL CONST $WS_BORDER = 8388608
GLOBAL CONST $WS_CAPTION = 12582912
GLOBAL CONST $WS_OVERLAPPEDWINDOW = BITOR($WS_CAPTION, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_OVERLAPPED, $WS_SYSMENU, $WS_THICKFRAME)
GLOBAL CONST $WS_TILEDWINDOW = $WS_OVERLAPPEDWINDOW
GLOBAL CONST $WS_MAXIMIZE = 16777216
GLOBAL CONST $WS_CLIPCHILDREN = 33554432
GLOBAL CONST $WS_CLIPSIBLINGS = 67108864
GLOBAL CONST $WS_DISABLED = 134217728
GLOBAL CONST $WS_VISIBLE = 268435456
GLOBAL CONST $WS_MINIMIZE = 536870912
GLOBAL CONST $WS_ICONIC = $WS_MINIMIZE
GLOBAL CONST $WS_CHILD = 1073741824
GLOBAL CONST $WS_CHILDWINDOW = $WS_CHILD
GLOBAL CONST $WS_POPUP = -2147483648
GLOBAL CONST $WS_POPUPWINDOW = -2138570752
GLOBAL CONST $DS_3DLOOK = 4
GLOBAL CONST $DS_ABSALIGN = 1
GLOBAL CONST $DS_CENTER = 2048
GLOBAL CONST $DS_CENTERMOUSE = 4096
GLOBAL CONST $DS_CONTEXTHELP = 8192
GLOBAL CONST $DS_CONTROL = 1024
GLOBAL CONST $DS_FIXEDSYS = 8
GLOBAL CONST $DS_LOCALEDIT = 32
GLOBAL CONST $DS_MODALFRAME = 128
GLOBAL CONST $DS_NOFAILCREATE = 16
GLOBAL CONST $DS_NOIDLEMSG = 256
GLOBAL CONST $DS_SETFONT = 64
GLOBAL CONST $DS_SETFOREGROUND = 512
GLOBAL CONST $DS_SHELLFONT = BITOR($DS_FIXEDSYS, $DS_SETFONT)
GLOBAL CONST $DS_SYSMODAL = 2
GLOBAL CONST $WS_EX_ACCEPTFILES = 16
GLOBAL CONST $WS_EX_APPWINDOW = 262144
GLOBAL CONST $WS_EX_COMPOSITED = 33554432
GLOBAL CONST $WS_EX_CONTROLPARENT = 65536
GLOBAL CONST $WS_EX_CLIENTEDGE = 512
GLOBAL CONST $WS_EX_CONTEXTHELP = 1024
GLOBAL CONST $WS_EX_DLGMODALFRAME = 1
GLOBAL CONST $WS_EX_LAYERED = 524288
GLOBAL CONST $WS_EX_LAYOUTRTL = 4194304
GLOBAL CONST $WS_EX_LEFT = 0
GLOBAL CONST $WS_EX_LEFTSCROLLBAR = 16384
GLOBAL CONST $WS_EX_LTRREADING = 0
GLOBAL CONST $WS_EX_MDICHILD = 64
GLOBAL CONST $WS_EX_NOACTIVATE = 134217728
GLOBAL CONST $WS_EX_NOINHERITLAYOUT = 1048576
GLOBAL CONST $WS_EX_NOPARENTNOTIFY = 4
GLOBAL CONST $WS_EX_NOREDIRECTIONBITMAP = 2097152
GLOBAL CONST $WS_EX_RIGHT = 4096
GLOBAL CONST $WS_EX_RIGHTSCROLLBAR = 0
GLOBAL CONST $WS_EX_RTLREADING = 8192
GLOBAL CONST $WS_EX_STATICEDGE = 131072
GLOBAL CONST $WS_EX_TOOLWINDOW = 128
GLOBAL CONST $WS_EX_TOPMOST = 8
GLOBAL CONST $WS_EX_TRANSPARENT = 32
GLOBAL CONST $WS_EX_WINDOWEDGE = 256
GLOBAL CONST $WS_EX_OVERLAPPEDWINDOW = BITOR($WS_EX_CLIENTEDGE, $WS_EX_WINDOWEDGE)
GLOBAL CONST $WS_EX_PALETTEWINDOW = BITOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE)
GLOBAL CONST $WM_NULL = 0
GLOBAL CONST $WM_CREATE = 1
GLOBAL CONST $WM_DESTROY = 2
GLOBAL CONST $WM_MOVE = 3
GLOBAL CONST $WM_SIZEWAIT = 4
GLOBAL CONST $WM_SIZE = 5
GLOBAL CONST $WM_ACTIVATE = 6
GLOBAL CONST $WM_SETFOCUS = 7
GLOBAL CONST $WM_KILLFOCUS = 8
GLOBAL CONST $WM_SETVISIBLE = 9
GLOBAL CONST $WM_ENABLE = 10
GLOBAL CONST $WM_SETREDRAW = 11
GLOBAL CONST $WM_SETTEXT = 12
GLOBAL CONST $WM_GETTEXT = 13
GLOBAL CONST $WM_GETTEXTLENGTH = 14
GLOBAL CONST $WM_PAINT = 15
GLOBAL CONST $WM_CLOSE = 16
GLOBAL CONST $WM_QUERYENDSESSION = 17
GLOBAL CONST $WM_QUIT = 18
GLOBAL CONST $WM_ERASEBKGND = 20
GLOBAL CONST $WM_QUERYOPEN = 19
GLOBAL CONST $WM_SYSCOLORCHANGE = 21
GLOBAL CONST $WM_ENDSESSION = 22
GLOBAL CONST $WM_SYSTEMERROR = 23
GLOBAL CONST $WM_SHOWWINDOW = 24
GLOBAL CONST $WM_CTLCOLOR = 25
GLOBAL CONST $WM_SETTINGCHANGE = 26
GLOBAL CONST $WM_WININICHANGE = 26
GLOBAL CONST $WM_DEVMODECHANGE = 27
GLOBAL CONST $WM_ACTIVATEAPP = 28
GLOBAL CONST $WM_FONTCHANGE = 29
GLOBAL CONST $WM_TIMECHANGE = 30
GLOBAL CONST $WM_CANCELMODE = 31
GLOBAL CONST $WM_SETCURSOR = 32
GLOBAL CONST $WM_MOUSEACTIVATE = 33
GLOBAL CONST $WM_CHILDACTIVATE = 34
GLOBAL CONST $WM_QUEUESYNC = 35
GLOBAL CONST $WM_GETMINMAXINFO = 36
GLOBAL CONST $WM_LOGOFF = 37
GLOBAL CONST $WM_PAINTICON = 38
GLOBAL CONST $WM_ICONERASEBKGND = 39
GLOBAL CONST $WM_NEXTDLGCTL = 40
GLOBAL CONST $WM_ALTTABACTIVE = 41
GLOBAL CONST $WM_SPOOLERSTATUS = 42
GLOBAL CONST $WM_DRAWITEM = 43
GLOBAL CONST $WM_MEASUREITEM = 44
GLOBAL CONST $WM_DELETEITEM = 45
GLOBAL CONST $WM_VKEYTOITEM = 46
GLOBAL CONST $WM_CHARTOITEM = 47
GLOBAL CONST $WM_SETFONT = 48
GLOBAL CONST $WM_GETFONT = 49
GLOBAL CONST $WM_SETHOTKEY = 50
GLOBAL CONST $WM_GETHOTKEY = 51
GLOBAL CONST $WM_FILESYSCHANGE = 52
GLOBAL CONST $WM_ISACTIVEICON = 53
GLOBAL CONST $WM_QUERYPARKICON = 54
GLOBAL CONST $WM_QUERYDRAGICON = 55
GLOBAL CONST $WM_WINHELP = 56
GLOBAL CONST $WM_COMPAREITEM = 57
GLOBAL CONST $WM_FULLSCREEN = 58
GLOBAL CONST $WM_CLIENTSHUTDOWN = 59
GLOBAL CONST $WM_DDEMLEVENT = 60
GLOBAL CONST $WM_GETOBJECT = 61
GLOBAL CONST $WM_CALCSCROLL = 63
GLOBAL CONST $WM_TESTING = 64
GLOBAL CONST $WM_COMPACTING = 65
GLOBAL CONST $WM_OTHERWINDOWCREATED = 66
GLOBAL CONST $WM_OTHERWINDOWDESTROYED = 67
GLOBAL CONST $WM_COMMNOTIFY = 68
GLOBAL CONST $WM_MEDIASTATUSCHANGE = 69
GLOBAL CONST $WM_WINDOWPOSCHANGING = 70
GLOBAL CONST $WM_WINDOWPOSCHANGED = 71
GLOBAL CONST $WM_POWER = 72
GLOBAL CONST $WM_COPYGLOBALDATA = 73
GLOBAL CONST $WM_COPYDATA = 74
GLOBAL CONST $WM_CANCELJOURNAL = 75
GLOBAL CONST $WM_LOGONNOTIFY = 76
GLOBAL CONST $WM_KEYF1 = 77
GLOBAL CONST $WM_NOTIFY = 78
GLOBAL CONST $WM_ACCESS_WINDOW = 79
GLOBAL CONST $WM_INPUTLANGCHANGEREQUEST = 80
GLOBAL CONST $WM_INPUTLANGCHANGE = 81
GLOBAL CONST $WM_TCARD = 82
GLOBAL CONST $WM_HELP = 83
GLOBAL CONST $WM_USERCHANGED = 84
GLOBAL CONST $WM_NOTIFYFORMAT = 85
GLOBAL CONST $WM_QM_ACTIVATE = 96
GLOBAL CONST $WM_HOOK_DO_CALLBACK = 97
GLOBAL CONST $WM_SYSCOPYDATA = 98
GLOBAL CONST $WM_FINALDESTROY = 112
GLOBAL CONST $WM_MEASUREITEM_CLIENTDATA = 113
GLOBAL CONST $WM_CONTEXTMENU = 123
GLOBAL CONST $WM_STYLECHANGING = 124
GLOBAL CONST $WM_STYLECHANGED = 125
GLOBAL CONST $WM_DISPLAYCHANGE = 126
GLOBAL CONST $WM_GETICON = 127
GLOBAL CONST $WM_SETICON = 128
GLOBAL CONST $WM_NCCREATE = 129
GLOBAL CONST $WM_NCDESTROY = 130
GLOBAL CONST $WM_NCCALCSIZE = 131
GLOBAL CONST $WM_NCHITTEST = 132
GLOBAL CONST $WM_NCPAINT = 133
GLOBAL CONST $WM_NCACTIVATE = 134
GLOBAL CONST $WM_GETDLGCODE = 135
GLOBAL CONST $WM_SYNCPAINT = 136
GLOBAL CONST $WM_SYNCTASK = 137
GLOBAL CONST $WM_KLUDGEMINRECT = 139
GLOBAL CONST $WM_LPKDRAWSWITCHWND = 140
GLOBAL CONST $WM_UAHDESTROYWINDOW = 144
GLOBAL CONST $WM_UAHDRAWMENU = 145
GLOBAL CONST $WM_UAHDRAWMENUITEM = 146
GLOBAL CONST $WM_UAHINITMENU = 147
GLOBAL CONST $WM_UAHMEASUREMENUITEM = 148
GLOBAL CONST $WM_UAHNCPAINTMENUPOPUP = 149
GLOBAL CONST $WM_NCMOUSEMOVE = 160
GLOBAL CONST $WM_NCLBUTTONDOWN = 161
GLOBAL CONST $WM_NCLBUTTONUP = 162
GLOBAL CONST $WM_NCLBUTTONDBLCLK = 163
GLOBAL CONST $WM_NCRBUTTONDOWN = 164
GLOBAL CONST $WM_NCRBUTTONUP = 165
GLOBAL CONST $WM_NCRBUTTONDBLCLK = 166
GLOBAL CONST $WM_NCMBUTTONDOWN = 167
GLOBAL CONST $WM_NCMBUTTONUP = 168
GLOBAL CONST $WM_NCMBUTTONDBLCLK = 169
GLOBAL CONST $WM_NCXBUTTONDOWN = 171
GLOBAL CONST $WM_NCXBUTTONUP = 172
GLOBAL CONST $WM_NCXBUTTONDBLCLK = 173
GLOBAL CONST $WM_NCUAHDRAWCAPTION = 174
GLOBAL CONST $WM_NCUAHDRAWFRAME = 175
GLOBAL CONST $WM_INPUT_DEVICE_CHANGE = 254
GLOBAL CONST $WM_INPUT = 255
GLOBAL CONST $WM_KEYDOWN = 256
GLOBAL CONST $WM_KEYFIRST = 256
GLOBAL CONST $WM_KEYUP = 257
GLOBAL CONST $WM_CHAR = 258
GLOBAL CONST $WM_DEADCHAR = 259
GLOBAL CONST $WM_SYSKEYDOWN = 260
GLOBAL CONST $WM_SYSKEYUP = 261
GLOBAL CONST $WM_SYSCHAR = 262
GLOBAL CONST $WM_SYSDEADCHAR = 263
GLOBAL CONST $WM_YOMICHAR = 264
GLOBAL CONST $WM_KEYLAST = 265
GLOBAL CONST $WM_UNICHAR = 265
GLOBAL CONST $WM_CONVERTREQUEST = 266
GLOBAL CONST $WM_CONVERTRESULT = 267
GLOBAL CONST $WM_IM_INFO = 268
GLOBAL CONST $WM_IME_STARTCOMPOSITION = 269
GLOBAL CONST $WM_IME_ENDCOMPOSITION = 270
GLOBAL CONST $WM_IME_COMPOSITION = 271
GLOBAL CONST $WM_IME_KEYLAST = 271
GLOBAL CONST $WM_INITDIALOG = 272
GLOBAL CONST $WM_COMMAND = 273
GLOBAL CONST $WM_SYSCOMMAND = 274
GLOBAL CONST $WM_TIMER = 275
GLOBAL CONST $WM_HSCROLL = 276
GLOBAL CONST $WM_VSCROLL = 277
GLOBAL CONST $WM_INITMENU = 278
GLOBAL CONST $WM_INITMENUPOPUP = 279
GLOBAL CONST $WM_SYSTIMER = 280
GLOBAL CONST $WM_GESTURE = 281
GLOBAL CONST $WM_GESTURENOTIFY = 282
GLOBAL CONST $WM_GESTUREINPUT = 283
GLOBAL CONST $WM_GESTURENOTIFIED = 284
GLOBAL CONST $WM_MENUSELECT = 287
GLOBAL CONST $WM_MENUCHAR = 288
GLOBAL CONST $WM_ENTERIDLE = 289
GLOBAL CONST $WM_MENURBUTTONUP = 290
GLOBAL CONST $WM_MENUDRAG = 291
GLOBAL CONST $WM_MENUGETOBJECT = 292
GLOBAL CONST $WM_UNINITMENUPOPUP = 293
GLOBAL CONST $WM_MENUCOMMAND = 294
GLOBAL CONST $WM_CHANGEUISTATE = 295
GLOBAL CONST $WM_UPDATEUISTATE = 296
GLOBAL CONST $WM_QUERYUISTATE = 297
GLOBAL CONST $WM_LBTRACKPOINT = 305
GLOBAL CONST $WM_CTLCOLORMSGBOX = 306
GLOBAL CONST $WM_CTLCOLOREDIT = 307
GLOBAL CONST $WM_CTLCOLORLISTBOX = 308
GLOBAL CONST $WM_CTLCOLORBTN = 309
GLOBAL CONST $WM_CTLCOLORDLG = 310
GLOBAL CONST $WM_CTLCOLORSCROLLBAR = 311
GLOBAL CONST $WM_CTLCOLORSTATIC = 312
GLOBAL CONST $MN_GETHMENU = 481
GLOBAL CONST $WM_PARENTNOTIFY = 528
GLOBAL CONST $WM_ENTERMENULOOP = 529
GLOBAL CONST $WM_EXITMENULOOP = 530
GLOBAL CONST $WM_NEXTMENU = 531
GLOBAL CONST $WM_SIZING = 532
GLOBAL CONST $WM_CAPTURECHANGED = 533
GLOBAL CONST $WM_MOVING = 534
GLOBAL CONST $WM_POWERBROADCAST = 536
GLOBAL CONST $WM_DEVICECHANGE = 537
GLOBAL CONST $WM_MDICREATE = 544
GLOBAL CONST $WM_MDIDESTROY = 545
GLOBAL CONST $WM_MDIACTIVATE = 546
GLOBAL CONST $WM_MDIRESTORE = 547
GLOBAL CONST $WM_MDINEXT = 548
GLOBAL CONST $WM_MDIMAXIMIZE = 549
GLOBAL CONST $WM_MDITILE = 550
GLOBAL CONST $WM_MDICASCADE = 551
GLOBAL CONST $WM_MDIICONARRANGE = 552
GLOBAL CONST $WM_MDIGETACTIVE = 553
GLOBAL CONST $WM_DROPOBJECT = 554
GLOBAL CONST $WM_QUERYDROPOBJECT = 555
GLOBAL CONST $WM_BEGINDRAG = 556
GLOBAL CONST $WM_DRAGLOOP = 557
GLOBAL CONST $WM_DRAGSELECT = 558
GLOBAL CONST $WM_DRAGMOVE = 559
GLOBAL CONST $WM_MDISETMENU = 560
GLOBAL CONST $WM_ENTERSIZEMOVE = 561
GLOBAL CONST $WM_EXITSIZEMOVE = 562
GLOBAL CONST $WM_DROPFILES = 563
GLOBAL CONST $WM_MDIREFRESHMENU = 564
GLOBAL CONST $WM_TOUCH = 576
GLOBAL CONST $WM_IME_SETCONTEXT = 641
GLOBAL CONST $WM_IME_NOTIFY = 642
GLOBAL CONST $WM_IME_CONTROL = 643
GLOBAL CONST $WM_IME_COMPOSITIONFULL = 644
GLOBAL CONST $WM_IME_SELECT = 645
GLOBAL CONST $WM_IME_CHAR = 646
GLOBAL CONST $WM_IME_SYSTEM = 647
GLOBAL CONST $WM_IME_REQUEST = 648
GLOBAL CONST $WM_IME_KEYDOWN = 656
GLOBAL CONST $WM_IME_KEYUP = 657
GLOBAL CONST $WM_NCMOUSEHOVER = 672
GLOBAL CONST $WM_MOUSEHOVER = 673
GLOBAL CONST $WM_NCMOUSELEAVE = 674
GLOBAL CONST $WM_MOUSELEAVE = 675
GLOBAL CONST $WM_WTSSESSION_CHANGE = 689
GLOBAL CONST $WM_TABLET_FIRST = 704
GLOBAL CONST $WM_TABLET_LAST = 735
GLOBAL CONST $WM_CUT = 768
GLOBAL CONST $WM_COPY = 769
GLOBAL CONST $WM_PASTE = 770
GLOBAL CONST $WM_CLEAR = 771
GLOBAL CONST $WM_UNDO = 772
GLOBAL CONST $WM_PALETTEISCHANGING = 784
GLOBAL CONST $WM_HOTKEY = 786
GLOBAL CONST $WM_PALETTECHANGED = 785
GLOBAL CONST $WM_SYSMENU = 787
GLOBAL CONST $WM_HOOKMSG = 788
GLOBAL CONST $WM_EXITPROCESS = 789
GLOBAL CONST $WM_WAKETHREAD = 790
GLOBAL CONST $WM_PRINT = 791
GLOBAL CONST $WM_PRINTCLIENT = 792
GLOBAL CONST $WM_APPCOMMAND = 793
GLOBAL CONST $WM_QUERYNEWPALETTE = 783
GLOBAL CONST $WM_THEMECHANGED = 794
GLOBAL CONST $WM_UAHINIT = 795
GLOBAL CONST $WM_DESKTOPNOTIFY = 796
GLOBAL CONST $WM_CLIPBOARDUPDATE = 797
GLOBAL CONST $WM_DWMCOMPOSITIONCHANGED = 798
GLOBAL CONST $WM_DWMNCRENDERINGCHANGED = 799
GLOBAL CONST $WM_DWMCOLORIZATIONCOLORCHANGED = 800
GLOBAL CONST $WM_DWMWINDOWMAXIMIZEDCHANGE = 801
GLOBAL CONST $WM_DWMEXILEFRAME = 802
GLOBAL CONST $WM_DWMSENDICONICTHUMBNAIL = 803
GLOBAL CONST $WM_MAGNIFICATION_STARTED = 804
GLOBAL CONST $WM_MAGNIFICATION_ENDED = 805
GLOBAL CONST $WM_DWMSENDICONICLIVEPREVIEWBITMAP = 806
GLOBAL CONST $WM_DWMTHUMBNAILSIZECHANGED = 807
GLOBAL CONST $WM_MAGNIFICATION_OUTPUT = 808
GLOBAL CONST $WM_MEASURECONTROL = 816
GLOBAL CONST $WM_GETACTIONTEXT = 817
GLOBAL CONST $WM_FORWARDKEYDOWN = 819
GLOBAL CONST $WM_FORWARDKEYUP = 820
GLOBAL CONST $WM_GETTITLEBARINFOEX = 831
GLOBAL CONST $WM_NOTIFYWOW = 832
GLOBAL CONST $WM_HANDHELDFIRST = 856
GLOBAL CONST $WM_HANDHELDLAST = 863
GLOBAL CONST $WM_AFXFIRST = 864
GLOBAL CONST $WM_AFXLAST = 895
GLOBAL CONST $WM_PENWINFIRST = 896
GLOBAL CONST $WM_PENWINLAST = 911
GLOBAL CONST $WM_DDE_INITIATE = 992
GLOBAL CONST $WM_DDE_TERMINATE = 993
GLOBAL CONST $WM_DDE_ADVISE = 994
GLOBAL CONST $WM_DDE_UNADVISE = 995
GLOBAL CONST $WM_DDE_ACK = 996
GLOBAL CONST $WM_DDE_DATA = 997
GLOBAL CONST $WM_DDE_REQUEST = 998
GLOBAL CONST $WM_DDE_POKE = 999
GLOBAL CONST $WM_DDE_EXECUTE = 1000
GLOBAL CONST $WM_DBNOTIFICATION = 1021
GLOBAL CONST $WM_NETCONNECT = 1022
GLOBAL CONST $WM_HIBERNATE = 1023
GLOBAL CONST $WM_USER = 1024
GLOBAL CONST $WM_APP = 32768
GLOBAL CONST $NM_FIRST = 0
GLOBAL CONST $NM_OUTOFMEMORY = $NM_FIRST - 1
GLOBAL CONST $NM_CLICK = $NM_FIRST - 2
GLOBAL CONST $NM_DBLCLK = $NM_FIRST - 3
GLOBAL CONST $NM_RETURN = $NM_FIRST - 4
GLOBAL CONST $NM_RCLICK = $NM_FIRST - 5
GLOBAL CONST $NM_RDBLCLK = $NM_FIRST - 6
GLOBAL CONST $NM_SETFOCUS = $NM_FIRST - 7
GLOBAL CONST $NM_KILLFOCUS = $NM_FIRST - 8
GLOBAL CONST $NM_CUSTOMDRAW = $NM_FIRST - 12
GLOBAL CONST $NM_HOVER = $NM_FIRST - 13
GLOBAL CONST $NM_NCHITTEST = $NM_FIRST - 14
GLOBAL CONST $NM_KEYDOWN = $NM_FIRST - 15
GLOBAL CONST $NM_RELEASEDCAPTURE = $NM_FIRST - 16
GLOBAL CONST $NM_SETCURSOR = $NM_FIRST - 17
GLOBAL CONST $NM_CHAR = $NM_FIRST - 18
GLOBAL CONST $NM_TOOLTIPSCREATED = $NM_FIRST - 19
GLOBAL CONST $NM_LDOWN = $NM_FIRST - 20
GLOBAL CONST $NM_RDOWN = $NM_FIRST - 21
GLOBAL CONST $NM_THEMECHANGED = $NM_FIRST - 22
GLOBAL CONST $WM_MOUSEFIRST = 512
GLOBAL CONST $WM_MOUSEMOVE = 512
GLOBAL CONST $WM_LBUTTONDOWN = 513
GLOBAL CONST $WM_LBUTTONUP = 514
GLOBAL CONST $WM_LBUTTONDBLCLK = 515
GLOBAL CONST $WM_RBUTTONDOWN = 516
GLOBAL CONST $WM_RBUTTONUP = 517
GLOBAL CONST $WM_RBUTTONDBLCLK = 518
GLOBAL CONST $WM_MBUTTONDOWN = 519
GLOBAL CONST $WM_MBUTTONUP = 520
GLOBAL CONST $WM_MBUTTONDBLCLK = 521
GLOBAL CONST $WM_MOUSEWHEEL = 522
GLOBAL CONST $WM_XBUTTONDOWN = 523
GLOBAL CONST $WM_XBUTTONUP = 524
GLOBAL CONST $WM_XBUTTONDBLCLK = 525
GLOBAL CONST $WM_MOUSEHWHEEL = 526
GLOBAL CONST $PS_SOLID = 0
GLOBAL CONST $PS_DASH = 1
GLOBAL CONST $PS_DOT = 2
GLOBAL CONST $PS_DASHDOT = 3
GLOBAL CONST $PS_DASHDOTDOT = 4
GLOBAL CONST $PS_NULL = 5
GLOBAL CONST $PS_INSIDEFRAME = 6
GLOBAL CONST $PS_USERSTYLE = 7
GLOBAL CONST $PS_ALTERNATE = 8
GLOBAL CONST $PS_ENDCAP_ROUND = 0
GLOBAL CONST $PS_ENDCAP_SQUARE = 256
GLOBAL CONST $PS_ENDCAP_FLAT = 512
GLOBAL CONST $PS_JOIN_BEVEL = 4096
GLOBAL CONST $PS_JOIN_MITER = 8192
GLOBAL CONST $PS_JOIN_ROUND = 0
GLOBAL CONST $PS_GEOMETRIC = 65536
GLOBAL CONST $PS_COSMETIC = 0
GLOBAL CONST $LWA_ALPHA = 2
GLOBAL CONST $LWA_COLORKEY = 1
GLOBAL CONST $RGN_AND = 1
GLOBAL CONST $RGN_OR = 2
GLOBAL CONST $RGN_XOR = 3
GLOBAL CONST $RGN_DIFF = 4
GLOBAL CONST $RGN_COPY = 5
GLOBAL CONST $ERRORREGION = 0
GLOBAL CONST $NULLREGION = 1
GLOBAL CONST $SIMPLEREGION = 2
GLOBAL CONST $COMPLEXREGION = 3
GLOBAL CONST $TRANSPARENT = 1
GLOBAL CONST $OPAQUE = 2
GLOBAL CONST $CCM_FIRST = 8192
GLOBAL CONST $CCM_GETUNICODEFORMAT = ($CCM_FIRST + 6)
GLOBAL CONST $CCM_SETUNICODEFORMAT = ($CCM_FIRST + 5)
GLOBAL CONST $CCM_SETBKCOLOR = $CCM_FIRST + 1
GLOBAL CONST $CCM_SETCOLORSCHEME = $CCM_FIRST + 2
GLOBAL CONST $CCM_GETCOLORSCHEME = $CCM_FIRST + 3
GLOBAL CONST $CCM_GETDROPTARGET = $CCM_FIRST + 4
GLOBAL CONST $CCM_SETWINDOWTHEME = $CCM_FIRST + 11
GLOBAL CONST $GA_PARENT = 1
GLOBAL CONST $GA_ROOT = 2
GLOBAL CONST $GA_ROOTOWNER = 3
GLOBAL CONST $SM_CXSCREEN = 0
GLOBAL CONST $SM_CYSCREEN = 1
GLOBAL CONST $SM_CXVSCROLL = 2
GLOBAL CONST $SM_CYHSCROLL = 3
GLOBAL CONST $SM_CYCAPTION = 4
GLOBAL CONST $SM_CXBORDER = 5
GLOBAL CONST $SM_CYBORDER = 6
GLOBAL CONST $SM_CXFIXEDFRAME = 7
GLOBAL CONST $SM_CXDLGFRAME = $SM_CXFIXEDFRAME
GLOBAL CONST $SM_CYFIXEDFRAME = 8
GLOBAL CONST $SM_CYDLGFRAME = $SM_CYFIXEDFRAME
GLOBAL CONST $SM_CYVTHUMB = 9
GLOBAL CONST $SM_CXHTHUMB = 10
GLOBAL CONST $SM_CXICON = 11
GLOBAL CONST $SM_CYICON = 12
GLOBAL CONST $SM_CXCURSOR = 13
GLOBAL CONST $SM_CYCURSOR = 14
GLOBAL CONST $SM_CYMENU = 15
GLOBAL CONST $SM_CXFULLSCREEN = 16
GLOBAL CONST $SM_CYFULLSCREEN = 17
GLOBAL CONST $SM_CYKANJIWINDOW = 18
GLOBAL CONST $SM_MOUSEPRESENT = 19
GLOBAL CONST $SM_CYVSCROLL = 20
GLOBAL CONST $SM_CXHSCROLL = 21
GLOBAL CONST $SM_DEBUG = 22
GLOBAL CONST $SM_SWAPBUTTON = 23
GLOBAL CONST $SM_RESERVED1 = 24
GLOBAL CONST $SM_RESERVED2 = 25
GLOBAL CONST $SM_RESERVED3 = 26
GLOBAL CONST $SM_RESERVED4 = 27
GLOBAL CONST $SM_CXMIN = 28
GLOBAL CONST $SM_CYMIN = 29
GLOBAL CONST $SM_CXSIZE = 30
GLOBAL CONST $SM_CYSIZE = 31
GLOBAL CONST $SM_CXSIZEFRAME = 32
GLOBAL CONST $SM_CXFRAME = $SM_CXSIZEFRAME
GLOBAL CONST $SM_CYSIZEFRAME = 33
GLOBAL CONST $SM_CYFRAME = $SM_CYSIZEFRAME
GLOBAL CONST $SM_CXMINTRACK = 34
GLOBAL CONST $SM_CYMINTRACK = 35
GLOBAL CONST $SM_CXDOUBLECLK = 36
GLOBAL CONST $SM_CYDOUBLECLK = 37
GLOBAL CONST $SM_CXICONSPACING = 38
GLOBAL CONST $SM_CYICONSPACING = 39
GLOBAL CONST $SM_MENUDROPALIGNMENT = 40
GLOBAL CONST $SM_PENWINDOWS = 41
GLOBAL CONST $SM_DBCSENABLED = 42
GLOBAL CONST $SM_CMOUSEBUTTONS = 43
GLOBAL CONST $SM_SECURE = 44
GLOBAL CONST $SM_CXEDGE = 45
GLOBAL CONST $SM_CYEDGE = 46
GLOBAL CONST $SM_CXMINSPACING = 47
GLOBAL CONST $SM_CYMINSPACING = 48
GLOBAL CONST $SM_CXSMICON = 49
GLOBAL CONST $SM_CYSMICON = 50
GLOBAL CONST $SM_CYSMCAPTION = 51
GLOBAL CONST $SM_CXSMSIZE = 52
GLOBAL CONST $SM_CYSMSIZE = 53
GLOBAL CONST $SM_CXMENUSIZE = 54
GLOBAL CONST $SM_CYMENUSIZE = 55
GLOBAL CONST $SM_ARRANGE = 56
GLOBAL CONST $SM_CXMINIMIZED = 57
GLOBAL CONST $SM_CYMINIMIZED = 58
GLOBAL CONST $SM_CXMAXTRACK = 59
GLOBAL CONST $SM_CYMAXTRACK = 60
GLOBAL CONST $SM_CXMAXIMIZED = 61
GLOBAL CONST $SM_CYMAXIMIZED = 62
GLOBAL CONST $SM_NETWORK = 63
GLOBAL CONST $SM_CLEANBOOT = 67
GLOBAL CONST $SM_CXDRAG = 68
GLOBAL CONST $SM_CYDRAG = 69
GLOBAL CONST $SM_SHOWSOUNDS = 70
GLOBAL CONST $SM_CXMENUCHECK = 71
GLOBAL CONST $SM_CYMENUCHECK = 72
GLOBAL CONST $SM_SLOWMACHINE = 73
GLOBAL CONST $SM_MIDEASTENABLED = 74
GLOBAL CONST $SM_MOUSEWHEELPRESENT = 75
GLOBAL CONST $SM_XVIRTUALSCREEN = 76
GLOBAL CONST $SM_YVIRTUALSCREEN = 77
GLOBAL CONST $SM_CXVIRTUALSCREEN = 78
GLOBAL CONST $SM_CYVIRTUALSCREEN = 79
GLOBAL CONST $SM_CMONITORS = 80
GLOBAL CONST $SM_SAMEDISPLAYFORMAT = 81
GLOBAL CONST $SM_IMMENABLED = 82
GLOBAL CONST $SM_CXFOCUSBORDER = 83
GLOBAL CONST $SM_CYFOCUSBORDER = 84
GLOBAL CONST $SM_TABLETPC = 86
GLOBAL CONST $SM_MEDIACENTER = 87
GLOBAL CONST $SM_STARTER = 88
GLOBAL CONST $SM_SERVERR2 = 89
GLOBAL CONST $SM_CMETRICS = 90
GLOBAL CONST $SM_REMOTESESSION = 4096
GLOBAL CONST $SM_SHUTTINGDOWN = 8192
GLOBAL CONST $SM_REMOTECONTROL = 8193
GLOBAL CONST $SM_CARETBLINKINGENABLED = 8194
GLOBAL CONST $BLACKNESS = 66
GLOBAL CONST $CAPTUREBLT = 1073741824
GLOBAL CONST $DSTINVERT = 5570569
GLOBAL CONST $MERGECOPY = 12583114
GLOBAL CONST $MERGEPAINT = 12255782
GLOBAL CONST $NOMIRRORBITMAP = -2147483648
GLOBAL CONST $NOTSRCCOPY = 3342344
GLOBAL CONST $NOTSRCERASE = 1114278
GLOBAL CONST $PATCOPY = 15728673
GLOBAL CONST $PATINVERT = 5898313
GLOBAL CONST $PATPAINT = 16452105
GLOBAL CONST $SRCAND = 8913094
GLOBAL CONST $SRCCOPY = 13369376
GLOBAL CONST $SRCERASE = 4457256
GLOBAL CONST $SRCINVERT = 6684742
GLOBAL CONST $SRCPAINT = 15597702
GLOBAL CONST $WHITENESS = 16711778
GLOBAL CONST $DT_BOTTOM = 8
GLOBAL CONST $DT_CALCRECT = 1024
GLOBAL CONST $DT_CENTER = 1
GLOBAL CONST $DT_EDITCONTROL = 8192
GLOBAL CONST $DT_END_ELLIPSIS = 32768
GLOBAL CONST $DT_EXPANDTABS = 64
GLOBAL CONST $DT_EXTERNALLEADING = 512
GLOBAL CONST $DT_HIDEPREFIX = 1048576
GLOBAL CONST $DT_INTERNAL = 4096
GLOBAL CONST $DT_LEFT = 0
GLOBAL CONST $DT_MODIFYSTRING = 65536
GLOBAL CONST $DT_NOCLIP = 256
GLOBAL CONST $DT_NOFULLWIDTHCHARBREAK = 524288
GLOBAL CONST $DT_NOPREFIX = 2048
GLOBAL CONST $DT_PATH_ELLIPSIS = 16384
GLOBAL CONST $DT_PREFIXONLY = 2097152
GLOBAL CONST $DT_RIGHT = 2
GLOBAL CONST $DT_RTLREADING = 131072
GLOBAL CONST $DT_SINGLELINE = 32
GLOBAL CONST $DT_TABSTOP = 128
GLOBAL CONST $DT_TOP = 0
GLOBAL CONST $DT_VCENTER = 4
GLOBAL CONST $DT_WORDBREAK = 16
GLOBAL CONST $DT_WORD_ELLIPSIS = 262144
GLOBAL CONST $RDW_ERASE = 4
GLOBAL CONST $RDW_FRAME = 1024
GLOBAL CONST $RDW_INTERNALPAINT = 2
GLOBAL CONST $RDW_INVALIDATE = 1
GLOBAL CONST $RDW_NOERASE = 32
GLOBAL CONST $RDW_NOFRAME = 2048
GLOBAL CONST $RDW_NOINTERNALPAINT = 16
GLOBAL CONST $RDW_VALIDATE = 8
GLOBAL CONST $RDW_ERASENOW = 512
GLOBAL CONST $RDW_UPDATENOW = 256
GLOBAL CONST $RDW_ALLCHILDREN = 128
GLOBAL CONST $RDW_NOCHILDREN = 64
GLOBAL CONST $WM_RENDERFORMAT = 773
GLOBAL CONST $WM_RENDERALLFORMATS = 774
GLOBAL CONST $WM_DESTROYCLIPBOARD = 775
GLOBAL CONST $WM_DRAWCLIPBOARD = 776
GLOBAL CONST $WM_PAINTCLIPBOARD = 777
GLOBAL CONST $WM_VSCROLLCLIPBOARD = 778
GLOBAL CONST $WM_SIZECLIPBOARD = 779
GLOBAL CONST $WM_ASKCBFORMATNAME = 780
GLOBAL CONST $WM_CHANGECBCHAIN = 781
GLOBAL CONST $WM_HSCROLLCLIPBOARD = 782
GLOBAL CONST $HTERROR = -2
GLOBAL CONST $HTTRANSPARENT = -1
GLOBAL CONST $HTNOWHERE = 0
GLOBAL CONST $HTCLIENT = 1
GLOBAL CONST $HTCAPTION = 2
GLOBAL CONST $HTSYSMENU = 3
GLOBAL CONST $HTGROWBOX = 4
GLOBAL CONST $HTSIZE = $HTGROWBOX
GLOBAL CONST $HTMENU = 5
GLOBAL CONST $HTHSCROLL = 6
GLOBAL CONST $HTVSCROLL = 7
GLOBAL CONST $HTMINBUTTON = 8
GLOBAL CONST $HTMAXBUTTON = 9
GLOBAL CONST $HTLEFT = 10
GLOBAL CONST $HTRIGHT = 11
GLOBAL CONST $HTTOP = 12
GLOBAL CONST $HTTOPLEFT = 13
GLOBAL CONST $HTTOPRIGHT = 14
GLOBAL CONST $HTBOTTOM = 15
GLOBAL CONST $HTBOTTOMLEFT = 16
GLOBAL CONST $HTBOTTOMRIGHT = 17
GLOBAL CONST $HTBORDER = 18
GLOBAL CONST $HTREDUCE = $HTMINBUTTON
GLOBAL CONST $HTZOOM = $HTMAXBUTTON
GLOBAL CONST $HTSIZEFIRST = $HTLEFT
GLOBAL CONST $HTSIZELAST = $HTBOTTOMRIGHT
GLOBAL CONST $HTOBJECT = 19
GLOBAL CONST $HTCLOSE = 20
GLOBAL CONST $HTHELP = 21
GLOBAL CONST $COLOR_SCROLLBAR = 0
GLOBAL CONST $COLOR_BACKGROUND = 1
GLOBAL CONST $COLOR_ACTIVECAPTION = 2
GLOBAL CONST $COLOR_INACTIVECAPTION = 3
GLOBAL CONST $COLOR_MENU = 4
GLOBAL CONST $COLOR_WINDOW = 5
GLOBAL CONST $COLOR_WINDOWFRAME = 6
GLOBAL CONST $COLOR_MENUTEXT = 7
GLOBAL CONST $COLOR_WINDOWTEXT = 8
GLOBAL CONST $COLOR_CAPTIONTEXT = 9
GLOBAL CONST $COLOR_ACTIVEBORDER = 10
GLOBAL CONST $COLOR_INACTIVEBORDER = 11
GLOBAL CONST $COLOR_APPWORKSPACE = 12
GLOBAL CONST $COLOR_HIGHLIGHT = 13
GLOBAL CONST $COLOR_HIGHLIGHTTEXT = 14
GLOBAL CONST $COLOR_BTNFACE = 15
GLOBAL CONST $COLOR_BTNSHADOW = 16
GLOBAL CONST $COLOR_GRAYTEXT = 17
GLOBAL CONST $COLOR_BTNTEXT = 18
GLOBAL CONST $COLOR_INACTIVECAPTIONTEXT = 19
GLOBAL CONST $COLOR_BTNHIGHLIGHT = 20
GLOBAL CONST $COLOR_3DDKSHADOW = 21
GLOBAL CONST $COLOR_3DLIGHT = 22
GLOBAL CONST $COLOR_INFOTEXT = 23
GLOBAL CONST $COLOR_INFOBK = 24
GLOBAL CONST $COLOR_HOTLIGHT = 26
GLOBAL CONST $COLOR_GRADIENTACTIVECAPTION = 27
GLOBAL CONST $COLOR_GRADIENTINACTIVECAPTION = 28
GLOBAL CONST $COLOR_MENUHILIGHT = 29
GLOBAL CONST $COLOR_MENUBAR = 30
GLOBAL CONST $COLOR_DESKTOP = 1
GLOBAL CONST $COLOR_3DFACE = 15
GLOBAL CONST $COLOR_3DSHADOW = 16
GLOBAL CONST $COLOR_3DHIGHLIGHT = 20
GLOBAL CONST $COLOR_3DHILIGHT = 20
GLOBAL CONST $COLOR_BTNHILIGHT = 20
GLOBAL CONST $HINST_COMMCTRL = -1
GLOBAL CONST $IDB_STD_SMALL_COLOR = 0
GLOBAL CONST $IDB_STD_LARGE_COLOR = 1
GLOBAL CONST $IDB_VIEW_SMALL_COLOR = 4
GLOBAL CONST $IDB_VIEW_LARGE_COLOR = 5
GLOBAL CONST $IDB_HIST_SMALL_COLOR = 8
GLOBAL CONST $IDB_HIST_LARGE_COLOR = 9
GLOBAL CONST $STARTF_FORCEOFFFEEDBACK = 128
GLOBAL CONST $STARTF_FORCEONFEEDBACK = 64
GLOBAL CONST $STARTF_PREVENTPINNING = 8192
GLOBAL CONST $STARTF_RUNFULLSCREEN = 32
GLOBAL CONST $STARTF_TITLEISAPPID = 4096
GLOBAL CONST $STARTF_TITLEISLINKNAME = 2048
GLOBAL CONST $STARTF_USECOUNTCHARS = 8
GLOBAL CONST $STARTF_USEFILLATTRIBUTE = 16
GLOBAL CONST $STARTF_USEHOTKEY = 512
GLOBAL CONST $STARTF_USEPOSITION = 4
GLOBAL CONST $STARTF_USESHOWWINDOW = 1
GLOBAL CONST $STARTF_USESIZE = 2
GLOBAL CONST $STARTF_USESTDHANDLES = 256
GLOBAL CONST $CDDS_PREPAINT = 1
GLOBAL CONST $CDDS_POSTPAINT = 2
GLOBAL CONST $CDDS_PREERASE = 3
GLOBAL CONST $CDDS_POSTERASE = 4
GLOBAL CONST $CDDS_ITEM = 65536
GLOBAL CONST $CDDS_ITEMPREPAINT = 65537
GLOBAL CONST $CDDS_ITEMPOSTPAINT = 65538
GLOBAL CONST $CDDS_ITEMPREERASE = 65539
GLOBAL CONST $CDDS_ITEMPOSTERASE = 65540
GLOBAL CONST $CDDS_SUBITEM = 131072
GLOBAL CONST $CDIS_SELECTED = 1
GLOBAL CONST $CDIS_GRAYED = 2
GLOBAL CONST $CDIS_DISABLED = 4
GLOBAL CONST $CDIS_CHECKED = 8
GLOBAL CONST $CDIS_FOCUS = 16
GLOBAL CONST $CDIS_DEFAULT = 32
GLOBAL CONST $CDIS_HOT = 64
GLOBAL CONST $CDIS_MARKED = 128
GLOBAL CONST $CDIS_INDETERMINATE = 256
GLOBAL CONST $CDIS_SHOWKEYBOARDCUES = 512
GLOBAL CONST $CDIS_NEARHOT = 1024
GLOBAL CONST $CDIS_OTHERSIDEHOT = 2048
GLOBAL CONST $CDIS_DROPHILITED = 4096
GLOBAL CONST $CDRF_DODEFAULT = 0
GLOBAL CONST $CDRF_NEWFONT = 2
GLOBAL CONST $CDRF_SKIPDEFAULT = 4
GLOBAL CONST $CDRF_NOTIFYPOSTPAINT = 16
GLOBAL CONST $CDRF_NOTIFYITEMDRAW = 32
GLOBAL CONST $CDRF_NOTIFYSUBITEMDRAW = 32
GLOBAL CONST $CDRF_NOTIFYPOSTERASE = 64
GLOBAL CONST $CDRF_DOERASE = 8
GLOBAL CONST $CDRF_SKIPPOSTPAINT = 256
GLOBAL CONST $GUI_SS_DEFAULT_GUI = BITOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
#Region Global Variables and Constants
	GLOBAL $_G_ARRAYDISPLAY_BUSERFUNC = FALSE
	GLOBAL $_G_ARRAYDISPLAY_HLISTVIEW
	GLOBAL $_G_ARRAYDISPLAY_ITRANSPOSE
	GLOBAL $_G_ARRAYDISPLAY_IDISPLAYROW
	GLOBAL $_G_ARRAYDISPLAY_AARRAY
	GLOBAL $_G_ARRAYDISPLAY_IDIMS
	GLOBAL $_G_ARRAYDISPLAY_NROWS
	GLOBAL $_G_ARRAYDISPLAY_NCOLS
	GLOBAL $_G_ARRAYDISPLAY_IITEM_START
	GLOBAL $_G_ARRAYDISPLAY_IITEM_END
	GLOBAL $_G_ARRAYDISPLAY_ISUBITEM_START
	GLOBAL $_G_ARRAYDISPLAY_ISUBITEM_END
	GLOBAL $_G_ARRAYDISPLAY_AINDEX
	GLOBAL $_G_ARRAYDISPLAY_AINDEXES[1]
	GLOBAL $_G_ARRAYDISPLAY_ISORTDIR
	GLOBAL $_G_ARRAYDISPLAY_ASHEADER
	GLOBAL $_G_ARRAYDISPLAY_ANUMERICSORT
	GLOBAL $ARRAYDISPLAY_ROWPREFIX = "#"
	GLOBAL $ARRAYDISPLAY_NUMERICSORT = "*"
	GLOBAL CONST $ARRAYDISPLAY_COLALIGNLEFT = 0
	GLOBAL CONST $ARRAYDISPLAY_TRANSPOSE = 1
	GLOBAL CONST $ARRAYDISPLAY_COLALIGNRIGHT = 2
	GLOBAL CONST $ARRAYDISPLAY_COLALIGNCENTER = 4
	GLOBAL CONST $ARRAYDISPLAY_VERBOSE = 8
	GLOBAL CONST $ARRAYDISPLAY_NOROW = 64
	GLOBAL CONST $ARRAYDISPLAY_CHECKERROR = 128
	GLOBAL CONST $_ARRAYCONSTANT_TAGLVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;lparam Param;" & "int Indent;int GroupID;uint Columns;ptr pColumns;ptr piColFmt;int iGroup;endstruct"
#EndRegion Global Variables and Constants
#Region Functions list
#EndRegion Functions list
FUNC __ARRAYDISPLAY_SHARE(CONST BYREF $AARRAY, $STITLE = DEFAULT, $SARRAYRANGE = DEFAULT, $IFLAGS = DEFAULT, $VUSER_SEPARATOR = DEFAULT, $SHEADER = DEFAULT, $IDESIRED_COLWIDTH = DEFAULT, $HUSER_FUNCTION = DEFAULT, $BDEBUG = TRUE, CONST $_ISCRIPTLINENUMBER = @SCRIPTLINENUMBER, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
	LOCAL $SMSGBOXTITLE = (($BDEBUG) ? ("_DebugArrayDisplay") : ("_ArrayDisplay"))
	IF $_G_ARRAYDISPLAY_BUSERFUNC THEN
		$HUSER_FUNCTION = DEFAULT
		$BDEBUG = FALSE
	ENDIF
	IF NOT ISKEYWORD($HUSER_FUNCTION) = $KEYWORD_DEFAULT THEN
		$_G_ARRAYDISPLAY_BUSERFUNC = TRUE
	ENDIF
	IF $STITLE = DEFAULT THEN $STITLE = $SMSGBOXTITLE
	IF $SARRAYRANGE = DEFAULT THEN $SARRAYRANGE = ""
	IF $IFLAGS = DEFAULT THEN $IFLAGS = 0
	IF $VUSER_SEPARATOR = DEFAULT THEN $VUSER_SEPARATOR = ""
	IF $SHEADER = DEFAULT THEN $SHEADER = ""
	LOCAL $IMIN_COLWIDTH = 55
	LOCAL $IMAX_COLWIDTH = 350
	IF $IDESIRED_COLWIDTH > 0 THEN $IMAX_COLWIDTH = $IDESIRED_COLWIDTH
	IF $IDESIRED_COLWIDTH < 0 THEN $IMIN_COLWIDTH = -$IDESIRED_COLWIDTH
	IF $IMAX_COLWIDTH = DEFAULT THEN $IMAX_COLWIDTH = 350
	IF $IMAX_COLWIDTH > 4095 THEN $IMAX_COLWIDTH = 4095
	IF $HUSER_FUNCTION = DEFAULT THEN $HUSER_FUNCTION = 0
	$_G_ARRAYDISPLAY_ITRANSPOSE = BITAND($IFLAGS, $ARRAYDISPLAY_TRANSPOSE)
	LOCAL $ICOLALIGN = BITAND($IFLAGS, 6)
	LOCAL $IVERBOSE = INT(BITAND($IFLAGS, $ARRAYDISPLAY_VERBOSE))
	$_G_ARRAYDISPLAY_IDISPLAYROW = INT(BITAND($IFLAGS, $ARRAYDISPLAY_NOROW) = 0)
	LOCAL $IBUTTONBORDER = (($BDEBUG) ? (40) : (20))
	#Region Check valid array
		LOCAL $SMSG = "", $IRET = 1
		LOCAL $FTIMER = 0
		IF ISARRAY($AARRAY) THEN
			$_G_ARRAYDISPLAY_AARRAY = $AARRAY
			$_G_ARRAYDISPLAY_IDIMS = UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_DIMENSIONS)
			IF $_G_ARRAYDISPLAY_IDIMS = 1 THEN $_G_ARRAYDISPLAY_ITRANSPOSE = 0
			$_G_ARRAYDISPLAY_NROWS = UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_ROWS)
			$_G_ARRAYDISPLAY_NCOLS = ($_G_ARRAYDISPLAY_IDIMS = 2) ? UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_COLUMNS) : 1
			DIM $_G_ARRAYDISPLAY_ANUMERICSORT[$_G_ARRAYDISPLAY_NCOLS]
			IF $_G_ARRAYDISPLAY_IDIMS > 2 THEN
				$SMSG = "Larger than 2D array passed to function"
				$IRET = 2
			ENDIF
			IF $_ICALLERERROR THEN
				IF $BDEBUG THEN
					IF ISDECLARED("__g_sReportCallBack_DebugReport_Debug") THEN
						$SMSG = "@@ Debug( " & $_ISCRIPTLINENUMBER & ") : @error = " & $_ICALLERERROR & " in " & $SMSGBOXTITLE & "( '" & $STITLE & "' )"
						EXECUTE('$__g_sReportCallBack_DebugReport_Debug("' & $SMSG & '")')
					ENDIF
					$IRET = 3
				ELSEIF BITAND($IFLAGS, $ARRAYDISPLAY_CHECKERROR) THEN
					$SMSG = "@error = " & $_ICALLERERROR & " when calling the function"
					IF $_ISCRIPTLINENUMBER > 0 THEN $SMSG &= " at line " & $_ISCRIPTLINENUMBER
					$IRET = 3
				ENDIF
			ENDIF
		ELSE
			$SMSG = "No array variable passed to function"
		ENDIF
		IF $SMSG THEN
			IF $IVERBOSE AND MSGBOX($MB_SYSTEMMODAL + $MB_ICONERROR + $MB_YESNO, $SMSGBOXTITLE & "() Error: " & $STITLE, $SMSG & @CRLF & @CRLF & "Exit the script?") = $IDYES THEN
				EXIT
			ELSE
				RETURN SETERROR($IRET, 0, 0)
			ENDIF
		ENDIF
	#EndRegion Check valid array
	#Region Check array range
		LOCAL $ICW_COLWIDTH = NUMBER($VUSER_SEPARATOR)
		LOCAL $SCURR_SEPARATOR = OPT("GUIDataSeparatorChar")
		IF $VUSER_SEPARATOR = "" THEN $VUSER_SEPARATOR = $SCURR_SEPARATOR
		$_G_ARRAYDISPLAY_IITEM_START = 0
		$_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_NROWS - 1
		$_G_ARRAYDISPLAY_ISUBITEM_START = 0
		$_G_ARRAYDISPLAY_ISUBITEM_END = (($_G_ARRAYDISPLAY_IDIMS = 2) ? ($_G_ARRAYDISPLAY_NCOLS - 1) : (0))
		LOCAL $AVRANGESPLIT
		IF $SARRAYRANGE THEN
			LOCAL $VTMP, $AARRAY_RANGE = STRINGREGEXP($SARRAYRANGE & "||", "(?U)(.*)\|", $STR_REGEXPARRAYGLOBALMATCH)
			IF $AARRAY_RANGE[0] THEN
				$AVRANGESPLIT = STRINGSPLIT($AARRAY_RANGE[0], ":")
				IF @ERROR THEN
					$_G_ARRAYDISPLAY_IITEM_END = NUMBER($AARRAY_RANGE[0])
				ELSE
					$_G_ARRAYDISPLAY_IITEM_START = NUMBER($AVRANGESPLIT[1])
					IF $AVRANGESPLIT[2] <> "" THEN
						$_G_ARRAYDISPLAY_IITEM_END = NUMBER($AVRANGESPLIT[2])
					ENDIF
				ENDIF
			ENDIF
			IF $_G_ARRAYDISPLAY_IITEM_START < 0 THEN $_G_ARRAYDISPLAY_IITEM_START = 0
			IF $_G_ARRAYDISPLAY_IITEM_END >= $_G_ARRAYDISPLAY_NROWS THEN $_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_NROWS - 1
			IF($_G_ARRAYDISPLAY_IITEM_START > $_G_ARRAYDISPLAY_IITEM_END) AND($_G_ARRAYDISPLAY_IITEM_END > 0) THEN
				$VTMP = $_G_ARRAYDISPLAY_IITEM_START
				$_G_ARRAYDISPLAY_IITEM_START = $_G_ARRAYDISPLAY_IITEM_END
				$_G_ARRAYDISPLAY_IITEM_END = $VTMP
			ENDIF
			IF $_G_ARRAYDISPLAY_IDIMS = 2 AND $AARRAY_RANGE[1] THEN
				$AVRANGESPLIT = STRINGSPLIT($AARRAY_RANGE[1], ":")
				IF @ERROR THEN
					$_G_ARRAYDISPLAY_ISUBITEM_END = NUMBER($AARRAY_RANGE[1])
				ELSE
					$_G_ARRAYDISPLAY_ISUBITEM_START = NUMBER($AVRANGESPLIT[1])
					IF $AVRANGESPLIT[2] <> "" THEN
						$_G_ARRAYDISPLAY_ISUBITEM_END = NUMBER($AVRANGESPLIT[2])
					ENDIF
				ENDIF
				IF $_G_ARRAYDISPLAY_ISUBITEM_START > $_G_ARRAYDISPLAY_ISUBITEM_END THEN
					$VTMP = $_G_ARRAYDISPLAY_ISUBITEM_START
					$_G_ARRAYDISPLAY_ISUBITEM_START = $_G_ARRAYDISPLAY_ISUBITEM_END
					$_G_ARRAYDISPLAY_ISUBITEM_END = $VTMP
				ENDIF
				IF $_G_ARRAYDISPLAY_ISUBITEM_START < 0 THEN $_G_ARRAYDISPLAY_ISUBITEM_START = 0
				IF $_G_ARRAYDISPLAY_ISUBITEM_END >= $_G_ARRAYDISPLAY_NCOLS THEN $_G_ARRAYDISPLAY_ISUBITEM_END = $_G_ARRAYDISPLAY_NCOLS - 1
			ENDIF
		ENDIF
		LOCAL $SDISPLAYDATA = "[" & $_G_ARRAYDISPLAY_NROWS & "]"
		IF $_G_ARRAYDISPLAY_IDIMS = 2 THEN
			$SDISPLAYDATA &= " [" & $_G_ARRAYDISPLAY_NCOLS & "]"
		ENDIF
		LOCAL $STIPDATA = ""
		IF $SARRAYRANGE THEN
			IF $STIPDATA THEN $STIPDATA &= " - "
			$STIPDATA &= "Range set " & $SARRAYRANGE
		ENDIF
		IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
			IF $STIPDATA THEN $STIPDATA &= " - "
			$STIPDATA &= "Transposed"
		ENDIF
		IF $SARRAYRANGE OR $_G_ARRAYDISPLAY_ITRANSPOSE THEN $_G_ARRAYDISPLAY_AARRAY = __ARRAYDISPLAY_CREATESUBARRAY()
	#EndRegion Check array range
	#Region Check custom header
		$_G_ARRAYDISPLAY_ASHEADER = STRINGSPLIT($SHEADER, $SCURR_SEPARATOR, $STR_NOCOUNT)
		IF UBOUND($_G_ARRAYDISPLAY_ASHEADER) = 0 THEN DIM $_G_ARRAYDISPLAY_ASHEADER[1] = [""]
		$SHEADER = "Row"
		LOCAL $IINDEX = $_G_ARRAYDISPLAY_ISUBITEM_START
		IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
			$SHEADER = "Row"
			FOR $J = 0 TO $_G_ARRAYDISPLAY_NCOLS - 1
				$SHEADER &= $SCURR_SEPARATOR & $ARRAYDISPLAY_ROWPREFIX & " " & $J + $_G_ARRAYDISPLAY_ISUBITEM_START
			NEXT
		ELSE
			IF $_G_ARRAYDISPLAY_ASHEADER[0] THEN
				FOR $IINDEX = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
					IF $IINDEX >= UBOUND($_G_ARRAYDISPLAY_ASHEADER) THEN EXITLOOP
					IF STRINGRIGHT($_G_ARRAYDISPLAY_ASHEADER[$IINDEX], 1) = $ARRAYDISPLAY_NUMERICSORT THEN
						$_G_ARRAYDISPLAY_ASHEADER[$IINDEX] = STRINGTRIMRIGHT($_G_ARRAYDISPLAY_ASHEADER[$IINDEX], 1)
						$_G_ARRAYDISPLAY_ANUMERICSORT[$IINDEX - $_G_ARRAYDISPLAY_ISUBITEM_START] = 1
					ENDIF
					$SHEADER &= $SCURR_SEPARATOR & $_G_ARRAYDISPLAY_ASHEADER[$IINDEX]
				NEXT
			ENDIF
			FOR $J = $IINDEX TO $_G_ARRAYDISPLAY_ISUBITEM_END
				$SHEADER &= $SCURR_SEPARATOR & "Col " & $J
			NEXT
		ENDIF
		IF NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN $SHEADER = STRINGTRIMLEFT($SHEADER, 4)
	#EndRegion Check custom header
	#Region Generate Sort index for columns
		__ARRAYDISPLAY_SORTINDEXES(0, -1)
		LOCAL $HTIMER = TIMERINIT()
		__ARRAYDISPLAY_SORTINDEXES(1, 1)
		$FTIMER = TIMERDIFF($HTIMER)
		IF $FTIMER * $_G_ARRAYDISPLAY_NCOLS < 1000 THEN
			__ARRAYDISPLAY_SORTINDEXES(2, $_G_ARRAYDISPLAY_NCOLS)
		ELSE
		ENDIF
	#EndRegion Generate Sort index for columns
	#Region GUI and Listview generation
		IF $IVERBOSE AND($_G_ARRAYDISPLAY_NROWS * $_G_ARRAYDISPLAY_NCOLS) > 1000 THEN
			SPLASHTEXTON($SMSGBOXTITLE, "Preparing display" & @CRLF & @CRLF & "Please be patient", 300, 100)
		ENDIF
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 64
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKBORDERS = 102
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 512
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKLEFT = 2
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKRIGHT = 4
		LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKHCENTER = 8
		LOCAL CONST $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
		LOCAL CONST $_ARRAYCONSTANT_GUI_EVENT_ARRAY = 1
		LOCAL CONST $_ARRAYCONSTANT_GUI_FOCUS = 256
		LOCAL CONST $_ARRAYCONSTANT_SS_CENTER = 1
		LOCAL CONST $_ARRAYCONSTANT_SS_CENTERIMAGE = 512
		LOCAL CONST $_ARRAYCONSTANT_LVM_GETITEMRECT = (4096 + 14)
		LOCAL CONST $_ARRAYCONSTANT_LVM_GETITEMSTATE = (4096 + 44)
		LOCAL CONST $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT = (4096 + 50)
		LOCAL CONST $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (4096 + 54)
		LOCAL CONST $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 1
		LOCAL CONST $_ARRAYCONSTANT_LVIS_SELECTED = 2
		LOCAL CONST $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 8
		LOCAL CONST $_ARRAYCONSTANT_LVS_OWNERDATA = 4096
		LOCAL CONST $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 32
		LOCAL CONST $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER = 65536
		LOCAL CONST $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 512
		LOCAL CONST $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 65536
		LOCAL CONST $_ARRAYCONSTANT_WS_MINIMIZEBOX = 131072
		LOCAL CONST $_ARRAYCONSTANT_WS_SIZEBOX = 262144
		LOCAL $ICOORDMODE = OPT("GUICoordMode", 1)
		LOCAL $IORGWIDTH = 210, $IHEIGHT = 200, $IMINSIZE = 250
		LOCAL $HGUI = GUICREATE($STITLE, $IORGWIDTH, $IHEIGHT, DEFAULT, DEFAULT, BITOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
		LOCAL $AIGUISIZE = WINGETCLIENTSIZE($HGUI)
		LOCAL $IDLISTVIEW = GUICTRLCREATELISTVIEW($SHEADER, 0, 0, $AIGUISIZE[0], $AIGUISIZE[1] - $IBUTTONBORDER, BITOR($_ARRAYCONSTANT_LVS_SHOWSELALWAYS, $_ARRAYCONSTANT_LVS_OWNERDATA))
		$_G_ARRAYDISPLAY_HLISTVIEW = GUICTRLGETHANDLE($IDLISTVIEW)
		GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
		GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
		GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER, $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER)
		GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)
		LOCAL $HHEADER = HWND(GUICTRLSENDMSG($IDLISTVIEW, (4096 + 31), 0, 0))
		GUICTRLSETRESIZING($IDLISTVIEW, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
		LOCAL $ICOLFILL = $_G_ARRAYDISPLAY_NCOLS + $_G_ARRAYDISPLAY_IDISPLAYROW
		IF $ICOLALIGN THEN
			FOR $I = 0 TO $ICOLFILL - 1
				__ARRAYDISPLAY_JUSTIFYCOLUMN($IDLISTVIEW, $I, $ICOLALIGN / 2)
			NEXT
		ENDIF
		GUICTRLSENDMSG($IDLISTVIEW, (4096 + 47), $_G_ARRAYDISPLAY_NROWS, 0)
		LOCAL $TRECT = DLLSTRUCTCREATE("struct; long Left;long Top;long Right;long Bottom; endstruct")
		DLLCALL("user32.dll", "struct*", "SendMessageW", "hwnd", $_G_ARRAYDISPLAY_HLISTVIEW, "uint", $_ARRAYCONSTANT_LVM_GETITEMRECT, "wparam", 0, "struct*", $TRECT)
		LOCAL $AIWIN_POS = WINGETPOS($HGUI)
		LOCAL $AILV_POS = CONTROLGETPOS($HGUI, "", $IDLISTVIEW)
		$IHEIGHT = (($_G_ARRAYDISPLAY_NROWS + 3) * (DLLSTRUCTGETDATA($TRECT, "Bottom") - DLLSTRUCTGETDATA($TRECT, "Top"))) + $AIWIN_POS[3] - $AILV_POS[3]
		IF $IHEIGHT > @DESKTOPHEIGHT - 100 THEN
			$IHEIGHT = @DESKTOPHEIGHT - 100
		ELSEIF $IHEIGHT < $IMINSIZE THEN
			$IHEIGHT = $IMINSIZE
		ENDIF
		IF $IVERBOSE THEN SPLASHOFF()
		$_G_ARRAYDISPLAY_ISORTDIR = 1024
		LOCAL $ICOLUMN = 0, $ICOLUMNPREV = -1
		IF $_G_ARRAYDISPLAY_IDISPLAYROW THEN
			$ICOLUMNPREV = $ICOLUMN
			__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMN, 16384 + $_G_ARRAYDISPLAY_ISORTDIR + $ICOLALIGN / 2)
		ENDIF
		$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[0]
	#EndRegion GUI and Listview generation
	LOCAL $P__ARRAYDISPLAY_NOTIFYHANDLER = DLLCALLBACKGETPTR(DLLCALLBACKREGISTER("__ArrayDisplay_NotifyHandler", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
	DLLCALL("comctl32.dll", "bool", "SetWindowSubclass", "hwnd", $HGUI, "ptr", $P__ARRAYDISPLAY_NOTIFYHANDLER, "uint_ptr", 0, "dword_ptr", 0)
	#Region Adjust dialog width
		LOCAL $IWIDTH = 40, $ICOLWIDTH = 0, $AICOLWIDTH[$ICOLFILL]
		LOCAL $ICOLWIDTHHEADER, $IMIN_COLW = 55
		FOR $I = 0 TO $ICOLFILL - 1
			IF $I > 0 THEN $IMIN_COLW = $IMIN_COLWIDTH
			GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, -1)
			$ICOLWIDTH = GUICTRLSENDMSG($IDLISTVIEW, (4096 + 29), $I, 0)
			IF $SHEADER <> "" THEN
				IF $ICOLWIDTH = 0 THEN EXITLOOP
				GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, -2)
				$ICOLWIDTHHEADER = GUICTRLSENDMSG($IDLISTVIEW, (4096 + 29), $I, 0)
				IF $ICOLWIDTH < $IMIN_COLW AND $ICOLWIDTHHEADER < $IMIN_COLW THEN
					GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMIN_COLW)
					$ICOLWIDTH = $IMIN_COLW
				ELSEIF $ICOLWIDTHHEADER < $ICOLWIDTH THEN
					GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $ICOLWIDTH)
				ELSE
					$ICOLWIDTH = $ICOLWIDTHHEADER
				ENDIF
			ELSE
				IF $ICOLWIDTH < $IMIN_COLW THEN
					GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMIN_COLW)
					$ICOLWIDTH = $IMIN_COLW
				ENDIF
			ENDIF
			$IWIDTH += $ICOLWIDTH
			$AICOLWIDTH[$I] = $ICOLWIDTH
		NEXT
		IF $IWIDTH > @DESKTOPWIDTH - 100 THEN
			$IWIDTH = 40
			FOR $I = 0 TO $ICOLFILL - 1
				IF $AICOLWIDTH[$I] > $IMAX_COLWIDTH THEN
					GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMAX_COLWIDTH)
					$IWIDTH += $IMAX_COLWIDTH
				ELSE
					$IWIDTH += $AICOLWIDTH[$I]
				ENDIF
				IF $I < 20 AND $BDEBUG THEN CONSOLEWRITE("@@ Debug(" & @SCRIPTLINENUMBER & ") : $iWidth = " & $IWIDTH & " $i = " & $I & @CRLF)
			NEXT
		ENDIF
		IF $IWIDTH > @DESKTOPWIDTH - 100 THEN
			$IWIDTH = @DESKTOPWIDTH - 100
		ELSEIF $IWIDTH < $IMINSIZE THEN
			$IWIDTH = $IMINSIZE
		ENDIF
	#EndRegion Adjust dialog width
	LOCAL $ISCROLLBARSIZE = 0
	IF $IHEIGHT = (@DESKTOPHEIGHT - 100) THEN $ISCROLLBARSIZE = 15
	WINMOVE($HGUI, "", (@DESKTOPWIDTH - $IWIDTH + $ISCROLLBARSIZE) / 2, (@DESKTOPHEIGHT - $IHEIGHT) / 2, $IWIDTH + $ISCROLLBARSIZE, $IHEIGHT)
	$AIGUISIZE = WINGETCLIENTSIZE($HGUI)
	GUICTRLSETPOS($IDLISTVIEW, 0, 0, $IWIDTH, $AIGUISIZE[1] - $IBUTTONBORDER)
	#Region Create bottom infos
		LOCAL $IBUTTONWIDTH_1 = $AIGUISIZE[0] / 2
		LOCAL $IBUTTONWIDTH_2 = $AIGUISIZE[0] / 3
		LOCAL $IDCOPY_ID = 9999, $IDCOPY_DATA = 99999, $IDDATA_LABEL = 99999, $IDUSER_FUNC = 99999, $IDEXIT_SCRIPT = 99999
		IF $BDEBUG THEN
			$IDCOPY_ID = GUICTRLCREATEBUTTON("Copy Data && Hdr/Row", 0, $AIGUISIZE[1] - $IBUTTONBORDER, $IBUTTONWIDTH_1, 20)
			$IDCOPY_DATA = GUICTRLCREATEBUTTON("Copy Data Only", $IBUTTONWIDTH_1, $AIGUISIZE[1] - $IBUTTONBORDER, $IBUTTONWIDTH_1, 20)
			LOCAL $IBUTTONWIDTH_VAR = $IBUTTONWIDTH_1
			LOCAL $IOFFSET = $IBUTTONWIDTH_1
			IF ISFUNC($HUSER_FUNCTION) THEN
				$IDUSER_FUNC = GUICTRLCREATEBUTTON("Run User Func", $IBUTTONWIDTH_2, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_2, 20)
				$IBUTTONWIDTH_VAR = $IBUTTONWIDTH_2
				$IOFFSET = $IBUTTONWIDTH_2 * 2
			ENDIF
			$IDEXIT_SCRIPT = GUICTRLCREATEBUTTON("Exit Script", $IOFFSET, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_VAR, 20)
			$IDDATA_LABEL = GUICTRLCREATELABEL($SDISPLAYDATA, 0, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_VAR, 18, BITOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE))
		ELSE
			$IDDATA_LABEL = GUICTRLCREATELABEL($SDISPLAYDATA, 0, $AIGUISIZE[1] - 20, $AIGUISIZE[0], 18, BITOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE))
		ENDIF
		IF $_G_ARRAYDISPLAY_ITRANSPOSE OR $SARRAYRANGE THEN
			GUICTRLSETCOLOR($IDDATA_LABEL, 16711680)
			GUICTRLSETTIP($IDDATA_LABEL, $STIPDATA)
		ENDIF
		GUICTRLSETRESIZING($IDCOPY_ID, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
		GUICTRLSETRESIZING($IDCOPY_DATA, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
		GUICTRLSETRESIZING($IDDATA_LABEL, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
		GUICTRLSETRESIZING($IDUSER_FUNC, $_ARRAYCONSTANT_GUI_DOCKHCENTER + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
		GUICTRLSETRESIZING($IDEXIT_SCRIPT, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
	#EndRegion Create bottom infos
	GUISETSTATE(@SW_SHOW, $HGUI)
	IF $FTIMER > 1000 AND NOT $SARRAYRANGE THEN
		BEEP(750, 250)
		TOOLTIP("Sorting Action can take as long as " & CEILING($FTIMER / 1000) & " sec" & @CRLF & @CRLF & "Please be patient when you click to sort a column", 50, 50, $SMSGBOXTITLE, $TIP_WARNINGICON, $TIP_BALLOON)
		SLEEP(3000)
		TOOLTIP("")
	ENDIF
	#Region GUI Handling events
		LOCAL $IONEVENTMODE = OPT("GUIOnEventMode", 0), $AMSG
		WHILE 1
			$AMSG = GUIGETMSG($_ARRAYCONSTANT_GUI_EVENT_ARRAY)
			IF $AMSG[1] = $HGUI THEN
				SWITCH $AMSG[0]
					CASE $_ARRAYCONSTANT_GUI_EVENT_CLOSE
						EXITLOOP
					CASE $IDCOPY_ID, $IDCOPY_DATA
						LOCAL $ISEL_COUNT = GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT, 0, 0)
						IF $IVERBOSE AND(NOT $ISEL_COUNT) AND($_G_ARRAYDISPLAY_IITEM_END - $_G_ARRAYDISPLAY_IITEM_START) * ($_G_ARRAYDISPLAY_ISUBITEM_END - $_G_ARRAYDISPLAY_ISUBITEM_START) > 10000 THEN
							SPLASHTEXTON($SMSGBOXTITLE, "Copying data" & @CRLF & @CRLF & "Please be patient", 300, 100)
						ENDIF
						LOCAL $SCLIP = "", $SITEM, $ASPLIT, $IFIRSTCOL = 0
						IF $AMSG[0] = $IDCOPY_DATA AND $_G_ARRAYDISPLAY_IDISPLAYROW THEN $IFIRSTCOL = 1
						FOR $I = 0 TO GUICTRLSENDMSG($IDLISTVIEW, 4100, 0, 0) - 1
							IF $ISEL_COUNT AND NOT(GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $I, $_ARRAYCONSTANT_LVIS_SELECTED) <> 0) THEN
								CONTINUELOOP
							ENDIF
							$SITEM = __ARRAYDISPLAY_GETITEMTEXTSTRINGSELECTED($IDLISTVIEW, $I, $IFIRSTCOL)
							IF $AMSG[0] = $IDCOPY_ID AND NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN
								$SITEM = $ARRAYDISPLAY_ROWPREFIX & " " & ($I + $_G_ARRAYDISPLAY_IITEM_START) & $SCURR_SEPARATOR & $SITEM
							ENDIF
							IF $ICW_COLWIDTH THEN
								$ASPLIT = STRINGSPLIT($SITEM, $SCURR_SEPARATOR)
								$SITEM = ""
								FOR $J = 1 TO $ASPLIT[0]
									$SITEM &= STRINGFORMAT("%-" & $ICW_COLWIDTH + 1 & "s", STRINGLEFT($ASPLIT[$J], $ICW_COLWIDTH))
								NEXT
							ELSE
								$SITEM = STRINGREPLACE($SITEM, $SCURR_SEPARATOR, $VUSER_SEPARATOR)
							ENDIF
							$SCLIP &= $SITEM & @CRLF
						NEXT
						$SITEM = $SHEADER
						IF $AMSG[0] = $IDCOPY_ID THEN
							$SITEM = $SHEADER
							IF NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN
								$SITEM = "Row" & $SCURR_SEPARATOR & $SITEM
							ENDIF
							IF $ICW_COLWIDTH THEN
								$ASPLIT = STRINGSPLIT($SITEM, $SCURR_SEPARATOR)
								$SITEM = ""
								FOR $J = 1 TO $ASPLIT[0]
									$SITEM &= STRINGFORMAT("%-" & $ICW_COLWIDTH + 1 & "s", STRINGLEFT($ASPLIT[$J], $ICW_COLWIDTH))
								NEXT
							ELSE
								$SITEM = STRINGREPLACE($SITEM, $SCURR_SEPARATOR, $VUSER_SEPARATOR)
							ENDIF
							$SCLIP = $SITEM & @CRLF & $SCLIP
						ENDIF
						CLIPPUT($SCLIP)
						SPLASHOFF()
						GUICTRLSETSTATE($IDLISTVIEW, $_ARRAYCONSTANT_GUI_FOCUS)
					CASE $IDLISTVIEW
						$ICOLUMN = GUICTRLGETSTATE($IDLISTVIEW)
						IF NOT ISARRAY($_G_ARRAYDISPLAY_AINDEXES[$ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW]) THEN
							__ARRAYDISPLAY_SORTINDEXES($ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW)
						ENDIF
						IF $ICOLUMN <> $ICOLUMNPREV THEN
							__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMNPREV, 16384 + $ICOLALIGN / 2)
							IF $_G_ARRAYDISPLAY_IDISPLAYROW AND $ICOLUMN = 0 THEN
								$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[0]
							ELSE
								$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[$ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW]
							ENDIF
						ENDIF
						$_G_ARRAYDISPLAY_ISORTDIR = ($ICOLUMN = $ICOLUMNPREV) ? $_G_ARRAYDISPLAY_ISORTDIR = 1024 ? 512 : 1024 : 1024
						__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMN, 16384 + $_G_ARRAYDISPLAY_ISORTDIR + $ICOLALIGN / 2)
						GUICTRLSENDMSG($IDLISTVIEW, (4096 + 140), $ICOLUMN, 0)
						GUICTRLSENDMSG($IDLISTVIEW, (4096 + 47), $_G_ARRAYDISPLAY_NROWS, 0)
						$ICOLUMNPREV = $ICOLUMN
					CASE $IDUSER_FUNC
						LOCAL $AISELITEMS[1] = [0]
						FOR $I = 0 TO GUICTRLSENDMSG($IDLISTVIEW, 4100, 0, 0) - 1
							IF(GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $I, $_ARRAYCONSTANT_LVIS_SELECTED) <> 0) THEN
								$AISELITEMS[0] += 1
								REDIM $AISELITEMS[$AISELITEMS[0] + 1]
								$AISELITEMS[$AISELITEMS[0]] = $I + $_G_ARRAYDISPLAY_IITEM_START
							ENDIF
						NEXT
						$HUSER_FUNCTION($_G_ARRAYDISPLAY_AARRAY, $AISELITEMS)
						$_G_ARRAYDISPLAY_BUSERFUNC = FALSE
						__ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
						RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, -1)
					CASE $IDEXIT_SCRIPT
						GUIDELETE($HGUI)
						EXIT
				ENDSWITCH
			ENDIF
		WEND
	#EndRegion GUI Handling events
	__ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
	DLLCALL("comctl32.dll", "bool", "RemoveWindowSubclass", "hwnd", $HGUI, "ptr", $P__ARRAYDISPLAY_NOTIFYHANDLER, "uint_ptr", 0)
	$_G_ARRAYDISPLAY_AINDEX = 0
	DIM $_G_ARRAYDISPLAY_AINDEXES[1]
	GUIDELETE($HGUI)
	OPT("GUICoordMode", $ICOORDMODE)
	OPT("GUIOnEventMode", $IONEVENTMODE)
	RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_NOTIFYHANDLER($HWND, $IMSG, $WPARAM, $LPARAM, $ISUBCLASSID, $PDATA)
	IF $IMSG <> 78 THEN RETURN DLLCALL("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $HWND, "uint", $IMSG, "wparam", $WPARAM, "lparam", $LPARAM)[0]
	LOCAL STATIC $TAGNMHDR = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct"
	LOCAL STATIC $TAGNMLVDISPINFO = $TAGNMHDR & ";" & $_ARRAYCONSTANT_TAGLVITEM
	LOCAL $TNMLVDISPINFO = DLLSTRUCTCREATE($TAGNMLVDISPINFO, $LPARAM)
	SWITCH HWND(DLLSTRUCTGETDATA($TNMLVDISPINFO, "hWndFrom"))
		CASE $_G_ARRAYDISPLAY_HLISTVIEW
			SWITCH DLLSTRUCTGETDATA($TNMLVDISPINFO, "Code")
				CASE -177
					LOCAL STATIC $TTEXT = DLLSTRUCTCREATE("wchar[4096]"), $PTEXT = DLLSTRUCTGETPTR($TTEXT)
					LOCAL $IITEM = DLLSTRUCTGETDATA($TNMLVDISPINFO, "Item")
					LOCAL $IROW = ($_G_ARRAYDISPLAY_ISORTDIR = 1024) ? $_G_ARRAYDISPLAY_AINDEX[$IITEM] : $_G_ARRAYDISPLAY_AINDEX[$_G_ARRAYDISPLAY_NROWS - 1 - $IITEM]
					LOCAL $ICOL = DLLSTRUCTGETDATA($TNMLVDISPINFO, "SubItem")
					LOCAL $STEMP
					IF $_G_ARRAYDISPLAY_IDISPLAYROW = 0 THEN
						$STEMP = __ARRAYDISPLAY_GETDATA($IROW, $ICOL)
						DLLSTRUCTSETDATA($TTEXT, 1, $STEMP)
						DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
					ELSE
						IF $ICOL = 0 THEN
							IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
								LOCAL $SCAPTIONCPLT = ""
								IF $IROW + $_G_ARRAYDISPLAY_IITEM_START < UBOUND($_G_ARRAYDISPLAY_ASHEADER) AND STRINGSTRIPWS($_G_ARRAYDISPLAY_ASHEADER[$IROW + $_G_ARRAYDISPLAY_IITEM_START], 1 + 2) <> "" THEN
									$SCAPTIONCPLT = " (" & STRINGSTRIPWS($_G_ARRAYDISPLAY_ASHEADER[$IROW + $_G_ARRAYDISPLAY_IITEM_START], 1 + 2)
									IF STRINGRIGHT($SCAPTIONCPLT, 1) = $ARRAYDISPLAY_NUMERICSORT THEN $SCAPTIONCPLT = STRINGTRIMRIGHT($SCAPTIONCPLT, 1)
									$SCAPTIONCPLT &= ")"
								ENDIF
								DLLSTRUCTSETDATA($TTEXT, 1, "Col " & ($IROW + $_G_ARRAYDISPLAY_IITEM_START) & $SCAPTIONCPLT)
							ELSE
								DLLSTRUCTSETDATA($TTEXT, 1, $ARRAYDISPLAY_ROWPREFIX & " " & $IROW + $_G_ARRAYDISPLAY_IITEM_START)
							ENDIF
							DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
						ELSE
							$STEMP = __ARRAYDISPLAY_GETDATA($IROW, $ICOL - 1)
							DLLSTRUCTSETDATA($TTEXT, 1, $STEMP)
							DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
						ENDIF
					ENDIF
					RETURN
			ENDSWITCH
	ENDSWITCH
	RETURN DLLCALL("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $HWND, "uint", $IMSG, "wparam", $WPARAM, "lparam", $LPARAM)[0]
	#forceref $ISUBCLASSID, $PDATA
ENDFUNC
FUNC __ARRAYDISPLAY_GETDATA($IROW, $ICOL)
	LOCAL $STEMP
	IF $_G_ARRAYDISPLAY_IDIMS = 2 THEN
		$STEMP = $_G_ARRAYDISPLAY_AARRAY[$IROW][$ICOL]
	ELSE
		$STEMP = $_G_ARRAYDISPLAY_AARRAY[$IROW]
	ENDIF
	SWITCH VARGETTYPE($STEMP)
		CASE "Array"
			LOCAL $SSUBSCRIPT = ""
			FOR $I = 1 TO UBOUND($STEMP, 0)
				$SSUBSCRIPT = "[" & UBOUND($STEMP, $I) & "]"
			NEXT
			$STEMP = "{Array" & $SSUBSCRIPT & "}"
		CASE "Map"
			$STEMP = "{Map[" & UBOUND($STEMP) & "]}"
		CASE "Object"
			$STEMP = "{Object}"
	ENDSWITCH
	IF STRINGLEN($STEMP) > 4095 THEN $STEMP = STRINGLEFT($STEMP, 4095)
	RETURN $STEMP
ENDFUNC
FUNC __ARRAYDISPLAY_SORTINDEXES($ICOLSTART, $ICOLEND = $ICOLSTART)
	DIM $_G_ARRAYDISPLAY_AINDEX[$_G_ARRAYDISPLAY_NROWS]
	IF $ICOLEND = -1 THEN
		DIM $_G_ARRAYDISPLAY_AINDEXES[$_G_ARRAYDISPLAY_NCOLS + $_G_ARRAYDISPLAY_IDISPLAYROW + 1]
		FOR $I = 0 TO $_G_ARRAYDISPLAY_NROWS - 1
			$_G_ARRAYDISPLAY_AINDEX[$I] = $I
		NEXT
		$_G_ARRAYDISPLAY_AINDEXES[0] = $_G_ARRAYDISPLAY_AINDEX
	ENDIF
	IF $ICOLSTART = -1 THEN
		$ICOLSTART = 1
		$ICOLEND = $_G_ARRAYDISPLAY_NCOLS
	ENDIF
	IF $ICOLSTART THEN
		LOCAL $TINDEX
		FOR $I = $ICOLSTART TO $ICOLEND
			$TINDEX = __ARRAYDISPLAY_GETSORTCOLSTRUCT($_G_ARRAYDISPLAY_AARRAY, $I - 1)
			FOR $J = 0 TO $_G_ARRAYDISPLAY_NROWS - 1
				$_G_ARRAYDISPLAY_AINDEX[$J] = DLLSTRUCTGETDATA($TINDEX, 1, $J + 1)
			NEXT
			$_G_ARRAYDISPLAY_AINDEXES[$I] = $_G_ARRAYDISPLAY_AINDEX
		NEXT
	ENDIF
ENDFUNC
FUNC __ARRAYDISPLAY_GETSORTCOLSTRUCT(CONST BYREF $AARRAY, $ICOL)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) < 1 OR UBOUND($AARRAY, $UBOUND_DIMENSIONS) > 2 THEN
		RETURN SETERROR(6, 0, 0)
	ENDIF
	RETURN __ARRAYDISPLAY_SORTARRAYSTRUCT($AARRAY, $ICOL)
ENDFUNC
FUNC __ARRAYDISPLAY_SORTARRAYSTRUCT(CONST BYREF $AARRAY, $ICOL)
	LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS)
	LOCAL $TINDEX = DLLSTRUCTCREATE("uint[" & $_G_ARRAYDISPLAY_NROWS & "]")
	LOCAL $PINDEX = DLLSTRUCTGETPTR($TINDEX)
	STATIC $HDLL = DLLOPEN("kernel32.dll")
	STATIC $HDLLCOMP = DLLOPEN("shlwapi.dll")
	LOCAL $LO, $HI, $MI, $R, $NVAL1, $NVAL2
	FOR $I = 1 TO $_G_ARRAYDISPLAY_NROWS - 1
		$LO = 0
		$HI = $I - 1
		DO
			$MI = INT(($LO + $HI) / 2)
			IF NOT $_G_ARRAYDISPLAY_ITRANSPOSE AND $_G_ARRAYDISPLAY_ANUMERICSORT[$ICOL] THEN
				IF $IDIMS = 1 THEN
					$NVAL1 = NUMBER($AARRAY[$I])
					$NVAL2 = NUMBER($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)])
				ELSE
					$NVAL1 = NUMBER($AARRAY[$I][$ICOL])
					$NVAL2 = NUMBER($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)][$ICOL])
				ENDIF
				$R = $NVAL1 < $NVAL2 ? -1 : $NVAL1 > $NVAL2 ? 1 : 0
			ELSE
				IF $IDIMS = 1 THEN
					$R = DLLCALL($HDLLCOMP, "int", "StrCmpLogicalW", "wstr", STRING($AARRAY[$I]), "wstr", STRING($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)]))[0]
				ELSE
					$R = DLLCALL($HDLLCOMP, "int", "StrCmpLogicalW", "wstr", STRING($AARRAY[$I][$ICOL]), "wstr", STRING($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)][$ICOL]))[0]
				ENDIF
			ENDIF
			SWITCH $R
				CASE -1
					$HI = $MI - 1
				CASE 1
					$LO = $MI + 1
				CASE 0
					EXITLOOP
			ENDSWITCH
		UNTIL $LO > $HI
		DLLCALL($HDLL, "none", "RtlMoveMemory", "struct*", $PINDEX + ($MI + 1) * 4, "struct*", $PINDEX + $MI * 4, "ulong_ptr", ($I - $MI) * 4)
		DLLSTRUCTSETDATA($TINDEX, 1, $I, $MI + 1 + ($LO = $MI + 1))
	NEXT
	RETURN $TINDEX
ENDFUNC
FUNC __ARRAYDISPLAY_CREATESUBARRAY()
	LOCAL $NROWS = $_G_ARRAYDISPLAY_IITEM_END - $_G_ARRAYDISPLAY_IITEM_START + 1
	LOCAL $NCOLS = $_G_ARRAYDISPLAY_ISUBITEM_END - $_G_ARRAYDISPLAY_ISUBITEM_START + 1
	LOCAL $IROW = -1, $ICOL, $ITEMP, $ATEMP
	IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
		DIM $ATEMP[$NCOLS][$NROWS]
		FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
			$IROW += 1
			$ICOL = -1
			FOR $J = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
				$ICOL += 1
				$ATEMP[$ICOL][$IROW] = $_G_ARRAYDISPLAY_AARRAY[$I][$J]
			NEXT
		NEXT
		$ITEMP = $_G_ARRAYDISPLAY_IITEM_START
		$_G_ARRAYDISPLAY_IITEM_START = $_G_ARRAYDISPLAY_ISUBITEM_START
		$_G_ARRAYDISPLAY_ISUBITEM_START = $ITEMP
		$ITEMP = $_G_ARRAYDISPLAY_IITEM_END
		$_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_ISUBITEM_END
		$_G_ARRAYDISPLAY_ISUBITEM_END = $ITEMP
		$_G_ARRAYDISPLAY_NROWS = $NCOLS
		$_G_ARRAYDISPLAY_NCOLS = $NROWS
	ELSE
		IF $_G_ARRAYDISPLAY_IDIMS = 1 THEN
			DIM $ATEMP[$NROWS]
			FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
				$IROW += 1
				$ATEMP[$IROW] = $_G_ARRAYDISPLAY_AARRAY[$I]
			NEXT
		ELSE
			DIM $ATEMP[$NROWS][$NCOLS]
			FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
				$IROW += 1
				$ICOL = -1
				FOR $J = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
					$ICOL += 1
					$ATEMP[$IROW][$ICOL] = $_G_ARRAYDISPLAY_AARRAY[$I][$J]
				NEXT
			NEXT
			$_G_ARRAYDISPLAY_NCOLS = $NCOLS
		ENDIF
		$_G_ARRAYDISPLAY_NROWS = $NROWS
	ENDIF
	RETURN $ATEMP
ENDFUNC
FUNC __ARRAYDISPLAY_HEADERSETITEMFORMAT($HWND, $IINDEX, $IFORMAT)
	LOCAL STATIC $THDITEM = DLLSTRUCTCREATE("uint Mask;int XY;ptr Text;handle hBMP;int TextMax;int Fmt;lparam Param;int Image;int Order;uint Type;ptr pFilter;uint State")
	DLLSTRUCTSETDATA($THDITEM, "Mask", 4)
	DLLSTRUCTSETDATA($THDITEM, "Fmt", $IFORMAT)
	LOCAL $ARESULT = DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $HWND, "uint", 4620, "wparam", $IINDEX, "struct*", $THDITEM)
	RETURN $ARESULT[0] <> 0
ENDFUNC
FUNC __ARRAYDISPLAY_GETITEMTEXT($IDLISTVIEW, $IINDEX, $ISUBITEM = 0)
	LOCAL $TBUFFER = DLLSTRUCTCREATE("wchar Text[4096]")
	LOCAL $PBUFFER = DLLSTRUCTGETPTR($TBUFFER)
	LOCAL $TITEM = DLLSTRUCTCREATE($_ARRAYCONSTANT_TAGLVITEM)
	DLLSTRUCTSETDATA($TITEM, "SubItem", $ISUBITEM)
	DLLSTRUCTSETDATA($TITEM, "TextMax", 4096)
	DLLSTRUCTSETDATA($TITEM, "Text", $PBUFFER)
	IF ISHWND($IDLISTVIEW) THEN
		DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $IDLISTVIEW, "uint", 4211, "wparam", $IINDEX, "struct*", $TITEM)
	ELSE
		LOCAL $PITEM = DLLSTRUCTGETPTR($TITEM)
		GUICTRLSENDMSG($IDLISTVIEW, 4211, $IINDEX, $PITEM)
	ENDIF
	RETURN DLLSTRUCTGETDATA($TBUFFER, "Text")
ENDFUNC
FUNC __ARRAYDISPLAY_GETITEMTEXTSTRINGSELECTED($IDLISTVIEW, $IITEM, $IFIRSTCOL)
	LOCAL $SROW = "", $SSEPARATORCHAR = OPT("GUIDataSeparatorChar")
	LOCAL $ISELECTED = $IITEM
	LOCAL $HHEADER = HWND(GUICTRLSENDMSG($IDLISTVIEW, 4127, 0, 0))
	LOCAL $NCOL = DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $HHEADER, "uint", 4608, "wparam", 0, "lparam", 0)[0]
	FOR $X = $IFIRSTCOL TO $NCOL - 1
		$SROW &= __ARRAYDISPLAY_GETITEMTEXT($IDLISTVIEW, $ISELECTED, $X) & $SSEPARATORCHAR
	NEXT
	RETURN STRINGTRIMRIGHT($SROW, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_JUSTIFYCOLUMN($IDLISTVIEW, $IINDEX, $IALIGN = -1)
	LOCAL $TCOLUMN = DLLSTRUCTCREATE("uint Mask;int Fmt;int CX;ptr Text;int TextMax;int SubItem;int Image;int Order;int cxMin;int cxDefault;int cxIdeal")
	IF $IALIGN < 0 OR $IALIGN > 2 THEN $IALIGN = 0
	DLLSTRUCTSETDATA($TCOLUMN, "Mask", 1)
	DLLSTRUCTSETDATA($TCOLUMN, "Fmt", $IALIGN)
	LOCAL $PCOLUMN = DLLSTRUCTGETPTR($TCOLUMN)
	LOCAL $IRET = GUICTRLSENDMSG($IDLISTVIEW, 4192, $IINDEX, $PCOLUMN)
	RETURN $IRET <> 0
ENDFUNC
GLOBAL ENUM $ARRAYFILL_FORCE_DEFAULT, $ARRAYFILL_FORCE_SINGLEITEM, $ARRAYFILL_FORCE_INT, $ARRAYFILL_FORCE_NUMBER, $ARRAYFILL_FORCE_PTR, $ARRAYFILL_FORCE_HWND, $ARRAYFILL_FORCE_STRING, $ARRAYFILL_FORCE_BOOLEAN
GLOBAL ENUM $ARRAYUNIQUE_NOCOUNT, $ARRAYUNIQUE_COUNT
GLOBAL ENUM $ARRAYUNIQUE_AUTO, $ARRAYUNIQUE_FORCE32, $ARRAYUNIQUE_FORCE64, $ARRAYUNIQUE_MATCH, $ARRAYUNIQUE_DISTINCT
FUNC _ARRAYADD(BYREF $AARRAY, $VVALUE, $ISTART = 0, $SDELIM_ITEM = "|", $SDELIM_ROW = @CRLF, $IFORCE = $ARRAYFILL_FORCE_DEFAULT)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $SDELIM_ITEM = DEFAULT THEN $SDELIM_ITEM = "|"
	IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
	IF $IFORCE = DEFAULT THEN $IFORCE = $ARRAYFILL_FORCE_DEFAULT
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
	LOCAL $HDATATYPE = 0
	SWITCH $IFORCE
		CASE $ARRAYFILL_FORCE_INT
			$HDATATYPE = INT
		CASE $ARRAYFILL_FORCE_NUMBER
			$HDATATYPE = NUMBER
		CASE $ARRAYFILL_FORCE_PTR
			$HDATATYPE = PTR
		CASE $ARRAYFILL_FORCE_HWND
			$HDATATYPE = HWND
		CASE $ARRAYFILL_FORCE_STRING
			$HDATATYPE = STRING
		CASE $ARRAYFILL_FORCE_BOOLEAN
			$HDATATYPE = "Boolean"
	ENDSWITCH
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $IFORCE = $ARRAYFILL_FORCE_SINGLEITEM THEN
				REDIM $AARRAY[$IDIM_1 + 1]
				$AARRAY[$IDIM_1] = $VVALUE
				RETURN $IDIM_1
			ENDIF
			IF ISARRAY($VVALUE) THEN
				IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(5, 0, -1)
				$HDATATYPE = 0
			ELSE
				LOCAL $ATMP = STRINGSPLIT($VVALUE, $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
				IF UBOUND($ATMP, $UBOUND_ROWS) = 1 THEN
					$ATMP[0] = $VVALUE
				ENDIF
				$VVALUE = $ATMP
			ENDIF
			LOCAL $IADD = UBOUND($VVALUE, $UBOUND_ROWS)
			REDIM $AARRAY[$IDIM_1 + $IADD]
			FOR $I = 0 TO $IADD - 1
				IF STRING($HDATATYPE) = "Boolean" THEN
					SWITCH $VVALUE[$I]
						CASE "True", "1"
							$AARRAY[$IDIM_1 + $I] = TRUE
						CASE "False", "0", ""
							$AARRAY[$IDIM_1 + $I] = FALSE
					ENDSWITCH
				ELSEIF ISFUNC($HDATATYPE) THEN
					$AARRAY[$IDIM_1 + $I] = $HDATATYPE($VVALUE[$I])
				ELSE
					$AARRAY[$IDIM_1 + $I] = $VVALUE[$I]
				ENDIF
			NEXT
			RETURN $IDIM_1 + $IADD - 1
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
			IF $ISTART < 0 OR $ISTART > $IDIM_2 - 1 THEN RETURN SETERROR(4, 0, -1)
			LOCAL $IVALDIM_1, $IVALDIM_2 = 0, $ICOLCOUNT
			IF ISARRAY($VVALUE) THEN
				IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(5, 0, -1)
				$IVALDIM_1 = UBOUND($VVALUE, $UBOUND_ROWS)
				$IVALDIM_2 = UBOUND($VVALUE, $UBOUND_COLUMNS)
				$HDATATYPE = 0
			ELSE
				LOCAL $ASPLIT_1 = STRINGSPLIT($VVALUE, $SDELIM_ROW, $STR_NOCOUNT + $STR_ENTIRESPLIT)
				$IVALDIM_1 = UBOUND($ASPLIT_1, $UBOUND_ROWS)
				LOCAL $ATMP[$IVALDIM_1][0], $ASPLIT_2
				FOR $I = 0 TO $IVALDIM_1 - 1
					$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
					$ICOLCOUNT = UBOUND($ASPLIT_2)
					IF $ICOLCOUNT > $IVALDIM_2 THEN
						$IVALDIM_2 = $ICOLCOUNT
						REDIM $ATMP[$IVALDIM_1][$IVALDIM_2]
					ENDIF
					FOR $J = 0 TO $ICOLCOUNT - 1
						$ATMP[$I][$J] = $ASPLIT_2[$J]
					NEXT
				NEXT
				$VVALUE = $ATMP
			ENDIF
			IF UBOUND($VVALUE, $UBOUND_COLUMNS) + $ISTART > UBOUND($AARRAY, $UBOUND_COLUMNS) THEN RETURN SETERROR(3, 0, -1)
			REDIM $AARRAY[$IDIM_1 + $IVALDIM_1][$IDIM_2]
			FOR $IWRITETO_INDEX = 0 TO $IVALDIM_1 - 1
				FOR $J = 0 TO $IDIM_2 - 1
					IF $J < $ISTART THEN
						$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = ""
					ELSEIF $J - $ISTART > $IVALDIM_2 - 1 THEN
						$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = ""
					ELSE
						IF STRING($HDATATYPE) = "Boolean" THEN
							SWITCH $VVALUE[$IWRITETO_INDEX][$J - $ISTART]
								CASE "True", "1"
									$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = TRUE
								CASE "False", "0", ""
									$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = FALSE
							ENDSWITCH
						ELSEIF ISFUNC($HDATATYPE) THEN
							$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = $HDATATYPE($VVALUE[$IWRITETO_INDEX][$J - $ISTART])
						ELSE
							$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = $VVALUE[$IWRITETO_INDEX][$J - $ISTART]
						ENDIF
					ENDIF
				NEXT
			NEXT
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN UBOUND($AARRAY, $UBOUND_ROWS) - 1
ENDFUNC
FUNC _ARRAYBINARYSEARCH(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICOLUMN = 0)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ICOLUMN = DEFAULT THEN $ICOLUMN = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
	IF $IDIM_1 = 0 THEN RETURN SETERROR(6, 0, -1)
	IF $IEND < 1 OR $IEND > $IDIM_1 - 1 THEN $IEND = $IDIM_1 - 1
	IF $ISTART < 0 THEN $ISTART = 0
	IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
	LOCAL $IMID = INT(($IEND + $ISTART) / 2)
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $AARRAY[$ISTART] > $VVALUE OR $AARRAY[$IEND] < $VVALUE THEN RETURN SETERROR(2, 0, -1)
			WHILE $ISTART <= $IMID AND $VVALUE <> $AARRAY[$IMID]
				IF $VVALUE < $AARRAY[$IMID] THEN
					$IEND = $IMID - 1
				ELSE
					$ISTART = $IMID + 1
				ENDIF
				$IMID = INT(($IEND + $ISTART) / 2)
			WEND
			IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 THEN RETURN SETERROR(7, 0, -1)
			IF $AARRAY[$ISTART][$ICOLUMN] > $VVALUE OR $AARRAY[$IEND][$ICOLUMN] < $VVALUE THEN RETURN SETERROR(2, 0, -1)
			WHILE $ISTART <= $IMID AND $VVALUE <> $AARRAY[$IMID][$ICOLUMN]
				IF $VVALUE < $AARRAY[$IMID][$ICOLUMN] THEN
					$IEND = $IMID - 1
				ELSE
					$ISTART = $IMID + 1
				ENDIF
				$IMID = INT(($IEND + $ISTART) / 2)
			WEND
			IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
		CASE ELSE
			RETURN SETERROR(5, 0, -1)
	ENDSWITCH
	RETURN $IMID
ENDFUNC
FUNC _ARRAYCOLDELETE(BYREF $AARRAY, $ICOLUMN, $BCONVERT = FALSE)
	IF $BCONVERT = DEFAULT THEN $BCONVERT = FALSE
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(2, 0, -1)
	LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
	SWITCH $IDIM_2
		CASE 2
			IF $ICOLUMN < 0 OR $ICOLUMN > 1 THEN RETURN SETERROR(3, 0, -1)
			IF $BCONVERT THEN
				LOCAL $ATEMPARRAY[$IDIM_1]
				FOR $I = 0 TO $IDIM_1 - 1
					$ATEMPARRAY[$I] = $AARRAY[$I][(NOT $ICOLUMN)]
				NEXT
				$AARRAY = $ATEMPARRAY
			ELSE
				CONTINUECASE
			ENDIF
		CASE ELSE
			IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 - 1 THEN RETURN SETERROR(3, 0, -1)
			FOR $I = 0 TO $IDIM_1 - 1
				FOR $J = $ICOLUMN TO $IDIM_2 - 2
					$AARRAY[$I][$J] = $AARRAY[$I][$J + 1]
				NEXT
			NEXT
			REDIM $AARRAY[$IDIM_1][$IDIM_2 - 1]
	ENDSWITCH
	RETURN UBOUND($AARRAY, $UBOUND_COLUMNS)
ENDFUNC
FUNC _ARRAYCOLINSERT(BYREF $AARRAY, $ICOLUMN)
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			LOCAL $ATEMPARRAY[$IDIM_1][2]
			SWITCH $ICOLUMN
				CASE 0, 1
					FOR $I = 0 TO $IDIM_1 - 1
						$ATEMPARRAY[$I][(NOT $ICOLUMN)] = $AARRAY[$I]
					NEXT
				CASE ELSE
					RETURN SETERROR(3, 0, -1)
			ENDSWITCH
			$AARRAY = $ATEMPARRAY
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
			IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 THEN RETURN SETERROR(3, 0, -1)
			REDIM $AARRAY[$IDIM_1][$IDIM_2 + 1]
			FOR $I = 0 TO $IDIM_1 - 1
				FOR $J = $IDIM_2 TO $ICOLUMN + 1 STEP -1
					$AARRAY[$I][$J] = $AARRAY[$I][$J - 1]
				NEXT
				$AARRAY[$I][$ICOLUMN] = ""
			NEXT
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN UBOUND($AARRAY, $UBOUND_COLUMNS)
ENDFUNC
FUNC _ARRAYCOMBINATIONS(CONST BYREF $AARRAY, $ISET, $SDELIMITER = "")
	IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, 0)
	LOCAL $IN = UBOUND($AARRAY)
	LOCAL $IR = $ISET
	LOCAL $AIDX[$IR]
	FOR $I = 0 TO $IR - 1
		$AIDX[$I] = $I
	NEXT
	LOCAL $ITOTAL = __ARRAY_COMBINATIONS($IN, $IR)
	LOCAL $ILEFT = $ITOTAL
	LOCAL $ARESULT[$ITOTAL + 1]
	$ARESULT[0] = $ITOTAL
	LOCAL $ICOUNT = 1
	WHILE $ILEFT > 0
		__ARRAY_GETNEXT($IN, $IR, $ILEFT, $ITOTAL, $AIDX)
		FOR $I = 0 TO $ISET - 1
			$ARESULT[$ICOUNT] &= $AARRAY[$AIDX[$I]] & $SDELIMITER
		NEXT
		IF $SDELIMITER <> "" THEN $ARESULT[$ICOUNT] = STRINGTRIMRIGHT($ARESULT[$ICOUNT], 1)
		$ICOUNT += 1
	WEND
	RETURN $ARESULT
ENDFUNC
FUNC _ARRAYCONCATENATE(BYREF $AARRAYTARGET, CONST BYREF $AARRAYSOURCE, $ISTART = 0)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF NOT ISARRAY($AARRAYTARGET) THEN RETURN SETERROR(1, 0, -1)
	IF NOT ISARRAY($AARRAYSOURCE) THEN RETURN SETERROR(2, 0, -1)
	LOCAL $IDIM_TOTAL_TGT = UBOUND($AARRAYTARGET, $UBOUND_DIMENSIONS)
	LOCAL $IDIM_TOTAL_SRC = UBOUND($AARRAYSOURCE, $UBOUND_DIMENSIONS)
	LOCAL $IDIM_1_TGT = UBOUND($AARRAYTARGET, $UBOUND_ROWS)
	LOCAL $IDIM_1_SRC = UBOUND($AARRAYSOURCE, $UBOUND_ROWS)
	IF $ISTART < 0 OR $ISTART > $IDIM_1_SRC - 1 THEN RETURN SETERROR(6, 0, -1)
	SWITCH $IDIM_TOTAL_TGT
		CASE 1
			IF $IDIM_TOTAL_SRC <> 1 THEN RETURN SETERROR(4, 0, -1)
			REDIM $AARRAYTARGET[$IDIM_1_TGT + $IDIM_1_SRC - $ISTART]
			FOR $I = $ISTART TO $IDIM_1_SRC - 1
				$AARRAYTARGET[$IDIM_1_TGT + $I - $ISTART] = $AARRAYSOURCE[$I]
			NEXT
		CASE 2
			IF $IDIM_TOTAL_SRC <> 2 THEN RETURN SETERROR(4, 0, -1)
			LOCAL $IDIM_2_TGT = UBOUND($AARRAYTARGET, $UBOUND_COLUMNS)
			IF UBOUND($AARRAYSOURCE, $UBOUND_COLUMNS) <> $IDIM_2_TGT THEN RETURN SETERROR(5, 0, -1)
			REDIM $AARRAYTARGET[$IDIM_1_TGT + $IDIM_1_SRC - $ISTART][$IDIM_2_TGT]
			FOR $I = $ISTART TO $IDIM_1_SRC - 1
				FOR $J = 0 TO $IDIM_2_TGT - 1
					$AARRAYTARGET[$IDIM_1_TGT + $I - $ISTART][$J] = $AARRAYSOURCE[$I][$J]
				NEXT
			NEXT
		CASE ELSE
			RETURN SETERROR(3, 0, -1)
	ENDSWITCH
	RETURN UBOUND($AARRAYTARGET, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYDELETE(BYREF $AARRAY, $VRANGE)
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	IF ISARRAY($VRANGE) THEN
		IF UBOUND($VRANGE, $UBOUND_DIMENSIONS) <> 1 OR UBOUND($VRANGE, $UBOUND_ROWS) < 2 THEN RETURN SETERROR(4, 0, -1)
	ELSE
		LOCAL $INUMBER, $ASPLIT_1, $ASPLIT_2
		$VRANGE = STRINGSTRIPWS($VRANGE, 8)
		$ASPLIT_1 = STRINGSPLIT($VRANGE, ";")
		$VRANGE = ""
		FOR $I = 1 TO $ASPLIT_1[0]
			IF NOT STRINGREGEXP($ASPLIT_1[$I], "^\d+(-\d+)?$") THEN RETURN SETERROR(3, 0, -1)
			$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], "-")
			SWITCH $ASPLIT_2[0]
				CASE 1
					$VRANGE &= $ASPLIT_2[1] & ";"
				CASE 2
					IF NUMBER($ASPLIT_2[2]) >= NUMBER($ASPLIT_2[1]) THEN
						$INUMBER = $ASPLIT_2[1] - 1
						DO
							$INUMBER += 1
							$VRANGE &= $INUMBER & ";"
						UNTIL $INUMBER = $ASPLIT_2[2]
					ENDIF
			ENDSWITCH
		NEXT
		$VRANGE = STRINGSPLIT(STRINGTRIMRIGHT($VRANGE, 1), ";")
	ENDIF
	FOR $I = 1 TO $VRANGE[0]
		$VRANGE[$I] = NUMBER($VRANGE[$I])
	NEXT
	IF $VRANGE[1] < 0 OR $VRANGE[$VRANGE[0]] > $IDIM_1 THEN RETURN SETERROR(5, 0, -1)
	LOCAL $ICOPYTO_INDEX = 0
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			FOR $I = 1 TO $VRANGE[0]
				$AARRAY[$VRANGE[$I]] = CHRW(64177)
			NEXT
			FOR $IREADFROM_INDEX = 0 TO $IDIM_1
				IF $AARRAY[$IREADFROM_INDEX] == CHRW(64177) THEN
					CONTINUELOOP
				ELSE
					IF $IREADFROM_INDEX <> $ICOPYTO_INDEX THEN
						$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROM_INDEX]
					ENDIF
					$ICOPYTO_INDEX += 1
				ENDIF
			NEXT
			REDIM $AARRAY[$IDIM_1 - $VRANGE[0] + 1]
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			FOR $I = 1 TO $VRANGE[0]
				$AARRAY[$VRANGE[$I]][0] = CHRW(64177)
			NEXT
			FOR $IREADFROM_INDEX = 0 TO $IDIM_1
				IF $AARRAY[$IREADFROM_INDEX][0] == CHRW(64177) THEN
					CONTINUELOOP
				ELSE
					IF $IREADFROM_INDEX <> $ICOPYTO_INDEX THEN
						FOR $J = 0 TO $IDIM_2
							$AARRAY[$ICOPYTO_INDEX][$J] = $AARRAY[$IREADFROM_INDEX][$J]
						NEXT
					ENDIF
					$ICOPYTO_INDEX += 1
				ENDIF
			NEXT
			REDIM $AARRAY[$IDIM_1 - $VRANGE[0] + 1][$IDIM_2 + 1]
		CASE ELSE
			RETURN SETERROR(2, 0, FALSE)
	ENDSWITCH
	RETURN UBOUND($AARRAY, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYDISPLAY(CONST BYREF $AARRAY, $STITLE = DEFAULT, $SARRAYRANGE = DEFAULT, $IFLAGS = DEFAULT, $VUSER_SEPARATOR = DEFAULT, $SHEADER = DEFAULT, $IDESIRED_COLWIDTH = DEFAULT)
	#forceref $VUSER_SEPARATOR
	LOCAL $IRET = __ARRAYDISPLAY_SHARE($AARRAY, $STITLE, $SARRAYRANGE, $IFLAGS, DEFAULT, $SHEADER, $IDESIRED_COLWIDTH, 0, FALSE)
	RETURN SETERROR(@ERROR, @EXTENDED, $IRET)
ENDFUNC
FUNC _ARRAYEXTRACT(CONST BYREF $AARRAY, $ISTART_ROW = -1, $IEND_ROW = -1, $ISTART_COL = -1, $IEND_COL = -1)
	IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = -1
	IF $IEND_ROW = DEFAULT THEN $IEND_ROW = -1
	IF $ISTART_COL = DEFAULT THEN $ISTART_COL = -1
	IF $IEND_COL = DEFAULT THEN $IEND_COL = -1
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	IF $IEND_ROW = -1 THEN $IEND_ROW = $IDIM_1
	IF $ISTART_ROW = -1 THEN $ISTART_ROW = 0
	IF $ISTART_ROW < -1 OR $IEND_ROW < -1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART_ROW > $IDIM_1 OR $IEND_ROW > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1]
			FOR $I = 0 TO $IEND_ROW - $ISTART_ROW
				$ARETARRAY[$I] = $AARRAY[$I + $ISTART_ROW]
			NEXT
			RETURN $ARETARRAY
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			IF $IEND_COL = -1 THEN $IEND_COL = $IDIM_2
			IF $ISTART_COL = -1 THEN $ISTART_COL = 0
			IF $ISTART_COL < -1 OR $IEND_COL < -1 THEN RETURN SETERROR(5, 0, -1)
			IF $ISTART_COL > $IDIM_2 OR $IEND_COL > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
			IF $ISTART_COL > $IEND_COL THEN RETURN SETERROR(6, 0, -1)
			IF $ISTART_COL = $IEND_COL THEN
				LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1]
			ELSE
				LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1][$IEND_COL - $ISTART_COL + 1]
			ENDIF
			FOR $I = 0 TO $IEND_ROW - $ISTART_ROW
				FOR $J = 0 TO $IEND_COL - $ISTART_COL
					IF $ISTART_COL = $IEND_COL THEN
						$ARETARRAY[$I] = $AARRAY[$I + $ISTART_ROW][$J + $ISTART_COL]
					ELSE
						$ARETARRAY[$I][$J] = $AARRAY[$I + $ISTART_ROW][$J + $ISTART_COL]
					ENDIF
				NEXT
			NEXT
			RETURN $ARETARRAY
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC _ARRAYFINDALL(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICASE = 0, $ICOMPARE = 0, $ISUBITEM = 0, $BROW = FALSE)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ICASE = DEFAULT THEN $ICASE = 0
	IF $ICOMPARE = DEFAULT THEN $ICOMPARE = 0
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	IF $BROW = DEFAULT THEN $BROW = FALSE
	$ISTART = _ARRAYSEARCH($AARRAY, $VVALUE, $ISTART, $IEND, $ICASE, $ICOMPARE, 1, $ISUBITEM, $BROW)
	IF @ERROR THEN RETURN SETERROR(@ERROR, 0, -1)
	LOCAL $IINDEX = 0, $AVRESULT[UBOUND($AARRAY, ($BROW ? $UBOUND_COLUMNS : $UBOUND_ROWS))]
	DO
		$AVRESULT[$IINDEX] = $ISTART
		$IINDEX += 1
		$ISTART = _ARRAYSEARCH($AARRAY, $VVALUE, $ISTART + 1, $IEND, $ICASE, $ICOMPARE, 1, $ISUBITEM, $BROW)
	UNTIL @ERROR
	REDIM $AVRESULT[$IINDEX]
	RETURN $AVRESULT
ENDFUNC
FUNC _ARRAYFROMSTRING($SARRAYSTR, $SDELIM_COL = "|", $SDELIM_ROW = @CRLF, $BFORCE2D = FALSE, $ISTRIPWS = $STR_STRIPLEADING + $STR_STRIPTRAILING)
	IF $SDELIM_COL = DEFAULT THEN $SDELIM_COL = "|"
	IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
	IF $BFORCE2D = DEFAULT THEN $BFORCE2D = FALSE
	IF $ISTRIPWS = DEFAULT THEN $ISTRIPWS = $STR_STRIPLEADING + $STR_STRIPTRAILING
	LOCAL $AROW, $ACOL = STRINGSPLIT($SARRAYSTR, $SDELIM_ROW, $STR_ENTIRESPLIT + $STR_NOCOUNT)
	$AROW = STRINGSPLIT($ACOL[0], $SDELIM_COL, $STR_ENTIRESPLIT + $STR_NOCOUNT)
	IF UBOUND($ACOL) = 1 AND NOT $BFORCE2D THEN
		FOR $M = 0 TO UBOUND($AROW) - 1
			$AROW[$M] = ($ISTRIPWS ? STRINGSTRIPWS($AROW[$M], $ISTRIPWS) : $AROW[$M])
		NEXT
		RETURN $AROW
	ENDIF
	LOCAL $ARET[UBOUND($ACOL)][UBOUND($AROW)]
	FOR $N = 0 TO UBOUND($ACOL) - 1
		$AROW = STRINGSPLIT($ACOL[$N], $SDELIM_COL, $STR_ENTIRESPLIT + $STR_NOCOUNT)
		IF UBOUND($AROW) > UBOUND($ARET, 2) THEN RETURN SETERROR(1)
		FOR $M = 0 TO UBOUND($AROW) - 1
			$ARET[$N][$M] = ($ISTRIPWS ? STRINGSTRIPWS($AROW[$M], $ISTRIPWS) : $AROW[$M])
		NEXT
	NEXT
	RETURN $ARET
ENDFUNC
FUNC _ARRAYINSERT(BYREF $AARRAY, $VRANGE, $VVALUE = "", $ISTART = 0, $SDELIM_ITEM = "|", $SDELIM_ROW = @CRLF, $IFORCE = $ARRAYFILL_FORCE_DEFAULT)
	IF $VVALUE = DEFAULT THEN $VVALUE = ""
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $SDELIM_ITEM = DEFAULT THEN $SDELIM_ITEM = "|"
	IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
	IF $IFORCE = DEFAULT THEN $IFORCE = $ARRAYFILL_FORCE_DEFAULT
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	LOCAL $HDATATYPE = 0
	SWITCH $IFORCE
		CASE $ARRAYFILL_FORCE_INT
			$HDATATYPE = INT
		CASE $ARRAYFILL_FORCE_NUMBER
			$HDATATYPE = NUMBER
		CASE $ARRAYFILL_FORCE_PTR
			$HDATATYPE = PTR
		CASE $ARRAYFILL_FORCE_HWND
			$HDATATYPE = HWND
		CASE $ARRAYFILL_FORCE_STRING
			$HDATATYPE = STRING
	ENDSWITCH
	LOCAL $ASPLIT_1, $ASPLIT_2
	IF ISARRAY($VRANGE) THEN
		IF UBOUND($VRANGE, $UBOUND_DIMENSIONS) <> 1 OR UBOUND($VRANGE, $UBOUND_ROWS) < 2 THEN RETURN SETERROR(4, 0, -1)
	ELSE
		LOCAL $INUMBER
		$VRANGE = STRINGSTRIPWS($VRANGE, 8)
		$ASPLIT_1 = STRINGSPLIT($VRANGE, ";")
		$VRANGE = ""
		FOR $I = 1 TO $ASPLIT_1[0]
			IF NOT STRINGREGEXP($ASPLIT_1[$I], "^\d+(-\d+)?$") THEN RETURN SETERROR(3, 0, -1)
			$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], "-")
			SWITCH $ASPLIT_2[0]
				CASE 1
					$VRANGE &= $ASPLIT_2[1] & ";"
				CASE 2
					IF NUMBER($ASPLIT_2[2]) >= NUMBER($ASPLIT_2[1]) THEN
						$INUMBER = $ASPLIT_2[1] - 1
						DO
							$INUMBER += 1
							$VRANGE &= $INUMBER & ";"
						UNTIL $INUMBER = $ASPLIT_2[2]
					ENDIF
			ENDSWITCH
		NEXT
		$VRANGE = STRINGSPLIT(STRINGTRIMRIGHT($VRANGE, 1), ";")
	ENDIF
	FOR $I = 1 TO $VRANGE[0]
		$VRANGE[$I] = NUMBER($VRANGE[$I])
	NEXT
	IF $VRANGE[1] < 0 OR $VRANGE[$VRANGE[0]] > $IDIM_1 THEN RETURN SETERROR(5, 0, -1)
	FOR $I = 2 TO $VRANGE[0]
		IF $VRANGE[$I] < $VRANGE[$I - 1] THEN RETURN SETERROR(3, 0, -1)
	NEXT
	LOCAL $ICOPYTO_INDEX = $IDIM_1 + $VRANGE[0]
	LOCAL $IINSERTPOINT_INDEX = $VRANGE[0]
	LOCAL $IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $IFORCE = $ARRAYFILL_FORCE_SINGLEITEM THEN
				REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1]
				FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
					$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROMINDEX]
					$ICOPYTO_INDEX -= 1
					$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
					WHILE $IREADFROMINDEX = $IINSERT_INDEX
						$AARRAY[$ICOPYTO_INDEX] = $VVALUE
						$ICOPYTO_INDEX -= 1
						$IINSERTPOINT_INDEX -= 1
						IF $IINSERTPOINT_INDEX < 1 THEN EXITLOOP 2
						$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
					WEND
				NEXT
				RETURN $IDIM_1 + $VRANGE[0] + 1
			ENDIF
			REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1]
			IF ISARRAY($VVALUE) THEN
				IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(5, 0, -1)
				$HDATATYPE = 0
			ELSE
				LOCAL $ATMP = STRINGSPLIT($VVALUE, $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
				IF UBOUND($ATMP, $UBOUND_ROWS) = 1 THEN
					$ATMP[0] = $VVALUE
					$HDATATYPE = 0
				ENDIF
				$VVALUE = $ATMP
			ENDIF
			FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
				$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROMINDEX]
				$ICOPYTO_INDEX -= 1
				$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
				WHILE $IREADFROMINDEX = $IINSERT_INDEX
					IF $IINSERTPOINT_INDEX <= UBOUND($VVALUE, $UBOUND_ROWS) THEN
						IF ISFUNC($HDATATYPE) THEN
							$AARRAY[$ICOPYTO_INDEX] = $HDATATYPE($VVALUE[$IINSERTPOINT_INDEX - 1])
						ELSE
							$AARRAY[$ICOPYTO_INDEX] = $VVALUE[$IINSERTPOINT_INDEX - 1]
						ENDIF
					ELSE
						$AARRAY[$ICOPYTO_INDEX] = ""
					ENDIF
					$ICOPYTO_INDEX -= 1
					$IINSERTPOINT_INDEX -= 1
					IF $IINSERTPOINT_INDEX = 0 THEN EXITLOOP 2
					$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
				WEND
			NEXT
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
			IF $ISTART < 0 OR $ISTART > $IDIM_2 - 1 THEN RETURN SETERROR(6, 0, -1)
			LOCAL $IVALDIM_1, $IVALDIM_2
			IF ISARRAY($VVALUE) THEN
				IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(7, 0, -1)
				$IVALDIM_1 = UBOUND($VVALUE, $UBOUND_ROWS)
				$IVALDIM_2 = UBOUND($VVALUE, $UBOUND_COLUMNS)
				$HDATATYPE = 0
			ELSE
				$ASPLIT_1 = STRINGSPLIT($VVALUE, $SDELIM_ROW, $STR_NOCOUNT + $STR_ENTIRESPLIT)
				$IVALDIM_1 = UBOUND($ASPLIT_1, $UBOUND_ROWS)
				STRINGREPLACE($ASPLIT_1[0], $SDELIM_ITEM, "")
				$IVALDIM_2 = @EXTENDED + 1
				LOCAL $ATMP[$IVALDIM_1][$IVALDIM_2]
				FOR $I = 0 TO $IVALDIM_1 - 1
					$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
					FOR $J = 0 TO $IVALDIM_2 - 1
						$ATMP[$I][$J] = $ASPLIT_2[$J]
					NEXT
				NEXT
				$VVALUE = $ATMP
			ENDIF
			IF UBOUND($VVALUE, $UBOUND_COLUMNS) + $ISTART > UBOUND($AARRAY, $UBOUND_COLUMNS) THEN RETURN SETERROR(8, 0, -1)
			REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1][$IDIM_2]
			FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
				FOR $J = 0 TO $IDIM_2 - 1
					$AARRAY[$ICOPYTO_INDEX][$J] = $AARRAY[$IREADFROMINDEX][$J]
				NEXT
				$ICOPYTO_INDEX -= 1
				$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
				WHILE $IREADFROMINDEX = $IINSERT_INDEX
					FOR $J = 0 TO $IDIM_2 - 1
						IF $J < $ISTART THEN
							$AARRAY[$ICOPYTO_INDEX][$J] = ""
						ELSEIF $J - $ISTART > $IVALDIM_2 - 1 THEN
							$AARRAY[$ICOPYTO_INDEX][$J] = ""
						ELSE
							IF $IINSERTPOINT_INDEX - 1 < $IVALDIM_1 THEN
								IF ISFUNC($HDATATYPE) THEN
									$AARRAY[$ICOPYTO_INDEX][$J] = $HDATATYPE($VVALUE[$IINSERTPOINT_INDEX - 1][$J - $ISTART])
								ELSE
									$AARRAY[$ICOPYTO_INDEX][$J] = $VVALUE[$IINSERTPOINT_INDEX - 1][$J - $ISTART]
								ENDIF
							ELSE
								$AARRAY[$ICOPYTO_INDEX][$J] = ""
							ENDIF
						ENDIF
					NEXT
					$ICOPYTO_INDEX -= 1
					$IINSERTPOINT_INDEX -= 1
					IF $IINSERTPOINT_INDEX = 0 THEN EXITLOOP 2
					$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
				WEND
			NEXT
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN UBOUND($AARRAY, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYMAX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
	LOCAL $IRESULT = _ARRAYMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM)
	IF @ERROR THEN RETURN SETERROR(@ERROR, 0, "")
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN
		RETURN $AARRAY[$IRESULT]
	ELSE
		RETURN $AARRAY[$IRESULT][$ISUBITEM]
	ENDIF
ENDFUNC
FUNC _ARRAYMAXINDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
	IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
	IF $ISTART = DEFAULT THEN $ISTART = -1
	IF $IEND = DEFAULT THEN $IEND = -1
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	LOCAL $IRET = __ARRAY_MINMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, __ARRAY_GREATERTHAN)
	RETURN SETERROR(@ERROR, 0, $IRET)
ENDFUNC
FUNC _ARRAYMIN(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
	LOCAL $IRESULT = _ARRAYMININDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM)
	IF @ERROR THEN RETURN SETERROR(@ERROR, 0, "")
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN
		RETURN $AARRAY[$IRESULT]
	ELSE
		RETURN $AARRAY[$IRESULT][$ISUBITEM]
	ENDIF
ENDFUNC
FUNC _ARRAYMININDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
	IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
	IF $ISTART = DEFAULT THEN $ISTART = -1
	IF $IEND = DEFAULT THEN $IEND = -1
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	LOCAL $IRET = __ARRAY_MINMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, __ARRAY_LESSTHAN)
	RETURN SETERROR(@ERROR, 0, $IRET)
ENDFUNC
FUNC _ARRAYPERMUTE(BYREF $AARRAY, $SDELIMITER = "")
	IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, 0)
	LOCAL $ISIZE = UBOUND($AARRAY), $IFACTORIAL = 1, $AIDX[$ISIZE], $ARESULT[1], $ICOUNT = 1
	IF UBOUND($AARRAY) THEN
		FOR $I = 0 TO $ISIZE - 1
			$AIDX[$I] = $I
		NEXT
		FOR $I = $ISIZE TO 1 STEP -1
			$IFACTORIAL *= $I
		NEXT
		REDIM $ARESULT[$IFACTORIAL + 1]
		$ARESULT[0] = $IFACTORIAL
		__ARRAY_EXETERINTERNAL($AARRAY, 0, $ISIZE, $SDELIMITER, $AIDX, $ARESULT, $ICOUNT)
	ELSE
		$ARESULT[0] = 0
	ENDIF
	RETURN $ARESULT
ENDFUNC
FUNC _ARRAYPOP(BYREF $AARRAY)
	IF(NOT ISARRAY($AARRAY)) THEN RETURN SETERROR(1, 0, "")
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, "")
	LOCAL $IUBOUND = UBOUND($AARRAY) - 1
	IF $IUBOUND = -1 THEN RETURN SETERROR(3, 0, "")
	LOCAL $SLASTVAL = $AARRAY[$IUBOUND]
	IF $IUBOUND > -1 THEN
		REDIM $AARRAY[$IUBOUND]
	ENDIF
	RETURN $SLASTVAL
ENDFUNC
FUNC _ARRAYPUSH(BYREF $AARRAY, $VVALUE, $IDIRECTION = 0)
	IF $IDIRECTION = DEFAULT THEN $IDIRECTION = 0
	IF(NOT ISARRAY($AARRAY)) THEN RETURN SETERROR(1, 0, 0)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(3, 0, 0)
	LOCAL $IUBOUND = UBOUND($AARRAY) - 1
	IF ISARRAY($VVALUE) THEN
		LOCAL $IUBOUNDS = UBOUND($VVALUE)
		IF($IUBOUNDS - 1) > $IUBOUND THEN RETURN SETERROR(2, 0, 0)
		IF $IDIRECTION THEN
			FOR $I = $IUBOUND TO $IUBOUNDS STEP -1
				$AARRAY[$I] = $AARRAY[$I - $IUBOUNDS]
			NEXT
			FOR $I = 0 TO $IUBOUNDS - 1
				$AARRAY[$I] = $VVALUE[$I]
			NEXT
		ELSE
			FOR $I = 0 TO $IUBOUND - $IUBOUNDS
				$AARRAY[$I] = $AARRAY[$I + $IUBOUNDS]
			NEXT
			FOR $I = 0 TO $IUBOUNDS - 1
				$AARRAY[$I + $IUBOUND - $IUBOUNDS + 1] = $VVALUE[$I]
			NEXT
		ENDIF
	ELSE
		IF $IUBOUND > -1 THEN
			IF $IDIRECTION THEN
				FOR $I = $IUBOUND TO 1 STEP -1
					$AARRAY[$I] = $AARRAY[$I - 1]
				NEXT
				$AARRAY[0] = $VVALUE
			ELSE
				FOR $I = 0 TO $IUBOUND - 1
					$AARRAY[$I] = $AARRAY[$I + 1]
				NEXT
				$AARRAY[$IUBOUND] = $VVALUE
			ENDIF
		ENDIF
	ENDIF
	RETURN 1
ENDFUNC
FUNC _ARRAYREVERSE(BYREF $AARRAY, $ISTART = 0, $IEND = 0)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
	IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(3, 0, 0)
	IF NOT UBOUND($AARRAY) THEN RETURN SETERROR(4, 0, 0)
	LOCAL $VTMP, $IUBOUND = UBOUND($AARRAY) - 1
	IF $IEND < 1 OR $IEND > $IUBOUND THEN $IEND = $IUBOUND
	IF $ISTART < 0 THEN $ISTART = 0
	IF $ISTART > $IEND THEN RETURN SETERROR(2, 0, 0)
	FOR $I = $ISTART TO INT(($ISTART + $IEND - 1) / 2)
		$VTMP = $AARRAY[$I]
		$AARRAY[$I] = $AARRAY[$IEND]
		$AARRAY[$IEND] = $VTMP
		$IEND -= 1
	NEXT
	RETURN 1
ENDFUNC
FUNC _ARRAYSEARCH(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICASE = 0, $ICOMPARE = 0, $IFORWARD = 1, $ISUBITEM = -1, $BROW = FALSE)
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ICASE = DEFAULT THEN $ICASE = 0
	IF $ICOMPARE = DEFAULT THEN $ICOMPARE = 0
	IF $IFORWARD = DEFAULT THEN $IFORWARD = 1
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = -1
	IF $BROW = DEFAULT THEN $BROW = FALSE
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY) - 1
	IF $IDIM_1 = -1 THEN RETURN SETERROR(3, 0, -1)
	LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
	LOCAL $BCOMPTYPE = FALSE
	IF $ICOMPARE = 2 THEN
		$ICOMPARE = 0
		$BCOMPTYPE = TRUE
	ENDIF
	IF $BROW THEN
		IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN RETURN SETERROR(5, 0, -1)
		IF $IEND < 1 OR $IEND > $IDIM_2 THEN $IEND = $IDIM_2
		IF $ISTART < 0 THEN $ISTART = 0
		IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
	ELSE
		IF $IEND < 1 OR $IEND > $IDIM_1 THEN $IEND = $IDIM_1
		IF $ISTART < 0 THEN $ISTART = 0
		IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
	ENDIF
	LOCAL $ISTEP = 1
	IF NOT $IFORWARD THEN
		LOCAL $ITMP = $ISTART
		$ISTART = $IEND
		$IEND = $ITMP
		$ISTEP = -1
	ENDIF
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF NOT $ICOMPARE THEN
				IF NOT $ICASE THEN
					FOR $I = $ISTART TO $IEND STEP $ISTEP
						IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
						IF $AARRAY[$I] = $VVALUE THEN RETURN $I
					NEXT
				ELSE
					FOR $I = $ISTART TO $IEND STEP $ISTEP
						IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
						IF $AARRAY[$I] == $VVALUE THEN RETURN $I
					NEXT
				ENDIF
			ELSE
				FOR $I = $ISTART TO $IEND STEP $ISTEP
					IF $ICOMPARE = 3 THEN
						IF STRINGREGEXP($AARRAY[$I], $VVALUE) THEN RETURN $I
					ELSE
						IF STRINGINSTR($AARRAY[$I], $VVALUE, $ICASE) > 0 THEN RETURN $I
					ENDIF
				NEXT
			ENDIF
		CASE 2
			LOCAL $IDIM_SUB
			IF $BROW THEN
				$IDIM_SUB = $IDIM_1
				IF $ISUBITEM > $IDIM_SUB THEN $ISUBITEM = $IDIM_SUB
				IF $ISUBITEM < 0 THEN
					$ISUBITEM = 0
				ELSE
					$IDIM_SUB = $ISUBITEM
				ENDIF
			ELSE
				$IDIM_SUB = $IDIM_2
				IF $ISUBITEM > $IDIM_SUB THEN $ISUBITEM = $IDIM_SUB
				IF $ISUBITEM < 0 THEN
					$ISUBITEM = 0
				ELSE
					$IDIM_SUB = $ISUBITEM
				ENDIF
			ENDIF
			FOR $J = $ISUBITEM TO $IDIM_SUB
				IF NOT $ICOMPARE THEN
					IF NOT $ICASE THEN
						FOR $I = $ISTART TO $IEND STEP $ISTEP
							IF $BROW THEN
								IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$J][$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
								IF $AARRAY[$J][$I] = $VVALUE THEN RETURN $I
							ELSE
								IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I][$J]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
								IF $AARRAY[$I][$J] = $VVALUE THEN RETURN $I
							ENDIF
						NEXT
					ELSE
						FOR $I = $ISTART TO $IEND STEP $ISTEP
							IF $BROW THEN
								IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$J][$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
								IF $AARRAY[$J][$I] == $VVALUE THEN RETURN $I
							ELSE
								IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I][$J]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
								IF $AARRAY[$I][$J] == $VVALUE THEN RETURN $I
							ENDIF
						NEXT
					ENDIF
				ELSE
					FOR $I = $ISTART TO $IEND STEP $ISTEP
						IF $ICOMPARE = 3 THEN
							IF $BROW THEN
								IF STRINGREGEXP($AARRAY[$J][$I], $VVALUE) THEN RETURN $I
							ELSE
								IF STRINGREGEXP($AARRAY[$I][$J], $VVALUE) THEN RETURN $I
							ENDIF
						ELSE
							IF $BROW THEN
								IF STRINGINSTR($AARRAY[$J][$I], $VVALUE, $ICASE) > 0 THEN RETURN $I
							ELSE
								IF STRINGINSTR($AARRAY[$I][$J], $VVALUE, $ICASE) > 0 THEN RETURN $I
							ENDIF
						ENDIF
					NEXT
				ENDIF
			NEXT
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN SETERROR(6, 0, -1)
ENDFUNC
FUNC _ARRAYSHUFFLE(BYREF $AARRAY, $ISTART_ROW = 0, $IEND_ROW = 0, $ICOL = -1)
	IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = 0
	IF $IEND_ROW = DEFAULT THEN $IEND_ROW = 0
	IF $ICOL = DEFAULT THEN $ICOL = -1
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
	IF $IEND_ROW = 0 THEN $IEND_ROW = $IDIM_1 - 1
	IF $ISTART_ROW < 0 OR $ISTART_ROW > $IDIM_1 - 1 THEN RETURN SETERROR(3, 0, -1)
	IF $IEND_ROW < 1 OR $IEND_ROW > $IDIM_1 - 1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
	LOCAL $VTMP, $IRAND
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			FOR $I = $IEND_ROW TO $ISTART_ROW + 1 STEP -1
				$IRAND = RANDOM($ISTART_ROW, $I, 1)
				$VTMP = $AARRAY[$I]
				$AARRAY[$I] = $AARRAY[$IRAND]
				$AARRAY[$IRAND] = $VTMP
			NEXT
			RETURN 1
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
			IF $ICOL < -1 OR $ICOL > $IDIM_2 - 1 THEN RETURN SETERROR(5, 0, -1)
			LOCAL $ICOL_START, $ICOL_END
			IF $ICOL = -1 THEN
				$ICOL_START = 0
				$ICOL_END = $IDIM_2 - 1
			ELSE
				$ICOL_START = $ICOL
				$ICOL_END = $ICOL
			ENDIF
			FOR $I = $IEND_ROW TO $ISTART_ROW + 1 STEP -1
				$IRAND = RANDOM($ISTART_ROW, $I, 1)
				FOR $J = $ICOL_START TO $ICOL_END
					$VTMP = $AARRAY[$I][$J]
					$AARRAY[$I][$J] = $AARRAY[$IRAND][$J]
					$AARRAY[$IRAND][$J] = $VTMP
				NEXT
			NEXT
			RETURN 1
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
ENDFUNC
FUNC _ARRAYSORT(BYREF $AARRAY, $IDESCENDING = 0, $ISTART = 0, $IEND = 0, $ISUBITEM = 0, $IPIVOT = 0)
	IF $IDESCENDING = DEFAULT THEN $IDESCENDING = 0
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	IF $IPIVOT = DEFAULT THEN $IPIVOT = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
	LOCAL $IUBOUND = UBOUND($AARRAY) - 1
	IF $IUBOUND = -1 THEN RETURN SETERROR(5, 0, 0)
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $IEND < 1 OR $IEND > $IUBOUND OR $IEND = DEFAULT THEN $IEND = $IUBOUND
	IF $ISTART < 0 OR $ISTART = DEFAULT THEN $ISTART = 0
	IF $ISTART > $IEND THEN RETURN SETERROR(2, 0, 0)
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $IPIVOT THEN
				__ARRAYDUALPIVOTSORT($AARRAY, $ISTART, $IEND)
			ELSE
				__ARRAYQUICKSORT1D($AARRAY, $ISTART, $IEND)
			ENDIF
			IF $IDESCENDING THEN _ARRAYREVERSE($AARRAY, $ISTART, $IEND)
		CASE 2
			IF $IPIVOT THEN RETURN SETERROR(6, 0, 0)
			LOCAL $ISUBMAX = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			IF $ISUBITEM > $ISUBMAX THEN RETURN SETERROR(3, 0, 0)
			IF $IDESCENDING THEN
				$IDESCENDING = -1
			ELSE
				$IDESCENDING = 1
			ENDIF
			__ARRAYQUICKSORT2D($AARRAY, $IDESCENDING, $ISTART, $IEND, $ISUBITEM, $ISUBMAX)
		CASE ELSE
			RETURN SETERROR(4, 0, 0)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC __ARRAYQUICKSORT1D(BYREF $AARRAY, CONST BYREF $ISTART, CONST BYREF $IEND)
	IF $IEND <= $ISTART THEN RETURN
	LOCAL $VTMP
	IF($IEND - $ISTART) < 15 THEN
		LOCAL $VCUR
		FOR $I = $ISTART + 1 TO $IEND
			$VTMP = $AARRAY[$I]
			IF ISNUMBER($VTMP) THEN
				FOR $J = $I - 1 TO $ISTART STEP -1
					$VCUR = $AARRAY[$J]
					IF($VTMP >= $VCUR AND ISNUMBER($VCUR)) OR(NOT ISNUMBER($VCUR) AND STRINGCOMPARE($VTMP, $VCUR) >= 0) THEN EXITLOOP
					$AARRAY[$J + 1] = $VCUR
				NEXT
			ELSE
				FOR $J = $I - 1 TO $ISTART STEP -1
					IF(STRINGCOMPARE($VTMP, $AARRAY[$J]) >= 0) THEN EXITLOOP
					$AARRAY[$J + 1] = $AARRAY[$J]
				NEXT
			ENDIF
			$AARRAY[$J + 1] = $VTMP
		NEXT
		RETURN
	ENDIF
	LOCAL $L = $ISTART, $R = $IEND, $VPIVOT = $AARRAY[INT(($ISTART + $IEND) / 2)], $BNUM = ISNUMBER($VPIVOT)
	DO
		IF $BNUM THEN
			WHILE($AARRAY[$L] < $VPIVOT AND ISNUMBER($AARRAY[$L])) OR(NOT ISNUMBER($AARRAY[$L]) AND STRINGCOMPARE($AARRAY[$L], $VPIVOT) < 0)
				$L += 1
			WEND
			WHILE($AARRAY[$R] > $VPIVOT AND ISNUMBER($AARRAY[$R])) OR(NOT ISNUMBER($AARRAY[$R]) AND STRINGCOMPARE($AARRAY[$R], $VPIVOT) > 0)
				$R -= 1
			WEND
		ELSE
			WHILE(STRINGCOMPARE($AARRAY[$L], $VPIVOT) < 0)
				$L += 1
			WEND
			WHILE(STRINGCOMPARE($AARRAY[$R], $VPIVOT) > 0)
				$R -= 1
			WEND
		ENDIF
		IF $L <= $R THEN
			$VTMP = $AARRAY[$L]
			$AARRAY[$L] = $AARRAY[$R]
			$AARRAY[$R] = $VTMP
			$L += 1
			$R -= 1
		ENDIF
	UNTIL $L > $R
	__ARRAYQUICKSORT1D($AARRAY, $ISTART, $R)
	__ARRAYQUICKSORT1D($AARRAY, $L, $IEND)
ENDFUNC
FUNC __ARRAYQUICKSORT2D(BYREF $AARRAY, CONST BYREF $ISTEP, CONST BYREF $ISTART, CONST BYREF $IEND, CONST BYREF $ISUBITEM, CONST BYREF $ISUBMAX)
	IF $IEND <= $ISTART THEN RETURN
	LOCAL $VTMP, $L = $ISTART, $R = $IEND, $VPIVOT = $AARRAY[INT(($ISTART + $IEND) / 2)][$ISUBITEM], $BNUM = ISNUMBER($VPIVOT)
	DO
		IF $BNUM THEN
			WHILE($ISTEP * ($AARRAY[$L][$ISUBITEM] - $VPIVOT) < 0 AND ISNUMBER($AARRAY[$L][$ISUBITEM])) OR(NOT ISNUMBER($AARRAY[$L][$ISUBITEM]) AND $ISTEP * STRINGCOMPARE($AARRAY[$L][$ISUBITEM], $VPIVOT) < 0)
				$L += 1
			WEND
			WHILE($ISTEP * ($AARRAY[$R][$ISUBITEM] - $VPIVOT) > 0 AND ISNUMBER($AARRAY[$R][$ISUBITEM])) OR(NOT ISNUMBER($AARRAY[$R][$ISUBITEM]) AND $ISTEP * STRINGCOMPARE($AARRAY[$R][$ISUBITEM], $VPIVOT) > 0)
				$R -= 1
			WEND
		ELSE
			WHILE($ISTEP * STRINGCOMPARE($AARRAY[$L][$ISUBITEM], $VPIVOT) < 0)
				$L += 1
			WEND
			WHILE($ISTEP * STRINGCOMPARE($AARRAY[$R][$ISUBITEM], $VPIVOT) > 0)
				$R -= 1
			WEND
		ENDIF
		IF $L <= $R THEN
			FOR $I = 0 TO $ISUBMAX
				$VTMP = $AARRAY[$L][$I]
				$AARRAY[$L][$I] = $AARRAY[$R][$I]
				$AARRAY[$R][$I] = $VTMP
			NEXT
			$L += 1
			$R -= 1
		ENDIF
	UNTIL $L > $R
	__ARRAYQUICKSORT2D($AARRAY, $ISTEP, $ISTART, $R, $ISUBITEM, $ISUBMAX)
	__ARRAYQUICKSORT2D($AARRAY, $ISTEP, $L, $IEND, $ISUBITEM, $ISUBMAX)
ENDFUNC
FUNC __ARRAYDUALPIVOTSORT(BYREF $AARRAY, $IPIVOT_LEFT, $IPIVOT_RIGHT, $BLEFTMOST = TRUE)
	IF $IPIVOT_LEFT > $IPIVOT_RIGHT THEN RETURN
	LOCAL $ILENGTH = $IPIVOT_RIGHT - $IPIVOT_LEFT + 1
	LOCAL $I, $J, $K, $IAI, $IAK, $IA1, $IA2, $ILAST
	IF $ILENGTH < 45 THEN
		IF $BLEFTMOST THEN
			$I = $IPIVOT_LEFT
			WHILE $I < $IPIVOT_RIGHT
				$J = $I
				$IAI = $AARRAY[$I + 1]
				WHILE $IAI < $AARRAY[$J]
					$AARRAY[$J + 1] = $AARRAY[$J]
					$J -= 1
					IF $J + 1 = $IPIVOT_LEFT THEN EXITLOOP
				WEND
				$AARRAY[$J + 1] = $IAI
				$I += 1
			WEND
		ELSE
			WHILE 1
				IF $IPIVOT_LEFT >= $IPIVOT_RIGHT THEN RETURN 1
				$IPIVOT_LEFT += 1
				IF $AARRAY[$IPIVOT_LEFT] < $AARRAY[$IPIVOT_LEFT - 1] THEN EXITLOOP
			WEND
			WHILE 1
				$K = $IPIVOT_LEFT
				$IPIVOT_LEFT += 1
				IF $IPIVOT_LEFT > $IPIVOT_RIGHT THEN EXITLOOP
				$IA1 = $AARRAY[$K]
				$IA2 = $AARRAY[$IPIVOT_LEFT]
				IF $IA1 < $IA2 THEN
					$IA2 = $IA1
					$IA1 = $AARRAY[$IPIVOT_LEFT]
				ENDIF
				$K -= 1
				WHILE $IA1 < $AARRAY[$K]
					$AARRAY[$K + 2] = $AARRAY[$K]
					$K -= 1
				WEND
				$AARRAY[$K + 2] = $IA1
				WHILE $IA2 < $AARRAY[$K]
					$AARRAY[$K + 1] = $AARRAY[$K]
					$K -= 1
				WEND
				$AARRAY[$K + 1] = $IA2
				$IPIVOT_LEFT += 1
			WEND
			$ILAST = $AARRAY[$IPIVOT_RIGHT]
			$IPIVOT_RIGHT -= 1
			WHILE $ILAST < $AARRAY[$IPIVOT_RIGHT]
				$AARRAY[$IPIVOT_RIGHT + 1] = $AARRAY[$IPIVOT_RIGHT]
				$IPIVOT_RIGHT -= 1
			WEND
			$AARRAY[$IPIVOT_RIGHT + 1] = $ILAST
		ENDIF
		RETURN 1
	ENDIF
	LOCAL $ISEVENTH = BITSHIFT($ILENGTH, 3) + BITSHIFT($ILENGTH, 6) + 1
	LOCAL $IE1, $IE2, $IE3, $IE4, $IE5, $T
	$IE3 = CEILING(($IPIVOT_LEFT + $IPIVOT_RIGHT) / 2)
	$IE2 = $IE3 - $ISEVENTH
	$IE1 = $IE2 - $ISEVENTH
	$IE4 = $IE3 + $ISEVENTH
	$IE5 = $IE4 + $ISEVENTH
	IF $AARRAY[$IE2] < $AARRAY[$IE1] THEN
		$T = $AARRAY[$IE2]
		$AARRAY[$IE2] = $AARRAY[$IE1]
		$AARRAY[$IE1] = $T
	ENDIF
	IF $AARRAY[$IE3] < $AARRAY[$IE2] THEN
		$T = $AARRAY[$IE3]
		$AARRAY[$IE3] = $AARRAY[$IE2]
		$AARRAY[$IE2] = $T
		IF $T < $AARRAY[$IE1] THEN
			$AARRAY[$IE2] = $AARRAY[$IE1]
			$AARRAY[$IE1] = $T
		ENDIF
	ENDIF
	IF $AARRAY[$IE4] < $AARRAY[$IE3] THEN
		$T = $AARRAY[$IE4]
		$AARRAY[$IE4] = $AARRAY[$IE3]
		$AARRAY[$IE3] = $T
		IF $T < $AARRAY[$IE2] THEN
			$AARRAY[$IE3] = $AARRAY[$IE2]
			$AARRAY[$IE2] = $T
			IF $T < $AARRAY[$IE1] THEN
				$AARRAY[$IE2] = $AARRAY[$IE1]
				$AARRAY[$IE1] = $T
			ENDIF
		ENDIF
	ENDIF
	IF $AARRAY[$IE5] < $AARRAY[$IE4] THEN
		$T = $AARRAY[$IE5]
		$AARRAY[$IE5] = $AARRAY[$IE4]
		$AARRAY[$IE4] = $T
		IF $T < $AARRAY[$IE3] THEN
			$AARRAY[$IE4] = $AARRAY[$IE3]
			$AARRAY[$IE3] = $T
			IF $T < $AARRAY[$IE2] THEN
				$AARRAY[$IE3] = $AARRAY[$IE2]
				$AARRAY[$IE2] = $T
				IF $T < $AARRAY[$IE1] THEN
					$AARRAY[$IE2] = $AARRAY[$IE1]
					$AARRAY[$IE1] = $T
				ENDIF
			ENDIF
		ENDIF
	ENDIF
	LOCAL $ILESS = $IPIVOT_LEFT
	LOCAL $IGREATER = $IPIVOT_RIGHT
	IF(($AARRAY[$IE1] <> $AARRAY[$IE2]) AND($AARRAY[$IE2] <> $AARRAY[$IE3]) AND($AARRAY[$IE3] <> $AARRAY[$IE4]) AND($AARRAY[$IE4] <> $AARRAY[$IE5])) THEN
		LOCAL $IPIVOT_1 = $AARRAY[$IE2]
		LOCAL $IPIVOT_2 = $AARRAY[$IE4]
		$AARRAY[$IE2] = $AARRAY[$IPIVOT_LEFT]
		$AARRAY[$IE4] = $AARRAY[$IPIVOT_RIGHT]
		DO
			$ILESS += 1
		UNTIL $AARRAY[$ILESS] >= $IPIVOT_1
		DO
			$IGREATER -= 1
		UNTIL $AARRAY[$IGREATER] <= $IPIVOT_2
		$K = $ILESS
		WHILE $K <= $IGREATER
			$IAK = $AARRAY[$K]
			IF $IAK < $IPIVOT_1 THEN
				$AARRAY[$K] = $AARRAY[$ILESS]
				$AARRAY[$ILESS] = $IAK
				$ILESS += 1
			ELSEIF $IAK > $IPIVOT_2 THEN
				WHILE $AARRAY[$IGREATER] > $IPIVOT_2
					$IGREATER -= 1
					IF $IGREATER + 1 = $K THEN EXITLOOP 2
				WEND
				IF $AARRAY[$IGREATER] < $IPIVOT_1 THEN
					$AARRAY[$K] = $AARRAY[$ILESS]
					$AARRAY[$ILESS] = $AARRAY[$IGREATER]
					$ILESS += 1
				ELSE
					$AARRAY[$K] = $AARRAY[$IGREATER]
				ENDIF
				$AARRAY[$IGREATER] = $IAK
				$IGREATER -= 1
			ENDIF
			$K += 1
		WEND
		$AARRAY[$IPIVOT_LEFT] = $AARRAY[$ILESS - 1]
		$AARRAY[$ILESS - 1] = $IPIVOT_1
		$AARRAY[$IPIVOT_RIGHT] = $AARRAY[$IGREATER + 1]
		$AARRAY[$IGREATER + 1] = $IPIVOT_2
		__ARRAYDUALPIVOTSORT($AARRAY, $IPIVOT_LEFT, $ILESS - 2, TRUE)
		__ARRAYDUALPIVOTSORT($AARRAY, $IGREATER + 2, $IPIVOT_RIGHT, FALSE)
		IF($ILESS < $IE1) AND($IE5 < $IGREATER) THEN
			WHILE $AARRAY[$ILESS] = $IPIVOT_1
				$ILESS += 1
			WEND
			WHILE $AARRAY[$IGREATER] = $IPIVOT_2
				$IGREATER -= 1
			WEND
			$K = $ILESS
			WHILE $K <= $IGREATER
				$IAK = $AARRAY[$K]
				IF $IAK = $IPIVOT_1 THEN
					$AARRAY[$K] = $AARRAY[$ILESS]
					$AARRAY[$ILESS] = $IAK
					$ILESS += 1
				ELSEIF $IAK = $IPIVOT_2 THEN
					WHILE $AARRAY[$IGREATER] = $IPIVOT_2
						$IGREATER -= 1
						IF $IGREATER + 1 = $K THEN EXITLOOP 2
					WEND
					IF $AARRAY[$IGREATER] = $IPIVOT_1 THEN
						$AARRAY[$K] = $AARRAY[$ILESS]
						$AARRAY[$ILESS] = $IPIVOT_1
						$ILESS += 1
					ELSE
						$AARRAY[$K] = $AARRAY[$IGREATER]
					ENDIF
					$AARRAY[$IGREATER] = $IAK
					$IGREATER -= 1
				ENDIF
				$K += 1
			WEND
		ENDIF
		__ARRAYDUALPIVOTSORT($AARRAY, $ILESS, $IGREATER, FALSE)
	ELSE
		LOCAL $IPIVOT = $AARRAY[$IE3]
		$K = $ILESS
		WHILE $K <= $IGREATER
			IF $AARRAY[$K] = $IPIVOT THEN
				$K += 1
				CONTINUELOOP
			ENDIF
			$IAK = $AARRAY[$K]
			IF $IAK < $IPIVOT THEN
				$AARRAY[$K] = $AARRAY[$ILESS]
				$AARRAY[$ILESS] = $IAK
				$ILESS += 1
			ELSE
				WHILE $AARRAY[$IGREATER] > $IPIVOT
					$IGREATER -= 1
				WEND
				IF $AARRAY[$IGREATER] < $IPIVOT THEN
					$AARRAY[$K] = $AARRAY[$ILESS]
					$AARRAY[$ILESS] = $AARRAY[$IGREATER]
					$ILESS += 1
				ELSE
					$AARRAY[$K] = $IPIVOT
				ENDIF
				$AARRAY[$IGREATER] = $IAK
				$IGREATER -= 1
			ENDIF
			$K += 1
		WEND
		__ARRAYDUALPIVOTSORT($AARRAY, $IPIVOT_LEFT, $ILESS - 1, TRUE)
		__ARRAYDUALPIVOTSORT($AARRAY, $IGREATER + 1, $IPIVOT_RIGHT, FALSE)
	ENDIF
ENDFUNC
FUNC _ARRAYSWAP(BYREF $AARRAY, $IINDEX_1, $IINDEX_2, $BCOL = FALSE, $ISTART = -1, $IEND = -1)
	IF $BCOL = DEFAULT THEN $BCOL = FALSE
	IF $ISTART = DEFAULT THEN $ISTART = -1
	IF $IEND = DEFAULT THEN $IEND = -1
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
	IF $IDIM_2 = -1 THEN
		$BCOL = FALSE
		$ISTART = -1
		$IEND = -1
	ENDIF
	IF $ISTART > $IEND THEN RETURN SETERROR(5, 0, -1)
	IF $BCOL THEN
		IF $IINDEX_1 < 0 OR $IINDEX_2 > $IDIM_2 THEN RETURN SETERROR(3, 0, -1)
		IF $ISTART = -1 THEN $ISTART = 0
		IF $IEND = -1 THEN $IEND = $IDIM_1
	ELSE
		IF $IINDEX_1 < 0 OR $IINDEX_2 > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
		IF $ISTART = -1 THEN $ISTART = 0
		IF $IEND = -1 THEN $IEND = $IDIM_2
	ENDIF
	LOCAL $VTMP
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			$VTMP = $AARRAY[$IINDEX_1]
			$AARRAY[$IINDEX_1] = $AARRAY[$IINDEX_2]
			$AARRAY[$IINDEX_2] = $VTMP
		CASE 2
			IF $ISTART < -1 OR $IEND < -1 THEN RETURN SETERROR(4, 0, -1)
			IF $BCOL THEN
				IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(4, 0, -1)
				FOR $J = $ISTART TO $IEND
					$VTMP = $AARRAY[$J][$IINDEX_1]
					$AARRAY[$J][$IINDEX_1] = $AARRAY[$J][$IINDEX_2]
					$AARRAY[$J][$IINDEX_2] = $VTMP
				NEXT
			ELSE
				IF $ISTART > $IDIM_2 OR $IEND > $IDIM_2 THEN RETURN SETERROR(4, 0, -1)
				FOR $J = $ISTART TO $IEND
					$VTMP = $AARRAY[$IINDEX_1][$J]
					$AARRAY[$IINDEX_1][$J] = $AARRAY[$IINDEX_2][$J]
					$AARRAY[$IINDEX_2][$J] = $VTMP
				NEXT
			ENDIF
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC _ARRAYTOCLIP(CONST BYREF $AARRAY, $SDELIM_COL = "|", $ISTART_ROW = -1, $IEND_ROW = -1, $SDELIM_ROW = @CRLF, $ISTART_COL = -1, $IEND_COL = -1)
	LOCAL $SRESULT = _ARRAYTOSTRING($AARRAY, $SDELIM_COL, $ISTART_ROW, $IEND_ROW, $SDELIM_ROW, $ISTART_COL, $IEND_COL)
	IF @ERROR THEN RETURN SETERROR(@ERROR, 0, 0)
	IF CLIPPUT($SRESULT) THEN RETURN 1
	RETURN SETERROR(-1, 0, 0)
ENDFUNC
FUNC _ARRAYTOSTRING(CONST BYREF $AARRAY, $SDELIM_COL = "|", $ISTART_ROW = DEFAULT, $IEND_ROW = DEFAULT, $SDELIM_ROW = @CRLF, $ISTART_COL = DEFAULT, $IEND_COL = DEFAULT)
	IF $SDELIM_COL = DEFAULT THEN $SDELIM_COL = "|"
	IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
	IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = -1
	IF $IEND_ROW = DEFAULT THEN $IEND_ROW = -1
	IF $ISTART_COL = DEFAULT THEN $ISTART_COL = -1
	IF $IEND_COL = DEFAULT THEN $IEND_COL = -1
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	IF $IDIM_1 = -1 THEN RETURN ""
	IF $ISTART_ROW = -1 THEN $ISTART_ROW = 0
	IF $IEND_ROW = -1 THEN $IEND_ROW = $IDIM_1
	IF $ISTART_ROW < -1 OR $IEND_ROW < -1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART_ROW > $IDIM_1 OR $IEND_ROW > $IDIM_1 THEN RETURN SETERROR(3, 0, "")
	IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
	LOCAL $SRET = ""
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			FOR $I = $ISTART_ROW TO $IEND_ROW
				$SRET &= $AARRAY[$I] & $SDELIM_COL
			NEXT
			RETURN STRINGTRIMRIGHT($SRET, STRINGLEN($SDELIM_COL))
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			IF $IDIM_2 = -1 THEN RETURN ""
			IF $ISTART_COL = -1 THEN $ISTART_COL = 0
			IF $IEND_COL = -1 THEN $IEND_COL = $IDIM_2
			IF $ISTART_COL < -1 OR $IEND_COL < -1 THEN RETURN SETERROR(5, 0, -1)
			IF $ISTART_COL > $IDIM_2 OR $IEND_COL > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
			IF $ISTART_COL > $IEND_COL THEN RETURN SETERROR(6, 0, -1)
			LOCAL $IDELIMCOLLEN = STRINGLEN($SDELIM_COL)
			FOR $I = $ISTART_ROW TO $IEND_ROW
				FOR $J = $ISTART_COL TO $IEND_COL
					$SRET &= $AARRAY[$I][$J] & $SDELIM_COL
				NEXT
				$SRET = STRINGTRIMRIGHT($SRET, $IDELIMCOLLEN) & $SDELIM_ROW
			NEXT
			RETURN STRINGTRIMRIGHT($SRET, STRINGLEN($SDELIM_ROW))
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC _ARRAYTRANSPOSE(BYREF $AARRAY, $BFORCE1D = FALSE)
	LOCAL $ATEMP
	SWITCH $BFORCE1D
		CASE DEFAULT
			$BFORCE1D = FALSE
		CASE TRUE, FALSE
		CASE ELSE
			RETURN SETERROR(3, 0, 0)
	ENDSWITCH
	SWITCH UBOUND($AARRAY, 0)
		CASE 0
			RETURN SETERROR(2, 0, 0)
		CASE 1
			LOCAL $ATEMP[1][UBOUND($AARRAY)]
			FOR $I = 0 TO UBOUND($AARRAY) - 1
				$ATEMP[0][$I] = $AARRAY[$I]
			NEXT
			$AARRAY = $ATEMP
		CASE 2
			LOCAL $IDIM_1 = UBOUND($AARRAY, 1), $IDIM_2 = UBOUND($AARRAY, 2)
			IF $IDIM_1 <> $IDIM_2 THEN
				LOCAL $ATEMP[$IDIM_2][$IDIM_1]
				FOR $I = 0 TO $IDIM_1 - 1
					FOR $J = 0 TO $IDIM_2 - 1
						$ATEMP[$J][$I] = $AARRAY[$I][$J]
					NEXT
				NEXT
				$AARRAY = $ATEMP
			ELSE
				LOCAL $VELEMENT
				FOR $I = 0 TO $IDIM_1 - 1
					FOR $J = $I + 1 TO $IDIM_2 - 1
						$VELEMENT = $AARRAY[$I][$J]
						$AARRAY[$I][$J] = $AARRAY[$J][$I]
						$AARRAY[$J][$I] = $VELEMENT
					NEXT
				NEXT
			ENDIF
			IF $BFORCE1D = TRUE AND UBOUND($AARRAY, 2) = 1 THEN
				$ATEMP = $AARRAY
				REDIM $AARRAY[UBOUND($ATEMP)]
				FOR $I = 0 TO UBOUND($ATEMP) - 1
					$AARRAY[$I] = $ATEMP[$I][0]
				NEXT
			ENDIF
		CASE ELSE
			RETURN SETERROR(1, 0, 0)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC _ARRAYTRIM(BYREF $AARRAY, $ITRIMNUM, $IDIRECTION = 0, $ISTART = 0, $IEND = 0, $ISUBITEM = 0)
	IF $IDIRECTION = DEFAULT THEN $IDIRECTION = 0
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	IF $IEND = 0 THEN $IEND = $IDIM_1
	IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART < 0 OR $IEND < 0 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $IDIRECTION THEN
				FOR $I = $ISTART TO $IEND
					$AARRAY[$I] = STRINGTRIMRIGHT($AARRAY[$I], $ITRIMNUM)
				NEXT
			ELSE
				FOR $I = $ISTART TO $IEND
					$AARRAY[$I] = STRINGTRIMLEFT($AARRAY[$I], $ITRIMNUM)
				NEXT
			ENDIF
		CASE 2
			LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
			IF $ISUBITEM < 0 OR $ISUBITEM > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
			IF $IDIRECTION THEN
				FOR $I = $ISTART TO $IEND
					$AARRAY[$I][$ISUBITEM] = STRINGTRIMRIGHT($AARRAY[$I][$ISUBITEM], $ITRIMNUM)
				NEXT
			ELSE
				FOR $I = $ISTART TO $IEND
					$AARRAY[$I][$ISUBITEM] = STRINGTRIMLEFT($AARRAY[$I][$ISUBITEM], $ITRIMNUM)
				NEXT
			ENDIF
		CASE ELSE
			RETURN SETERROR(2, 0, 0)
	ENDSWITCH
	RETURN 1
ENDFUNC
FUNC _ARRAYUNIQUE(CONST BYREF $AARRAY, $ICOLUMN = 0, $IBASE = 0, $ICASE = 0, $ICOUNT = $ARRAYUNIQUE_COUNT, $IINTTYPE = $ARRAYUNIQUE_AUTO)
	IF $ICOLUMN = DEFAULT THEN $ICOLUMN = 0
	IF $IBASE = DEFAULT THEN $IBASE = 0
	IF $ICASE = DEFAULT THEN $ICASE = 0
	IF $ICOUNT = DEFAULT THEN $ICOUNT = $ARRAYUNIQUE_COUNT
	IF $IINTTYPE = DEFAULT THEN $IINTTYPE = $ARRAYUNIQUE_AUTO
	IF UBOUND($AARRAY, $UBOUND_ROWS) = 0 THEN RETURN SETERROR(1, 0, 0)
	LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS), $INUMCOLUMNS = UBOUND($AARRAY, $UBOUND_COLUMNS)
	IF $IDIMS > 2 THEN RETURN SETERROR(2, 0, 0)
	IF $IBASE < 0 OR $IBASE > 1 OR(NOT ISINT($IBASE)) THEN RETURN SETERROR(3, 0, 0)
	IF $ICASE < 0 OR $ICASE > 1 OR(NOT ISINT($ICASE)) THEN RETURN SETERROR(3, 0, 0)
	IF $ICOUNT < 0 OR $ICOUNT > 1 OR(NOT ISINT($ICOUNT)) THEN RETURN SETERROR(4, 0, 0)
	IF $IINTTYPE < 0 OR $IINTTYPE > 4 OR(NOT ISINT($IINTTYPE)) THEN RETURN SETERROR(5, 0, 0)
	IF $ICOLUMN < 0 OR($INUMCOLUMNS = 0 AND $ICOLUMN > 0) OR($INUMCOLUMNS > 0 AND $ICOLUMN >= $INUMCOLUMNS) THEN RETURN SETERROR(6, 0, 0)
	IF $IINTTYPE = $ARRAYUNIQUE_AUTO THEN
		LOCAL $BINT, $SVARTYPE
		IF $IDIMS = 1 THEN
			$BINT = ISINT($AARRAY[$IBASE])
			$SVARTYPE = VARGETTYPE($AARRAY[$IBASE])
		ELSE
			$BINT = ISINT($AARRAY[$IBASE][$ICOLUMN])
			$SVARTYPE = VARGETTYPE($AARRAY[$IBASE][$ICOLUMN])
		ENDIF
		IF $BINT AND $SVARTYPE = "Int64" THEN
			$IINTTYPE = $ARRAYUNIQUE_FORCE64
		ELSE
			$IINTTYPE = $ARRAYUNIQUE_FORCE32
		ENDIF
	ENDIF
	OBJEVENT("AutoIt.Error", __ARRAYUNIQUE_AUTOERRFUNC)
	LOCAL $ODICTIONARY = OBJCREATE("Scripting.Dictionary")
	$ODICTIONARY.CompareMode = NUMBER(NOT $ICASE)
	LOCAL $VELEM, $STYPE, $VKEY, $BCOMERROR = FALSE
	FOR $I = $IBASE TO UBOUND($AARRAY) - 1
		IF $IDIMS = 1 THEN
			$VELEM = $AARRAY[$I]
		ELSE
			$VELEM = $AARRAY[$I][$ICOLUMN]
		ENDIF
		SWITCH $IINTTYPE
			CASE $ARRAYUNIQUE_FORCE32
				$ODICTIONARY.Item($VELEM)
				IF @ERROR THEN
					$BCOMERROR = TRUE
					EXITLOOP
				ENDIF
			CASE $ARRAYUNIQUE_FORCE64
				$STYPE = VARGETTYPE($VELEM)
				IF $STYPE = "Int32" THEN
					$BCOMERROR = TRUE
					EXITLOOP
				ENDIF
				$VKEY = "#" & $STYPE & "#" & STRING($VELEM)
				IF NOT $ODICTIONARY.Item($VKEY) THEN
					$ODICTIONARY($VKEY) = $VELEM
				ENDIF
			CASE $ARRAYUNIQUE_MATCH
				$STYPE = VARGETTYPE($VELEM)
				IF STRINGLEFT($STYPE, 3) = "Int" THEN
					$VKEY = "#Int#" & STRING($VELEM)
				ELSE
					$VKEY = "#" & $STYPE & "#" & STRING($VELEM)
				ENDIF
				IF NOT $ODICTIONARY.Item($VKEY) THEN
					$ODICTIONARY($VKEY) = $VELEM
				ENDIF
			CASE $ARRAYUNIQUE_DISTINCT
				$VKEY = "#" & VARGETTYPE($VELEM) & "#" & STRING($VELEM)
				IF NOT $ODICTIONARY.Item($VKEY) THEN
					$ODICTIONARY($VKEY) = $VELEM
				ENDIF
		ENDSWITCH
	NEXT
	LOCAL $AVALUES, $J = 0
	IF $BCOMERROR THEN
		RETURN SETERROR(7, 0, 0)
	ELSEIF $IINTTYPE <> $ARRAYUNIQUE_FORCE32 THEN
		LOCAL $AVALUES[$ODICTIONARY.Count]
		FOR $VKEY IN $ODICTIONARY.Keys()
			$AVALUES[$J] = $ODICTIONARY($VKEY)
			IF STRINGLEFT($VKEY, 5) = "#Ptr#" THEN
				$AVALUES[$J] = PTR($AVALUES[$J])
			ENDIF
			$J += 1
		NEXT
	ELSE
		$AVALUES = $ODICTIONARY.Keys()
	ENDIF
	IF $ICOUNT THEN
		_ARRAYINSERT($AVALUES, 0, $ODICTIONARY.Count)
	ENDIF
	RETURN $AVALUES
ENDFUNC
FUNC _ARRAY1DTOHISTOGRAM($AARRAY, $ISIZING = 100)
	IF UBOUND($AARRAY, 0) > 1 THEN RETURN SETERROR(1, 0, "")
	$ISIZING = $ISIZING * 8
	LOCAL $T, $N, $IMIN = 0, $IMAX = 0, $IOFFSET = 0
	FOR $I = 0 TO UBOUND($AARRAY) - 1
		$T = $AARRAY[$I]
		$T = ISNUMBER($T) ? ROUND($T) : 0
		IF $T < $IMIN THEN $IMIN = $T
		IF $T > $IMAX THEN $IMAX = $T
	NEXT
	LOCAL $IRANGE = INT(ROUND(($IMAX - $IMIN) / 8)) * 8
	LOCAL $ISPACERATIO = 4
	FOR $I = 0 TO UBOUND($AARRAY) - 1
		$T = $AARRAY[$I]
		IF $T THEN
			$N = ABS(ROUND(($ISIZING * $T) / $IRANGE) / 8)
			$AARRAY[$I] = ""
			IF $T > 0 THEN
				IF $IMIN THEN
					$IOFFSET = INT(ABS(ROUND(($ISIZING * $IMIN) / $IRANGE) / 8) / 8 * $ISPACERATIO)
					$AARRAY[$I] = __ARRAY_STRINGREPEAT(CHRW(32), $IOFFSET)
				ENDIF
			ELSE
				IF $IMIN <> $T THEN
					$IOFFSET = INT(ABS(ROUND(($ISIZING * ($T - $IMIN)) / $IRANGE) / 8) / 8 * $ISPACERATIO)
					$AARRAY[$I] = __ARRAY_STRINGREPEAT(CHRW(32), $IOFFSET)
				ENDIF
			ENDIF
			$AARRAY[$I] &= __ARRAY_STRINGREPEAT(CHRW(9608), INT($N / 8))
			$N = MOD($N, 8)
			IF $N > 0 THEN $AARRAY[$I] &= CHRW(9608 + 8 - $N)
			$AARRAY[$I] &= " " & $T
		ELSE
			$AARRAY[$I] = ""
		ENDIF
	NEXT
	RETURN $AARRAY
ENDFUNC
FUNC _ARRAY2DCREATE($AARRAY1, $AARRAY2)
	IF NOT ISARRAY($AARRAY1) OR NOT ISARRAY($AARRAY2) THEN RETURN SETERROR(3, 0, "")
	LOCAL $IDIM1 = UBOUND($AARRAY1, $UBOUND_DIMENSIONS), $IDIM2 = UBOUND($AARRAY2, $UBOUND_DIMENSIONS)
	IF $IDIM1 > 2 OR $IDIM2 > 2 THEN RETURN SETERROR(1, 0, "")
	LOCAL $NROWS = UBOUND($AARRAY1, $UBOUND_ROWS)
	IF $NROWS <> UBOUND($AARRAY2, $UBOUND_ROWS) THEN RETURN SETERROR(2, 0, "")
	LOCAL $NCOLS1 = ($IDIM1 = 1 ? 1 : UBOUND($AARRAY1, $UBOUND_COLUMNS))
	LOCAL $NCOLS2 = ($IDIM2 = 1 ? 1 : UBOUND($AARRAY2, $UBOUND_COLUMNS))
	LOCAL $ATMP[$NROWS][$NCOLS1 + $NCOLS2]
	SELECT
		CASE $IDIM1 = 1 AND $IDIM2 = 1
			FOR $I = 0 TO $NROWS - 1
				$ATMP[$I][0] = $AARRAY1[$I]
				$ATMP[$I][1] = $AARRAY2[$I]
			NEXT
		CASE $IDIM1 = 1 AND $IDIM2 = 2
			FOR $I = 0 TO $NROWS - 1
				$ATMP[$I][0] = $AARRAY1[$I]
			NEXT
			FOR $J = 1 TO $NCOLS2
				FOR $I = 0 TO $NROWS - 1
					$ATMP[$I][$J] = $AARRAY2[$I][$J - 1]
				NEXT
			NEXT
		CASE $IDIM1 = 2 AND $IDIM2 = 1
			FOR $J = 0 TO $NCOLS1 - 1
				FOR $I = 0 TO $NROWS - 1
					$ATMP[$I][$J] = $AARRAY1[$I][$J]
				NEXT
			NEXT
			FOR $I = 0 TO $NROWS - 1
				$ATMP[$I][$NCOLS1] = $AARRAY2[$I]
			NEXT
		CASE $IDIM1 = 2 AND $IDIM2 = 2
			FOR $J = 0 TO $NCOLS1 - 1
				FOR $I = 0 TO $NROWS - 1
					$ATMP[$I][$J] = $AARRAY1[$I][$J]
				NEXT
			NEXT
			FOR $J = $NCOLS1 TO($NCOLS1 + $NCOLS2) - 1
				FOR $I = 0 TO $NROWS - 1
					$ATMP[$I][$J] = $AARRAY2[$I][$J - $NCOLS1]
				NEXT
			NEXT
	ENDSELECT
	RETURN $ATMP
ENDFUNC
FUNC __ARRAY_STRINGREPEAT($SSTRING, $IREPEATCOUNT)
	$IREPEATCOUNT = INT($IREPEATCOUNT)
	IF STRINGLEN($SSTRING) < 1 OR $IREPEATCOUNT <= 0 THEN RETURN SETERROR(1, 0, "")
	LOCAL $SRESULT = ""
	WHILE $IREPEATCOUNT > 1
		IF BITAND($IREPEATCOUNT, 1) THEN $SRESULT &= $SSTRING
		$SSTRING &= $SSTRING
		$IREPEATCOUNT = BITSHIFT($IREPEATCOUNT, 1)
	WEND
	RETURN $SSTRING & $SRESULT
ENDFUNC
FUNC __ARRAY_EXETERINTERNAL(BYREF $AARRAY, $ISTART, $ISIZE, $SDELIMITER, BYREF $AIDX, BYREF $ARESULT, BYREF $ICOUNT)
	IF $ISTART == $ISIZE - 1 THEN
		FOR $I = 0 TO $ISIZE - 1
			$ARESULT[$ICOUNT] &= $AARRAY[$AIDX[$I]] & $SDELIMITER
		NEXT
		IF $SDELIMITER <> "" THEN $ARESULT[$ICOUNT] = STRINGTRIMRIGHT($ARESULT[$ICOUNT], STRINGLEN($SDELIMITER))
		$ICOUNT += 1
	ELSE
		LOCAL $ITEMP
		FOR $I = $ISTART TO $ISIZE - 1
			$ITEMP = $AIDX[$I]
			$AIDX[$I] = $AIDX[$ISTART]
			$AIDX[$ISTART] = $ITEMP
			__ARRAY_EXETERINTERNAL($AARRAY, $ISTART + 1, $ISIZE, $SDELIMITER, $AIDX, $ARESULT, $ICOUNT)
			$AIDX[$ISTART] = $AIDX[$I]
			$AIDX[$I] = $ITEMP
		NEXT
	ENDIF
ENDFUNC
FUNC __ARRAY_COMBINATIONS($IN, $IR)
	LOCAL $I_TOTAL = 1
	FOR $I = $IR TO 1 STEP -1
		$I_TOTAL *= ($IN / $I)
		$IN -= 1
	NEXT
	RETURN ROUND($I_TOTAL)
ENDFUNC
FUNC __ARRAY_GETNEXT($IN, $IR, BYREF $ILEFT, $ITOTAL, BYREF $AIDX)
	IF $ILEFT == $ITOTAL THEN
		$ILEFT -= 1
		RETURN
	ENDIF
	LOCAL $I = $IR - 1
	WHILE $AIDX[$I] == $IN - $IR + $I
		$I -= 1
	WEND
	$AIDX[$I] += 1
	FOR $J = $I + 1 TO $IR - 1
		$AIDX[$J] = $AIDX[$I] + $J - $I
	NEXT
	$ILEFT -= 1
ENDFUNC
FUNC __ARRAY_MINMAXINDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, $FUCOMPARISON)
	IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
	IF $ICOMPNUMERIC <> 1 THEN $ICOMPNUMERIC = 0
	IF $ISTART = DEFAULT THEN $ISTART = 0
	IF $IEND = DEFAULT THEN $IEND = 0
	IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
	LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
	IF $IDIM_1 < 0 THEN RETURN SETERROR(1, 0, -1)
	IF $IEND = -1 THEN $IEND = $IDIM_1
	IF $ISTART = -1 THEN $ISTART = 0
	IF $ISTART < -1 OR $IEND < -1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
	IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
	IF $IDIM_1 < 0 THEN RETURN SETERROR(5, 0, -1)
	LOCAL $IMAXMININDEX = $ISTART
	SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
		CASE 1
			IF $ICOMPNUMERIC THEN
				FOR $I = $ISTART TO $IEND
					IF $FUCOMPARISON(NUMBER($AARRAY[$I]), NUMBER($AARRAY[$IMAXMININDEX])) THEN $IMAXMININDEX = $I
				NEXT
			ELSE
				FOR $I = $ISTART TO $IEND
					IF $FUCOMPARISON($AARRAY[$I], $AARRAY[$IMAXMININDEX]) THEN $IMAXMININDEX = $I
				NEXT
			ENDIF
		CASE 2
			IF $ISUBITEM < 0 OR $ISUBITEM > UBOUND($AARRAY, $UBOUND_COLUMNS) - 1 THEN RETURN SETERROR(6, 0, -1)
			IF $ICOMPNUMERIC THEN
				FOR $I = $ISTART TO $IEND
					IF $FUCOMPARISON(NUMBER($AARRAY[$I][$ISUBITEM]), NUMBER($AARRAY[$IMAXMININDEX][$ISUBITEM])) THEN $IMAXMININDEX = $I
				NEXT
			ELSE
				FOR $I = $ISTART TO $IEND
					IF $FUCOMPARISON($AARRAY[$I][$ISUBITEM], $AARRAY[$IMAXMININDEX][$ISUBITEM]) THEN $IMAXMININDEX = $I
				NEXT
			ENDIF
		CASE ELSE
			RETURN SETERROR(2, 0, -1)
	ENDSWITCH
	RETURN $IMAXMININDEX
ENDFUNC
FUNC __ARRAY_GREATERTHAN($VVALUE1, $VVALUE2)
	RETURN $VVALUE1 > $VVALUE2
ENDFUNC
FUNC __ARRAY_LESSTHAN($VVALUE1, $VVALUE2)
	RETURN $VVALUE1 < $VVALUE2
ENDFUNC
FUNC __ARRAYUNIQUE_AUTOERRFUNC()
ENDFUNC
GLOBAL CONST $FC_NOOVERWRITE = 0
GLOBAL CONST $FC_OVERWRITE = 1
GLOBAL CONST $FC_CREATEPATH = 8
GLOBAL CONST $FT_MODIFIED = 0
GLOBAL CONST $FT_CREATED = 1
GLOBAL CONST $FT_ACCESSED = 2
GLOBAL CONST $FT_ARRAY = 0
GLOBAL CONST $FT_STRING = 1
GLOBAL CONST $FT_MSEC = 2
GLOBAL CONST $FT_UTC = 4
GLOBAL CONST $FSF_CREATEBUTTON = 1
GLOBAL CONST $FSF_NEWDIALOG = 2
GLOBAL CONST $FSF_EDITCONTROL = 4
GLOBAL CONST $FT_NONRECURSIVE = 0
GLOBAL CONST $FT_RECURSIVE = 1
GLOBAL CONST $FO_READ = 0
GLOBAL CONST $FO_APPEND = 1
GLOBAL CONST $FO_OVERWRITE = 2
GLOBAL CONST $FO_CREATEPATH = 8
GLOBAL CONST $FO_BINARY = 16
GLOBAL CONST $FO_UNICODE = 32
GLOBAL CONST $FO_UTF16_LE = 32
GLOBAL CONST $FO_UTF16_BE = 64
GLOBAL CONST $FO_UTF8 = 128
GLOBAL CONST $FO_UTF8_NOBOM = 256
GLOBAL CONST $FO_ANSI = 512
GLOBAL CONST $FO_UTF16_LE_NOBOM = 1024
GLOBAL CONST $FO_UTF16_BE_NOBOM = 2048
GLOBAL CONST $FO_UTF8_FULL = 16384
GLOBAL CONST $FO_FULLFILE_DETECT = 16384
GLOBAL CONST $EOF = -1
GLOBAL CONST $FD_FILEMUSTEXIST = 1
GLOBAL CONST $FD_PATHMUSTEXIST = 2
GLOBAL CONST $FD_MULTISELECT = 4
GLOBAL CONST $FD_PROMPTCREATENEW = 8
GLOBAL CONST $FD_PROMPTOVERWRITE = 16
GLOBAL CONST $CREATE_NEW = 1
GLOBAL CONST $CREATE_ALWAYS = 2
GLOBAL CONST $OPEN_EXISTING = 3
GLOBAL CONST $OPEN_ALWAYS = 4
GLOBAL CONST $TRUNCATE_EXISTING = 5
GLOBAL CONST $INVALID_SET_FILE_POINTER = -1
GLOBAL CONST $FILE_BEGIN = 0
GLOBAL CONST $FILE_CURRENT = 1
GLOBAL CONST $FILE_END = 2
GLOBAL CONST $FILE_ATTRIBUTE_READONLY = 1
GLOBAL CONST $FILE_ATTRIBUTE_HIDDEN = 2
GLOBAL CONST $FILE_ATTRIBUTE_SYSTEM = 4
GLOBAL CONST $FILE_ATTRIBUTE_DIRECTORY = 16
GLOBAL CONST $FILE_ATTRIBUTE_ARCHIVE = 32
GLOBAL CONST $FILE_ATTRIBUTE_DEVICE = 64
GLOBAL CONST $FILE_ATTRIBUTE_NORMAL = 128
GLOBAL CONST $FILE_ATTRIBUTE_TEMPORARY = 256
GLOBAL CONST $FILE_ATTRIBUTE_SPARSE_FILE = 512
GLOBAL CONST $FILE_ATTRIBUTE_REPARSE_POINT = 1024
GLOBAL CONST $FILE_ATTRIBUTE_COMPRESSED = 2048
GLOBAL CONST $FILE_ATTRIBUTE_OFFLINE = 4096
GLOBAL CONST $FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192
GLOBAL CONST $FILE_ATTRIBUTE_ENCRYPTED = 16384
GLOBAL CONST $FILE_SHARE_READ = 1
GLOBAL CONST $FILE_SHARE_WRITE = 2
GLOBAL CONST $FILE_SHARE_DELETE = 4
GLOBAL CONST $FILE_SHARE_READWRITE = BITOR($FILE_SHARE_READ, $FILE_SHARE_WRITE)
GLOBAL CONST $FILE_SHARE_ANY = BITOR($FILE_SHARE_READ, $FILE_SHARE_WRITE, $FILE_SHARE_DELETE)
GLOBAL CONST $GENERIC_ALL = 268435456
GLOBAL CONST $GENERIC_EXECUTE = 536870912
GLOBAL CONST $GENERIC_WRITE = 1073741824
GLOBAL CONST $GENERIC_READ = -2147483648
GLOBAL CONST $GENERIC_READWRITE = BITOR($GENERIC_READ, $GENERIC_WRITE)
GLOBAL CONST $FILE_ENCODING_UTF16LE = 32
GLOBAL CONST $FE_ENTIRE_UTF8 = 1
GLOBAL CONST $FE_PARTIALFIRST_UTF8 = 2
GLOBAL CONST $FN_FULLPATH = 0
GLOBAL CONST $FN_RELATIVEPATH = 1
GLOBAL CONST $FV_COMMENTS = "Comments"
GLOBAL CONST $FV_COMPANYNAME = "CompanyName"
GLOBAL CONST $FV_FILEDESCRIPTION = "FileDescription"
GLOBAL CONST $FV_FILEVERSION = "FileVersion"
GLOBAL CONST $FV_INTERNALNAME = "InternalName"
GLOBAL CONST $FV_LEGALCOPYRIGHT = "LegalCopyright"
GLOBAL CONST $FV_LEGALTRADEMARKS = "LegalTrademarks"
GLOBAL CONST $FV_ORIGINALFILENAME = "OriginalFilename"
GLOBAL CONST $FV_PRODUCTNAME = "ProductName"
GLOBAL CONST $FV_PRODUCTVERSION = "ProductVersion"
GLOBAL CONST $FV_PRIVATEBUILD = "PrivateBuild"
GLOBAL CONST $FV_SPECIALBUILD = "SpecialBuild"
GLOBAL CONST $FRTA_NOCOUNT = 0
GLOBAL CONST $FRTA_COUNT = 1
GLOBAL CONST $FRTA_INTARRAYS = 2
GLOBAL CONST $FRTA_ENTIRESPLIT = 4
GLOBAL CONST $FLTA_FILESFOLDERS = 0
GLOBAL CONST $FLTA_FILES = 1
GLOBAL CONST $FLTA_FOLDERS = 2
GLOBAL CONST $FLTAR_FILESFOLDERS = 0
GLOBAL CONST $FLTAR_FILES = 1
GLOBAL CONST $FLTAR_FOLDERS = 2
GLOBAL CONST $FLTAR_NOHIDDEN = 4
GLOBAL CONST $FLTAR_NOSYSTEM = 8
GLOBAL CONST $FLTAR_NOLINK = 16
GLOBAL CONST $FLTAR_NORECUR = 0
GLOBAL CONST $FLTAR_RECUR = 1
GLOBAL CONST $FLTAR_NOSORT = 0
GLOBAL CONST $FLTAR_SORT = 1
GLOBAL CONST $FLTAR_FASTSORT = 2
GLOBAL CONST $FLTAR_NOPATH = 0
GLOBAL CONST $FLTAR_RELPATH = 1
GLOBAL CONST $FLTAR_FULLPATH = 2
GLOBAL CONST $PATH_ORIGINAL = 0
GLOBAL CONST $PATH_DRIVE = 1
GLOBAL CONST $PATH_DIRECTORY = 2
GLOBAL CONST $PATH_FILENAME = 3
GLOBAL CONST $PATH_EXTENSION = 4
FUNC _FILECOUNTLINES($SFILEPATH)
	FILEREADTOARRAY($SFILEPATH)
	IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
	RETURN @EXTENDED
ENDFUNC
FUNC _FILECREATE($SFILEPATH)
	LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, BITOR($FO_OVERWRITE, $FO_CREATEPATH))
	IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
	LOCAL $IFILEWRITE = FILEWRITE($HFILEOPEN, "")
	FILECLOSE($HFILEOPEN)
	IF NOT $IFILEWRITE THEN RETURN SETERROR(2, 0, 0)
	RETURN 1
ENDFUNC
FUNC _FILELISTTOARRAY($SFILEPATH, $SFILTER = "*", $IFLAG = $FLTA_FILESFOLDERS, $BRETURNPATH = FALSE)
	LOCAL $SDELIMITER = "|", $SFILELIST = "", $SFILENAME = "", $SFULLPATH = ""
	$SFILEPATH = STRINGREGEXPREPLACE($SFILEPATH, "[\\/]+$", "") & "\"
	IF $IFLAG = DEFAULT THEN $IFLAG = $FLTA_FILESFOLDERS
	IF $BRETURNPATH THEN $SFULLPATH = $SFILEPATH
	IF $SFILTER = DEFAULT THEN $SFILTER = "*"
	IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(1, 0, 0)
	IF STRINGREGEXP($SFILTER, "[\\/:><\|]|(?s)^\s*$") THEN RETURN SETERROR(2, 0, 0)
	IF NOT($IFLAG = 0 OR $IFLAG = 1 OR $IFLAG = 2) THEN RETURN SETERROR(3, 0, 0)
	LOCAL $HSEARCH = FILEFINDFIRSTFILE($SFILEPATH & $SFILTER)
	IF @ERROR THEN RETURN SETERROR(4, 0, 0)
	WHILE 1
		$SFILENAME = FILEFINDNEXTFILE($HSEARCH)
		IF @ERROR THEN EXITLOOP
		IF($IFLAG + @EXTENDED = 2) THEN CONTINUELOOP
		$SFILELIST &= $SDELIMITER & $SFULLPATH & $SFILENAME
	WEND
	FILECLOSE($HSEARCH)
	IF $SFILELIST = "" THEN RETURN SETERROR(4, 0, 0)
	RETURN STRINGSPLIT(STRINGTRIMLEFT($SFILELIST, 1), $SDELIMITER)
ENDFUNC
FUNC _FILELISTTOARRAYREC($SFILEPATH, $SMASK = "*", $IRETURN = $FLTAR_FILESFOLDERS, $IRECUR = $FLTAR_NORECUR, $ISORT = $FLTAR_NOSORT, $IRETURNPATH = $FLTAR_RELPATH)
	IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(1, 1, "")
	IF $SMASK = DEFAULT THEN $SMASK = "*"
	IF $IRETURN = DEFAULT THEN $IRETURN = $FLTAR_FILESFOLDERS
	IF $IRECUR = DEFAULT THEN $IRECUR = $FLTAR_NORECUR
	IF $ISORT = DEFAULT THEN $ISORT = $FLTAR_NOSORT
	IF $IRETURNPATH = DEFAULT THEN $IRETURNPATH = $FLTAR_RELPATH
	IF $IRECUR > 1 OR NOT ISINT($IRECUR) THEN RETURN SETERROR(1, 6, "")
	LOCAL $BLONGPATH = FALSE
	IF STRINGLEFT($SFILEPATH, 4) == "\\?\" THEN
		$BLONGPATH = TRUE
	ENDIF
	LOCAL $SFOLDERSLASH = ""
	IF STRINGRIGHT($SFILEPATH, 1) = "\" THEN
		$SFOLDERSLASH = "\"
	ELSE
		$SFILEPATH = $SFILEPATH & "\"
	ENDIF
	LOCAL $ASFOLDERSEARCHLIST[100] = [1]
	$ASFOLDERSEARCHLIST[1] = $SFILEPATH
	LOCAL $IHIDE_HS = 0, $SHIDE_HS = ""
	IF BITAND($IRETURN, $FLTAR_NOHIDDEN) THEN
		$IHIDE_HS += 2
		$SHIDE_HS &= "H"
		$IRETURN -= $FLTAR_NOHIDDEN
	ENDIF
	IF BITAND($IRETURN, $FLTAR_NOSYSTEM) THEN
		$IHIDE_HS += 4
		$SHIDE_HS &= "S"
		$IRETURN -= $FLTAR_NOSYSTEM
	ENDIF
	LOCAL $IHIDE_LINK = 0
	IF BITAND($IRETURN, $FLTAR_NOLINK) THEN
		$IHIDE_LINK = 1024
		$IRETURN -= $FLTAR_NOLINK
	ENDIF
	LOCAL $IMAXLEVEL = 0
	IF $IRECUR < 0 THEN
		STRINGREPLACE($SFILEPATH, "\", "", 0, $STR_NOCASESENSEBASIC)
		$IMAXLEVEL = @EXTENDED - $IRECUR
	ENDIF
	LOCAL $SEXCLUDE_LIST = "", $SEXCLUDE_LIST_FOLDER = "", $SINCLUDE_LIST = "*"
	LOCAL $AMASKSPLIT = STRINGSPLIT($SMASK, "|")
	SWITCH $AMASKSPLIT[0]
		CASE 3
			$SEXCLUDE_LIST_FOLDER = $AMASKSPLIT[3]
			CONTINUECASE
		CASE 2
			$SEXCLUDE_LIST = $AMASKSPLIT[2]
			CONTINUECASE
		CASE 1
			$SINCLUDE_LIST = $AMASKSPLIT[1]
	ENDSWITCH
	LOCAL $SINCLUDE_FILE_MASK = ".+"
	IF $SINCLUDE_LIST <> "*" THEN
		IF NOT __FLTAR_LISTTOMASK($SINCLUDE_FILE_MASK, $SINCLUDE_LIST) THEN RETURN SETERROR(1, 2, "")
	ENDIF
	LOCAL $SINCLUDE_FOLDER_MASK = ".+"
	SWITCH $IRETURN
		CASE 0
			SWITCH $IRECUR
				CASE 0
					$SINCLUDE_FOLDER_MASK = $SINCLUDE_FILE_MASK
			ENDSWITCH
		CASE 2
			$SINCLUDE_FOLDER_MASK = $SINCLUDE_FILE_MASK
	ENDSWITCH
	LOCAL $SEXCLUDE_FILE_MASK = ":"
	IF $SEXCLUDE_LIST <> "" THEN
		IF NOT __FLTAR_LISTTOMASK($SEXCLUDE_FILE_MASK, $SEXCLUDE_LIST) THEN RETURN SETERROR(1, 3, "")
	ENDIF
	LOCAL $SEXCLUDE_FOLDER_MASK = ":"
	IF $IRECUR THEN
		IF $SEXCLUDE_LIST_FOLDER THEN
			IF NOT __FLTAR_LISTTOMASK($SEXCLUDE_FOLDER_MASK, $SEXCLUDE_LIST_FOLDER) THEN RETURN SETERROR(1, 4, "")
		ENDIF
		IF $IRETURN = 2 THEN
			$SEXCLUDE_FOLDER_MASK = $SEXCLUDE_FILE_MASK
		ENDIF
	ELSE
		$SEXCLUDE_FOLDER_MASK = $SEXCLUDE_FILE_MASK
	ENDIF
	IF NOT($IRETURN = 0 OR $IRETURN = 1 OR $IRETURN = 2) THEN RETURN SETERROR(1, 5, "")
	IF NOT($ISORT = 0 OR $ISORT = 1 OR $ISORT = 2) THEN RETURN SETERROR(1, 7, "")
	IF NOT($IRETURNPATH = 0 OR $IRETURNPATH = 1 OR $IRETURNPATH = 2) THEN RETURN SETERROR(1, 8, "")
	IF $IHIDE_LINK THEN
		LOCAL $TFILE_DATA = DLLSTRUCTCREATE("struct;align 4;dword FileAttributes;uint64 CreationTime;uint64 LastAccessTime;uint64 LastWriteTime;" & "dword FileSizeHigh;dword FileSizeLow;dword Reserved0;dword Reserved1;wchar FileName[260];wchar AlternateFileName[14];endstruct")
		LOCAL $HDLL = DLLOPEN("kernel32.dll"), $ADLL_RET
	ENDIF
	LOCAL $ASRETURNLIST[100] = [0]
	LOCAL $ASFILEMATCHLIST = $ASRETURNLIST, $ASROOTFILEMATCHLIST = $ASRETURNLIST, $ASFOLDERMATCHLIST = $ASRETURNLIST
	LOCAL $BFOLDER = FALSE, $HSEARCH = 0, $SCURRENTPATH = "", $SNAME = "", $SRETPATH = ""
	LOCAL $IATTRIBS = 0, $SATTRIBS = ""
	LOCAL $ASFOLDERFILESECTIONLIST[100][2] = [[0, 0]]
	WHILE $ASFOLDERSEARCHLIST[0] > 0
		$SCURRENTPATH = $ASFOLDERSEARCHLIST[$ASFOLDERSEARCHLIST[0]]
		$ASFOLDERSEARCHLIST[0] -= 1
		SWITCH $IRETURNPATH
			CASE 1
				$SRETPATH = STRINGREPLACE($SCURRENTPATH, $SFILEPATH, "")
			CASE 2
				IF $BLONGPATH THEN
					$SRETPATH = STRINGTRIMLEFT($SCURRENTPATH, 4)
				ELSE
					$SRETPATH = $SCURRENTPATH
				ENDIF
		ENDSWITCH
		IF $IHIDE_LINK THEN
			$ADLL_RET = DLLCALL($HDLL, "handle", "FindFirstFileW", "wstr", $SCURRENTPATH & "*", "struct*", $TFILE_DATA)
			IF @ERROR OR NOT $ADLL_RET[0] THEN
				CONTINUELOOP
			ENDIF
			$HSEARCH = $ADLL_RET[0]
		ELSE
			$HSEARCH = FILEFINDFIRSTFILE($SCURRENTPATH & "*")
			IF $HSEARCH = -1 THEN
				CONTINUELOOP
			ENDIF
		ENDIF
		IF $IRETURN = 0 AND $ISORT AND $IRETURNPATH THEN
			__FLTAR_ADDTOLIST($ASFOLDERFILESECTIONLIST, $SRETPATH, $ASFILEMATCHLIST[0] + 1)
		ENDIF
		$SATTRIBS = ""
		WHILE 1
			IF $IHIDE_LINK THEN
				$ADLL_RET = DLLCALL($HDLL, "int", "FindNextFileW", "handle", $HSEARCH, "struct*", $TFILE_DATA)
				IF @ERROR OR NOT $ADLL_RET[0] THEN
					EXITLOOP
				ENDIF
				$SNAME = DLLSTRUCTGETDATA($TFILE_DATA, "FileName")
				IF $SNAME = ".." OR $SNAME = "." THEN
					CONTINUELOOP
				ENDIF
				$IATTRIBS = DLLSTRUCTGETDATA($TFILE_DATA, "FileAttributes")
				IF $IHIDE_HS AND BITAND($IATTRIBS, $IHIDE_HS) THEN
					CONTINUELOOP
				ENDIF
				IF BITAND($IATTRIBS, $IHIDE_LINK) THEN
					CONTINUELOOP
				ENDIF
				$BFOLDER = FALSE
				IF BITAND($IATTRIBS, 16) THEN
					$BFOLDER = TRUE
				ENDIF
			ELSE
				$BFOLDER = FALSE
				$SNAME = FILEFINDNEXTFILE($HSEARCH, 1)
				IF @ERROR THEN
					EXITLOOP
				ENDIF
				IF $SNAME = ".." OR $SNAME = "." THEN
					CONTINUELOOP
				ENDIF
				$SATTRIBS = @EXTENDED
				IF STRINGINSTR($SATTRIBS, "D") THEN
					$BFOLDER = TRUE
				ENDIF
				IF STRINGREGEXP($SATTRIBS, "[" & $SHIDE_HS & "]") THEN
					CONTINUELOOP
				ENDIF
			ENDIF
			IF $BFOLDER THEN
				SELECT
					CASE $IRECUR < 0
						STRINGREPLACE($SCURRENTPATH, "\", "", 0, $STR_NOCASESENSEBASIC)
						IF @EXTENDED < $IMAXLEVEL THEN
							CONTINUECASE
						ENDIF
					CASE $IRECUR = 1
						IF NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
							__FLTAR_ADDTOLIST($ASFOLDERSEARCHLIST, $SCURRENTPATH & $SNAME & "\")
						ENDIF
				ENDSELECT
			ENDIF
			IF $ISORT THEN
				IF $BFOLDER THEN
					IF STRINGREGEXP($SNAME, $SINCLUDE_FOLDER_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
						__FLTAR_ADDTOLIST($ASFOLDERMATCHLIST, $SRETPATH & $SNAME & $SFOLDERSLASH)
					ENDIF
				ELSE
					IF STRINGREGEXP($SNAME, $SINCLUDE_FILE_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FILE_MASK) THEN
						IF $SCURRENTPATH = $SFILEPATH THEN
							__FLTAR_ADDTOLIST($ASROOTFILEMATCHLIST, $SRETPATH & $SNAME)
						ELSE
							__FLTAR_ADDTOLIST($ASFILEMATCHLIST, $SRETPATH & $SNAME)
						ENDIF
					ENDIF
				ENDIF
			ELSE
				IF $BFOLDER THEN
					IF $IRETURN <> 1 AND STRINGREGEXP($SNAME, $SINCLUDE_FOLDER_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
						__FLTAR_ADDTOLIST($ASRETURNLIST, $SRETPATH & $SNAME & $SFOLDERSLASH)
					ENDIF
				ELSE
					IF $IRETURN <> 2 AND STRINGREGEXP($SNAME, $SINCLUDE_FILE_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FILE_MASK) THEN
						__FLTAR_ADDTOLIST($ASRETURNLIST, $SRETPATH & $SNAME)
					ENDIF
				ENDIF
			ENDIF
		WEND
		IF $IHIDE_LINK THEN
			DLLCALL($HDLL, "int", "FindClose", "ptr", $HSEARCH)
		ELSE
			FILECLOSE($HSEARCH)
		ENDIF
	WEND
	IF $IHIDE_LINK THEN
		DLLCLOSE($HDLL)
	ENDIF
	IF $ISORT THEN
		SWITCH $IRETURN
			CASE 2
				IF $ASFOLDERMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
				REDIM $ASFOLDERMATCHLIST[$ASFOLDERMATCHLIST[0] + 1]
				$ASRETURNLIST = $ASFOLDERMATCHLIST
				__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
			CASE 1
				IF $ASROOTFILEMATCHLIST[0] = 0 AND $ASFILEMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
				IF $IRETURNPATH = 0 THEN
					__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST)
					__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
				ELSE
					__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST, 1)
				ENDIF
			CASE 0
				IF $ASROOTFILEMATCHLIST[0] = 0 AND $ASFOLDERMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
				IF $IRETURNPATH = 0 THEN
					__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST)
					$ASRETURNLIST[0] += $ASFOLDERMATCHLIST[0]
					REDIM $ASFOLDERMATCHLIST[$ASFOLDERMATCHLIST[0] + 1]
					_ARRAYCONCATENATE($ASRETURNLIST, $ASFOLDERMATCHLIST, 1)
					__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
				ELSE
					LOCAL $ASRETURNLIST[$ASFILEMATCHLIST[0] + $ASROOTFILEMATCHLIST[0] + $ASFOLDERMATCHLIST[0] + 1]
					$ASRETURNLIST[0] = $ASFILEMATCHLIST[0] + $ASROOTFILEMATCHLIST[0] + $ASFOLDERMATCHLIST[0]
					__ARRAYDUALPIVOTSORT($ASROOTFILEMATCHLIST, 1, $ASROOTFILEMATCHLIST[0])
					FOR $I = 1 TO $ASROOTFILEMATCHLIST[0]
						$ASRETURNLIST[$I] = $ASROOTFILEMATCHLIST[$I]
					NEXT
					LOCAL $INEXTINSERTIONINDEX = $ASROOTFILEMATCHLIST[0] + 1
					__ARRAYDUALPIVOTSORT($ASFOLDERMATCHLIST, 1, $ASFOLDERMATCHLIST[0])
					LOCAL $SFOLDERTOFIND = ""
					FOR $I = 1 TO $ASFOLDERMATCHLIST[0]
						$ASRETURNLIST[$INEXTINSERTIONINDEX] = $ASFOLDERMATCHLIST[$I]
						$INEXTINSERTIONINDEX += 1
						IF $SFOLDERSLASH THEN
							$SFOLDERTOFIND = $ASFOLDERMATCHLIST[$I]
						ELSE
							$SFOLDERTOFIND = $ASFOLDERMATCHLIST[$I] & "\"
						ENDIF
						LOCAL $IFILESECTIONENDINDEX = 0, $IFILESECTIONSTARTINDEX = 0
						FOR $J = 1 TO $ASFOLDERFILESECTIONLIST[0][0]
							IF $SFOLDERTOFIND = $ASFOLDERFILESECTIONLIST[$J][0] THEN
								$IFILESECTIONSTARTINDEX = $ASFOLDERFILESECTIONLIST[$J][1]
								IF $J = $ASFOLDERFILESECTIONLIST[0][0] THEN
									$IFILESECTIONENDINDEX = $ASFILEMATCHLIST[0]
								ELSE
									$IFILESECTIONENDINDEX = $ASFOLDERFILESECTIONLIST[$J + 1][1] - 1
								ENDIF
								IF $ISORT = 1 THEN
									__ARRAYDUALPIVOTSORT($ASFILEMATCHLIST, $IFILESECTIONSTARTINDEX, $IFILESECTIONENDINDEX)
								ENDIF
								FOR $K = $IFILESECTIONSTARTINDEX TO $IFILESECTIONENDINDEX
									$ASRETURNLIST[$INEXTINSERTIONINDEX] = $ASFILEMATCHLIST[$K]
									$INEXTINSERTIONINDEX += 1
								NEXT
								EXITLOOP
							ENDIF
						NEXT
					NEXT
				ENDIF
		ENDSWITCH
	ELSE
		IF $ASRETURNLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
		REDIM $ASRETURNLIST[$ASRETURNLIST[0] + 1]
	ENDIF
	RETURN $ASRETURNLIST
ENDFUNC
FUNC __FLTAR_ADDFILELISTS(BYREF $ASTARGET, $ASSOURCE_1, $ASSOURCE_2, $ISORT = 0)
	REDIM $ASSOURCE_1[$ASSOURCE_1[0] + 1]
	IF $ISORT = 1 THEN __ARRAYDUALPIVOTSORT($ASSOURCE_1, 1, $ASSOURCE_1[0])
	$ASTARGET = $ASSOURCE_1
	$ASTARGET[0] += $ASSOURCE_2[0]
	REDIM $ASSOURCE_2[$ASSOURCE_2[0] + 1]
	IF $ISORT = 1 THEN __ARRAYDUALPIVOTSORT($ASSOURCE_2, 1, $ASSOURCE_2[0])
	_ARRAYCONCATENATE($ASTARGET, $ASSOURCE_2, 1)
ENDFUNC
FUNC __FLTAR_ADDTOLIST(BYREF $ALIST, $VVALUE_0, $VVALUE_1 = -1)
	IF $VVALUE_1 = -1 THEN
		$ALIST[0] += 1
		IF UBOUND($ALIST) <= $ALIST[0] THEN REDIM $ALIST[UBOUND($ALIST) * 2]
		$ALIST[$ALIST[0]] = $VVALUE_0
	ELSE
		$ALIST[0][0] += 1
		IF UBOUND($ALIST) <= $ALIST[0][0] THEN REDIM $ALIST[UBOUND($ALIST) * 2][2]
		$ALIST[$ALIST[0][0]][0] = $VVALUE_0
		$ALIST[$ALIST[0][0]][1] = $VVALUE_1
	ENDIF
ENDFUNC
FUNC __FLTAR_LISTTOMASK(BYREF $SMASK, $SLIST)
	IF STRINGREGEXP($SLIST, "\\|/|:|\<|\>|\|") THEN RETURN 0
	$SLIST = STRINGREPLACE(STRINGSTRIPWS(STRINGREGEXPREPLACE($SLIST, "\s*;\s*", ";"), BITOR($STR_STRIPLEADING, $STR_STRIPTRAILING)), ";", "|")
	$SLIST = STRINGREPLACE(STRINGREPLACE(STRINGREGEXPREPLACE($SLIST, "[][$^.{}()+\-]", "\\$0"), "?", "."), "*", ".*?")
	$SMASK = "(?i)^(" & $SLIST & ")\z"
	RETURN 1
ENDFUNC
FUNC _FILEPRINT($SFILEPATH, $ISHOW = @SW_HIDE)
	RETURN SHELLEXECUTE($SFILEPATH, "", @WORKINGDIR, "print", $ISHOW = DEFAULT ? @SW_HIDE : $ISHOW)
ENDFUNC
FUNC _FILEREADTOARRAY($SFILEPATH, BYREF $VRETURN, $IFLAGS = $FRTA_COUNT, $SDELIMITER = "")
	$VRETURN = 0
	IF $IFLAGS = DEFAULT THEN $IFLAGS = $FRTA_COUNT
	IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
	LOCAL $BEXPAND = TRUE
	IF BITAND($IFLAGS, $FRTA_INTARRAYS) THEN
		$BEXPAND = FALSE
		$IFLAGS -= $FRTA_INTARRAYS
	ENDIF
	LOCAL $IENTIRE = $STR_CHRSPLIT
	IF BITAND($IFLAGS, $FRTA_ENTIRESPLIT) THEN
		$IENTIRE = $STR_ENTIRESPLIT
		$IFLAGS -= $FRTA_ENTIRESPLIT
	ENDIF
	LOCAL $INOCOUNT = 0
	IF $IFLAGS <> $FRTA_COUNT THEN
		$IFLAGS = $FRTA_NOCOUNT
		$INOCOUNT = $STR_NOCOUNT
	ENDIF
	IF $SDELIMITER THEN
		LOCAL $ALINES = FILEREADTOARRAY($SFILEPATH)
		IF @ERROR THEN RETURN SETERROR(@ERROR, 0, 0)
		LOCAL $IDIM_1 = UBOUND($ALINES) + $IFLAGS
		IF $BEXPAND THEN
			LOCAL $IDIM_2 = UBOUND(STRINGSPLIT($ALINES[0], $SDELIMITER, $IENTIRE + $STR_NOCOUNT))
			LOCAL $ATEMP_ARRAY[$IDIM_1][$IDIM_2]
			LOCAL $IFIELDS, $ASPLIT
			FOR $I = 0 TO $IDIM_1 - $IFLAGS - 1
				$ASPLIT = STRINGSPLIT($ALINES[$I], $SDELIMITER, $IENTIRE + $STR_NOCOUNT)
				$IFIELDS = UBOUND($ASPLIT)
				IF $IFIELDS <> $IDIM_2 THEN
					RETURN SETERROR(3, 0, 0)
				ENDIF
				FOR $J = 0 TO $IFIELDS - 1
					$ATEMP_ARRAY[$I + $IFLAGS][$J] = $ASPLIT[$J]
				NEXT
			NEXT
			IF $IDIM_2 < 2 THEN RETURN SETERROR(4, 0, 0)
			IF $IFLAGS THEN
				$ATEMP_ARRAY[0][0] = $IDIM_1 - $IFLAGS
				$ATEMP_ARRAY[0][1] = $IDIM_2
			ENDIF
		ELSE
			LOCAL $ATEMP_ARRAY[$IDIM_1]
			FOR $I = 0 TO $IDIM_1 - $IFLAGS - 1
				$ATEMP_ARRAY[$I + $IFLAGS] = STRINGSPLIT($ALINES[$I], $SDELIMITER, $IENTIRE + $INOCOUNT)
			NEXT
			IF $IFLAGS THEN
				$ATEMP_ARRAY[0] = $IDIM_1 - $IFLAGS
			ENDIF
		ENDIF
		$VRETURN = $ATEMP_ARRAY
	ELSE
		IF $IFLAGS THEN
			LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, $FO_READ)
			IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
			LOCAL $SFILEREAD = FILEREAD($HFILEOPEN)
			FILECLOSE($HFILEOPEN)
			IF STRINGLEN($SFILEREAD) THEN
				$VRETURN = STRINGREGEXP(@LF & $SFILEREAD, "(?|(\N+)\z|(\N*)(?:\R))", $STR_REGEXPARRAYGLOBALMATCH)
				$VRETURN[0] = UBOUND($VRETURN) - 1
			ELSE
				RETURN SETERROR(2, 0, 0)
			ENDIF
		ELSE
			$VRETURN = FILEREADTOARRAY($SFILEPATH)
			IF @ERROR THEN
				$VRETURN = 0
				RETURN SETERROR(@ERROR, 0, 0)
			ENDIF
		ENDIF
	ENDIF
	RETURN 1
ENDFUNC
FUNC _FILEWRITEFROMARRAY($SFILEPATH, CONST BYREF $AARRAY, $IBASE = DEFAULT, $IUBOUND = DEFAULT, $SDELIMITER = "|")
	LOCAL $IRETURN = 0
	IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(2, 0, $IRETURN)
	LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS)
	IF $IDIMS > 2 THEN RETURN SETERROR(4, 0, 0)
	LOCAL $ILAST = UBOUND($AARRAY) - 1
	IF $IUBOUND = DEFAULT OR $IUBOUND > $ILAST THEN $IUBOUND = $ILAST
	IF $IBASE < 0 OR $IBASE = DEFAULT THEN $IBASE = 0
	IF $IBASE > $IUBOUND THEN RETURN SETERROR(5, 0, $IRETURN)
	IF $SDELIMITER = DEFAULT THEN $SDELIMITER = "|"
	LOCAL $HFILEOPEN = $SFILEPATH
	IF ISSTRING($SFILEPATH) THEN
		$HFILEOPEN = FILEOPEN($SFILEPATH, $FO_OVERWRITE)
		IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, $IRETURN)
	ENDIF
	LOCAL $IERROR = 0
	$IRETURN = 1
	SWITCH $IDIMS
		CASE 1
			FOR $I = $IBASE TO $IUBOUND
				IF NOT FILEWRITE($HFILEOPEN, $AARRAY[$I] & @CRLF) THEN
					$IERROR = 3
					$IRETURN = 0
					EXITLOOP
				ENDIF
			NEXT
		CASE 2
			LOCAL $STEMP = ""
			FOR $I = $IBASE TO $IUBOUND
				$STEMP = $AARRAY[$I][0]
				FOR $J = 1 TO UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
					$STEMP &= $SDELIMITER & $AARRAY[$I][$J]
				NEXT
				IF NOT FILEWRITE($HFILEOPEN, $STEMP & @CRLF) THEN
					$IERROR = 3
					$IRETURN = 0
					EXITLOOP
				ENDIF
			NEXT
	ENDSWITCH
	IF ISSTRING($SFILEPATH) THEN FILECLOSE($HFILEOPEN)
	RETURN SETERROR($IERROR, 0, $IRETURN)
ENDFUNC
FUNC _FILEWRITELOG($SLOGPATH, $SLOGMSG, $IFLAG = -1)
	LOCAL $IOPENMODE = $FO_APPEND
	LOCAL $SMSG = @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $SLOGMSG
	IF $IFLAG = DEFAULT THEN $IFLAG = -1
	IF $IFLAG <> -1 THEN
		$IOPENMODE = $FO_OVERWRITE
		$SMSG &= @CRLF & FILEREAD($SLOGPATH)
	ENDIF
	LOCAL $HFILEOPEN = $SLOGPATH
	IF ISSTRING($SLOGPATH) THEN $HFILEOPEN = FILEOPEN($SLOGPATH, $IOPENMODE)
	IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
	LOCAL $IRETURN = FILEWRITELINE($HFILEOPEN, $SMSG)
	IF ISSTRING($SLOGPATH) THEN $IRETURN = FILECLOSE($HFILEOPEN)
	IF $IFLAG <> -1 AND NOT ISSTRING($SLOGPATH) THEN SETEXTENDED(1)
	IF $IRETURN = 0 THEN RETURN SETERROR(2, 0, 0)
	RETURN $IRETURN
ENDFUNC
FUNC _FILEWRITETOLINE($SFILEPATH, $ILINE, $STEXT, $BOVERWRITE = FALSE, $BFILL = FALSE)
	IF $BOVERWRITE = DEFAULT THEN $BOVERWRITE = FALSE
	IF $BFILL = DEFAULT THEN $BFILL = FALSE
	IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(2, 0, 0)
	IF $ILINE <= 0 THEN RETURN SETERROR(4, 0, 0)
	IF NOT(ISBOOL($BOVERWRITE) OR $BOVERWRITE = 0 OR $BOVERWRITE = 1) THEN RETURN SETERROR(5, 0, 0)
	IF NOT ISSTRING($STEXT) THEN
		$STEXT = STRING($STEXT)
		IF $STEXT = "" THEN RETURN SETERROR(6, 0, 0)
	ENDIF
	IF NOT ISBOOL($BFILL) THEN RETURN SETERROR(7, 0, 0)
	LOCAL $AARRAY = FILEREADTOARRAY($SFILEPATH)
	IF @ERROR THEN LOCAL $AARRAY[0]
	LOCAL $IUBOUND = UBOUND($AARRAY) - 1
	IF $BFILL THEN
		IF $IUBOUND < $ILINE THEN
			REDIM $AARRAY[$ILINE]
			$IUBOUND = $ILINE - 1
		ENDIF
	ELSE
		IF($IUBOUND + 1) < $ILINE THEN RETURN SETERROR(1, 0, 0)
	ENDIF
	$AARRAY[$ILINE - 1] = ($BOVERWRITE ? $STEXT : $STEXT & @CRLF & $AARRAY[$ILINE - 1])
	LOCAL $SDATA = ""
	FOR $I = 0 TO $IUBOUND
		$SDATA &= $AARRAY[$I] & @CRLF
	NEXT
	$SDATA = STRINGTRIMRIGHT($SDATA, STRINGLEN(@CRLF))
	LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, FILEGETENCODING($SFILEPATH) + $FO_OVERWRITE)
	IF $HFILEOPEN = -1 THEN RETURN SETERROR(3, 0, 0)
	FILEWRITE($HFILEOPEN, $SDATA)
	FILECLOSE($HFILEOPEN)
	RETURN 1
ENDFUNC
FUNC _PATHFULL($SRELATIVEPATH, $SBASEPATH = @WORKINGDIR)
	IF NOT $SRELATIVEPATH OR $SRELATIVEPATH = "." THEN RETURN $SBASEPATH
	LOCAL $SFULLPATH = STRINGREPLACE($SRELATIVEPATH, "/", "\")
	LOCAL CONST $SFULLPATHCONST = $SFULLPATH
	LOCAL $SPATH
	LOCAL $BROOTONLY = STRINGLEFT($SFULLPATH, 1) = "\" AND STRINGMID($SFULLPATH, 2, 1) <> "\"
	IF $SBASEPATH = DEFAULT THEN $SBASEPATH = @WORKINGDIR
	FOR $I = 1 TO 2
		$SPATH = STRINGLEFT($SFULLPATH, 2)
		IF $SPATH = "\\" THEN
			$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, 2)
			LOCAL $NSERVERLEN = STRINGINSTR($SFULLPATH, "\") - 1
			$SPATH = "\\" & STRINGLEFT($SFULLPATH, $NSERVERLEN)
			$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, $NSERVERLEN)
			EXITLOOP
		ELSEIF STRINGRIGHT($SPATH, 1) = ":" THEN
			$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, 2)
			EXITLOOP
		ELSE
			$SFULLPATH = $SBASEPATH & "\" & $SFULLPATH
		ENDIF
	NEXT
	IF STRINGLEFT($SFULLPATH, 1) <> "\" THEN
		IF STRINGLEFT($SFULLPATHCONST, 2) = STRINGLEFT($SBASEPATH, 2) THEN
			$SFULLPATH = $SBASEPATH & "\" & $SFULLPATH
		ELSE
			$SFULLPATH = "\" & $SFULLPATH
		ENDIF
	ENDIF
	LOCAL $ATEMP = STRINGSPLIT($SFULLPATH, "\")
	LOCAL $APATHPARTS[$ATEMP[0]], $J = 0
	FOR $I = 2 TO $ATEMP[0]
		IF $ATEMP[$I] = ".." THEN
			IF $J THEN $J -= 1
		ELSEIF NOT($ATEMP[$I] = "" AND $I <> $ATEMP[0]) AND $ATEMP[$I] <> "." THEN
			$APATHPARTS[$J] = $ATEMP[$I]
			$J += 1
		ENDIF
	NEXT
	$SFULLPATH = $SPATH
	IF NOT $BROOTONLY THEN
		FOR $I = 0 TO $J - 1
			$SFULLPATH &= "\" & $APATHPARTS[$I]
		NEXT
	ELSE
		$SFULLPATH &= $SFULLPATHCONST
		IF STRINGINSTR($SFULLPATH, "..") THEN $SFULLPATH = _PATHFULL($SFULLPATH)
	ENDIF
	DO
		$SFULLPATH = STRINGREPLACE($SFULLPATH, ".\", "\")
	UNTIL @EXTENDED = 0
	RETURN $SFULLPATH
ENDFUNC
FUNC _PATHGETRELATIVE($SFROM, $STO)
	IF STRINGRIGHT($SFROM, 1) <> "\" THEN $SFROM &= "\"
	IF STRINGRIGHT($STO, 1) <> "\" THEN $STO &= "\"
	IF $SFROM = $STO THEN RETURN SETERROR(1, 0, STRINGTRIMRIGHT($STO, 1))
	LOCAL $ASFROM = STRINGSPLIT($SFROM, "\")
	LOCAL $ASTO = STRINGSPLIT($STO, "\")
	IF $ASFROM[1] <> $ASTO[1] THEN RETURN SETERROR(2, 0, STRINGTRIMRIGHT($STO, 1))
	LOCAL $I = 2
	LOCAL $IDIFF = 1
	WHILE 1
		IF $ASFROM[$I] <> $ASTO[$I] THEN
			$IDIFF = $I
			EXITLOOP
		ENDIF
		$I += 1
	WEND
	$I = 1
	LOCAL $SRELPATH = ""
	FOR $J = 1 TO $ASTO[0]
		IF $I >= $IDIFF THEN
			$SRELPATH &= "\" & $ASTO[$I]
		ENDIF
		$I += 1
	NEXT
	$SRELPATH = STRINGTRIMLEFT($SRELPATH, 1)
	$I = 1
	FOR $J = 1 TO $ASFROM[0]
		IF $I > $IDIFF THEN
			$SRELPATH = "..\" & $SRELPATH
		ENDIF
		$I += 1
	NEXT
	IF STRINGRIGHT($SRELPATH, 1) == "\" THEN $SRELPATH = STRINGTRIMRIGHT($SRELPATH, 1)
	RETURN $SRELPATH
ENDFUNC
FUNC _PATHMAKE($SDRIVE, $SDIR, $SFILENAME, $SEXTENSION)
	IF STRINGLEN($SDRIVE) THEN
		IF NOT(STRINGLEFT($SDRIVE, 2) = "\\") THEN $SDRIVE = STRINGLEFT($SDRIVE, 1) & ":"
	ENDIF
	IF STRINGLEN($SDIR) THEN
		IF NOT(STRINGRIGHT($SDIR, 1) = "\") AND NOT(STRINGRIGHT($SDIR, 1) = "/") THEN $SDIR = $SDIR & "\"
	ELSE
		$SDIR = "\"
	ENDIF
	IF STRINGLEN($SDIR) THEN
		IF NOT(STRINGLEFT($SDIR, 1) = "\") AND NOT(STRINGLEFT($SDIR, 1) = "/") THEN $SDIR = "\" & $SDIR
	ENDIF
	IF STRINGLEN($SEXTENSION) THEN
		IF NOT(STRINGLEFT($SEXTENSION, 1) = ".") THEN $SEXTENSION = "." & $SEXTENSION
	ENDIF
	RETURN $SDRIVE & $SDIR & $SFILENAME & $SEXTENSION
ENDFUNC
FUNC _PATHSPLIT($SFILEPATH, BYREF $SDRIVE, BYREF $SDIR, BYREF $SFILENAME, BYREF $SEXTENSION)
	LOCAL $AARRAY = STRINGREGEXP($SFILEPATH, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", $STR_REGEXPARRAYMATCH)
	IF @ERROR THEN
		REDIM $AARRAY[5]
		$AARRAY[$PATH_ORIGINAL] = $SFILEPATH
	ENDIF
	$SDRIVE = $AARRAY[$PATH_DRIVE]
	IF STRINGLEFT($AARRAY[$PATH_DIRECTORY], 1) == "/" THEN
		$SDIR = STRINGREGEXPREPLACE($AARRAY[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\/")
	ELSE
		$SDIR = STRINGREGEXPREPLACE($AARRAY[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\\")
	ENDIF
	$AARRAY[$PATH_DIRECTORY] = $SDIR
	$SFILENAME = $AARRAY[$PATH_FILENAME]
	$SEXTENSION = $AARRAY[$PATH_EXTENSION]
	RETURN $AARRAY
ENDFUNC
FUNC _REPLACESTRINGINFILE($SFILEPATH, $SSEARCHSTRING, $SREPLACESTRING, $ICASESENSITIVE = 0, $IOCCURANCE = 1)
	IF STRINGINSTR(FILEGETATTRIB($SFILEPATH), "R") THEN RETURN SETERROR(1, 0, -1)
	LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, $FO_READ)
	IF $HFILEOPEN = -1 THEN RETURN SETERROR(2, 0, -1)
	LOCAL $SFILEREAD = FILEREAD($HFILEOPEN)
	FILECLOSE($HFILEOPEN)
	IF $ICASESENSITIVE = DEFAULT THEN $ICASESENSITIVE = 0
	IF $IOCCURANCE = DEFAULT THEN $IOCCURANCE = 1
	$SFILEREAD = STRINGREPLACE($SFILEREAD, $SSEARCHSTRING, $SREPLACESTRING, 1 - $IOCCURANCE, $ICASESENSITIVE)
	LOCAL $IRETURN = @EXTENDED
	IF $IRETURN THEN
		LOCAL $IFILEENCODING = FILEGETENCODING($SFILEPATH)
		$HFILEOPEN = FILEOPEN($SFILEPATH, $IFILEENCODING + $FO_OVERWRITE)
		IF $HFILEOPEN = -1 THEN RETURN SETERROR(3, 0, -1)
		FILEWRITE($HFILEOPEN, $SFILEREAD)
		FILECLOSE($HFILEOPEN)
	ENDIF
	RETURN $IRETURN
ENDFUNC
FUNC _TEMPFILE($SDIRECTORYNAME = @TEMPDIR, $SFILEPREFIX = "~", $SFILEEXTENSION = ".tmp", $IRANDOMLENGTH = 7)
	IF $IRANDOMLENGTH = DEFAULT OR $IRANDOMLENGTH <= 0 THEN $IRANDOMLENGTH = 7
	IF $SDIRECTORYNAME = DEFAULT OR(NOT FILEEXISTS($SDIRECTORYNAME)) THEN $SDIRECTORYNAME = @TEMPDIR
	IF $SFILEEXTENSION = DEFAULT THEN $SFILEEXTENSION = ".tmp"
	IF $SFILEPREFIX = DEFAULT THEN $SFILEPREFIX = "~"
	IF NOT FILEEXISTS($SDIRECTORYNAME) THEN $SDIRECTORYNAME = @SCRIPTDIR
	$SDIRECTORYNAME = STRINGREGEXPREPLACE($SDIRECTORYNAME, "[\\/]+$", "")
	$SFILEEXTENSION = STRINGREGEXPREPLACE($SFILEEXTENSION, "^\.+", "")
	$SFILEPREFIX = STRINGREGEXPREPLACE($SFILEPREFIX, '[\\/:*?"<>|]', "")
	LOCAL $STEMPNAME = ""
	DO
		$STEMPNAME = ""
		WHILE STRINGLEN($STEMPNAME) < $IRANDOMLENGTH
			$STEMPNAME &= CHR(RANDOM(97, 122, 1))
		WEND
		$STEMPNAME = $SDIRECTORYNAME & "\" & $SFILEPREFIX & $STEMPNAME & "." & $SFILEEXTENSION
	UNTIL NOT FILEEXISTS($STEMPNAME)
	RETURN $STEMPNAME
ENDFUNC
GLOBAL $PARAEXIST
IF STRINGINSTR("0804 1004 1404 0004", @OSLANG) <> 0 THEN
	GLOBAL $TIP = "已在运行!"
	GLOBAL $TIP_LOAD[2] = ["正在激活", "正在启动"]
ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) <> 0 THEN
	GLOBAL $TIP = "已在運行!"
	GLOBAL $TIP_LOAD[2] = ["正在激活", "正在啟動"]
ELSE
	GLOBAL $TIP = "is running."
	GLOBAL $TIP_LOAD[2] = ["is activating", "is starting"]
ENDIF
IF _SINGLETON("HEU KMS Activator", 1) = 0 THEN
	MSGBOX(262144 + 16, "HEU_KMS_Activator", "HEU KMS Activator " & $TIP)
	EXIT
ENDIF
GLOBAL $HEU_KMS_SERVER = "kms-server.exe"
GLOBAL $PROGRESS_LABEL, $PROGRESS_LABEL_TEXT
GLOBAL $LOAD
IF $OSARCH = "x64" OR $OSARCH = "ARM64" THEN
	$KMS = "x64\kms_x64.exe"
ELSE
	$KMS = "x86\kms.exe"
ENDIF
IF @OSBUILD < 2600 THEN
	MSGBOX(16, $HEU_MSGBOX, "HEU KMS Activator 不支持当前系统!", 10)
	FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
	EXIT
ENDIF
IF $CMDLINE[0] <> 0 THEN
	$PARAEXIST = 1
	$LOAD = "v" & $HEU_VER & " " & $TIP_LOAD[0] & "..."
	$FILENAME = $CMDLINE[1]
	IF STRINGINSTR($CMDLINERAW, "/?") <> 0 OR STRINGINSTR($CMDLINERAW, "-?") <> 0 THEN
		_SILENT_PARAMETERS()
		FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
		EXIT
	ELSEIF STRINGINSTR($CMDLINERAW, "/wpa") <> 0 OR STRINGINSTR($CMDLINERAW, "-wpa") <> 0 THEN
		DIRCREATE($FILEINSTDIR)
		_FIXWPA()
		DIRREMOVE($FILEINSTDIR, 1)
		FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
		EXIT
	ELSEIF STRINGINSTR($CMDLINERAW, "/spp") <> 0 OR STRINGINSTR($CMDLINERAW, "-spp") <> 0 THEN
		FILEWRITE(@WINDOWSDIR & "\heurenewal.log", ">>[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "]")
		RUNWAIT(@COMSPEC & " /c " & $SETENV & " & net start sppsvc || sc start sppsvc >> %windir%\heurenewal.log", @WINDOWSDIR, @SW_HIDE)
		EXIT
	ENDIF
ELSE
	LOCAL $ID
	$ID = MSGBOX(262144 + 64 + 4, $HEU_MSGBOX, $STATEMENT[0] & @CRLF & "" & @CRLF & $STATEMENT[1] & @CRLF & "" & @CRLF & $STATEMENT[2] & @CRLF & "" & @CRLF & $STATEMENT[3] & $STATEMENT[4])
	IF $ID = 6 THEN
		INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "UserAgreement", "UA", "YES")
		$LOAD = "v" & $HEU_VER & " " & $TIP_LOAD[1] & "..."
	ELSE
		FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
		EXIT
	ENDIF
ENDIF
FILEINSTALL("splashlogo.jpg", @TEMPDIR & "\splashlogo.jpg", 1)
IF STRINGINSTR($CMDLINERAW, "/nologo") = 0 THEN
	$SPLASH_GUI = GUICREATE($LOAD, 400, 236, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
	GUICTRLCREATEPIC(@TEMPDIR & "\splashlogo.jpg", 0, 0, 400, 236, -1, 1048576)
	GUICTRLCREATELABEL($LOAD, 15, 10, 200, 20)
	GUICTRLSETBKCOLOR(-1, $GUI_BKCOLOR_TRANSPARENT)
	GUICTRLSETCOLOR(-1, 16777215)
	GUICTRLSETFONT(-1, 10, 400, 0, "微软雅黑")
	IF @OSBUILD >= 6000 THEN
		$PROGRESS_OLD = GUICTRLCREATEPROGRESS(355, 228, 30, 3)
	ENDIF
	$PROGRESS_LABEL = GUICTRLCREATELABEL("", 24, 195, 351, 6)
	GUICTRLSETBKCOLOR($PROGRESS_LABEL, 16777215)
	$PROGRESS_LABEL_TEXT = GUICTRLCREATELABEL("", 355, 210, 30, 14, 2)
	GUICTRLSETCOLOR($PROGRESS_LABEL_TEXT, 16777215)
	GUICTRLSETBKCOLOR($PROGRESS_LABEL_TEXT, $GUI_BKCOLOR_TRANSPARENT)
	GUICTRLSETFONT($PROGRESS_LABEL_TEXT, 9, 300, 0, "Arial")
	GUISETSTATE(@SW_SHOW, $SPLASH_GUI)
	_PROGRESS(0)
ENDIF
LOCAL $TEMPFOLDERS = _FILELISTTOARRAY(@TEMPDIR)
FOR $I = 1 TO UBOUND($TEMPFOLDERS) - 1
	IF STRINGINSTR($TEMPFOLDERS[$I], "_temp_heu") THEN
		DIRREMOVE(@TEMPDIR & "\" & $TEMPFOLDERS[$I], 1)
	ENDIF
NEXT
IF FILEEXISTS($FILEINSTDIR) THEN
	DIRREMOVE($FILEINSTDIR, 1)
ENDIF
FILEDELETE($FILEINSTDIR & "\*.*")
_PROGRESS(10)
IF NOT FILEEXISTS($FILEINSTDIR) THEN
	DIRCREATE($FILEINSTDIR)
ENDIF
FILEINSTALL("KMSmini.7z", $FILEINSTDIR & "\", 1)
FILEINSTALL("files.7z", $FILEINSTDIR & "\", 1)
FILEINSTALL("7Z.EXE", $FILEINSTDIR & "\", 1)
_PROGRESS(20)
RUNWAIT('"' & $FILEINSTDIR & '\7Z.EXE"' & ' x "' & $FILEINSTDIR & '\KMSmini.7z"' & ' -y -o"' & $FILEINSTDIR & '"', @TEMPDIR, @SW_HIDE)
_PROGRESS(30)
FILESETATTRIB($FILEINSTDIR & "\*.*", "+H")
FILESETATTRIB($FILEINSTDIR, "+H")
FILEDELETE($FILEINSTDIR & "\KMSmini.7z")
IF $CMDLINE[0] <> 0 THEN
	$FILENAME = $CMDLINE[1]
	_FILEWRITEDEBUG($HEU_DEBUG, $HEU_MSGBOX & " Parameters " & $CMDLINERAW & @CRLF)
ELSE
	GUIDELETE($SPLASH_GUI)
	RUNWAIT($FILEINSTDIR & "\" & $KMS)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/kd1") OR STRINGINSTR($CMDLINERAW, "-kd1") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kd1", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/kd2") OR STRINGINSTR($CMDLINERAW, "-kd2") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kd2", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/od1") OR STRINGINSTR($CMDLINERAW, "-od1") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /od1", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/od2") OR STRINGINSTR($CMDLINERAW, "-od2") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /od2", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(10)
IF STRINGINSTR($CMDLINERAW, "/smart") OR STRINGINSTR($CMDLINERAW, "-smart") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /smart", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(30)
IF STRINGINSTR($CMDLINERAW, "/dig") OR STRINGINSTR($CMDLINERAW, "-dig") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /dig", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(35)
IF STRINGINSTR($CMDLINERAW, "/wts") OR STRINGINSTR($CMDLINERAW, "-wts") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /wts", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(40)
IF STRINGINSTR($CMDLINERAW, "/k38") OR STRINGINSTR($CMDLINERAW, "-k38") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /k38", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(45)
IF STRINGINSTR($CMDLINERAW, "/ots") OR STRINGINSTR($CMDLINERAW, "-ots") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ots", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(50)
IF STRINGINSTR($CMDLINERAW, "/ohk") OR STRINGINSTR($CMDLINERAW, "-ohk") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ohk", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(55)
IF STRINGINSTR($CMDLINERAW, "/kwi") OR STRINGINSTR($CMDLINERAW, "-kwi") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kwi", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(60)
IF STRINGINSTR($CMDLINERAW, "/lok") OR STRINGINSTR($CMDLINERAW, "-lok") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /lok", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(65)
IF STRINGINSTR($CMDLINERAW, "/wxp") OR STRINGINSTR($CMDLINERAW, "-wxp") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /wxp", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(70)
IF STRINGINSTR($CMDLINERAW, "/r2v") OR STRINGINSTR($CMDLINERAW, "-r2v") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /r2v", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(75)
IF STRINGINSTR($CMDLINERAW, "/kof") OR STRINGINSTR($CMDLINERAW, "-kof") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kof", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(80)
IF STRINGINSTR($CMDLINERAW, "/ren") OR STRINGINSTR($CMDLINERAW, "-ren") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ren", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(85)
IF STRINGINSTR($CMDLINERAW, "/unr") OR STRINGINSTR($CMDLINERAW, "-unr") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /unr", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(90)
IF STRINGINSTR($CMDLINERAW, "/reb") OR STRINGINSTR($CMDLINERAW, "-reb") THEN
	RUNWAIT($FILEINSTDIR & "\" & $KMS & " /reb", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF $PARAEXIST = 1 THEN
	PROCESSCLOSE($HEU_KMS_SERVER)
	PROCESSCLOSE("kms.exe")
	PROCESSCLOSE("kms_x64.exe")
	DIRREMOVE(@WINDOWSDIR & "\HeuKmsLog", 1)
	FILEDELETE(@WINDOWSDIR & "\HeuKmsRenewal\HEU_KMS_Activator.exe")
	FILEDELETE(@WINDOWSDIR & "\splashlogo.jpg")
	FILEDELETE(@WINDOWSDIR & "\ScriptTemp.ini")
	FILEDELETE(@TEMPDIR & "\splashlogo.jpg")
	FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
	DIRREMOVE($FILEINSTDIR, 1)
ENDIF
EXIT
FUNC _PROGRESS($A)
	IF STRINGINSTR($CMDLINERAW, "/nologo") = 0 THEN
		CONTROLMOVE($SPLASH_GUI, "", $PROGRESS_LABEL, 24, 195, $A / 100 * 351, 6)
		GUICTRLSETDATA($PROGRESS_LABEL_TEXT, $A & "%")
		IF @OSBUILD >= 6000 THEN
			GUICTRLSETDATA($PROGRESS_OLD, $A)
		ENDIF
	ENDIF
ENDFUNC
; DeTokenise by myAut2Exe >The Open Source AutoIT/AutoHotKey script decompiler< 2.15 build(212)

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

tottor
Habitué
Habitué
Messages : 419
Enregistré le : il y a 10 ans

Message par tottor »

@ LaDidi21 :
Merci pour ce retour, j'avais compris que cela venait de l'Asie.
Passage de 42 à 50, choix de l'éditeur !!!
Tu penses quoi de cet outil vu de ta lorgnette ?
Décryptage des liens du forum : Thiweb Live
Avatar du membre
dosibox
Dieu
Dieu
Messages : 2149
Enregistré le : il y a 9 ans

Message par dosibox »

La réponse de LaDidi21 à ta question m'intéresse également.
Ah les sacrés chinois : versions passés de 42 à 50 ^^
✖ Escroc de haut vol et rentier de père en fils depuis 1848. ✖
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@tottor :
Cela semble sain.

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

tottor
Habitué
Habitué
Messages : 419
Enregistré le : il y a 10 ans

Message par tottor »

LaDidi21 a écrit : il y a 2 jours @tottor :
Cela semble sain.
@LaDidi21
Merci pour ton analyse mais que pense-tu des fonctionnalités :smiley:
Décryptage des liens du forum : Thiweb Live
Avatar du membre
Auteur du sujet
LaDidi21
Modérateur
Modérateur
Messages : 13364
Enregistré le : il y a 15 ans

Message par LaDidi21 »

@tottor :
Il n'apporte rien de plus que les autres produits, déjà, existants.

-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-

Avatar du membre
dosibox
Dieu
Dieu
Messages : 2149
Enregistré le : il y a 9 ans

Message par dosibox »

Merci LaDidi21 pour ce retour.
✖ Escroc de haut vol et rentier de père en fils depuis 1848. ✖
Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités