Patchwork Move PicKit2 form libusb0 to libusb

login
register
about
Submitter tgotic
Date 2017-11-18 18:01:41
Message ID <77d8d24d-827f-3ffd-ecce-7488126a97b8@gmail.com>
Download mbox | patch
Permalink /patch/4514/
State New
Headers show

Comments

tgotic - 2017-11-18 18:01:41
Hi,
Recently I tried to use flashrom with PicKit2 on Windows.
I was unable to get it working with various libusb0 dll's,
so I rewrote pickit2_spi.c to use libusb (form libusb.info).
Since other external USB programmers use libusb,
flashrom doesn't depend on obsolete libusb0 anymore.

Please find attached new pickit2_spi.c, patch for Makefile, and a result 
of write operation.

Signed-off-by: Tomislav Gotić <tgotic@gmail.com>
/*
 * This file is part of the flashrom project.
 *
 * Copyright (C) 2010 Carl-Daniel Hailfinger
 * Copyright (C) 2014 Justin Chevrier
 * Copyright (C) 2017 Tomislav Gotic
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */

/*
 * Connections are as follows:
 *
 *      +------+-----+----------+
 *      | SPI  | Pin | PICkit2  |
 *      +------+-----+----------+
 *      | /CS  | 1   | VPP/MCLR |
 *      | VCC  | 2   | VDD      |
 *      | GND  | 3   | GND      |
 *      | MISO | 4   | PGD      |
 *      | SCLK | 5   | PDC      |
 *      | MOSI | 6   | AUX      |
 *      +------+-----+----------+
 *
 * Inspiration and some specifics of the interface came via the AVRDude
 * PICkit2 code: https://github.com/steve-m/avrdude/blob/master/pickit2.c
 */

#include "platform.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <errno.h>

#include <libusb.h>

#include "flash.h"
#include "chipdrivers.h"
#include "programmer.h"
#include "spi.h"

const struct dev_entry devs_pickit2_spi[] = {
	{0x04D8, 0x0033, OK, "Microchip", "PICkit 2"},

	{}
};
struct libusb_context *usb_ctx;
static libusb_device_handle *pickit2_handle;

/* Default USB transaction timeout in ms */
#define DFLT_TIMEOUT			1000U
#define MB1						1048576U
#define KB8						8192U
#define PICKIT2_SCLK_MAX_kHz	1000U
#define PICKIT2_Vdd_MIN_mV		2500
#define PICKIT2_Vdd_MAX_mV		5000
#define PICKIT2_ERR_MASK_LO		0x30
#define PICKIT2_ERR_MASK_HI		0xFC

#define ENDPOINT_OUT			0x01
#define ENDPOINT_IN				0x81
#define USB_PACKET_LENGTH		64U		

#define CMD_FIRMWARE_VERSION	0x76
#define CMD_SET_VDD				0xA0
#define CMD_SET_VPP				0xA1
#define CMD_READ_STATUS			0xA2
#define CMD_READ_VDD_VPP		0xA3
#define CMD_DOWNLOAD_SCRIPT		0xA4
#define CMD_RUN_SCRIPT			0xA5
#define CMD_EXEC_SCRIPT			0xA6
#define CMD_CLR_DOWNLOAD_BUFFER	0xA7
#define CMD_DOWNLOAD_DATA		0xA8
#define CMD_CLR_UPLOAD_BUFFER	0xA9
#define CMD_UPLOAD_DATA			0xAA
#define CMD_CLR_SCRIPT_BUFFER	0xAB
#define CMD_UPLOAD_DATA_NO_LEN	0xAC
#define CMD_END_OF_BUFFER		0xAD

#define SCR_SPI_READ_BUFFER		0xC5
#define SCR_SPI_WRITE_BUFFER	0xC6
#define	SCR_SPI_WRITE_LIT		0xC7
#define SCR_SET_AUX				0xCF
#define SCR_DELAY_LONG			0xE8
#define SCR_LOOP				0xE9
#define SCR_SET_ICSP_CLK_PERIOD	0xEA
#define SCR_SET_PINS			0xF3
#define SCR_BUSY_LED_OFF		0xF4
#define SCR_BUSY_LED_ON			0xF5
#define SCR_MCLR_GND_Q_OFF		0xF6
#define SCR_MCLR_GND_Q_ON		0xF7
#define SCR_VPP_PWM_OFF			0xF8
#define SCR_VPP_PWM_ON			0xF9
#define SCR_VPP_Q_OFF			0xFA
#define SCR_VPP_Q_ON			0xFB
#define SCR_VDD_OFF				0xFE
#define SCR_VDD_ON				0xFF

#define RUN_SCR_SPI_CS_HI		1U
#define RUN_SCR_SPI_WRITE		2U
#define RUN_SCR_SPI_READ		3U
#define RUN_SCR_SPI_STATUS_REG	4U
#define RUN_SCR_LED_ON			5U

/* Might be useful for other USB devices as well. static for now.
 * device parameter allows user to specify one device of multiple installed */
static struct libusb_device_handle *get_device_by_vid_pid_number(uint16_t vid, uint16_t pid, unsigned int num)
{
	struct libusb_device **list;
	ssize_t count = libusb_get_device_list(usb_ctx, &list);
	if (count < 0) {
		msg_perr("Getting the USB device list failed (%s)!\n", libusb_error_name(count));
		return NULL;
	}

	struct libusb_device_handle *handle = NULL;
	ssize_t i = 0;
	for (i = 0; i < count; i++) {
		struct libusb_device *dev = list[i];
		struct libusb_device_descriptor desc;
		int err = libusb_get_device_descriptor(dev, &desc);
		if (err != 0) {
			msg_perr("Reading the USB device descriptor failed (%s)!\n", libusb_error_name(err));
			libusb_free_device_list(list, 1);
			return NULL;
		}
		if ((desc.idVendor == vid) && (desc.idProduct == pid)) {
			msg_pinfo("Found USB device %04"PRIx16":%04"PRIx16" at address %d-%d.\n",
				 desc.idVendor, desc.idProduct,
				 libusb_get_bus_number(dev), libusb_get_device_address(dev));
			if (num == 0) {
				err = libusb_open(dev, &handle);
				if (err != 0) {
					msg_perr("Opening the USB device failed (%s)!\n",
						 libusb_error_name(err));
					libusb_free_device_list(list, 1);
					return NULL;
				}
				break;
			}
			num--;
		}
	}
	libusb_free_device_list(list, 1);

	return handle;
}

static int pickit2_get_firmware_version(void)
{
	int ret, transferred = 0;
	uint8_t command[USB_PACKET_LENGTH] = {CMD_FIRMWARE_VERSION, CMD_END_OF_BUFFER};

	ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
	if (ret == 0) {
		ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
		if (ret == 0) {
			msg_pinfo("PICkit2 Firmware Version: %"PRIu8".%"PRIu8".%"PRIu8"\n", command[0], command[1], command[2]);
			return 0;
		}
	}
	msg_perr("PicKit2 Get Firmware Version Command failed (%s)!\n", libusb_error_name(ret));
	return SPI_PROGRAMMER_ERROR;
}

static int pickit2_get_status()
{
	int ret, transferred = 0;
	uint8_t command[USB_PACKET_LENGTH] = {CMD_READ_STATUS, CMD_END_OF_BUFFER};

	ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
	if (ret == 0) {
		ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
		if (ret == 0) {
			msg_pinfo("PICkit2 status(0x%"PRIx8" 0x%"PRIx8"):", command[0], command[1]);
			if (command[0] & 0x40)
				msg_pinfo("BTN,");
			if (command[0] & 0x20)
				msg_perr("VPP ERR,");
			if (command[0] & 0x10)
				msg_perr("VDD ERR,");
			if (command[0] & 0x08)
				msg_pinfo("/CS Hi,");
			if (command[0] & 0x04)
				msg_pinfo("/CS Low");
			if (command[0] & 0x02)
				msg_pinfo("VDD OFF,");
			if (command[0] & 0x01)
				msg_pinfo("VDD GND,");
			if (command[1] & 0x80)
				msg_perr("DL FULL ERR,");
			if (command[1] & 0x40)
				msg_perr("SCR ERR,");
			if (command[1] & 0x20)
				msg_perr("SCR EMPTY ERR,");
			if (command[1] & 0x10)
				msg_perr("SCR DL EMPTY ERR,");
			if (command[1] & 0x08)
				msg_perr("SCR UL FULL ERR,");
			if (command[1] & 0x04)
				msg_perr("ICD TOUT ERR");
			if (command[1] & 0x02)
				msg_pinfo("UART On,");
			if (command[1] & 0x01)
				msg_pinfo("RESET");
			
			msg_pinfo("\n");

			return 0;
		}
	}
	msg_perr("PicKit2 Read Status Command failed (%s)!\n", libusb_error_name(ret));
	return SPI_PROGRAMMER_ERROR;
}
static int pickit2_check_errors()
{
	int ret, transferred = 0;
	uint8_t command[USB_PACKET_LENGTH] = {
		CMD_READ_STATUS,
		CMD_RUN_SCRIPT,
		RUN_SCR_LED_ON,
		1,
		CMD_END_OF_BUFFER
	};

	ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
	if (ret == 0) {
		ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
		if (ret == 0) {
			if ((command[0] & PICKIT2_ERR_MASK_LO) || (command[1] & PICKIT2_ERR_MASK_HI)) {
				msg_perr("PicKit Status Errors: 0x%"PRIx8" 0x%"PRIx8"!\n", (command[0] & PICKIT2_ERR_MASK_LO), (command[1] & PICKIT2_ERR_MASK_HI));
				return SPI_PROGRAMMER_ERROR;
			}
			return 0;
		}
	}
	msg_perr("PicKit2 Read Status Command failed (%s)!\n", libusb_error_name(ret));
	return SPI_PROGRAMMER_ERROR;
}

static int pickit2_set_spi_voltage(int millivolt)
{
	double voltage_selector = millivolt / 1000.0;
	if ((millivolt < PICKIT2_Vdd_MIN_mV) || (millivolt > PICKIT2_Vdd_MAX_mV)) {
		msg_perr("Cannot set Vdd to %.3fV! Aborting.\n", voltage_selector);
		return SPI_PROGRAMMER_ERROR;
	}
	msg_pdbg("Setting Vdd voltage to %.3f V\n", voltage_selector);

	uint8_t command[USB_PACKET_LENGTH] = {
		CMD_SET_VDD,
		voltage_selector * 2048 + 672,
		(voltage_selector * 2048 + 672) / 256,
		voltage_selector * 36,
		CMD_SET_VPP,
		0x40,
		voltage_selector * 18.61,
		voltage_selector * 13,
		CMD_END_OF_BUFFER
	};
	int transferred = 0;

	int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);

	if (ret != 0) {
		msg_perr("PicKit2 Set SPI Vdd Command failed (%s)!\n", libusb_error_name(ret));
		return SPI_PROGRAMMER_ERROR;
	}

	return 0;
}

static int pickit2_set_spi_speed(unsigned int spispeed)
{
	uint8_t command[USB_PACKET_LENGTH] = {
		CMD_EXEC_SCRIPT,
		2,
		SCR_SET_ICSP_CLK_PERIOD,
		(uint8_t)(PICKIT2_SCLK_MAX_kHz / spispeed),
		CMD_END_OF_BUFFER
	};
	int transferred = 0;
	int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
	
	if (ret != 0) {
		msg_perr("PicKit2 Set SPI Speed Command failed (%s)!\n", libusb_error_name(ret));
		return SPI_PROGRAMMER_ERROR;
	}
	msg_pdbg("SPI CLK frequency %0.3f kHz\n", (1.0f / (int)(PICKIT2_SCLK_MAX_kHz / spispeed)) * 1000.0f);
	
	return 0;
}

static int pickit2_spi_send_command(struct flashctx __attribute__((unused))*flash, unsigned int writecnt, unsigned int readcnt,
									const unsigned char *writearr, unsigned char *readarr)
{
	int ret, transferred = 0;
	unsigned int i = 0, n, cnt8k = 0, cnt1M = 0;
	uint8_t buf[USB_PACKET_LENGTH] = { 0 };

	/* Write Flash instruction and data to PicKit2's Download buffer (256B).
	* Write Instruction (02b xx xx xx) and Flash data can be larger than download buffer.
	* Instruction and data are sent in 64B USB packets and executed when received. 
	* SCLK must be > 10kHz to avoid download buffer overflow.
	* Each USB interrupt packet is sent in 1ms time slots.
	* At 1MHz SCLK, USB transfer is slower than PicKit2 to chip transfer.
	* Try to minimize number of USB transfers and maximize USB payload. 
	*/
	if (writecnt > 1) {
		do {
			n = (writecnt > 52) ? 52 : writecnt; /* 256 / 5 + 1 */
			buf[i++] = CMD_DOWNLOAD_DATA;
			buf[i++] = n;
			memcpy(buf + i, writearr, n);
			i += n;

			buf[i++] = CMD_RUN_SCRIPT;
			buf[i++] = RUN_SCR_SPI_WRITE;
			buf[i++] = n; 	/* Number of times to run SPI_WRITE script */

			/* 3 = CS# Hi, 4 = READ_DATA */
			if ((writecnt > 52) || (USB_PACKET_LENGTH < i + 3 + (readcnt ? 4 : 0))) {
				if (i < USB_PACKET_LENGTH)
					buf[i] = CMD_END_OF_BUFFER;
				
				/* msg_pdbg2("pickit2_spi_send_command!w%u/%u!%ub\n", n, writecnt, i); */
				ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
				if (ret != 0) {
					msg_perr("PicKit2 Send Write Script failed, sent %d %s!\n", transferred, libusb_error_name(ret));
					return SPI_PROGRAMMER_ERROR;
				}
				i = 0;
			}
			writecnt -= n;
			writearr += n;
		} while (writecnt);
	} 
	else if (writecnt == 1) {
		/* while checking status register, don't change data in the DOWNLOAD buffer*/
		if (writearr[0] == JEDEC_RDSR) {
			buf[i++] = CMD_RUN_SCRIPT;
			buf[i++] = RUN_SCR_SPI_STATUS_REG;
			buf[i++] = 1;
		}
		else {
			buf[i++] = CMD_EXEC_SCRIPT;
			buf[i++] = 4;
			/* CS# Low */
			buf[i++] = SCR_VPP_Q_OFF;
			buf[i++] = SCR_MCLR_GND_Q_ON;
			buf[i++] = SCR_SPI_WRITE_LIT;
			buf[i++] = writearr[0];
		}
	}
	do 
	{
		if (readcnt) {
			n = (readcnt > USB_PACKET_LENGTH) ? USB_PACKET_LENGTH : readcnt; /* max 64B in one packet */
			buf[i++] = CMD_RUN_SCRIPT;
			buf[i++] = RUN_SCR_SPI_READ;
			buf[i++] = n;						/* Number of times to run SPI_READ script / bytes to read */
			buf[i++] = CMD_UPLOAD_DATA_NO_LEN;	/* Fetch data from Upload Buffer */
		}
		/* last USB packet/no packets to read, set CS# Hi */
		if (readcnt <= USB_PACKET_LENGTH) {
			/* CS# High */
			buf[i++] = CMD_RUN_SCRIPT;
			buf[i++] = RUN_SCR_SPI_CS_HI;
			buf[i++] = 1;
		}
		/* mark end of commands */			
		if (i < USB_PACKET_LENGTH)
			buf[i] = CMD_END_OF_BUFFER;

		//msg_pdbg2("pickit2_spi_send_command!w63!%ub\n", i);
		/* send commands to PicKit2 and Flash */
		ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
		if (ret != 0) {
			msg_perr("PicKit2 Send Read Script failed, sent %d %s!\n", transferred, libusb_error_name(ret));
			return SPI_PROGRAMMER_ERROR;
		} 
		i = 0;
		if (readcnt) {
			/* Get data from PicKit2 or from Flash */
			ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
			if (ret != 0) {
				msg_perr("PicKit2 Read Data failed, expected %u, got %d %s!\n", n, transferred, libusb_error_name(ret));
				return SPI_PROGRAMMER_ERROR;
			}
			if (USB_PACKET_LENGTH == transferred) {
				memcpy(readarr, buf, n);
				readcnt -= n;
				readarr += n;
				cnt8k += n;
				cnt1M += n;
			}
			else {
				msg_perr("PicKit2 Data error, expected %u/%u, got %d %s!\n", n, USB_PACKET_LENGTH, transferred, libusb_error_name(ret));
				return SPI_INVALID_LENGTH;
			}
			if (cnt1M / MB1) {
				msg_pdbg2("*\n");
				cnt1M -= MB1;
				cnt8k = cnt1M;
			}
			if (cnt8k / KB8) {
				msg_pdbg2(".");
				cnt8k -= KB8;
			}
		}
	} while (readcnt);
	
	return pickit2_check_errors();
}

/* Copied from dediprog.c */
/* Might be useful for other USB devices as well. static for now. */
static int parse_voltage(char *voltage)
{
	char *tmp = NULL;
	int i;
	int millivolt = 0, fraction = 0;

	if (!(voltage && *voltage)) {
		msg_perr("Empty voltage= specified.\n");
		return -1;
	}
	millivolt = (int)strtol(voltage, &tmp, 0);
	voltage = tmp;
	/* Handle "," and "." as decimal point. Everything after it is assumed
	 * to be in decimal notation.
	 */
	if ((*voltage == '.') || (*voltage == ',')) {
		voltage++;
		for (i = 0; i < 3; i++) {
			fraction *= 10;
			/* Don't advance if the current character is invalid,
			 * but continue multiplying.
			 */
			if ((*voltage < '0') || (*voltage > '9'))
				continue;
			fraction += *voltage - '0';
			voltage++;
		}
		/* Throw away remaining digits. */
		voltage += strspn(voltage, "0123456789");
	}
	/* The remaining string must be empty or "mV" or "V". */
	tolower_string(voltage);

	/* No unit or "V". */
	if ((*voltage == '\0') || !strncmp(voltage, "v", 1)) {
		millivolt *= 1000;
		millivolt += fraction;
	} else if (!strncmp(voltage, "mv", 2) ||
			!strncmp(voltage, "millivolt", 9)) {
		/* No adjustment. fraction is discarded. */
	} else {
		/* Garbage at the end of the string. */
		msg_perr("Garbage voltage= specified.\n");
		return -1;
	}
	return millivolt;
}

static const struct spi_master spi_master_pickit2 = {
	.type			= SPI_CONTROLLER_PICKIT2,
	.max_data_read	= 0xFFFFFF, /* 16MB, read complete chip with one instruction */
	.max_data_write	= 256, 
	.command		= pickit2_spi_send_command,
	.multicommand	= default_spi_send_multicommand,
	.read			= default_spi_read,
	.write_256		= default_spi_write_256,
	.write_aai		= default_spi_write_aai,
};

static int pickit2_shutdown(void __attribute__((unused))*data)
{
	/* Set all pins to float and turn voltages off */
	uint8_t command[USB_PACKET_LENGTH] = {
		CMD_EXEC_SCRIPT,
		8,
		/* CS# float */
		SCR_VPP_Q_OFF,
		SCR_MCLR_GND_Q_OFF,
		SCR_SET_PINS,
		3, 					/* Bit-0=1(PDC In), Bit-1=1(PGD In), Bit-2=0(PDC LL), Bit-3=0(PGD LL) */
		SCR_SET_AUX,
		1, 					/* Bit-0=1(Aux In), Bit-1=0(Aux LL) */
		/*SCR_VPP_PWM_OFF,*/
		SCR_VDD_OFF,		/* Power OFF Vdd */
		SCR_BUSY_LED_OFF,	/* Turn OFF Busy LED */
		CMD_END_OF_BUFFER
	};
	int transferred = 0;
	int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);

	if (ret != 0) {
		msg_perr("SPI Shutdown Script failed (%s)!\n", libusb_error_name(ret));
	}

	ret = libusb_release_interface(pickit2_handle, 0);
	if (ret != 0) {
		msg_perr("Could not release USB interface (%s)!\n", libusb_error_name(ret));
		ret = SPI_GENERIC_ERROR;
	}
	libusb_close(pickit2_handle);
	libusb_exit(usb_ctx);
	
	msg_pinfo("Shutdown succeeded\n");

	return ret;
}

int pickit2_spi_init(void)
{
	int usedevice = 0;

	uint8_t buf[USB_PACKET_LENGTH] = {
		CMD_EXEC_SCRIPT,
		8,					/* Script length */
		SCR_SET_PINS,
		2,					/* Bit-0=0(PDC Out), Bit-1=1(PGD In), Bit-2=0(PDC LL), Bit-3=0(PGD LL) */
		SCR_SET_AUX,
		0,					/* Bit-0=0(Aux Out), Bit-1=0(Aux LL) */
		SCR_VDD_ON,			/* Power ON Vdd */
		SCR_MCLR_GND_Q_OFF,	/* Let CS# float */
		SCR_VPP_Q_ON,		/* Pull CS# high */
		/*SCR_VPP_PWM_ON,*/	/* no need to Power ON Vpp, CS# is internaly connected to Vdd */
		SCR_BUSY_LED_ON,	/* Busy LED ON*/

		CMD_CLR_DOWNLOAD_BUFFER,
		CMD_CLR_UPLOAD_BUFFER,
		CMD_CLR_SCRIPT_BUFFER,

		CMD_DOWNLOAD_SCRIPT,
		RUN_SCR_SPI_CS_HI,
		2,
		SCR_MCLR_GND_Q_OFF,
		SCR_VPP_Q_ON,

		CMD_DOWNLOAD_SCRIPT,
		RUN_SCR_SPI_WRITE,
		3,
		SCR_VPP_Q_OFF,
		SCR_MCLR_GND_Q_ON,
		SCR_SPI_WRITE_BUFFER,

		CMD_DOWNLOAD_SCRIPT,
		RUN_SCR_SPI_READ,
		3,
		SCR_VPP_Q_OFF,
		SCR_MCLR_GND_Q_ON,
		SCR_SPI_READ_BUFFER,

		CMD_DOWNLOAD_SCRIPT,
		RUN_SCR_SPI_STATUS_REG,
		4,
		SCR_VPP_Q_OFF,
		SCR_MCLR_GND_Q_ON,
		SCR_SPI_WRITE_LIT,
		JEDEC_RDSR,

		CMD_DOWNLOAD_SCRIPT,
		RUN_SCR_LED_ON,
		1,
		SCR_BUSY_LED_ON,

		CMD_END_OF_BUFFER
	};

	unsigned int spispeed = PICKIT2_SCLK_MAX_kHz; /* 1 MHz */
	char *spispeed_str = extract_programmer_param("spispeed");
	if (spispeed_str != NULL) {
		char* end_ptr = NULL;
		errno = 0;
		spispeed = strtoul(spispeed_str, &end_ptr, 10);
		if ((errno != 0) || (spispeed_str == end_ptr)) {
			msg_perr("Error: Could not convert 'spispeed'.\n");
			free(spispeed_str);
			return SPI_GENERIC_ERROR;
		}
		if (end_ptr && *end_ptr == 'M')
			spispeed *= 1000;

		if ((spispeed == 0) || (spispeed > PICKIT2_SCLK_MAX_kHz) || (spispeed < 10)) {
			msg_perr("Error: Value for 'spispeed' is out of range.\n");
			free(spispeed_str);
			return SPI_GENERIC_ERROR;
		}
		free(spispeed_str);
	}

	int millivolt = 3000;

	char *voltage = extract_programmer_param("voltage");
	if (voltage != NULL) {
		millivolt = parse_voltage(voltage);
		free(voltage);
		if (millivolt < 0)
			return SPI_GENERIC_ERROR;
	}
	/* from dediproc.c */
	char *device = extract_programmer_param("device");
	if (device) {
		char *dev_suffix = NULL;
		errno = 0;
		usedevice = strtol(device, &dev_suffix, 10);
		if ((errno != 0) || (device == dev_suffix)) {
			msg_perr("Error: Could not convert 'device'.\n");
			free(device);
			return SPI_GENERIC_ERROR;
		}
		if (usedevice < 0) {
			msg_perr("Error: Value for 'device' is out of range.\n");
			free(device);
			return SPI_GENERIC_ERROR;
		}
		if (*dev_suffix) {
			msg_perr("Error: Garbage following 'device' value.\n");
			free(device);
			return SPI_GENERIC_ERROR;
		}
		msg_pinfo("Using device %d.\n", usedevice);
	}
	free(device);

	/* Here comes the USB stuff */
	libusb_init(&usb_ctx);
	if (!usb_ctx) {
		msg_perr("Could not initialize libusb!\n");
		return SPI_PROGRAMMER_ERROR;
	}
	const uint16_t vid = devs_pickit2_spi[0].vendor_id;
	const uint16_t pid = devs_pickit2_spi[0].device_id;
	
	pickit2_handle = get_device_by_vid_pid_number(vid, pid, (unsigned int) usedevice);
	if (pickit2_handle == NULL) {
		msg_perr("Could not find a PICkit2 on USB!\n");
		libusb_exit(usb_ctx);
		return SPI_PROGRAMMER_ERROR;
	}

	int ret = libusb_set_configuration(pickit2_handle, 1);
	if (ret != 0) {
		msg_perr("Could not set USB device configuration: %d %s\n", ret, libusb_error_name(ret));
		libusb_close(pickit2_handle);
		libusb_exit(usb_ctx);
		return SPI_PROGRAMMER_ERROR;
	}
	ret = libusb_claim_interface(pickit2_handle, 0);
	if (ret != 0) {
		msg_perr("Could not claim USB device interface %d: %d %s\n", 0, ret, libusb_error_name(ret));
		libusb_close(pickit2_handle);
		libusb_exit(usb_ctx);
		return SPI_PROGRAMMER_ERROR;
	}
	if (register_shutdown(pickit2_shutdown, NULL)) {
		return SPI_PROGRAMMER_ERROR;
	}

	if (pickit2_get_status())
		return SPI_PROGRAMMER_ERROR;

	if (pickit2_get_firmware_version()) {
		return SPI_PROGRAMMER_ERROR;
	}

	if (pickit2_set_spi_speed(spispeed)) {
		return SPI_PROGRAMMER_ERROR;
	}

	if (pickit2_set_spi_voltage(millivolt) != 0) {
		return SPI_PROGRAMMER_ERROR;
	}

	/* Perform basic setup.
	 * Configure pin directions and logic levels, turn Vdd on, turn busy LED on, clear buffers and download canned scripts. */
	int transferred = 0;
	ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT);
	if (ret != 0) {
		msg_perr("PicKit2 Setup Command failed (%s)!\n", libusb_error_name(ret));
		return SPI_PROGRAMMER_ERROR;
	}

	register_spi_master(&spi_master_pickit2);

	return 0;
}

$ ./flashrom -VVV -p pickit2_spi -c W25Q64.V -w 64M_8.bin
flashrom  on Windows 10.0 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

flashrom was built with GCC 7.2.0, little endian
Command line (7 args): D:\dev\src\flashrom\flashrom-1.0-rc1\flashrom.exe -VVV -p pickit2_spi -c W25Q64.V -w 64M_8.bin
Calibrating delay loop... OS timer resolution is 15621 usecs, 3729M loops per second, 10 myus = 0 us, 100 myus = 0 us, 1000 myus = 0 us, 10000 myus = 15625 us, 62484 myus = 62483 us, OK.
Initializing pickit2_spi programmer
Found USB device 04d8:0033 at address 4-25.
PICkit2 status(0x0 0x0):
PICkit2 Firmware Version: 2.32.0
SPI CLK frequency 1000.000 kHz
Setting Vdd voltage to 3.000 V
The following protocols are supported: SPI.
Probing for Winbond W25Q64.V, 8192 kB: programmer_map_flash_region: mapping W25Q64.V from 0x00000000ff800000 to 0x0000000000000000
RDID returned 0xef 0x40 0x17. probe_spi_rdid_generic: id1 0xef, id2 0x4017
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) on pickit2_spi.
Chip status register is 0x00.
programmer_unmap_flash_region: unmapped 0x0000000000000000
This chip may contain one-time programmable memory. flashrom cannot read
and may never be able to write it, hence it may not be able to completely
clone the contents of this chip (see man page for details).
programmer_map_flash_region: mapping W25Q64.V from 0x00000000ff800000 to 0x0000000000000000
Block protection is disabled.
Reading old flash chip contents... ...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
done.
Erasing and writing flash chip... Trying erase function 0... 0x000000-0x000fff:W, 0x001000-0x001fff:W, 0x002000-0x002fff:W, 0x003000-0x003fff:W, 0x004000-0x004fff:W, 0x005000-0x005fff:W, 0x006000-0x006fff:W, 0x007000-0x007fff:W, 0x008000-0x008fff:W, 0x009000-0x009fff:W, 0x00a000-0x00afff:W, 0x00b000-0x00bfff:W, 0x00c000-0x00cfff:W, 0x00d000-0x00dfff:W, 0x00e000-0x00efff:W, 0x00f000-0x00ffff:W, 0x010000-0x010fff:W, 0x011000-0x011fff:W, 0x012000-0x012fff:W, 0x013000-0x013fff:W, 0x014000-0x014fff:W, 0x015000-0x015fff:W, 0x016000-0x016fff:W, 0x017000-0x017fff:W, 0x018000-0x018fff:W, 0x019000-0x019fff:W, 0x01a000-0x01afff:W, 0x01b000-0x01bfff:W, 0x01c000-0x01cfff:W, 0x01d000-0x01dfff:W, 0x01e000-0x01efff:W, 0x01f000-0x01ffff:W, 0x020000-0x020fff:W, 0x021000-0x021fff:W, 0x022000-0x022fff:W, 0x023000-0x023fff:W, 0x024000-0x024fff:W, 0x025000-0x025fff:W, 0x026000-0x026fff:W, 0x027000-0x027fff:W, 0x028000-0x028fff:W, 0x029000-0x029fff:W, 0x02a000-0x02afff:W, 0x02b000-0x02bfff:W, 0x02c000-0x02cfff:W, 0x02d000-0x02dfff:W, 0x02e000-0x02efff:W, 0x02f000-0x02ffff:W, 0x030000-0x030fff:W, 0x031000-0x031fff:W, 0x032000-0x032fff:W, 0x033000-0x033fff:W, 0x034000-0x034fff:W, 0x035000-0x035fff:W, 0x036000-0x036fff:W, 0x037000-0x037fff:W, 0x038000-0x038fff:W, 0x039000-0x039fff:W, 0x03a000-0x03afff:W, 0x03b000-0x03bfff:W, 0x03c000-0x03cfff:W, 0x03d000-0x03dfff:W, 0x03e000-0x03efff:W, 0x03f000-0x03ffff:W, 0x040000-0x040fff:W, 0x041000-0x041fff:W, 0x042000-0x042fff:W, 0x043000-0x043fff:W, 0x044000-0x044fff:W, 0x045000-0x045fff:W, 0x046000-0x046fff:W, 0x047000-0x047fff:W, 0x048000-0x048fff:W, 0x049000-0x049fff:W, 0x04a000-0x04afff:W, 0x04b000-0x04bfff:W, 0x04c000-0x04cfff:W, 0x04d000-0x04dfff:W, 0x04e000-0x04efff:W, 0x04f000-0x04ffff:W, 0x050000-0x050fff:W, 0x051000-0x051fff:W, 0x052000-0x052fff:W, 0x053000-0x053fff:W, 0x054000-0x054fff:W, 0x055000-0x055fff:W, 0x056000-0x056fff:W, 0x057000-0x057fff:W, 0x058000-0x058fff:W, 0x059000-0x059fff:W, 0x05a000-0x05afff:W, 0x05b000-0x05bfff:W, 0x05c000-0x05cfff:W, 0x05d000-0x05dfff:W, 0x05e000-0x05efff:W, 0x05f000-0x05ffff:W, 0x060000-0x060fff:W, 0x061000-0x061fff:W, 0x062000-0x062fff:W, 0x063000-0x063fff:W, 0x064000-0x064fff:W, 0x065000-0x065fff:W, 0x066000-0x066fff:W, 0x067000-0x067fff:W, 0x068000-0x068fff:W, 0x069000-0x069fff:W, 0x06a000-0x06afff:W, 0x06b000-0x06bfff:W, 0x06c000-0x06cfff:W, 0x06d000-0x06dfff:W, 0x06e000-0x06efff:W, 0x06f000-0x06ffff:W, 0x070000-0x070fff:W, 0x071000-0x071fff:W, 0x072000-0x072fff:W, 0x073000-0x073fff:W, 0x074000-0x074fff:W, 0x075000-0x075fff:W, 0x076000-0x076fff:W, 0x077000-0x077fff:W, 0x078000-0x078fff:W, 0x079000-0x079fff:W, 0x07a000-0x07afff:W, 0x07b000-0x07bfff:W, 0x07c000-0x07cfff:W, 0x07d000-0x07dfff:W, 0x07e000-0x07efff:W, 0x07f000-0x07ffff:W, 0x080000-0x080fff:W, 0x081000-0x081fff:W, 0x082000-0x082fff:W, 0x083000-0x083fff:W, 0x084000-0x084fff:W, 0x085000-0x085fff:W, 0x086000-0x086fff:W, 0x087000-0x087fff:W, 0x088000-0x088fff:W, 0x089000-0x089fff:W, 0x08a000-0x08afff:W, 0x08b000-0x08bfff:W, 0x08c000-0x08cfff:W, 0x08d000-0x08dfff:W, 0x08e000-0x08efff:W, 0x08f000-0x08ffff:W, 0x090000-0x090fff:W, 0x091000-0x091fff:W, 0x092000-0x092fff:W, 0x093000-0x093fff:W, 0x094000-0x094fff:W, 0x095000-0x095fff:W, 0x096000-0x096fff:W, 0x097000-0x097fff:W, 0x098000-0x098fff:W, 0x099000-0x099fff:W, 0x09a000-0x09afff:W, 0x09b000-0x09bfff:W, 0x09c000-0x09cfff:W, 0x09d000-0x09dfff:W, 0x09e000-0x09efff:W, 0x09f000-0x09ffff:W, 0x0a0000-0x0a0fff:W, 0x0a1000-0x0a1fff:W, 0x0a2000-0x0a2fff:W, 0x0a3000-0x0a3fff:W, 0x0a4000-0x0a4fff:W, 0x0a5000-0x0a5fff:W, 0x0a6000-0x0a6fff:W, 0x0a7000-0x0a7fff:W, 0x0a8000-0x0a8fff:W, 0x0a9000-0x0a9fff:W, 0x0aa000-0x0aafff:W, 0x0ab000-0x0abfff:W, 0x0ac000-0x0acfff:W, 0x0ad000-0x0adfff:W, 0x0ae000-0x0aefff:W, 0x0af000-0x0affff:W, 0x0b0000-0x0b0fff:W, 0x0b1000-0x0b1fff:W, 0x0b2000-0x0b2fff:W, 0x0b3000-0x0b3fff:W, 0x0b4000-0x0b4fff:W, 0x0b5000-0x0b5fff:W, 0x0b6000-0x0b6fff:W, 0x0b7000-0x0b7fff:W, 0x0b8000-0x0b8fff:W, 0x0b9000-0x0b9fff:W, 0x0ba000-0x0bafff:W, 0x0bb000-0x0bbfff:W, 0x0bc000-0x0bcfff:W, 0x0bd000-0x0bdfff:W, 0x0be000-0x0befff:W, 0x0bf000-0x0bffff:W, 0x0c0000-0x0c0fff:W, 0x0c1000-0x0c1fff:W, 0x0c2000-0x0c2fff:W, 0x0c3000-0x0c3fff:W, 0x0c4000-0x0c4fff:W, 0x0c5000-0x0c5fff:W, 0x0c6000-0x0c6fff:W, 0x0c7000-0x0c7fff:W, 0x0c8000-0x0c8fff:W, 0x0c9000-0x0c9fff:W, 0x0ca000-0x0cafff:W, 0x0cb000-0x0cbfff:W, 0x0cc000-0x0ccfff:W, 0x0cd000-0x0cdfff:W, 0x0ce000-0x0cefff:W, 0x0cf000-0x0cffff:W, 0x0d0000-0x0d0fff:W, 0x0d1000-0x0d1fff:W, 0x0d2000-0x0d2fff:W, 0x0d3000-0x0d3fff:W, 0x0d4000-0x0d4fff:W, 0x0d5000-0x0d5fff:W, 0x0d6000-0x0d6fff:W, 0x0d7000-0x0d7fff:W, 0x0d8000-0x0d8fff:W, 0x0d9000-0x0d9fff:W, 0x0da000-0x0dafff:W, 0x0db000-0x0dbfff:W, 0x0dc000-0x0dcfff:W, 0x0dd000-0x0ddfff:W, 0x0de000-0x0defff:W, 0x0df000-0x0dffff:W, 0x0e0000-0x0e0fff:W, 0x0e1000-0x0e1fff:W, 0x0e2000-0x0e2fff:W, 0x0e3000-0x0e3fff:W, 0x0e4000-0x0e4fff:W, 0x0e5000-0x0e5fff:W, 0x0e6000-0x0e6fff:W, 0x0e7000-0x0e7fff:W, 0x0e8000-0x0e8fff:W, 0x0e9000-0x0e9fff:W, 0x0ea000-0x0eafff:W, 0x0eb000-0x0ebfff:W, 0x0ec000-0x0ecfff:W, 0x0ed000-0x0edfff:W, 0x0ee000-0x0eefff:W, 0x0ef000-0x0effff:W, 0x0f0000-0x0f0fff:W, 0x0f1000-0x0f1fff:W, 0x0f2000-0x0f2fff:W, 0x0f3000-0x0f3fff:W, 0x0f4000-0x0f4fff:W, 0x0f5000-0x0f5fff:W, 0x0f6000-0x0f6fff:W, 0x0f7000-0x0f7fff:W, 0x0f8000-0x0f8fff:W, 0x0f9000-0x0f9fff:W, 0x0fa000-0x0fafff:W, 0x0fb000-0x0fbfff:W, 0x0fc000-0x0fcfff:W, 0x0fd000-0x0fdfff:W, 0x0fe000-0x0fefff:W, 0x0ff000-0x0fffff:W, 0x100000-0x100fff:W, 0x101000-0x101fff:W, 0x102000-0x102fff:W, 0x103000-0x103fff:W, 0x104000-0x104fff:W, 0x105000-0x105fff:W, 0x106000-0x106fff:W, 0x107000-0x107fff:W, 0x108000-0x108fff:W, 0x109000-0x109fff:W, 0x10a000-0x10afff:W, 0x10b000-0x10bfff:W, 0x10c000-0x10cfff:W, 0x10d000-0x10dfff:W, 0x10e000-0x10efff:W, 0x10f000-0x10ffff:W, 0x110000-0x110fff:W, 0x111000-0x111fff:W, 0x112000-0x112fff:W, 0x113000-0x113fff:W, 0x114000-0x114fff:W, 0x115000-0x115fff:W, 0x116000-0x116fff:W, 0x117000-0x117fff:W, 0x118000-0x118fff:W, 0x119000-0x119fff:W, 0x11a000-0x11afff:W, 0x11b000-0x11bfff:W, 0x11c000-0x11cfff:W, 0x11d000-0x11dfff:W, 0x11e000-0x11efff:W, 0x11f000-0x11ffff:W, 0x120000-0x120fff:W, 0x121000-0x121fff:W, 0x122000-0x122fff:W, 0x123000-0x123fff:W, 0x124000-0x124fff:W, 0x125000-0x125fff:W, 0x126000-0x126fff:W, 0x127000-0x127fff:W, 0x128000-0x128fff:W, 0x129000-0x129fff:W, 0x12a000-0x12afff:W, 0x12b000-0x12bfff:W, 0x12c000-0x12cfff:W, 0x12d000-0x12dfff:W, 0x12e000-0x12efff:W, 0x12f000-0x12ffff:W, 0x130000-0x130fff:W, 0x131000-0x131fff:W, 0x132000-0x132fff:W, 0x133000-0x133fff:W, 0x134000-0x134fff:W, 0x135000-0x135fff:W, 0x136000-0x136fff:W, 0x137000-0x137fff:W, 0x138000-0x138fff:W, 0x139000-0x139fff:W, 0x13a000-0x13afff:W, 0x13b000-0x13bfff:W, 0x13c000-0x13cfff:W, 0x13d000-0x13dfff:W, 0x13e000-0x13efff:W, 0x13f000-0x13ffff:W, 0x140000-0x140fff:W, 0x141000-0x141fff:W, 0x142000-0x142fff:W, 0x143000-0x143fff:W, 0x144000-0x144fff:W, 0x145000-0x145fff:W, 0x146000-0x146fff:W, 0x147000-0x147fff:W, 0x148000-0x148fff:W, 0x149000-0x149fff:W, 0x14a000-0x14afff:W, 0x14b000-0x14bfff:W, 0x14c000-0x14cfff:W, 0x14d000-0x14dfff:W, 0x14e000-0x14efff:W, 0x14f000-0x14ffff:W, 0x150000-0x150fff:W, 0x151000-0x151fff:W, 0x152000-0x152fff:W, 0x153000-0x153fff:W, 0x154000-0x154fff:W, 0x155000-0x155fff:W, 0x156000-0x156fff:W, 0x157000-0x157fff:W, 0x158000-0x158fff:W, 0x159000-0x159fff:W, 0x15a000-0x15afff:W, 0x15b000-0x15bfff:W, 0x15c000-0x15cfff:W, 0x15d000-0x15dfff:W, 0x15e000-0x15efff:W, 0x15f000-0x15ffff:W, 0x160000-0x160fff:W, 0x161000-0x161fff:W, 0x162000-0x162fff:W, 0x163000-0x163fff:W, 0x164000-0x164fff:W, 0x165000-0x165fff:W, 0x166000-0x166fff:W, 0x167000-0x167fff:W, 0x168000-0x168fff:W, 0x169000-0x169fff:W, 0x16a000-0x16afff:W, 0x16b000-0x16bfff:W, 0x16c000-0x16cfff:W, 0x16d000-0x16dfff:W, 0x16e000-0x16efff:W, 0x16f000-0x16ffff:W, 0x170000-0x170fff:W, 0x171000-0x171fff:W, 0x172000-0x172fff:W, 0x173000-0x173fff:W, 0x174000-0x174fff:W, 0x175000-0x175fff:W, 0x176000-0x176fff:W, 0x177000-0x177fff:W, 0x178000-0x178fff:W, 0x179000-0x179fff:W, 0x17a000-0x17afff:W, 0x17b000-0x17bfff:W, 0x17c000-0x17cfff:W, 0x17d000-0x17dfff:W, 0x17e000-0x17efff:W, 0x17f000-0x17ffff:W, 0x180000-0x180fff:W, 0x181000-0x181fff:W, 0x182000-0x182fff:W, 0x183000-0x183fff:W, 0x184000-0x184fff:W, 0x185000-0x185fff:W, 0x186000-0x186fff:W, 0x187000-0x187fff:W, 0x188000-0x188fff:W, 0x189000-0x189fff:W, 0x18a000-0x18afff:W, 0x18b000-0x18bfff:W, 0x18c000-0x18cfff:W, 0x18d000-0x18dfff:W, 0x18e000-0x18efff:W, 0x18f000-0x18ffff:W, 0x190000-0x190fff:W, 0x191000-0x191fff:W, 0x192000-0x192fff:W, 0x193000-0x193fff:W, 0x194000-0x194fff:W, 0x195000-0x195fff:W, 0x196000-0x196fff:W, 0x197000-0x197fff:W, 0x198000-0x198fff:W, 0x199000-0x199fff:W, 0x19a000-0x19afff:W, 0x19b000-0x19bfff:W, 0x19c000-0x19cfff:W, 0x19d000-0x19dfff:W, 0x19e000-0x19efff:W, 0x19f000-0x19ffff:W, 0x1a0000-0x1a0fff:W, 0x1a1000-0x1a1fff:W, 0x1a2000-0x1a2fff:W, 0x1a3000-0x1a3fff:W, 0x1a4000-0x1a4fff:W, 0x1a5000-0x1a5fff:W, 0x1a6000-0x1a6fff:W, 0x1a7000-0x1a7fff:W, 0x1a8000-0x1a8fff:W, 0x1a9000-0x1a9fff:W, 0x1aa000-0x1aafff:W, 0x1ab000-0x1abfff:W, 0x1ac000-0x1acfff:W, 0x1ad000-0x1adfff:W, 0x1ae000-0x1aefff:W, 0x1af000-0x1affff:W, 0x1b0000-0x1b0fff:W, 0x1b1000-0x1b1fff:W, 0x1b2000-0x1b2fff:W, 0x1b3000-0x1b3fff:W, 0x1b4000-0x1b4fff:W, 0x1b5000-0x1b5fff:W, 0x1b6000-0x1b6fff:W, 0x1b7000-0x1b7fff:W, 0x1b8000-0x1b8fff:W, 0x1b9000-0x1b9fff:W, 0x1ba000-0x1bafff:W, 0x1bb000-0x1bbfff:W, 0x1bc000-0x1bcfff:W, 0x1bd000-0x1bdfff:W, 0x1be000-0x1befff:W, 0x1bf000-0x1bffff:W, 0x1c0000-0x1c0fff:W, 0x1c1000-0x1c1fff:W, 0x1c2000-0x1c2fff:W, 0x1c3000-0x1c3fff:W, 0x1c4000-0x1c4fff:W, 0x1c5000-0x1c5fff:W, 0x1c6000-0x1c6fff:W, 0x1c7000-0x1c7fff:W, 0x1c8000-0x1c8fff:W, 0x1c9000-0x1c9fff:W, 0x1ca000-0x1cafff:W, 0x1cb000-0x1cbfff:W, 0x1cc000-0x1ccfff:W, 0x1cd000-0x1cdfff:W, 0x1ce000-0x1cefff:W, 0x1cf000-0x1cffff:W, 0x1d0000-0x1d0fff:W, 0x1d1000-0x1d1fff:W, 0x1d2000-0x1d2fff:W, 0x1d3000-0x1d3fff:W, 0x1d4000-0x1d4fff:W, 0x1d5000-0x1d5fff:W, 0x1d6000-0x1d6fff:W, 0x1d7000-0x1d7fff:W, 0x1d8000-0x1d8fff:W, 0x1d9000-0x1d9fff:W, 0x1da000-0x1dafff:W, 0x1db000-0x1dbfff:W, 0x1dc000-0x1dcfff:W, 0x1dd000-0x1ddfff:W, 0x1de000-0x1defff:W, 0x1df000-0x1dffff:W, 0x1e0000-0x1e0fff:W, 0x1e1000-0x1e1fff:W, 0x1e2000-0x1e2fff:W, 0x1e3000-0x1e3fff:W, 0x1e4000-0x1e4fff:W, 0x1e5000-0x1e5fff:W, 0x1e6000-0x1e6fff:W, 0x1e7000-0x1e7fff:W, 0x1e8000-0x1e8fff:W, 0x1e9000-0x1e9fff:W, 0x1ea000-0x1eafff:W, 0x1eb000-0x1ebfff:W, 0x1ec000-0x1ecfff:W, 0x1ed000-0x1edfff:W, 0x1ee000-0x1eefff:W, 0x1ef000-0x1effff:W, 0x1f0000-0x1f0fff:W, 0x1f1000-0x1f1fff:W, 0x1f2000-0x1f2fff:W, 0x1f3000-0x1f3fff:W, 0x1f4000-0x1f4fff:W, 0x1f5000-0x1f5fff:W, 0x1f6000-0x1f6fff:W, 0x1f7000-0x1f7fff:W, 0x1f8000-0x1f8fff:W, 0x1f9000-0x1f9fff:W, 0x1fa000-0x1fafff:W, 0x1fb000-0x1fbfff:W, 0x1fc000-0x1fcfff:W, 0x1fd000-0x1fdfff:W, 0x1fe000-0x1fefff:W, 0x1ff000-0x1fffff:W, 0x200000-0x200fff:W, 0x201000-0x201fff:W, 0x202000-0x202fff:W, 0x203000-0x203fff:W, 0x204000-0x204fff:W, 0x205000-0x205fff:W, 0x206000-0x206fff:W, 0x207000-0x207fff:W, 0x208000-0x208fff:W, 0x209000-0x209fff:W, 0x20a000-0x20afff:W, 0x20b000-0x20bfff:W, 0x20c000-0x20cfff:W, 0x20d000-0x20dfff:W, 0x20e000-0x20efff:W, 0x20f000-0x20ffff:W, 0x210000-0x210fff:W, 0x211000-0x211fff:W, 0x212000-0x212fff:W, 0x213000-0x213fff:W, 0x214000-0x214fff:W, 0x215000-0x215fff:W, 0x216000-0x216fff:W, 0x217000-0x217fff:W, 0x218000-0x218fff:W, 0x219000-0x219fff:W, 0x21a000-0x21afff:W, 0x21b000-0x21bfff:W, 0x21c000-0x21cfff:W, 0x21d000-0x21dfff:W, 0x21e000-0x21efff:W, 0x21f000-0x21ffff:W, 0x220000-0x220fff:W, 0x221000-0x221fff:W, 0x222000-0x222fff:W, 0x223000-0x223fff:W, 0x224000-0x224fff:W, 0x225000-0x225fff:W, 0x226000-0x226fff:W, 0x227000-0x227fff:W, 0x228000-0x228fff:W, 0x229000-0x229fff:W, 0x22a000-0x22afff:W, 0x22b000-0x22bfff:W, 0x22c000-0x22cfff:W, 0x22d000-0x22dfff:W, 0x22e000-0x22efff:W, 0x22f000-0x22ffff:W, 0x230000-0x230fff:W, 0x231000-0x231fff:W, 0x232000-0x232fff:W, 0x233000-0x233fff:W, 0x234000-0x234fff:W, 0x235000-0x235fff:W, 0x236000-0x236fff:W, 0x237000-0x237fff:W, 0x238000-0x238fff:W, 0x239000-0x239fff:W, 0x23a000-0x23afff:W, 0x23b000-0x23bfff:W, 0x23c000-0x23cfff:W, 0x23d000-0x23dfff:W, 0x23e000-0x23efff:W, 0x23f000-0x23ffff:W, 0x240000-0x240fff:W, 0x241000-0x241fff:W, 0x242000-0x242fff:W, 0x243000-0x243fff:W, 0x244000-0x244fff:W, 0x245000-0x245fff:W, 0x246000-0x246fff:W, 0x247000-0x247fff:W, 0x248000-0x248fff:W, 0x249000-0x249fff:W, 0x24a000-0x24afff:W, 0x24b000-0x24bfff:W, 0x24c000-0x24cfff:W, 0x24d000-0x24dfff:W, 0x24e000-0x24efff:W, 0x24f000-0x24ffff:W, 0x250000-0x250fff:W, 0x251000-0x251fff:W, 0x252000-0x252fff:W, 0x253000-0x253fff:W, 0x254000-0x254fff:W, 0x255000-0x255fff:W, 0x256000-0x256fff:W, 0x257000-0x257fff:W, 0x258000-0x258fff:W, 0x259000-0x259fff:W, 0x25a000-0x25afff:W, 0x25b000-0x25bfff:W, 0x25c000-0x25cfff:W, 0x25d000-0x25dfff:W, 0x25e000-0x25efff:W, 0x25f000-0x25ffff:W, 0x260000-0x260fff:W, 0x261000-0x261fff:W, 0x262000-0x262fff:W, 0x263000-0x263fff:W, 0x264000-0x264fff:W, 0x265000-0x265fff:W, 0x266000-0x266fff:W, 0x267000-0x267fff:W, 0x268000-0x268fff:W, 0x269000-0x269fff:W, 0x26a000-0x26afff:W, 0x26b000-0x26bfff:W, 0x26c000-0x26cfff:W, 0x26d000-0x26dfff:W, 0x26e000-0x26efff:W, 0x26f000-0x26ffff:W, 0x270000-0x270fff:W, 0x271000-0x271fff:W, 0x272000-0x272fff:W, 0x273000-0x273fff:W, 0x274000-0x274fff:W, 0x275000-0x275fff:W, 0x276000-0x276fff:W, 0x277000-0x277fff:W, 0x278000-0x278fff:W, 0x279000-0x279fff:W, 0x27a000-0x27afff:W, 0x27b000-0x27bfff:W, 0x27c000-0x27cfff:W, 0x27d000-0x27dfff:W, 0x27e000-0x27efff:W, 0x27f000-0x27ffff:W, 0x280000-0x280fff:W, 0x281000-0x281fff:W, 0x282000-0x282fff:W, 0x283000-0x283fff:W, 0x284000-0x284fff:W, 0x285000-0x285fff:W, 0x286000-0x286fff:W, 0x287000-0x287fff:W, 0x288000-0x288fff:W, 0x289000-0x289fff:W, 0x28a000-0x28afff:W, 0x28b000-0x28bfff:W, 0x28c000-0x28cfff:W, 0x28d000-0x28dfff:W, 0x28e000-0x28efff:W, 0x28f000-0x28ffff:W, 0x290000-0x290fff:W, 0x291000-0x291fff:W, 0x292000-0x292fff:W, 0x293000-0x293fff:W, 0x294000-0x294fff:W, 0x295000-0x295fff:W, 0x296000-0x296fff:W, 0x297000-0x297fff:W, 0x298000-0x298fff:W, 0x299000-0x299fff:W, 0x29a000-0x29afff:W, 0x29b000-0x29bfff:W, 0x29c000-0x29cfff:W, 0x29d000-0x29dfff:W, 0x29e000-0x29efff:W, 0x29f000-0x29ffff:W, 0x2a0000-0x2a0fff:W, 0x2a1000-0x2a1fff:W, 0x2a2000-0x2a2fff:W, 0x2a3000-0x2a3fff:W, 0x2a4000-0x2a4fff:W, 0x2a5000-0x2a5fff:W, 0x2a6000-0x2a6fff:W, 0x2a7000-0x2a7fff:W, 0x2a8000-0x2a8fff:W, 0x2a9000-0x2a9fff:W, 0x2aa000-0x2aafff:W, 0x2ab000-0x2abfff:W, 0x2ac000-0x2acfff:W, 0x2ad000-0x2adfff:W, 0x2ae000-0x2aefff:W, 0x2af000-0x2affff:W, 0x2b0000-0x2b0fff:W, 0x2b1000-0x2b1fff:W, 0x2b2000-0x2b2fff:W, 0x2b3000-0x2b3fff:W, 0x2b4000-0x2b4fff:W, 0x2b5000-0x2b5fff:W, 0x2b6000-0x2b6fff:W, 0x2b7000-0x2b7fff:W, 0x2b8000-0x2b8fff:W, 0x2b9000-0x2b9fff:W, 0x2ba000-0x2bafff:W, 0x2bb000-0x2bbfff:W, 0x2bc000-0x2bcfff:W, 0x2bd000-0x2bdfff:W, 0x2be000-0x2befff:W, 0x2bf000-0x2bffff:W, 0x2c0000-0x2c0fff:W, 0x2c1000-0x2c1fff:W, 0x2c2000-0x2c2fff:W, 0x2c3000-0x2c3fff:W, 0x2c4000-0x2c4fff:W, 0x2c5000-0x2c5fff:W, 0x2c6000-0x2c6fff:W, 0x2c7000-0x2c7fff:W, 0x2c8000-0x2c8fff:W, 0x2c9000-0x2c9fff:W, 0x2ca000-0x2cafff:W, 0x2cb000-0x2cbfff:W, 0x2cc000-0x2ccfff:W, 0x2cd000-0x2cdfff:W, 0x2ce000-0x2cefff:W, 0x2cf000-0x2cffff:W, 0x2d0000-0x2d0fff:W, 0x2d1000-0x2d1fff:W, 0x2d2000-0x2d2fff:W, 0x2d3000-0x2d3fff:W, 0x2d4000-0x2d4fff:W, 0x2d5000-0x2d5fff:W, 0x2d6000-0x2d6fff:W, 0x2d7000-0x2d7fff:W, 0x2d8000-0x2d8fff:W, 0x2d9000-0x2d9fff:W, 0x2da000-0x2dafff:W, 0x2db000-0x2dbfff:W, 0x2dc000-0x2dcfff:W, 0x2dd000-0x2ddfff:W, 0x2de000-0x2defff:W, 0x2df000-0x2dffff:W, 0x2e0000-0x2e0fff:W, 0x2e1000-0x2e1fff:W, 0x2e2000-0x2e2fff:W, 0x2e3000-0x2e3fff:W, 0x2e4000-0x2e4fff:W, 0x2e5000-0x2e5fff:W, 0x2e6000-0x2e6fff:W, 0x2e7000-0x2e7fff:W, 0x2e8000-0x2e8fff:W, 0x2e9000-0x2e9fff:W, 0x2ea000-0x2eafff:W, 0x2eb000-0x2ebfff:W, 0x2ec000-0x2ecfff:W, 0x2ed000-0x2edfff:W, 0x2ee000-0x2eefff:W, 0x2ef000-0x2effff:W, 0x2f0000-0x2f0fff:W, 0x2f1000-0x2f1fff:W, 0x2f2000-0x2f2fff:W, 0x2f3000-0x2f3fff:W, 0x2f4000-0x2f4fff:W, 0x2f5000-0x2f5fff:W, 0x2f6000-0x2f6fff:W, 0x2f7000-0x2f7fff:W, 0x2f8000-0x2f8fff:W, 0x2f9000-0x2f9fff:W, 0x2fa000-0x2fafff:W, 0x2fb000-0x2fbfff:W, 0x2fc000-0x2fcfff:W, 0x2fd000-0x2fdfff:W, 0x2fe000-0x2fefff:W, 0x2ff000-0x2fffff:W, 0x300000-0x300fff:W, 0x301000-0x301fff:W, 0x302000-0x302fff:W, 0x303000-0x303fff:W, 0x304000-0x304fff:W, 0x305000-0x305fff:W, 0x306000-0x306fff:W, 0x307000-0x307fff:W, 0x308000-0x308fff:W, 0x309000-0x309fff:W, 0x30a000-0x30afff:W, 0x30b000-0x30bfff:W, 0x30c000-0x30cfff:W, 0x30d000-0x30dfff:W, 0x30e000-0x30efff:W, 0x30f000-0x30ffff:W, 0x310000-0x310fff:W, 0x311000-0x311fff:W, 0x312000-0x312fff:W, 0x313000-0x313fff:W, 0x314000-0x314fff:W, 0x315000-0x315fff:W, 0x316000-0x316fff:W, 0x317000-0x317fff:W, 0x318000-0x318fff:W, 0x319000-0x319fff:W, 0x31a000-0x31afff:W, 0x31b000-0x31bfff:W, 0x31c000-0x31cfff:W, 0x31d000-0x31dfff:W, 0x31e000-0x31efff:W, 0x31f000-0x31ffff:W, 0x320000-0x320fff:W, 0x321000-0x321fff:W, 0x322000-0x322fff:W, 0x323000-0x323fff:W, 0x324000-0x324fff:W, 0x325000-0x325fff:W, 0x326000-0x326fff:W, 0x327000-0x327fff:W, 0x328000-0x328fff:W, 0x329000-0x329fff:W, 0x32a000-0x32afff:W, 0x32b000-0x32bfff:W, 0x32c000-0x32cfff:W, 0x32d000-0x32dfff:W, 0x32e000-0x32efff:W, 0x32f000-0x32ffff:W, 0x330000-0x330fff:W, 0x331000-0x331fff:W, 0x332000-0x332fff:W, 0x333000-0x333fff:W, 0x334000-0x334fff:W, 0x335000-0x335fff:W, 0x336000-0x336fff:W, 0x337000-0x337fff:W, 0x338000-0x338fff:W, 0x339000-0x339fff:W, 0x33a000-0x33afff:W, 0x33b000-0x33bfff:W, 0x33c000-0x33cfff:W, 0x33d000-0x33dfff:W, 0x33e000-0x33efff:W, 0x33f000-0x33ffff:W, 0x340000-0x340fff:W, 0x341000-0x341fff:W, 0x342000-0x342fff:W, 0x343000-0x343fff:W, 0x344000-0x344fff:W, 0x345000-0x345fff:W, 0x346000-0x346fff:W, 0x347000-0x347fff:W, 0x348000-0x348fff:W, 0x349000-0x349fff:W, 0x34a000-0x34afff:W, 0x34b000-0x34bfff:W, 0x34c000-0x34cfff:W, 0x34d000-0x34dfff:W, 0x34e000-0x34efff:W, 0x34f000-0x34ffff:W, 0x350000-0x350fff:W, 0x351000-0x351fff:W, 0x352000-0x352fff:W, 0x353000-0x353fff:W, 0x354000-0x354fff:W, 0x355000-0x355fff:W, 0x356000-0x356fff:W, 0x357000-0x357fff:W, 0x358000-0x358fff:W, 0x359000-0x359fff:W, 0x35a000-0x35afff:W, 0x35b000-0x35bfff:W, 0x35c000-0x35cfff:W, 0x35d000-0x35dfff:W, 0x35e000-0x35efff:W, 0x35f000-0x35ffff:W, 0x360000-0x360fff:W, 0x361000-0x361fff:W, 0x362000-0x362fff:W, 0x363000-0x363fff:W, 0x364000-0x364fff:W, 0x365000-0x365fff:W, 0x366000-0x366fff:W, 0x367000-0x367fff:W, 0x368000-0x368fff:W, 0x369000-0x369fff:W, 0x36a000-0x36afff:W, 0x36b000-0x36bfff:W, 0x36c000-0x36cfff:W, 0x36d000-0x36dfff:W, 0x36e000-0x36efff:W, 0x36f000-0x36ffff:W, 0x370000-0x370fff:W, 0x371000-0x371fff:W, 0x372000-0x372fff:W, 0x373000-0x373fff:W, 0x374000-0x374fff:W, 0x375000-0x375fff:W, 0x376000-0x376fff:W, 0x377000-0x377fff:W, 0x378000-0x378fff:W, 0x379000-0x379fff:W, 0x37a000-0x37afff:W, 0x37b000-0x37bfff:W, 0x37c000-0x37cfff:W, 0x37d000-0x37dfff:W, 0x37e000-0x37efff:W, 0x37f000-0x37ffff:W, 0x380000-0x380fff:W, 0x381000-0x381fff:W, 0x382000-0x382fff:W, 0x383000-0x383fff:W, 0x384000-0x384fff:W, 0x385000-0x385fff:W, 0x386000-0x386fff:W, 0x387000-0x387fff:W, 0x388000-0x388fff:W, 0x389000-0x389fff:W, 0x38a000-0x38afff:W, 0x38b000-0x38bfff:W, 0x38c000-0x38cfff:W, 0x38d000-0x38dfff:W, 0x38e000-0x38efff:W, 0x38f000-0x38ffff:W, 0x390000-0x390fff:W, 0x391000-0x391fff:W, 0x392000-0x392fff:W, 0x393000-0x393fff:W, 0x394000-0x394fff:W, 0x395000-0x395fff:W, 0x396000-0x396fff:W, 0x397000-0x397fff:W, 0x398000-0x398fff:W, 0x399000-0x399fff:W, 0x39a000-0x39afff:W, 0x39b000-0x39bfff:W, 0x39c000-0x39cfff:W, 0x39d000-0x39dfff:W, 0x39e000-0x39efff:W, 0x39f000-0x39ffff:W, 0x3a0000-0x3a0fff:W, 0x3a1000-0x3a1fff:W, 0x3a2000-0x3a2fff:W, 0x3a3000-0x3a3fff:W, 0x3a4000-0x3a4fff:W, 0x3a5000-0x3a5fff:W, 0x3a6000-0x3a6fff:W, 0x3a7000-0x3a7fff:W, 0x3a8000-0x3a8fff:W, 0x3a9000-0x3a9fff:W, 0x3aa000-0x3aafff:W, 0x3ab000-0x3abfff:W, 0x3ac000-0x3acfff:W, 0x3ad000-0x3adfff:W, 0x3ae000-0x3aefff:W, 0x3af000-0x3affff:W, 0x3b0000-0x3b0fff:W, 0x3b1000-0x3b1fff:W, 0x3b2000-0x3b2fff:W, 0x3b3000-0x3b3fff:W, 0x3b4000-0x3b4fff:W, 0x3b5000-0x3b5fff:W, 0x3b6000-0x3b6fff:W, 0x3b7000-0x3b7fff:W, 0x3b8000-0x3b8fff:W, 0x3b9000-0x3b9fff:W, 0x3ba000-0x3bafff:W, 0x3bb000-0x3bbfff:W, 0x3bc000-0x3bcfff:W, 0x3bd000-0x3bdfff:W, 0x3be000-0x3befff:W, 0x3bf000-0x3bffff:W, 0x3c0000-0x3c0fff:W, 0x3c1000-0x3c1fff:W, 0x3c2000-0x3c2fff:W, 0x3c3000-0x3c3fff:W, 0x3c4000-0x3c4fff:W, 0x3c5000-0x3c5fff:W, 0x3c6000-0x3c6fff:W, 0x3c7000-0x3c7fff:W, 0x3c8000-0x3c8fff:W, 0x3c9000-0x3c9fff:W, 0x3ca000-0x3cafff:W, 0x3cb000-0x3cbfff:W, 0x3cc000-0x3ccfff:W, 0x3cd000-0x3cdfff:W, 0x3ce000-0x3cefff:W, 0x3cf000-0x3cffff:W, 0x3d0000-0x3d0fff:W, 0x3d1000-0x3d1fff:W, 0x3d2000-0x3d2fff:W, 0x3d3000-0x3d3fff:W, 0x3d4000-0x3d4fff:W, 0x3d5000-0x3d5fff:W, 0x3d6000-0x3d6fff:W, 0x3d7000-0x3d7fff:W, 0x3d8000-0x3d8fff:W, 0x3d9000-0x3d9fff:W, 0x3da000-0x3dafff:W, 0x3db000-0x3dbfff:W, 0x3dc000-0x3dcfff:W, 0x3dd000-0x3ddfff:W, 0x3de000-0x3defff:W, 0x3df000-0x3dffff:W, 0x3e0000-0x3e0fff:W, 0x3e1000-0x3e1fff:W, 0x3e2000-0x3e2fff:W, 0x3e3000-0x3e3fff:W, 0x3e4000-0x3e4fff:W, 0x3e5000-0x3e5fff:W, 0x3e6000-0x3e6fff:W, 0x3e7000-0x3e7fff:W, 0x3e8000-0x3e8fff:W, 0x3e9000-0x3e9fff:W, 0x3ea000-0x3eafff:W, 0x3eb000-0x3ebfff:W, 0x3ec000-0x3ecfff:W, 0x3ed000-0x3edfff:W, 0x3ee000-0x3eefff:W, 0x3ef000-0x3effff:W, 0x3f0000-0x3f0fff:W, 0x3f1000-0x3f1fff:W, 0x3f2000-0x3f2fff:W, 0x3f3000-0x3f3fff:W, 0x3f4000-0x3f4fff:W, 0x3f5000-0x3f5fff:W, 0x3f6000-0x3f6fff:W, 0x3f7000-0x3f7fff:W, 0x3f8000-0x3f8fff:W, 0x3f9000-0x3f9fff:W, 0x3fa000-0x3fafff:W, 0x3fb000-0x3fbfff:W, 0x3fc000-0x3fcfff:W, 0x3fd000-0x3fdfff:W, 0x3fe000-0x3fefff:W, 0x3ff000-0x3fffff:W, 0x400000-0x400fff:W, 0x401000-0x401fff:W, 0x402000-0x402fff:W, 0x403000-0x403fff:W, 0x404000-0x404fff:W, 0x405000-0x405fff:W, 0x406000-0x406fff:W, 0x407000-0x407fff:W, 0x408000-0x408fff:W, 0x409000-0x409fff:W, 0x40a000-0x40afff:W, 0x40b000-0x40bfff:W, 0x40c000-0x40cfff:W, 0x40d000-0x40dfff:W, 0x40e000-0x40efff:W, 0x40f000-0x40ffff:W, 0x410000-0x410fff:W, 0x411000-0x411fff:W, 0x412000-0x412fff:W, 0x413000-0x413fff:W, 0x414000-0x414fff:W, 0x415000-0x415fff:W, 0x416000-0x416fff:W, 0x417000-0x417fff:W, 0x418000-0x418fff:W, 0x419000-0x419fff:W, 0x41a000-0x41afff:W, 0x41b000-0x41bfff:W, 0x41c000-0x41cfff:W, 0x41d000-0x41dfff:W, 0x41e000-0x41efff:W, 0x41f000-0x41ffff:W, 0x420000-0x420fff:W, 0x421000-0x421fff:W, 0x422000-0x422fff:W, 0x423000-0x423fff:W, 0x424000-0x424fff:W, 0x425000-0x425fff:W, 0x426000-0x426fff:W, 0x427000-0x427fff:W, 0x428000-0x428fff:W, 0x429000-0x429fff:W, 0x42a000-0x42afff:W, 0x42b000-0x42bfff:W, 0x42c000-0x42cfff:W, 0x42d000-0x42dfff:W, 0x42e000-0x42efff:W, 0x42f000-0x42ffff:W, 0x430000-0x430fff:W, 0x431000-0x431fff:W, 0x432000-0x432fff:W, 0x433000-0x433fff:W, 0x434000-0x434fff:W, 0x435000-0x435fff:W, 0x436000-0x436fff:W, 0x437000-0x437fff:W, 0x438000-0x438fff:W, 0x439000-0x439fff:W, 0x43a000-0x43afff:W, 0x43b000-0x43bfff:W, 0x43c000-0x43cfff:W, 0x43d000-0x43dfff:W, 0x43e000-0x43efff:W, 0x43f000-0x43ffff:W, 0x440000-0x440fff:W, 0x441000-0x441fff:W, 0x442000-0x442fff:W, 0x443000-0x443fff:W, 0x444000-0x444fff:W, 0x445000-0x445fff:W, 0x446000-0x446fff:W, 0x447000-0x447fff:W, 0x448000-0x448fff:W, 0x449000-0x449fff:W, 0x44a000-0x44afff:W, 0x44b000-0x44bfff:W, 0x44c000-0x44cfff:W, 0x44d000-0x44dfff:W, 0x44e000-0x44efff:W, 0x44f000-0x44ffff:W, 0x450000-0x450fff:W, 0x451000-0x451fff:W, 0x452000-0x452fff:W, 0x453000-0x453fff:W, 0x454000-0x454fff:W, 0x455000-0x455fff:W, 0x456000-0x456fff:W, 0x457000-0x457fff:W, 0x458000-0x458fff:W, 0x459000-0x459fff:W, 0x45a000-0x45afff:W, 0x45b000-0x45bfff:W, 0x45c000-0x45cfff:W, 0x45d000-0x45dfff:W, 0x45e000-0x45efff:W, 0x45f000-0x45ffff:W, 0x460000-0x460fff:W, 0x461000-0x461fff:W, 0x462000-0x462fff:W, 0x463000-0x463fff:W, 0x464000-0x464fff:W, 0x465000-0x465fff:W, 0x466000-0x466fff:W, 0x467000-0x467fff:W, 0x468000-0x468fff:W, 0x469000-0x469fff:W, 0x46a000-0x46afff:W, 0x46b000-0x46bfff:W, 0x46c000-0x46cfff:W, 0x46d000-0x46dfff:W, 0x46e000-0x46efff:W, 0x46f000-0x46ffff:W, 0x470000-0x470fff:W, 0x471000-0x471fff:W, 0x472000-0x472fff:W, 0x473000-0x473fff:W, 0x474000-0x474fff:W, 0x475000-0x475fff:W, 0x476000-0x476fff:W, 0x477000-0x477fff:W, 0x478000-0x478fff:W, 0x479000-0x479fff:W, 0x47a000-0x47afff:W, 0x47b000-0x47bfff:W, 0x47c000-0x47cfff:W, 0x47d000-0x47dfff:W, 0x47e000-0x47efff:W, 0x47f000-0x47ffff:W, 0x480000-0x480fff:W, 0x481000-0x481fff:W, 0x482000-0x482fff:W, 0x483000-0x483fff:W, 0x484000-0x484fff:W, 0x485000-0x485fff:W, 0x486000-0x486fff:W, 0x487000-0x487fff:W, 0x488000-0x488fff:W, 0x489000-0x489fff:W, 0x48a000-0x48afff:W, 0x48b000-0x48bfff:W, 0x48c000-0x48cfff:W, 0x48d000-0x48dfff:W, 0x48e000-0x48efff:W, 0x48f000-0x48ffff:W, 0x490000-0x490fff:W, 0x491000-0x491fff:W, 0x492000-0x492fff:W, 0x493000-0x493fff:W, 0x494000-0x494fff:W, 0x495000-0x495fff:W, 0x496000-0x496fff:W, 0x497000-0x497fff:W, 0x498000-0x498fff:W, 0x499000-0x499fff:W, 0x49a000-0x49afff:W, 0x49b000-0x49bfff:W, 0x49c000-0x49cfff:W, 0x49d000-0x49dfff:W, 0x49e000-0x49efff:W, 0x49f000-0x49ffff:W, 0x4a0000-0x4a0fff:W, 0x4a1000-0x4a1fff:W, 0x4a2000-0x4a2fff:W, 0x4a3000-0x4a3fff:W, 0x4a4000-0x4a4fff:W, 0x4a5000-0x4a5fff:W, 0x4a6000-0x4a6fff:W, 0x4a7000-0x4a7fff:W, 0x4a8000-0x4a8fff:W, 0x4a9000-0x4a9fff:W, 0x4aa000-0x4aafff:W, 0x4ab000-0x4abfff:W, 0x4ac000-0x4acfff:W, 0x4ad000-0x4adfff:W, 0x4ae000-0x4aefff:W, 0x4af000-0x4affff:W, 0x4b0000-0x4b0fff:W, 0x4b1000-0x4b1fff:W, 0x4b2000-0x4b2fff:W, 0x4b3000-0x4b3fff:W, 0x4b4000-0x4b4fff:W, 0x4b5000-0x4b5fff:W, 0x4b6000-0x4b6fff:W, 0x4b7000-0x4b7fff:W, 0x4b8000-0x4b8fff:W, 0x4b9000-0x4b9fff:W, 0x4ba000-0x4bafff:W, 0x4bb000-0x4bbfff:W, 0x4bc000-0x4bcfff:W, 0x4bd000-0x4bdfff:W, 0x4be000-0x4befff:W, 0x4bf000-0x4bffff:W, 0x4c0000-0x4c0fff:W, 0x4c1000-0x4c1fff:W, 0x4c2000-0x4c2fff:W, 0x4c3000-0x4c3fff:W, 0x4c4000-0x4c4fff:W, 0x4c5000-0x4c5fff:W, 0x4c6000-0x4c6fff:W, 0x4c7000-0x4c7fff:W, 0x4c8000-0x4c8fff:W, 0x4c9000-0x4c9fff:W, 0x4ca000-0x4cafff:W, 0x4cb000-0x4cbfff:W, 0x4cc000-0x4ccfff:W, 0x4cd000-0x4cdfff:W, 0x4ce000-0x4cefff:W, 0x4cf000-0x4cffff:W, 0x4d0000-0x4d0fff:W, 0x4d1000-0x4d1fff:W, 0x4d2000-0x4d2fff:W, 0x4d3000-0x4d3fff:W, 0x4d4000-0x4d4fff:W, 0x4d5000-0x4d5fff:W, 0x4d6000-0x4d6fff:W, 0x4d7000-0x4d7fff:W, 0x4d8000-0x4d8fff:W, 0x4d9000-0x4d9fff:W, 0x4da000-0x4dafff:W, 0x4db000-0x4dbfff:W, 0x4dc000-0x4dcfff:W, 0x4dd000-0x4ddfff:W, 0x4de000-0x4defff:W, 0x4df000-0x4dffff:W, 0x4e0000-0x4e0fff:W, 0x4e1000-0x4e1fff:W, 0x4e2000-0x4e2fff:W, 0x4e3000-0x4e3fff:W, 0x4e4000-0x4e4fff:W, 0x4e5000-0x4e5fff:W, 0x4e6000-0x4e6fff:W, 0x4e7000-0x4e7fff:W, 0x4e8000-0x4e8fff:W, 0x4e9000-0x4e9fff:W, 0x4ea000-0x4eafff:W, 0x4eb000-0x4ebfff:W, 0x4ec000-0x4ecfff:W, 0x4ed000-0x4edfff:W, 0x4ee000-0x4eefff:W, 0x4ef000-0x4effff:W, 0x4f0000-0x4f0fff:W, 0x4f1000-0x4f1fff:W, 0x4f2000-0x4f2fff:W, 0x4f3000-0x4f3fff:W, 0x4f4000-0x4f4fff:W, 0x4f5000-0x4f5fff:W, 0x4f6000-0x4f6fff:W, 0x4f7000-0x4f7fff:W, 0x4f8000-0x4f8fff:W, 0x4f9000-0x4f9fff:W, 0x4fa000-0x4fafff:W, 0x4fb000-0x4fbfff:W, 0x4fc000-0x4fcfff:W, 0x4fd000-0x4fdfff:W, 0x4fe000-0x4fefff:W, 0x4ff000-0x4fffff:W, 0x500000-0x500fff:W, 0x501000-0x501fff:W, 0x502000-0x502fff:W, 0x503000-0x503fff:W, 0x504000-0x504fff:W, 0x505000-0x505fff:W, 0x506000-0x506fff:W, 0x507000-0x507fff:W, 0x508000-0x508fff:W, 0x509000-0x509fff:W, 0x50a000-0x50afff:W, 0x50b000-0x50bfff:W, 0x50c000-0x50cfff:W, 0x50d000-0x50dfff:W, 0x50e000-0x50efff:W, 0x50f000-0x50ffff:W, 0x510000-0x510fff:W, 0x511000-0x511fff:W, 0x512000-0x512fff:W, 0x513000-0x513fff:W, 0x514000-0x514fff:W, 0x515000-0x515fff:W, 0x516000-0x516fff:W, 0x517000-0x517fff:W, 0x518000-0x518fff:W, 0x519000-0x519fff:W, 0x51a000-0x51afff:W, 0x51b000-0x51bfff:W, 0x51c000-0x51cfff:W, 0x51d000-0x51dfff:W, 0x51e000-0x51efff:W, 0x51f000-0x51ffff:W, 0x520000-0x520fff:W, 0x521000-0x521fff:W, 0x522000-0x522fff:W, 0x523000-0x523fff:W, 0x524000-0x524fff:W, 0x525000-0x525fff:W, 0x526000-0x526fff:W, 0x527000-0x527fff:W, 0x528000-0x528fff:W, 0x529000-0x529fff:W, 0x52a000-0x52afff:W, 0x52b000-0x52bfff:W, 0x52c000-0x52cfff:W, 0x52d000-0x52dfff:W, 0x52e000-0x52efff:W, 0x52f000-0x52ffff:W, 0x530000-0x530fff:W, 0x531000-0x531fff:W, 0x532000-0x532fff:W, 0x533000-0x533fff:W, 0x534000-0x534fff:W, 0x535000-0x535fff:W, 0x536000-0x536fff:W, 0x537000-0x537fff:W, 0x538000-0x538fff:W, 0x539000-0x539fff:W, 0x53a000-0x53afff:W, 0x53b000-0x53bfff:W, 0x53c000-0x53cfff:W, 0x53d000-0x53dfff:W, 0x53e000-0x53efff:W, 0x53f000-0x53ffff:W, 0x540000-0x540fff:W, 0x541000-0x541fff:W, 0x542000-0x542fff:W, 0x543000-0x543fff:W, 0x544000-0x544fff:W, 0x545000-0x545fff:W, 0x546000-0x546fff:W, 0x547000-0x547fff:W, 0x548000-0x548fff:W, 0x549000-0x549fff:W, 0x54a000-0x54afff:W, 0x54b000-0x54bfff:W, 0x54c000-0x54cfff:W, 0x54d000-0x54dfff:W, 0x54e000-0x54efff:W, 0x54f000-0x54ffff:W, 0x550000-0x550fff:W, 0x551000-0x551fff:W, 0x552000-0x552fff:W, 0x553000-0x553fff:W, 0x554000-0x554fff:W, 0x555000-0x555fff:W, 0x556000-0x556fff:W, 0x557000-0x557fff:W, 0x558000-0x558fff:W, 0x559000-0x559fff:W, 0x55a000-0x55afff:W, 0x55b000-0x55bfff:W, 0x55c000-0x55cfff:W, 0x55d000-0x55dfff:W, 0x55e000-0x55efff:W, 0x55f000-0x55ffff:W, 0x560000-0x560fff:W, 0x561000-0x561fff:W, 0x562000-0x562fff:W, 0x563000-0x563fff:W, 0x564000-0x564fff:W, 0x565000-0x565fff:W, 0x566000-0x566fff:W, 0x567000-0x567fff:W, 0x568000-0x568fff:W, 0x569000-0x569fff:W, 0x56a000-0x56afff:W, 0x56b000-0x56bfff:W, 0x56c000-0x56cfff:W, 0x56d000-0x56dfff:W, 0x56e000-0x56efff:W, 0x56f000-0x56ffff:W, 0x570000-0x570fff:W, 0x571000-0x571fff:W, 0x572000-0x572fff:W, 0x573000-0x573fff:W, 0x574000-0x574fff:W, 0x575000-0x575fff:W, 0x576000-0x576fff:W, 0x577000-0x577fff:W, 0x578000-0x578fff:W, 0x579000-0x579fff:W, 0x57a000-0x57afff:W, 0x57b000-0x57bfff:W, 0x57c000-0x57cfff:W, 0x57d000-0x57dfff:W, 0x57e000-0x57efff:W, 0x57f000-0x57ffff:W, 0x580000-0x580fff:W, 0x581000-0x581fff:W, 0x582000-0x582fff:W, 0x583000-0x583fff:W, 0x584000-0x584fff:W, 0x585000-0x585fff:W, 0x586000-0x586fff:W, 0x587000-0x587fff:W, 0x588000-0x588fff:W, 0x589000-0x589fff:W, 0x58a000-0x58afff:W, 0x58b000-0x58bfff:W, 0x58c000-0x58cfff:W, 0x58d000-0x58dfff:W, 0x58e000-0x58efff:W, 0x58f000-0x58ffff:W, 0x590000-0x590fff:W, 0x591000-0x591fff:W, 0x592000-0x592fff:W, 0x593000-0x593fff:W, 0x594000-0x594fff:W, 0x595000-0x595fff:W, 0x596000-0x596fff:W, 0x597000-0x597fff:W, 0x598000-0x598fff:W, 0x599000-0x599fff:W, 0x59a000-0x59afff:W, 0x59b000-0x59bfff:W, 0x59c000-0x59cfff:W, 0x59d000-0x59dfff:W, 0x59e000-0x59efff:W, 0x59f000-0x59ffff:W, 0x5a0000-0x5a0fff:W, 0x5a1000-0x5a1fff:W, 0x5a2000-0x5a2fff:W, 0x5a3000-0x5a3fff:W, 0x5a4000-0x5a4fff:W, 0x5a5000-0x5a5fff:W, 0x5a6000-0x5a6fff:W, 0x5a7000-0x5a7fff:W, 0x5a8000-0x5a8fff:W, 0x5a9000-0x5a9fff:W, 0x5aa000-0x5aafff:W, 0x5ab000-0x5abfff:W, 0x5ac000-0x5acfff:W, 0x5ad000-0x5adfff:W, 0x5ae000-0x5aefff:W, 0x5af000-0x5affff:W, 0x5b0000-0x5b0fff:W, 0x5b1000-0x5b1fff:W, 0x5b2000-0x5b2fff:W, 0x5b3000-0x5b3fff:W, 0x5b4000-0x5b4fff:W, 0x5b5000-0x5b5fff:W, 0x5b6000-0x5b6fff:W, 0x5b7000-0x5b7fff:W, 0x5b8000-0x5b8fff:W, 0x5b9000-0x5b9fff:W, 0x5ba000-0x5bafff:W, 0x5bb000-0x5bbfff:W, 0x5bc000-0x5bcfff:W, 0x5bd000-0x5bdfff:W, 0x5be000-0x5befff:W, 0x5bf000-0x5bffff:W, 0x5c0000-0x5c0fff:W, 0x5c1000-0x5c1fff:W, 0x5c2000-0x5c2fff:W, 0x5c3000-0x5c3fff:W, 0x5c4000-0x5c4fff:W, 0x5c5000-0x5c5fff:W, 0x5c6000-0x5c6fff:W, 0x5c7000-0x5c7fff:W, 0x5c8000-0x5c8fff:W, 0x5c9000-0x5c9fff:W, 0x5ca000-0x5cafff:W, 0x5cb000-0x5cbfff:W, 0x5cc000-0x5ccfff:W, 0x5cd000-0x5cdfff:W, 0x5ce000-0x5cefff:W, 0x5cf000-0x5cffff:W, 0x5d0000-0x5d0fff:W, 0x5d1000-0x5d1fff:W, 0x5d2000-0x5d2fff:W, 0x5d3000-0x5d3fff:W, 0x5d4000-0x5d4fff:W, 0x5d5000-0x5d5fff:W, 0x5d6000-0x5d6fff:W, 0x5d7000-0x5d7fff:W, 0x5d8000-0x5d8fff:W, 0x5d9000-0x5d9fff:W, 0x5da000-0x5dafff:W, 0x5db000-0x5dbfff:W, 0x5dc000-0x5dcfff:W, 0x5dd000-0x5ddfff:W, 0x5de000-0x5defff:W, 0x5df000-0x5dffff:W, 0x5e0000-0x5e0fff:W, 0x5e1000-0x5e1fff:W, 0x5e2000-0x5e2fff:W, 0x5e3000-0x5e3fff:W, 0x5e4000-0x5e4fff:W, 0x5e5000-0x5e5fff:W, 0x5e6000-0x5e6fff:W, 0x5e7000-0x5e7fff:W, 0x5e8000-0x5e8fff:W, 0x5e9000-0x5e9fff:W, 0x5ea000-0x5eafff:W, 0x5eb000-0x5ebfff:W, 0x5ec000-0x5ecfff:W, 0x5ed000-0x5edfff:W, 0x5ee000-0x5eefff:W, 0x5ef000-0x5effff:W, 0x5f0000-0x5f0fff:W, 0x5f1000-0x5f1fff:W, 0x5f2000-0x5f2fff:W, 0x5f3000-0x5f3fff:W, 0x5f4000-0x5f4fff:W, 0x5f5000-0x5f5fff:W, 0x5f6000-0x5f6fff:W, 0x5f7000-0x5f7fff:W, 0x5f8000-0x5f8fff:W, 0x5f9000-0x5f9fff:W, 0x5fa000-0x5fafff:W, 0x5fb000-0x5fbfff:W, 0x5fc000-0x5fcfff:W, 0x5fd000-0x5fdfff:W, 0x5fe000-0x5fefff:W, 0x5ff000-0x5fffff:W, 0x600000-0x600fff:W, 0x601000-0x601fff:W, 0x602000-0x602fff:W, 0x603000-0x603fff:W, 0x604000-0x604fff:W, 0x605000-0x605fff:W, 0x606000-0x606fff:W, 0x607000-0x607fff:W, 0x608000-0x608fff:W, 0x609000-0x609fff:W, 0x60a000-0x60afff:W, 0x60b000-0x60bfff:W, 0x60c000-0x60cfff:W, 0x60d000-0x60dfff:W, 0x60e000-0x60efff:W, 0x60f000-0x60ffff:W, 0x610000-0x610fff:W, 0x611000-0x611fff:W, 0x612000-0x612fff:W, 0x613000-0x613fff:W, 0x614000-0x614fff:W, 0x615000-0x615fff:W, 0x616000-0x616fff:W, 0x617000-0x617fff:W, 0x618000-0x618fff:W, 0x619000-0x619fff:W, 0x61a000-0x61afff:W, 0x61b000-0x61bfff:W, 0x61c000-0x61cfff:W, 0x61d000-0x61dfff:W, 0x61e000-0x61efff:W, 0x61f000-0x61ffff:W, 0x620000-0x620fff:W, 0x621000-0x621fff:W, 0x622000-0x622fff:W, 0x623000-0x623fff:W, 0x624000-0x624fff:W, 0x625000-0x625fff:W, 0x626000-0x626fff:W, 0x627000-0x627fff:W, 0x628000-0x628fff:W, 0x629000-0x629fff:W, 0x62a000-0x62afff:W, 0x62b000-0x62bfff:W, 0x62c000-0x62cfff:W, 0x62d000-0x62dfff:W, 0x62e000-0x62efff:W, 0x62f000-0x62ffff:W, 0x630000-0x630fff:W, 0x631000-0x631fff:W, 0x632000-0x632fff:W, 0x633000-0x633fff:W, 0x634000-0x634fff:W, 0x635000-0x635fff:W, 0x636000-0x636fff:W, 0x637000-0x637fff:W, 0x638000-0x638fff:W, 0x639000-0x639fff:W, 0x63a000-0x63afff:W, 0x63b000-0x63bfff:W, 0x63c000-0x63cfff:W, 0x63d000-0x63dfff:W, 0x63e000-0x63efff:W, 0x63f000-0x63ffff:W, 0x640000-0x640fff:W, 0x641000-0x641fff:W, 0x642000-0x642fff:W, 0x643000-0x643fff:W, 0x644000-0x644fff:W, 0x645000-0x645fff:W, 0x646000-0x646fff:W, 0x647000-0x647fff:W, 0x648000-0x648fff:W, 0x649000-0x649fff:W, 0x64a000-0x64afff:W, 0x64b000-0x64bfff:W, 0x64c000-0x64cfff:W, 0x64d000-0x64dfff:W, 0x64e000-0x64efff:W, 0x64f000-0x64ffff:W, 0x650000-0x650fff:W, 0x651000-0x651fff:W, 0x652000-0x652fff:W, 0x653000-0x653fff:W, 0x654000-0x654fff:W, 0x655000-0x655fff:W, 0x656000-0x656fff:W, 0x657000-0x657fff:W, 0x658000-0x658fff:W, 0x659000-0x659fff:W, 0x65a000-0x65afff:W, 0x65b000-0x65bfff:W, 0x65c000-0x65cfff:W, 0x65d000-0x65dfff:W, 0x65e000-0x65efff:W, 0x65f000-0x65ffff:W, 0x660000-0x660fff:W, 0x661000-0x661fff:W, 0x662000-0x662fff:W, 0x663000-0x663fff:W, 0x664000-0x664fff:W, 0x665000-0x665fff:W, 0x666000-0x666fff:W, 0x667000-0x667fff:W, 0x668000-0x668fff:W, 0x669000-0x669fff:W, 0x66a000-0x66afff:W, 0x66b000-0x66bfff:W, 0x66c000-0x66cfff:W, 0x66d000-0x66dfff:W, 0x66e000-0x66efff:W, 0x66f000-0x66ffff:W, 0x670000-0x670fff:W, 0x671000-0x671fff:W, 0x672000-0x672fff:W, 0x673000-0x673fff:W, 0x674000-0x674fff:W, 0x675000-0x675fff:W, 0x676000-0x676fff:W, 0x677000-0x677fff:W, 0x678000-0x678fff:W, 0x679000-0x679fff:W, 0x67a000-0x67afff:W, 0x67b000-0x67bfff:W, 0x67c000-0x67cfff:W, 0x67d000-0x67dfff:W, 0x67e000-0x67efff:W, 0x67f000-0x67ffff:W, 0x680000-0x680fff:W, 0x681000-0x681fff:W, 0x682000-0x682fff:W, 0x683000-0x683fff:W, 0x684000-0x684fff:W, 0x685000-0x685fff:W, 0x686000-0x686fff:W, 0x687000-0x687fff:W, 0x688000-0x688fff:W, 0x689000-0x689fff:W, 0x68a000-0x68afff:W, 0x68b000-0x68bfff:W, 0x68c000-0x68cfff:W, 0x68d000-0x68dfff:W, 0x68e000-0x68efff:W, 0x68f000-0x68ffff:W, 0x690000-0x690fff:W, 0x691000-0x691fff:W, 0x692000-0x692fff:W, 0x693000-0x693fff:W, 0x694000-0x694fff:W, 0x695000-0x695fff:W, 0x696000-0x696fff:W, 0x697000-0x697fff:W, 0x698000-0x698fff:W, 0x699000-0x699fff:W, 0x69a000-0x69afff:W, 0x69b000-0x69bfff:W, 0x69c000-0x69cfff:W, 0x69d000-0x69dfff:W, 0x69e000-0x69efff:W, 0x69f000-0x69ffff:W, 0x6a0000-0x6a0fff:W, 0x6a1000-0x6a1fff:W, 0x6a2000-0x6a2fff:W, 0x6a3000-0x6a3fff:W, 0x6a4000-0x6a4fff:W, 0x6a5000-0x6a5fff:W, 0x6a6000-0x6a6fff:W, 0x6a7000-0x6a7fff:W, 0x6a8000-0x6a8fff:W, 0x6a9000-0x6a9fff:W, 0x6aa000-0x6aafff:W, 0x6ab000-0x6abfff:W, 0x6ac000-0x6acfff:W, 0x6ad000-0x6adfff:W, 0x6ae000-0x6aefff:W, 0x6af000-0x6affff:W, 0x6b0000-0x6b0fff:W, 0x6b1000-0x6b1fff:W, 0x6b2000-0x6b2fff:W, 0x6b3000-0x6b3fff:W, 0x6b4000-0x6b4fff:W, 0x6b5000-0x6b5fff:W, 0x6b6000-0x6b6fff:W, 0x6b7000-0x6b7fff:W, 0x6b8000-0x6b8fff:W, 0x6b9000-0x6b9fff:W, 0x6ba000-0x6bafff:W, 0x6bb000-0x6bbfff:W, 0x6bc000-0x6bcfff:W, 0x6bd000-0x6bdfff:W, 0x6be000-0x6befff:W, 0x6bf000-0x6bffff:W, 0x6c0000-0x6c0fff:W, 0x6c1000-0x6c1fff:W, 0x6c2000-0x6c2fff:W, 0x6c3000-0x6c3fff:W, 0x6c4000-0x6c4fff:W, 0x6c5000-0x6c5fff:W, 0x6c6000-0x6c6fff:W, 0x6c7000-0x6c7fff:W, 0x6c8000-0x6c8fff:W, 0x6c9000-0x6c9fff:W, 0x6ca000-0x6cafff:W, 0x6cb000-0x6cbfff:W, 0x6cc000-0x6ccfff:W, 0x6cd000-0x6cdfff:W, 0x6ce000-0x6cefff:W, 0x6cf000-0x6cffff:W, 0x6d0000-0x6d0fff:W, 0x6d1000-0x6d1fff:W, 0x6d2000-0x6d2fff:W, 0x6d3000-0x6d3fff:W, 0x6d4000-0x6d4fff:W, 0x6d5000-0x6d5fff:W, 0x6d6000-0x6d6fff:W, 0x6d7000-0x6d7fff:W, 0x6d8000-0x6d8fff:W, 0x6d9000-0x6d9fff:W, 0x6da000-0x6dafff:W, 0x6db000-0x6dbfff:W, 0x6dc000-0x6dcfff:W, 0x6dd000-0x6ddfff:W, 0x6de000-0x6defff:W, 0x6df000-0x6dffff:W, 0x6e0000-0x6e0fff:W, 0x6e1000-0x6e1fff:W, 0x6e2000-0x6e2fff:W, 0x6e3000-0x6e3fff:W, 0x6e4000-0x6e4fff:W, 0x6e5000-0x6e5fff:W, 0x6e6000-0x6e6fff:W, 0x6e7000-0x6e7fff:W, 0x6e8000-0x6e8fff:W, 0x6e9000-0x6e9fff:W, 0x6ea000-0x6eafff:W, 0x6eb000-0x6ebfff:W, 0x6ec000-0x6ecfff:W, 0x6ed000-0x6edfff:W, 0x6ee000-0x6eefff:W, 0x6ef000-0x6effff:W, 0x6f0000-0x6f0fff:W, 0x6f1000-0x6f1fff:W, 0x6f2000-0x6f2fff:W, 0x6f3000-0x6f3fff:W, 0x6f4000-0x6f4fff:W, 0x6f5000-0x6f5fff:W, 0x6f6000-0x6f6fff:W, 0x6f7000-0x6f7fff:W, 0x6f8000-0x6f8fff:W, 0x6f9000-0x6f9fff:W, 0x6fa000-0x6fafff:W, 0x6fb000-0x6fbfff:W, 0x6fc000-0x6fcfff:W, 0x6fd000-0x6fdfff:W, 0x6fe000-0x6fefff:W, 0x6ff000-0x6fffff:W, 0x700000-0x700fff:W, 0x701000-0x701fff:W, 0x702000-0x702fff:W, 0x703000-0x703fff:W, 0x704000-0x704fff:W, 0x705000-0x705fff:W, 0x706000-0x706fff:W, 0x707000-0x707fff:W, 0x708000-0x708fff:W, 0x709000-0x709fff:W, 0x70a000-0x70afff:W, 0x70b000-0x70bfff:W, 0x70c000-0x70cfff:W, 0x70d000-0x70dfff:W, 0x70e000-0x70efff:W, 0x70f000-0x70ffff:W, 0x710000-0x710fff:W, 0x711000-0x711fff:W, 0x712000-0x712fff:W, 0x713000-0x713fff:W, 0x714000-0x714fff:W, 0x715000-0x715fff:W, 0x716000-0x716fff:W, 0x717000-0x717fff:W, 0x718000-0x718fff:W, 0x719000-0x719fff:W, 0x71a000-0x71afff:W, 0x71b000-0x71bfff:W, 0x71c000-0x71cfff:W, 0x71d000-0x71dfff:W, 0x71e000-0x71efff:W, 0x71f000-0x71ffff:W, 0x720000-0x720fff:W, 0x721000-0x721fff:W, 0x722000-0x722fff:W, 0x723000-0x723fff:W, 0x724000-0x724fff:W, 0x725000-0x725fff:W, 0x726000-0x726fff:W, 0x727000-0x727fff:W, 0x728000-0x728fff:W, 0x729000-0x729fff:W, 0x72a000-0x72afff:W, 0x72b000-0x72bfff:W, 0x72c000-0x72cfff:W, 0x72d000-0x72dfff:W, 0x72e000-0x72efff:W, 0x72f000-0x72ffff:W, 0x730000-0x730fff:W, 0x731000-0x731fff:W, 0x732000-0x732fff:W, 0x733000-0x733fff:W, 0x734000-0x734fff:W, 0x735000-0x735fff:W, 0x736000-0x736fff:W, 0x737000-0x737fff:W, 0x738000-0x738fff:W, 0x739000-0x739fff:W, 0x73a000-0x73afff:W, 0x73b000-0x73bfff:W, 0x73c000-0x73cfff:W, 0x73d000-0x73dfff:W, 0x73e000-0x73efff:W, 0x73f000-0x73ffff:W, 0x740000-0x740fff:W, 0x741000-0x741fff:W, 0x742000-0x742fff:W, 0x743000-0x743fff:W, 0x744000-0x744fff:W, 0x745000-0x745fff:W, 0x746000-0x746fff:W, 0x747000-0x747fff:W, 0x748000-0x748fff:W, 0x749000-0x749fff:W, 0x74a000-0x74afff:W, 0x74b000-0x74bfff:W, 0x74c000-0x74cfff:W, 0x74d000-0x74dfff:W, 0x74e000-0x74efff:W, 0x74f000-0x74ffff:W, 0x750000-0x750fff:W, 0x751000-0x751fff:W, 0x752000-0x752fff:W, 0x753000-0x753fff:W, 0x754000-0x754fff:W, 0x755000-0x755fff:W, 0x756000-0x756fff:W, 0x757000-0x757fff:W, 0x758000-0x758fff:W, 0x759000-0x759fff:W, 0x75a000-0x75afff:W, 0x75b000-0x75bfff:W, 0x75c000-0x75cfff:W, 0x75d000-0x75dfff:W, 0x75e000-0x75efff:W, 0x75f000-0x75ffff:W, 0x760000-0x760fff:W, 0x761000-0x761fff:W, 0x762000-0x762fff:W, 0x763000-0x763fff:W, 0x764000-0x764fff:W, 0x765000-0x765fff:W, 0x766000-0x766fff:W, 0x767000-0x767fff:W, 0x768000-0x768fff:W, 0x769000-0x769fff:W, 0x76a000-0x76afff:W, 0x76b000-0x76bfff:W, 0x76c000-0x76cfff:W, 0x76d000-0x76dfff:W, 0x76e000-0x76efff:W, 0x76f000-0x76ffff:W, 0x770000-0x770fff:W, 0x771000-0x771fff:W, 0x772000-0x772fff:W, 0x773000-0x773fff:W, 0x774000-0x774fff:W, 0x775000-0x775fff:W, 0x776000-0x776fff:W, 0x777000-0x777fff:W, 0x778000-0x778fff:W, 0x779000-0x779fff:W, 0x77a000-0x77afff:W, 0x77b000-0x77bfff:W, 0x77c000-0x77cfff:W, 0x77d000-0x77dfff:W, 0x77e000-0x77efff:W, 0x77f000-0x77ffff:W, 0x780000-0x780fff:W, 0x781000-0x781fff:W, 0x782000-0x782fff:W, 0x783000-0x783fff:W, 0x784000-0x784fff:W, 0x785000-0x785fff:W, 0x786000-0x786fff:W, 0x787000-0x787fff:W, 0x788000-0x788fff:W, 0x789000-0x789fff:W, 0x78a000-0x78afff:W, 0x78b000-0x78bfff:W, 0x78c000-0x78cfff:W, 0x78d000-0x78dfff:W, 0x78e000-0x78efff:W, 0x78f000-0x78ffff:W, 0x790000-0x790fff:W, 0x791000-0x791fff:W, 0x792000-0x792fff:W, 0x793000-0x793fff:W, 0x794000-0x794fff:W, 0x795000-0x795fff:W, 0x796000-0x796fff:W, 0x797000-0x797fff:W, 0x798000-0x798fff:W, 0x799000-0x799fff:W, 0x79a000-0x79afff:W, 0x79b000-0x79bfff:W, 0x79c000-0x79cfff:W, 0x79d000-0x79dfff:W, 0x79e000-0x79efff:W, 0x79f000-0x79ffff:W, 0x7a0000-0x7a0fff:W, 0x7a1000-0x7a1fff:W, 0x7a2000-0x7a2fff:W, 0x7a3000-0x7a3fff:W, 0x7a4000-0x7a4fff:W, 0x7a5000-0x7a5fff:W, 0x7a6000-0x7a6fff:W, 0x7a7000-0x7a7fff:W, 0x7a8000-0x7a8fff:W, 0x7a9000-0x7a9fff:W, 0x7aa000-0x7aafff:W, 0x7ab000-0x7abfff:W, 0x7ac000-0x7acfff:W, 0x7ad000-0x7adfff:W, 0x7ae000-0x7aefff:W, 0x7af000-0x7affff:W, 0x7b0000-0x7b0fff:W, 0x7b1000-0x7b1fff:W, 0x7b2000-0x7b2fff:W, 0x7b3000-0x7b3fff:W, 0x7b4000-0x7b4fff:W, 0x7b5000-0x7b5fff:W, 0x7b6000-0x7b6fff:W, 0x7b7000-0x7b7fff:W, 0x7b8000-0x7b8fff:W, 0x7b9000-0x7b9fff:W, 0x7ba000-0x7bafff:W, 0x7bb000-0x7bbfff:W, 0x7bc000-0x7bcfff:W, 0x7bd000-0x7bdfff:W, 0x7be000-0x7befff:W, 0x7bf000-0x7bffff:W, 0x7c0000-0x7c0fff:W, 0x7c1000-0x7c1fff:W, 0x7c2000-0x7c2fff:W, 0x7c3000-0x7c3fff:W, 0x7c4000-0x7c4fff:W, 0x7c5000-0x7c5fff:W, 0x7c6000-0x7c6fff:W, 0x7c7000-0x7c7fff:W, 0x7c8000-0x7c8fff:W, 0x7c9000-0x7c9fff:W, 0x7ca000-0x7cafff:W, 0x7cb000-0x7cbfff:W, 0x7cc000-0x7ccfff:W, 0x7cd000-0x7cdfff:W, 0x7ce000-0x7cefff:W, 0x7cf000-0x7cffff:W, 0x7d0000-0x7d0fff:W, 0x7d1000-0x7d1fff:W, 0x7d2000-0x7d2fff:W, 0x7d3000-0x7d3fff:W, 0x7d4000-0x7d4fff:W, 0x7d5000-0x7d5fff:W, 0x7d6000-0x7d6fff:W, 0x7d7000-0x7d7fff:W, 0x7d8000-0x7d8fff:W, 0x7d9000-0x7d9fff:W, 0x7da000-0x7dafff:W, 0x7db000-0x7dbfff:W, 0x7dc000-0x7dcfff:W, 0x7dd000-0x7ddfff:W, 0x7de000-0x7defff:W, 0x7df000-0x7dffff:W, 0x7e0000-0x7e0fff:W, 0x7e1000-0x7e1fff:W, 0x7e2000-0x7e2fff:W, 0x7e3000-0x7e3fff:W, 0x7e4000-0x7e4fff:W, 0x7e5000-0x7e5fff:W, 0x7e6000-0x7e6fff:W, 0x7e7000-0x7e7fff:W, 0x7e8000-0x7e8fff:W, 0x7e9000-0x7e9fff:W, 0x7ea000-0x7eafff:W, 0x7eb000-0x7ebfff:W, 0x7ec000-0x7ecfff:W, 0x7ed000-0x7edfff:W, 0x7ee000-0x7eefff:W, 0x7ef000-0x7effff:W, 0x7f0000-0x7f0fff:W, 0x7f1000-0x7f1fff:W, 0x7f2000-0x7f2fff:W, 0x7f3000-0x7f3fff:W, 0x7f4000-0x7f4fff:W, 0x7f5000-0x7f5fff:W, 0x7f6000-0x7f6fff:W, 0x7f7000-0x7f7fff:W, 0x7f8000-0x7f8fff:W, 0x7f9000-0x7f9fff:W, 0x7fa000-0x7fafff:W, 0x7fb000-0x7fbfff:W, 0x7fc000-0x7fcfff:W, 0x7fd000-0x7fdfff:W, 0x7fe000-0x7fefff:W, 0x7ff000-0x7fffff:W
Erase/write done.
Verifying flash... ...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
...............................................................................................................................*
VERIFIED.
programmer_unmap_flash_region: unmapped 0x0000000000000000
Shutdown succeeded

Patch

--- D:/dev/src/flashrom/flashrom-1.0-rc1/Makefile_old	Sun Nov  5 22:35:34 2017

+++ D:/dev/src/flashrom/flashrom-1.0-rc1/Makefile	Sat Nov 18 17:32:54 2017

@@ -97,7 +97,7 @@ 

 
 # HOST_OS is only used to work around local toolchain issues.
 HOST_OS ?= $(shell uname)
-ifeq ($(HOST_OS), MINGW32_NT-5.1)

+ifeq ($(findstring MINGW, $(HOST_OS)), MINGW)

 # Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found".
 CC = gcc
 endif
@@ -189,7 +189,7 @@ 

 ifeq ($(TARGET_OS), MinGW)
 EXEC_SUFFIX := .exe
 # MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs().
-FLASHROM_CFLAGS += -Dffs=__builtin_ffs

+FLASHROM_CFLAGS += -Dffs=__builtin_ffs -D_CRT_SECURE_NO_WARNINGS

 # Some functions provided by Microsoft do not work as described in C99 specifications. This macro fixes that
 # for MinGW. See http://sourceforge.net/p/mingw-w64/wiki2/printf%20and%20scanf%20family/ */
 FLASHROM_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1
@@ -653,10 +653,8 @@ 

 endif
 
 # Disable feature groups
-ifeq ($(CONFIG_ENABLE_LIBUSB0_PROGRAMMERS), no)

-override CONFIG_PICKIT2_SPI = no

-endif

 ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no)
+override CONFIG_PICKIT2_SPI = no

 override CONFIG_CH341A_SPI = no
 override CONFIG_DEDIPROG = no
 endif
@@ -823,7 +821,7 @@ 

 ifeq ($(CONFIG_PICKIT2_SPI), yes)
 FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1'
 PROGRAMMER_OBJS += pickit2_spi.o
-NEED_LIBUSB0 += CONFIG_PICKIT2_SPI

+NEED_LIBUSB1 += CONFIG_PICKIT2_SPI

 endif
 
 ifneq ($(NEED_LIBFTDI), )
@@ -970,11 +968,6 @@ 

 
 endif
 
-ifneq ($(NEED_LIBUSB0), )

-CHECK_LIBUSB0 = yes

-FEATURE_CFLAGS += -D'NEED_LIBUSB0=1'

-USBLIBS := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --libs libusb || printf "%s" "-lusb")

-endif

 
 ifneq ($(NEED_LIBUSB1), )
 CHECK_LIBUSB1 = yes
@@ -1015,7 +1008,7 @@ 

 endif
 
 $(PROGRAM)$(EXEC_SUFFIX): $(OBJS)
-	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS) $(USB1LIBS)

+	$(CC) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS) $(USB1LIBS) $(LDFLAGS)

 
 libflashrom.a: $(LIBFLASHROM_OBJS)
 	$(AR) rcs $@ $^
@@ -1119,23 +1112,6 @@ 

 endef
 export PCI_GET_DEV_TEST
 
-define LIBUSB0_TEST

-#include "platform.h"

-#if IS_WINDOWS

-#include <lusb0_usb.h>

-#else

-#include <usb.h>

-#endif

-int main(int argc, char **argv)

-{

-	(void) argc;

-	(void) argv;

-	usb_init();

-	return 0;

-}

-endef

-export LIBUSB0_TEST

-

 define LIBUSB1_TEST
 #include <stddef.h>
 #include <libusb.h>
@@ -1181,28 +1157,6 @@ 

 		echo "mentioned above by specifying make CONFIG_ENABLE_LIBPCI_PROGRAMMERS=no"; \
 		echo "See README for more information."; echo;				\
 		rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1
-	@rm -f .test.c .test.o .test$(EXEC_SUFFIX)

-endif

-ifeq ($(CHECK_LIBUSB0), yes)

-	@printf "Checking for libusb-0.1/libusb-compat headers... " | tee -a $(BUILD_DETAILS_FILE)

-	@echo "$$LIBUSB0_TEST" > .test.c

-	@printf "\nexec: %s\n" "$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o" >>$(BUILD_DETAILS_FILE)

-	@{ { { { { $(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >&2 && \

-		echo "found." || { echo "not found."; echo;				\

-		echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \

-		echo "Please install libusb-0.1 headers or libusb-compat headers or disable all features"; \

-		echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \

-		echo "See README for more information."; echo;				\

-		rm -f .test.c .test.o; exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1

-	@printf "Checking if libusb-0.1 is usable... " | tee -a $(BUILD_DETAILS_FILE)

-	@printf "\nexec: %s\n" "$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS)" >>$(BUILD_DETAILS_FILE)

-	@{ { { { { $(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS) >&2 && \

-		echo "yes." || { echo "no.";						\

-		echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \

-		echo "Please install libusb-0.1 or libusb-compat or disable all features"; \

-		echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \

-		echo "See README for more information."; echo;				\

-		rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1

 	@rm -f .test.c .test.o .test$(EXEC_SUFFIX)
 endif
 ifeq ($(CHECK_LIBUSB1), yes)