diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 66fd13c90..000000000 --- a/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ diff --git a/README.md b/README.md deleted file mode 100644 index 32459150d..000000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# distros -These are mutually dependent distros that use u-root. This includes weboot, NiChrome, and other images. diff --git a/nichrome/.github/workflows/go.yml b/nichrome/.github/workflows/go.yml new file mode 100644 index 000000000..51f71649c --- /dev/null +++ b/nichrome/.github/workflows/go.yml @@ -0,0 +1,24 @@ +name: Go + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + + - name: Build + run: (cd usb && go build .) + - name: usb + run: ./usb/usb -fetch diff --git a/nichrome/.gitignore b/nichrome/.gitignore new file mode 100644 index 000000000..e9e0554ec --- /dev/null +++ b/nichrome/.gitignore @@ -0,0 +1,27 @@ +nocontent.efi +linux-stable +linux-firmware +vboot_reference +config.txt +newKern +usb/usb +*.cpio +*~ +uinit/uinit +tcz/ +.bb/ + +# definitely ignore upspin! It may have keys. +upspin/ + +# and ignore .ssh. We DO NOT pull in ~/.ssh. +# if you want .ssh config stuff, you have to put it here. +# This still scares me however. We might want to make +# it not a . file -- they're dangerous. +.ssh/ + +# Also ignore etc +etc/ + +# we install binaries into usr/bin, ignore it. +usr/bin/ diff --git a/nichrome/.travis.yml b/nichrome/.travis.yml new file mode 100644 index 000000000..9c6882d46 --- /dev/null +++ b/nichrome/.travis.yml @@ -0,0 +1,27 @@ +sudo: true +language: go +go: + - 1.12.x +env: + - "PATH=/home/travis/gopath/bin:$PATH" +addons: + apt: + packages: + - gcc-4.8 + - bc + - uuid-dev +before_install: + - pwd + - ls -l +install: + - ls + - curl -L -o /home/travis/gopath/bin/dep https://github.com/golang/dep/releases/download/v0.5.0/dep-linux-amd64 + - chmod +x /home/travis/gopath/bin/dep +script: + - cat travis.sh + - bash travis.sh +after_success: + - if [ "$TRAVIS_BRANCH" == "master" ]; then ghr --username u-root --token $GITHUB_TOKEN --replace --prerelease --debug `git describe --always` dist/; fi + +notifications: + slack: u-root:S74GnNB8ekAiqNYTjwbEhkQE diff --git a/nichrome/CONFIG b/nichrome/CONFIG new file mode 100644 index 000000000..05f2e9b04 --- /dev/null +++ b/nichrome/CONFIG @@ -0,0 +1,6148 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86_64 5.10.0 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="gcc (Ubuntu 10.3.0-1ubuntu1~20.10) 10.3.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=100300 +CONFIG_LD_VERSION=235010000 +CONFIG_CLANG_VERSION=0 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_HAVE_KERNEL_ZSTD=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_ZSTD is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_WATCH_QUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +CONFIG_USELIB=y +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +# CONFIG_TASKSTATS is not set +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +# CONFIG_IKCONFIG is not set +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_MEMCG_KMEM=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +# CONFIG_CGROUP_RDMA is not set +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +# CONFIG_CGROUP_BPF is not set +# CONFIG_CGROUP_DEBUG is not set +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="initramfs.linux_amd64.cpio" +CONFIG_INITRAMFS_ROOT_UID=0 +CONFIG_INITRAMFS_ROOT_GID=0 +# CONFIG_RD_GZIP is not set +# CONFIG_RD_BZIP2 is not set +CONFIG_RD_LZMA=y +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_ZSTD is not set +CONFIG_INITRAMFS_COMPRESSION_LZMA=y +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +# CONFIG_BOOT_CONFIG is not set +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_BPF=y +CONFIG_EXPERT=y +CONFIG_UID16=y +CONFIG_MULTIUSER=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_PCSPKR_PLATFORM=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y +CONFIG_KALLSYMS_BASE_RELATIVE=y +CONFIG_BPF_SYSCALL=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y +# CONFIG_BPF_PRELOAD is not set +# CONFIG_USERFAULTFD is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_RSEQ=y +# CONFIG_DEBUG_RSEQ is not set +# CONFIG_EMBEDDED is not set +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_MEMCG_SYSFS_ON is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# end of General setup + +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_FILTER_PGPROT=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_ZONE_DMA32=y +CONFIG_AUDIT_ARCH=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_HAVE_INTEL_TXT=y +CONFIG_X86_64_SMP=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_CC_HAS_SANE_STACKPROTECTOR=y + +# +# Processor type and features +# +CONFIG_ZONE_DMA=y +CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y +CONFIG_X86_X2APIC=y +# CONFIG_X86_MPPARSE is not set +# CONFIG_GOLDFISH is not set +CONFIG_RETPOLINE=y +# CONFIG_X86_CPU_RESCTRL is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +CONFIG_X86_INTEL_LPSS=y +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +CONFIG_IOSF_MBI=y +CONFIG_IOSF_MBI_DEBUG=y +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_PARAVIRT=y +# CONFIG_PARAVIRT_DEBUG is not set +CONFIG_PARAVIRT_SPINLOCKS=y +CONFIG_X86_HV_CALLBACK_VECTOR=y +# CONFIG_XEN is not set +CONFIG_KVM_GUEST=y +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +# CONFIG_PVH is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_JAILHOUSE_GUEST is not set +# CONFIG_ACRN_GUEST is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +# CONFIG_MCORE2 is not set +# CONFIG_MATOM is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_X86_VMX_FEATURE_NAMES=y +CONFIG_PROCESSOR_SELECT=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_AMD=y +# CONFIG_CPU_SUP_HYGON is not set +# CONFIG_CPU_SUP_CENTAUR is not set +# CONFIG_CPU_SUP_ZHAOXIN is not set +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_DMI=y +# CONFIG_GART_IOMMU is not set +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS=8 +CONFIG_SCHED_SMT=y +# CONFIG_SCHED_MC is not set +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_AMD=y +CONFIG_X86_MCE_THRESHOLD=y +# CONFIG_X86_MCE_INJECT is not set +CONFIG_X86_THERMAL_VECTOR=y + +# +# Performance monitoring +# +CONFIG_PERF_EVENTS_INTEL_UNCORE=y +CONFIG_PERF_EVENTS_INTEL_RAPL=y +CONFIG_PERF_EVENTS_INTEL_CSTATE=y +# CONFIG_PERF_EVENTS_AMD_POWER is not set +# end of Performance monitoring + +CONFIG_X86_16BIT=y +CONFIG_X86_ESPFIX64=y +# CONFIG_X86_VSYSCALL_EMULATION is not set +CONFIG_X86_IOPL_IOPERM=y +# CONFIG_I8K is not set +CONFIG_MICROCODE=y +CONFIG_MICROCODE_INTEL=y +CONFIG_MICROCODE_AMD=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_X86_MSR=y +CONFIG_X86_CPUID=y +# CONFIG_X86_5LEVEL is not set +CONFIG_X86_DIRECT_GBPAGES=y +# CONFIG_X86_CPA_STATISTICS is not set +# CONFIG_AMD_MEM_ENCRYPT is not set +# CONFIG_NUMA is not set +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +# CONFIG_X86_PMEM_LEGACY is not set +CONFIG_X86_CHECK_BIOS_CORRUPTION=y +CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y +CONFIG_X86_RESERVE_LOW=64 +CONFIG_MTRR=y +CONFIG_MTRR_SANITIZER=y +CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1 +CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 +CONFIG_X86_PAT=y +CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_RANDOM=y +CONFIG_X86_SMAP=y +CONFIG_X86_UMIP=y +CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y +CONFIG_X86_INTEL_TSX_MODE_OFF=y +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +# CONFIG_EFI is not set +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 +CONFIG_SCHED_HRTICK=y +# CONFIG_KEXEC is not set +# CONFIG_KEXEC_FILE is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_PHYSICAL_START=0x1000000 +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa +CONFIG_HOTPLUG_CPU=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +# CONFIG_COMPAT_VDSO is not set +CONFIG_LEGACY_VSYSCALL_EMULATE=y +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +# CONFIG_LEGACY_VSYSCALL_NONE is not set +# CONFIG_CMDLINE_BOOL is not set +CONFIG_MODIFY_LDT_SYSCALL=y +CONFIG_HAVE_LIVEPATCH=y +# end of Processor type and features + +CONFIG_ARCH_HAS_ADD_PAGES=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y + +# +# Power management and ACPI options +# +CONFIG_ARCH_HIBERNATION_HEADER=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_HIBERNATION_SNAPSHOT_DEV=y +CONFIG_PM_STD_PARTITION="" +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_DPM_WATCHDOG is not set +CONFIG_PM_TRACE=y +CONFIG_PM_TRACE_RTC=y +CONFIG_PM_CLK=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +# CONFIG_ENERGY_MODEL is not set +CONFIG_ARCH_SUPPORTS_ACPI=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_SPCR_TABLE is not set +CONFIG_ACPI_LPIT=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +CONFIG_ACPI_EC_DEBUGFS=y +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_VIDEO=y +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_TAD is not set +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_CPU_FREQ_PSS=y +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_IPMI=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_PROCESSOR_AGGREGATOR=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_CUSTOM_DSDT_FILE="" +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_PCI_SLOT=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +CONFIG_ACPI_SBS=y +CONFIG_ACPI_HED=y +# CONFIG_ACPI_CUSTOM_METHOD is not set +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +# CONFIG_ACPI_NFIT is not set +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +CONFIG_ACPI_APEI=y +CONFIG_ACPI_APEI_GHES=y +CONFIG_ACPI_APEI_PCIEAER=y +CONFIG_ACPI_APEI_MEMORY_FAILURE=y +CONFIG_ACPI_APEI_EINJ=y +# CONFIG_ACPI_APEI_ERST_DEBUG is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_CONFIGFS is not set +# CONFIG_PMIC_OPREGION is not set +CONFIG_X86_PM_TIMER=y +CONFIG_SFI=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_X86_INTEL_PSTATE=y +CONFIG_X86_PCC_CPUFREQ=y +CONFIG_X86_ACPI_CPUFREQ=y +CONFIG_X86_ACPI_CPUFREQ_CPB=y +# CONFIG_X86_POWERNOW_K8 is not set +# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_P4_CLOCKMOD is not set + +# +# shared options +# +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set +CONFIG_HALTPOLL_CPUIDLE=y +# end of CPU Idle + +CONFIG_INTEL_IDLE=y +# end of Power management and ACPI options + +# +# Bus options (PCI etc.) +# +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_MMCONF_FAM10H=y +# CONFIG_PCI_CNB20LE_QUIRK is not set +# CONFIG_ISA_BUS is not set +CONFIG_ISA_DMA_API=y +CONFIG_AMD_NB=y +# CONFIG_X86_SYSFB is not set +# end of Bus options (PCI etc.) + +# +# Binary Emulations +# +CONFIG_IA32_EMULATION=y +CONFIG_X86_X32=y +CONFIG_COMPAT_32=y +CONFIG_COMPAT=y +CONFIG_COMPAT_FOR_U64_ALIGNMENT=y +CONFIG_SYSVIPC_COMPAT=y +# end of Binary Emulations + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_DMIID=y +CONFIG_DMI_SYSFS=y +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_GOOGLE_FIRMWARE=y +# CONFIG_GOOGLE_SMI is not set +CONFIG_GOOGLE_COREBOOT_TABLE=y +CONFIG_GOOGLE_MEMCONSOLE=y +# CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY is not set +CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y +CONFIG_GOOGLE_VPD=y +CONFIG_UEFI_CPER=y +CONFIG_UEFI_CPER_X86=y + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +CONFIG_HAVE_KVM=y +CONFIG_VIRTUALIZATION=y +# CONFIG_KVM is not set +CONFIG_AS_AVX512=y +CONFIG_AS_SHA1_NI=y +CONFIG_AS_SHA256_NI=y +CONFIG_AS_TPAUSE=y + +# +# General architecture-dependent options +# +CONFIG_CRASH_CORE=y +CONFIG_HOTPLUG_SMT=y +CONFIG_GENERIC_ENTRY=y +CONFIG_OPROFILE=y +# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set +CONFIG_HAVE_OPROFILE=y +CONFIG_OPROFILE_NMI_TIMER=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_UPROBES=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 +CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y +CONFIG_HAVE_STACK_VALIDATION=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_STATIC_CALL=y +CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +# CONFIG_MODULES is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_INTEGRITY_T10=y +# CONFIG_BLK_DEV_ZONED is not set +CONFIG_BLK_DEV_THROTTLING=y +# CONFIG_BLK_DEV_THROTTLING_LOW is not set +CONFIG_BLK_CMDLINE_PARSER=y +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +CONFIG_ACORN_PARTITION_EESOX=y +CONFIG_ACORN_PARTITION_ICS=y +CONFIG_ACORN_PARTITION_ADFS=y +CONFIG_ACORN_PARTITION_POWERTEC=y +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_AIX_PARTITION=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y +CONFIG_SYSV68_PARTITION=y +CONFIG_CMDLINE_PARTITION=y +# end of Partition Types + +CONFIG_BLOCK_COMPAT=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_BINFMT_MISC=y +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_FAST_GUP=y +CONFIG_MEMORY_ISOLATION=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +CONFIG_MMU_NOTIFIER=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +CONFIG_MEMORY_FAILURE=y +CONFIG_HWPOISON_INJECT=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANTS_THP_SWAP=y +CONFIG_CLEANCACHE=y +CONFIG_FRONTSWAP=y +CONFIG_CMA=y +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_AREAS=7 +CONFIG_ZSWAP=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" +CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y +# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD is not set +# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC is not set +CONFIG_ZSWAP_ZPOOL_DEFAULT="zbud" +# CONFIG_ZSWAP_DEFAULT_ON is not set +CONFIG_ZPOOL=y +CONFIG_ZBUD=y +# CONFIG_Z3FOLD is not set +CONFIG_ZSMALLOC=y +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_VMAP_PFN=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_HAS_PKEYS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_BENCHMARK is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +# end of Memory Management options + +CONFIG_NET=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_NET_INGRESS=y +CONFIG_SKB_EXTENSIONS=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_AH=y +CONFIG_XFRM_ESP=y +CONFIG_XFRM_IPCOMP=y +# CONFIG_NET_KEY is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_FIB_TRIE_STATS=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +CONFIG_NET_IPIP=y +CONFIG_NET_IPGRE_DEMUX=y +CONFIG_NET_IP_TUNNEL=y +CONFIG_NET_IPGRE=y +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE_COMMON=y +CONFIG_IP_MROUTE=y +# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=y +CONFIG_NET_UDP_TUNNEL=y +CONFIG_NET_FOU=y +CONFIG_NET_FOU_IP_TUNNELS=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +# CONFIG_INET_ESP_OFFLOAD is not set +# CONFIG_INET_ESPINTCP is not set +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_TUNNEL=y +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +CONFIG_INET_UDP_DIAG=y +# CONFIG_INET_RAW_DIAG is not set +# CONFIG_INET_DIAG_DESTROY is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=y +CONFIG_TCP_CONG_CUBIC=y +CONFIG_TCP_CONG_WESTWOOD=y +CONFIG_TCP_CONG_HTCP=y +# CONFIG_TCP_CONG_HSTCP is not set +# CONFIG_TCP_CONG_HYBLA is not set +# CONFIG_TCP_CONG_VEGAS is not set +# CONFIG_TCP_CONG_NV is not set +# CONFIG_TCP_CONG_SCALABLE is not set +# CONFIG_TCP_CONG_LP is not set +# CONFIG_TCP_CONG_VENO is not set +# CONFIG_TCP_CONG_YEAH is not set +# CONFIG_TCP_CONG_ILLINOIS is not set +# CONFIG_TCP_CONG_DCTCP is not set +# CONFIG_TCP_CONG_CDG is not set +# CONFIG_TCP_CONG_BBR is not set +# CONFIG_DEFAULT_BIC is not set +CONFIG_DEFAULT_CUBIC=y +# CONFIG_DEFAULT_HTCP is not set +# CONFIG_DEFAULT_WESTWOOD is not set +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set +# CONFIG_MPTCP is not set +CONFIG_NETWORK_SECMARK=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +# CONFIG_NF_CONNTRACK is not set +# CONFIG_NF_LOG_NETDEV is not set +# CONFIG_NF_TABLES is not set +# CONFIG_NETFILTER_XTABLES is not set +# end of Core Netfilter Configuration + +# CONFIG_IP_SET is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_TPROXY_IPV4 is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_IPV4 is not set +# CONFIG_NF_REJECT_IPV4 is not set +# CONFIG_IP_NF_IPTABLES is not set +# CONFIG_IP_NF_ARPTABLES is not set +# end of IP: Netfilter Configuration + +# CONFIG_BPFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +CONFIG_HAVE_NET_DSA=y +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +# CONFIG_DNS_RESOLVER is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +# CONFIG_CGROUP_NET_PRIO is not set +# CONFIG_CGROUP_NET_CLASSID is not set +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_SPY=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=y +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +CONFIG_CFG80211_WEXT_EXPORT=y +CONFIG_LIB80211=y +CONFIG_LIB80211_CRYPT_WEP=y +CONFIG_LIB80211_CRYPT_CCMP=y +CONFIG_LIB80211_CRYPT_TKIP=y +# CONFIG_LIB80211_DEBUG is not set +CONFIG_MAC80211=y +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +CONFIG_MAC80211_DEBUGFS=y +CONFIG_MAC80211_MESSAGE_TRACING=y +CONFIG_MAC80211_DEBUG_MENU=y +# CONFIG_MAC80211_NOINLINE is not set +CONFIG_MAC80211_VERBOSE_DEBUG=y +# CONFIG_MAC80211_MLME_DEBUG is not set +CONFIG_MAC80211_STA_DEBUG=y +CONFIG_MAC80211_HT_DEBUG=y +CONFIG_MAC80211_OCB_DEBUG=y +CONFIG_MAC80211_IBSS_DEBUG=y +CONFIG_MAC80211_PS_DEBUG=y +CONFIG_MAC80211_TDLS_DEBUG=y +# CONFIG_MAC80211_DEBUG_COUNTERS is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_WIMAX=y +CONFIG_WIMAX_DEBUG_LEVEL=8 +CONFIG_RFKILL=y +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=y +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +# CONFIG_FAILOVER is not set +CONFIG_ETHTOOL_NETLINK=y +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# +CONFIG_HAVE_EISA=y +# CONFIG_EISA is not set +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCIEPORTBUS=y +# CONFIG_HOTPLUG_PCI_PCIE is not set +CONFIG_PCIEAER=y +# CONFIG_PCIEAER_INJECT is not set +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +CONFIG_PCIE_PME=y +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_PTM is not set +# CONFIG_PCIE_BW is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +CONFIG_PCI_REALLOC_ENABLE_AUTO=y +CONFIG_PCI_STUB=y +# CONFIG_PCI_PF_STUB is not set +CONFIG_PCI_ATS=y +CONFIG_PCI_LOCKLESS_CONFIG=y +CONFIG_PCI_IOV=y +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +CONFIG_PCI_LABEL=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y +CONFIG_HOTPLUG_PCI_ACPI_IBM=y +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=y +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=y +CONFIG_HOTPLUG_PCI_SHPC=y + +# +# PCI controller drivers +# +# CONFIG_VMD is not set + +# +# DesignWare PCI Core Support +# +# CONFIG_PCIE_DW_PLAT_HOST is not set +# CONFIG_PCI_MESON is not set +# end of DesignWare PCI Core Support + +# +# Mobiveil PCIe Core Support +# +# end of Mobiveil PCIe Core Support + +# +# Cadence PCIe controllers support +# +# end of Cadence PCIe controllers support +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +CONFIG_PCCARD=y +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=y +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=y +CONFIG_I82092=y +CONFIG_PCCARD_NONSTATIC=y +CONFIG_RAPIDIO=y +CONFIG_RAPIDIO_TSI721=y +CONFIG_RAPIDIO_DISC_TIMEOUT=30 +# CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not set +CONFIG_RAPIDIO_DMA_ENGINE=y +# CONFIG_RAPIDIO_DEBUG is not set +CONFIG_RAPIDIO_ENUM_BASIC=y +# CONFIG_RAPIDIO_CHMAN is not set +# CONFIG_RAPIDIO_MPORT_CDEV is not set + +# +# RapidIO Switch drivers +# +CONFIG_RAPIDIO_TSI57X=y +CONFIG_RAPIDIO_CPS_XX=y +CONFIG_RAPIDIO_TSI568=y +CONFIG_RAPIDIO_CPS_GEN2=y +# CONFIG_RAPIDIO_RXS_GEN3 is not set +# end of RapidIO Switch drivers + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_STANDALONE is not set +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_EXTRA_FIRMWARE="iwlwifi-7265D-29.ucode iwlwifi-7265-17.ucode" +CONFIG_EXTRA_FIRMWARE_DIR="../linux-firmware" +CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set +# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_CACHE=y +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MHI_BUS is not set +# end of Bus devices + +# CONFIG_CONNECTOR is not set +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +CONFIG_BLK_DEV_NULL_BLK=y +# CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION is not set +CONFIG_BLK_DEV_FD=y +CONFIG_CDROM=y +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y +CONFIG_ZRAM=y +# CONFIG_ZRAM_WRITEBACK is not set +# CONFIG_ZRAM_MEMORY_TRACKING is not set +CONFIG_BLK_DEV_UMEM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_BLK_DEV_CRYPTOLOOP=y +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_SKD=y +# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_CDROM_PKTCDVD=y +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_RSXX is not set + +# +# NVME Support +# +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_IBM_ASM is not set +# CONFIG_PHANTOM is not set +CONFIG_TIFM_CORE=y +# CONFIG_TIFM_7XX1 is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +CONFIG_SRAM=y +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_PVPANIC is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +CONFIG_EEPROM_93CX6=y +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +CONFIG_CB710_CORE=y +# CONFIG_CB710_DEBUG is not set +CONFIG_CB710_DEBUG_ASSUMPTIONS=y + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set +# CONFIG_INTEL_MEI_HDCP is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_HABANA_AI is not set +# CONFIG_UACCE is not set +# end of Misc devices + +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=y +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +CONFIG_SCSI_SAS_ATTRS=y +CONFIG_SCSI_SAS_LIBSAS=y +# CONFIG_SCSI_SAS_ATA is not set +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SRP_ATTRS=y +# end of SCSI Transports + +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_ATA=y +CONFIG_SATA_HOST=y +CONFIG_PATA_TIMINGS=y +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y +CONFIG_ATA_ACPI=y +# CONFIG_SATA_ZPODD is not set +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=y +CONFIG_SATA_MOBILE_LPM_POLICY=0 +CONFIG_SATA_AHCI_PLATFORM=y +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_SX4 is not set +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_ATA_PIIX is not set +# CONFIG_SATA_DWC is not set +# CONFIG_SATA_MV is not set +# CONFIG_SATA_NV is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SIL is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set + +# +# PATA SFF controllers with BMDMA +# +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# PIO-only SFF controllers +# +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PLATFORM is not set +# CONFIG_PATA_RZ1000 is not set + +# +# Generic fallback / legacy drivers +# +# CONFIG_PATA_ACPI is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_LEGACY is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +# CONFIG_MD_AUTODETECT is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID10 is not set +# CONFIG_MD_RAID456 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_MD_FAULTY is not set +CONFIG_BCACHE=y +# CONFIG_BCACHE_DEBUG is not set +# CONFIG_BCACHE_CLOSURES_DEBUG is not set +# CONFIG_BCACHE_ASYNC_REGISTRATION is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=y +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=y +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=y +CONFIG_DM_CACHE=y +CONFIG_DM_CACHE_SMQ=y +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +CONFIG_DM_ERA=y +# CONFIG_DM_CLONE is not set +CONFIG_DM_MIRROR=y +# CONFIG_DM_LOG_USERSPACE is not set +# CONFIG_DM_RAID is not set +CONFIG_DM_ZERO=y +CONFIG_DM_MULTIPATH=y +CONFIG_DM_MULTIPATH_QL=y +CONFIG_DM_MULTIPATH_ST=y +# CONFIG_DM_MULTIPATH_HST is not set +CONFIG_DM_DELAY=y +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +CONFIG_DM_UEVENT=y +CONFIG_DM_FLAKEY=y +CONFIG_DM_VERITY=y +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +# CONFIG_DM_VERITY_FEC is not set +CONFIG_DM_SWITCH=y +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +CONFIG_TARGET_CORE=y +CONFIG_TCM_IBLOCK=y +CONFIG_TCM_FILEIO=y +CONFIG_TCM_PSCSI=y +# CONFIG_TCM_USER2 is not set +CONFIG_LOOPBACK_TARGET=y +# CONFIG_ISCSI_TARGET is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +# CONFIG_MACINTOSH_DRIVERS is not set +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_WIREGUARD is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_RIONET is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set +# CONFIG_ARCNET is not set + +# +# Distributed Switch Architecture drivers +# +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +CONFIG_NET_VENDOR_3COM=y +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_VORTEX is not set +# CONFIG_TYPHOON is not set +CONFIG_NET_VENDOR_ADAPTEC=y +# CONFIG_ADAPTEC_STARFIRE is not set +CONFIG_NET_VENDOR_AGERE=y +# CONFIG_ET131X is not set +CONFIG_NET_VENDOR_ALACRITECH=y +# CONFIG_SLICOSS is not set +CONFIG_NET_VENDOR_ALTEON=y +# CONFIG_ACENIC is not set +# CONFIG_ALTERA_TSE is not set +CONFIG_NET_VENDOR_AMAZON=y +# CONFIG_ENA_ETHERNET is not set +CONFIG_NET_VENDOR_AMD=y +# CONFIG_AMD8111_ETH is not set +# CONFIG_PCNET32 is not set +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_AMD_XGBE is not set +CONFIG_NET_VENDOR_AQUANTIA=y +# CONFIG_AQTION is not set +CONFIG_NET_VENDOR_ARC=y +CONFIG_NET_VENDOR_ATHEROS=y +# CONFIG_ATL2 is not set +# CONFIG_ATL1 is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set +# CONFIG_ALX is not set +# CONFIG_NET_VENDOR_AURORA is not set +CONFIG_NET_VENDOR_BROADCOM=y +# CONFIG_B44 is not set +# CONFIG_BCMGENET is not set +# CONFIG_BNX2 is not set +# CONFIG_CNIC is not set +CONFIG_TIGON3=y +# CONFIG_TIGON3_HWMON is not set +# CONFIG_BNX2X is not set +# CONFIG_SYSTEMPORT is not set +# CONFIG_BNXT is not set +CONFIG_NET_VENDOR_BROCADE=y +# CONFIG_BNA is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +CONFIG_NET_VENDOR_CAVIUM=y +# CONFIG_THUNDER_NIC_PF is not set +# CONFIG_THUNDER_NIC_VF is not set +# CONFIG_THUNDER_NIC_BGX is not set +# CONFIG_THUNDER_NIC_RGX is not set +# CONFIG_LIQUIDIO is not set +# CONFIG_LIQUIDIO_VF is not set +CONFIG_NET_VENDOR_CHELSIO=y +# CONFIG_CHELSIO_T1 is not set +# CONFIG_CHELSIO_T3 is not set +# CONFIG_CHELSIO_T4 is not set +# CONFIG_CHELSIO_T4VF is not set +CONFIG_NET_VENDOR_CISCO=y +# CONFIG_ENIC is not set +CONFIG_NET_VENDOR_CORTINA=y +# CONFIG_CX_ECAT is not set +# CONFIG_DNET is not set +CONFIG_NET_VENDOR_DEC=y +# CONFIG_NET_TULIP is not set +CONFIG_NET_VENDOR_DLINK=y +# CONFIG_DL2K is not set +# CONFIG_SUNDANCE is not set +CONFIG_NET_VENDOR_EMULEX=y +# CONFIG_BE2NET is not set +CONFIG_NET_VENDOR_EZCHIP=y +CONFIG_NET_VENDOR_FUJITSU=y +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_NET_VENDOR_GOOGLE=y +# CONFIG_GVE is not set +CONFIG_NET_VENDOR_HUAWEI=y +# CONFIG_HINIC is not set +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_INTEL=y +# CONFIG_E100 is not set +# CONFIG_E1000 is not set +# CONFIG_E1000E is not set +# CONFIG_IGB is not set +# CONFIG_IGBVF is not set +# CONFIG_IXGB is not set +# CONFIG_IXGBE is not set +# CONFIG_IXGBEVF is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_ICE is not set +# CONFIG_FM10K is not set +# CONFIG_IGC is not set +# CONFIG_JME is not set +CONFIG_NET_VENDOR_MARVELL=y +# CONFIG_MVMDIO is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +CONFIG_NET_VENDOR_MELLANOX=y +# CONFIG_MLX4_EN is not set +# CONFIG_MLX5_CORE is not set +# CONFIG_MLXSW_CORE is not set +# CONFIG_MLXFW is not set +CONFIG_NET_VENDOR_MICREL=y +# CONFIG_KS8842 is not set +# CONFIG_KS8851 is not set +# CONFIG_KS8851_MLL is not set +# CONFIG_KSZ884X_PCI is not set +CONFIG_NET_VENDOR_MICROCHIP=y +# CONFIG_ENC28J60 is not set +# CONFIG_ENCX24J600 is not set +# CONFIG_LAN743X is not set +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MYRI=y +# CONFIG_MYRI10GE is not set +# CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NATSEMI=y +# CONFIG_NATSEMI is not set +# CONFIG_NS83820 is not set +CONFIG_NET_VENDOR_NETERION=y +# CONFIG_S2IO is not set +# CONFIG_VXGE is not set +CONFIG_NET_VENDOR_NETRONOME=y +# CONFIG_NFP is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +CONFIG_NET_VENDOR_8390=y +# CONFIG_PCMCIA_AXNET is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_PCMCIA_PCNET is not set +CONFIG_NET_VENDOR_NVIDIA=y +# CONFIG_FORCEDETH is not set +CONFIG_NET_VENDOR_OKI=y +# CONFIG_ETHOC is not set +CONFIG_NET_VENDOR_PACKET_ENGINES=y +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_IONIC is not set +CONFIG_NET_VENDOR_QLOGIC=y +# CONFIG_QLA3XXX is not set +# CONFIG_QLCNIC is not set +# CONFIG_NETXEN_NIC is not set +# CONFIG_QED is not set +CONFIG_NET_VENDOR_QUALCOMM=y +# CONFIG_QCOM_EMAC is not set +# CONFIG_RMNET is not set +CONFIG_NET_VENDOR_RDC=y +# CONFIG_R6040 is not set +CONFIG_NET_VENDOR_REALTEK=y +CONFIG_8139CP=y +CONFIG_8139TOO=y +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_R8169=y +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_NET_VENDOR_SAMSUNG=y +# CONFIG_SXGBE_ETH is not set +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SOLARFLARE=y +# CONFIG_SFC is not set +# CONFIG_SFC_FALCON is not set +CONFIG_NET_VENDOR_SILAN=y +# CONFIG_SC92031 is not set +CONFIG_NET_VENDOR_SIS=y +# CONFIG_SIS900 is not set +# CONFIG_SIS190 is not set +CONFIG_NET_VENDOR_SMSC=y +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SMSC911X is not set +# CONFIG_SMSC9420 is not set +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +# CONFIG_STMMAC_ETH is not set +CONFIG_NET_VENDOR_SUN=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NIU is not set +CONFIG_NET_VENDOR_SYNOPSYS=y +# CONFIG_DWC_XLGMAC is not set +CONFIG_NET_VENDOR_TEHUTI=y +# CONFIG_TEHUTI is not set +CONFIG_NET_VENDOR_TI=y +# CONFIG_TI_CPSW_PHY_SEL is not set +# CONFIG_TLAN is not set +CONFIG_NET_VENDOR_VIA=y +# CONFIG_VIA_RHINE is not set +# CONFIG_VIA_VELOCITY is not set +CONFIG_NET_VENDOR_WIZNET=y +# CONFIG_WIZNET_W5100 is not set +# CONFIG_WIZNET_W5300 is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_AXI_EMAC is not set +# CONFIG_XILINX_LL_TEMAC is not set +CONFIG_NET_VENDOR_XIRCOM=y +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_NET_SB1000 is not set +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +CONFIG_LED_TRIGGER_PHY=y +CONFIG_FIXED_PHY=y + +# +# MII PHY device drivers +# +# CONFIG_AMD_PHY is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +# CONFIG_AX88796B_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_QSEMI_PHY is not set +CONFIG_REALTEK_PHY=y +# CONFIG_RENESAS_PHY is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVRES=y +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_THUNDER is not set + +# +# MDIO Multiplexers +# + +# +# PCS device drivers +# +# CONFIG_PCS_XPCS is not set +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=y +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +CONFIG_USB_RTL8152=y +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=y +CONFIG_USB_NET_AX8817X=y +CONFIG_USB_NET_AX88179_178A=y +CONFIG_USB_NET_CDCETHER=y +# CONFIG_USB_NET_CDC_EEM is not set +CONFIG_USB_NET_CDC_NCM=y +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +CONFIG_USB_NET_NET1080=y +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET_ENABLE=y +CONFIG_USB_NET_CDC_SUBSET=y +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +CONFIG_USB_NET_ZAURUS=y +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_HSO is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_WLAN=y +# CONFIG_WIRELESS_WDS is not set +CONFIG_WLAN_VENDOR_ADMTEK=y +# CONFIG_ADM8211 is not set +CONFIG_ATH_COMMON=y +CONFIG_WLAN_VENDOR_ATH=y +CONFIG_ATH_DEBUG=y +CONFIG_ATH_TRACEPOINTS=y +# CONFIG_ATH5K is not set +# CONFIG_ATH5K_PCI is not set +CONFIG_ATH9K_HW=y +CONFIG_ATH9K_COMMON=y +CONFIG_ATH9K_COMMON_DEBUG=y +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=y +CONFIG_ATH9K_PCI=y +# CONFIG_ATH9K_AHB is not set +CONFIG_ATH9K_DEBUGFS=y +CONFIG_ATH9K_STATION_STATISTICS=y +# CONFIG_ATH9K_DYNACK is not set +# CONFIG_ATH9K_WOW is not set +CONFIG_ATH9K_RFKILL=y +# CONFIG_ATH9K_CHANNEL_CONTEXT is not set +CONFIG_ATH9K_PCOEM=y +# CONFIG_ATH9K_PCI_NO_EEPROM is not set +CONFIG_ATH9K_HTC=y +CONFIG_ATH9K_HTC_DEBUGFS=y +# CONFIG_ATH9K_HWRNG is not set +# CONFIG_ATH9K_COMMON_SPECTRAL is not set +# CONFIG_CARL9170 is not set +# CONFIG_ATH6KL is not set +# CONFIG_AR5523 is not set +# CONFIG_WIL6210 is not set +# CONFIG_ATH10K is not set +# CONFIG_WCN36XX is not set +# CONFIG_ATH11K is not set +CONFIG_WLAN_VENDOR_ATMEL=y +# CONFIG_ATMEL is not set +# CONFIG_AT76C50X_USB is not set +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +# CONFIG_BRCMSMAC is not set +# CONFIG_BRCMFMAC is not set +CONFIG_WLAN_VENDOR_CISCO=y +# CONFIG_AIRO is not set +# CONFIG_AIRO_CS is not set +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_IPW2100=y +# CONFIG_IPW2100_MONITOR is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=y +# CONFIG_IPW2200_MONITOR is not set +# CONFIG_IPW2200_QOS is not set +# CONFIG_IPW2200_DEBUG is not set +CONFIG_LIBIPW=y +# CONFIG_LIBIPW_DEBUG is not set +CONFIG_IWLEGACY=y +CONFIG_IWL4965=y +CONFIG_IWL3945=y + +# +# iwl3945 / iwl4965 Debugging Options +# +# CONFIG_IWLEGACY_DEBUG is not set +# CONFIG_IWLEGACY_DEBUGFS is not set +# end of iwl3945 / iwl4965 Debugging Options + +CONFIG_IWLWIFI=y +CONFIG_IWLWIFI_LEDS=y +CONFIG_IWLDVM=y +CONFIG_IWLMVM=y +# CONFIG_IWLWIFI_BCAST_FILTERING is not set + +# +# Debugging Options +# +# CONFIG_IWLWIFI_DEBUG is not set +# CONFIG_IWLWIFI_DEBUGFS is not set +CONFIG_IWLWIFI_DEVICE_TRACING=y +# end of Debugging Options + +CONFIG_WLAN_VENDOR_INTERSIL=y +# CONFIG_HOSTAP is not set +# CONFIG_HERMES is not set +# CONFIG_P54_COMMON is not set +# CONFIG_PRISM54 is not set +CONFIG_WLAN_VENDOR_MARVELL=y +# CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set +# CONFIG_MWIFIEX is not set +# CONFIG_MWL8K is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +# CONFIG_MT7601U is not set +# CONFIG_MT76x0U is not set +# CONFIG_MT76x0E is not set +# CONFIG_MT76x2E is not set +# CONFIG_MT76x2U is not set +# CONFIG_MT7603E is not set +# CONFIG_MT7615E is not set +# CONFIG_MT7663U is not set +# CONFIG_MT7663S is not set +# CONFIG_MT7915E is not set +CONFIG_WLAN_VENDOR_MICROCHIP=y +# CONFIG_WILC1000_SDIO is not set +# CONFIG_WILC1000_SPI is not set +CONFIG_WLAN_VENDOR_RALINK=y +# CONFIG_RT2X00 is not set +CONFIG_WLAN_VENDOR_REALTEK=y +# CONFIG_RTL8180 is not set +# CONFIG_RTL8187 is not set +CONFIG_RTL_CARDS=y +# CONFIG_RTL8192CE is not set +# CONFIG_RTL8192SE is not set +# CONFIG_RTL8192DE is not set +# CONFIG_RTL8723AE is not set +# CONFIG_RTL8723BE is not set +# CONFIG_RTL8188EE is not set +# CONFIG_RTL8192EE is not set +# CONFIG_RTL8821AE is not set +# CONFIG_RTL8192CU is not set +# CONFIG_RTL8XXXU is not set +# CONFIG_RTW88 is not set +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +# CONFIG_USB_ZD1201 is not set +# CONFIG_ZD1211RW is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_QTNFMAC_PCIE is not set +# CONFIG_PCMCIA_RAYCS is not set +# CONFIG_PCMCIA_WL3501 is not set +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set +# CONFIG_VIRT_WIFI is not set + +# +# WiMAX Wireless Broadband devices +# +# CONFIG_WIMAX_I2400M_USB is not set +# end of WiMAX Wireless Broadband devices + +# CONFIG_WAN is not set +# CONFIG_VMXNET3 is not set +# CONFIG_FUJITSU_ES is not set +# CONFIG_NETDEVSIM is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set +# CONFIG_NVM is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=y +CONFIG_INPUT_POLLDEV=y +# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_INPUT_MATRIXKMAP=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ADC=y +CONFIG_KEYBOARD_ADP5588=y +CONFIG_KEYBOARD_ADP5589=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_QT1050 is not set +CONFIG_KEYBOARD_QT1070=y +CONFIG_KEYBOARD_QT2160=y +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +CONFIG_KEYBOARD_LKKBD=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_GPIO_POLLED=y +CONFIG_KEYBOARD_TCA6416=y +CONFIG_KEYBOARD_TCA8418=y +CONFIG_KEYBOARD_MATRIX=y +CONFIG_KEYBOARD_LM8323=y +CONFIG_KEYBOARD_LM8333=y +CONFIG_KEYBOARD_MAX7359=y +CONFIG_KEYBOARD_MCS=y +CONFIG_KEYBOARD_MPR121=y +CONFIG_KEYBOARD_NEWTON=y +CONFIG_KEYBOARD_OPENCORES=y +CONFIG_KEYBOARD_SAMSUNG=y +CONFIG_KEYBOARD_STOWAWAY=y +CONFIG_KEYBOARD_SUNKBD=y +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +CONFIG_KEYBOARD_XTKBD=y +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_BYD=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +CONFIG_MOUSE_PS2_CYPRESS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_MOUSE_PS2_ELANTECH_SMBUS=y +CONFIG_MOUSE_PS2_SENTELIC=y +CONFIG_MOUSE_PS2_TOUCHKIT=y +CONFIG_MOUSE_PS2_FOCALTECH=y +CONFIG_MOUSE_PS2_VMMOUSE=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_SERIAL=y +CONFIG_MOUSE_APPLETOUCH=y +CONFIG_MOUSE_BCM5974=y +CONFIG_MOUSE_CYAPA=y +CONFIG_MOUSE_ELAN_I2C=y +CONFIG_MOUSE_ELAN_I2C_I2C=y +CONFIG_MOUSE_ELAN_I2C_SMBUS=y +CONFIG_MOUSE_VSXXXAA=y +CONFIG_MOUSE_GPIO=y +CONFIG_MOUSE_SYNAPTICS_I2C=y +CONFIG_MOUSE_SYNAPTICS_USB=y +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=y +CONFIG_JOYSTICK_A3D=y +# CONFIG_JOYSTICK_ADC is not set +CONFIG_JOYSTICK_ADI=y +CONFIG_JOYSTICK_COBRA=y +CONFIG_JOYSTICK_GF2K=y +CONFIG_JOYSTICK_GRIP=y +CONFIG_JOYSTICK_GRIP_MP=y +CONFIG_JOYSTICK_GUILLEMOT=y +CONFIG_JOYSTICK_INTERACT=y +CONFIG_JOYSTICK_SIDEWINDER=y +CONFIG_JOYSTICK_TMDC=y +CONFIG_JOYSTICK_IFORCE=y +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=y +CONFIG_JOYSTICK_MAGELLAN=y +CONFIG_JOYSTICK_SPACEORB=y +CONFIG_JOYSTICK_SPACEBALL=y +CONFIG_JOYSTICK_STINGER=y +CONFIG_JOYSTICK_TWIDJOY=y +CONFIG_JOYSTICK_ZHENHUA=y +CONFIG_JOYSTICK_AS5011=y +CONFIG_JOYSTICK_JOYDUMP=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +# CONFIG_JOYSTICK_PXRC is not set +# CONFIG_JOYSTICK_FSIA6B is not set +CONFIG_INPUT_TABLET=y +CONFIG_TABLET_USB_ACECAD=y +CONFIG_TABLET_USB_AIPTEK=y +CONFIG_TABLET_USB_GTCO=y +CONFIG_TABLET_USB_HANWANG=y +CONFIG_TABLET_USB_KBTAB=y +# CONFIG_TABLET_USB_PEGASUS is not set +CONFIG_TABLET_SERIAL_WACOM4=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_PROPERTIES=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ADC is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +CONFIG_TOUCHSCREEN_ELAN=y +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_WM97XX is not set +CONFIG_TOUCHSCREEN_USB_COMPOSITE=y +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_TOUCHSCREEN_USB_IRTOUCH=y +CONFIG_TOUCHSCREEN_USB_IDEALTEK=y +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y +CONFIG_TOUCHSCREEN_USB_GOTOP=y +CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y +CONFIG_TOUCHSCREEN_USB_E2I=y +CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y +CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_PCSPKR is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_APANEL is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +# CONFIG_INPUT_ATLAS_BTNS is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_UINPUT=y +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +# CONFIG_INPUT_PWM_VIBRA is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set +# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_RMI4_CORE=y +# CONFIG_RMI4_I2C is not set +# CONFIG_RMI4_SPI is not set +# CONFIG_RMI4_SMB is not set +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=y +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +# CONFIG_RMI4_F34 is not set +# CONFIG_RMI4_F3A is not set +# CONFIG_RMI4_F55 is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_USERIO is not set +CONFIG_GAMEPORT=y +# CONFIG_GAMEPORT_NS558 is not set +# CONFIG_GAMEPORT_L4 is not set +# CONFIG_GAMEPORT_EMU10K1 is not set +# CONFIG_GAMEPORT_FM801 is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=0 +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_PNP=y +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_CS=y +CONFIG_SERIAL_8250_NR_UARTS=48 +CONFIG_SERIAL_8250_RUNTIME_UARTS=32 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_RSA=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_8250_LPSS=y +# CONFIG_SERIAL_8250_MID is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_KGDB_NMI=y +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_CONSOLE_POLL=y +CONFIG_SERIAL_JSM=y +# CONFIG_SERIAL_LANTIQ is not set +CONFIG_SERIAL_SCCNXP=y +CONFIG_SERIAL_SCCNXP_CONSOLE=y +CONFIG_SERIAL_SC16IS7XX_CORE=y +CONFIG_SERIAL_SC16IS7XX=y +CONFIG_SERIAL_SC16IS7XX_I2C=y +# CONFIG_SERIAL_SC16IS7XX_SPI is not set +CONFIG_SERIAL_ALTERA_JTAGUART=y +# CONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE is not set +CONFIG_SERIAL_ALTERA_UART=y +CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4 +CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200 +# CONFIG_SERIAL_ALTERA_UART_CONSOLE is not set +# CONFIG_SERIAL_IFX6X60 is not set +CONFIG_SERIAL_ARC=y +# CONFIG_SERIAL_ARC_CONSOLE is not set +CONFIG_SERIAL_ARC_NR_PORTS=1 +CONFIG_SERIAL_RP2=y +CONFIG_SERIAL_RP2_NR_UARTS=32 +CONFIG_SERIAL_FSL_LPUART=y +# CONFIG_SERIAL_FSL_LPUART_CONSOLE is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_ROCKETPORT=y +CONFIG_CYCLADES=y +# CONFIG_CYZ_INTR is not set +CONFIG_MOXA_INTELLIO=y +CONFIG_MOXA_SMARTIO=y +CONFIG_SYNCLINK=y +CONFIG_SYNCLINKMP=y +CONFIG_SYNCLINK_GT=y +CONFIG_ISI=y +CONFIG_N_HDLC=y +# CONFIG_N_GSM is not set +CONFIG_NOZOMI=y +# CONFIG_NULL_TTY is not set +CONFIG_TRACE_ROUTER=y +CONFIG_TRACE_SINK=y +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_TTY_PRINTK=y +CONFIG_TTY_PRINTK_LEVEL=6 +# CONFIG_VIRTIO_CONSOLE is not set +CONFIG_IPMI_HANDLER=y +CONFIG_IPMI_DMI_DECODE=y +CONFIG_IPMI_PLAT_DATA=y +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=y +CONFIG_IPMI_SI=y +CONFIG_IPMI_SSIF=y +CONFIG_IPMI_WATCHDOG=y +CONFIG_IPMI_POWEROFF=y +# CONFIG_IPMB_DEVICE_INTERFACE is not set +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_TIMERIOMEM=y +CONFIG_HW_RANDOM_INTEL=y +CONFIG_HW_RANDOM_AMD=y +# CONFIG_HW_RANDOM_BA431 is not set +CONFIG_HW_RANDOM_VIA=y +# CONFIG_HW_RANDOM_XIPHERA is not set +CONFIG_APPLICOM=y + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=y +CONFIG_CARDMAN_4000=y +CONFIG_CARDMAN_4040=y +# CONFIG_SCR24X is not set +# CONFIG_IPWIRELESS is not set +# end of PCMCIA character devices + +CONFIG_MWAVE=y +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set +CONFIG_NVRAM=y +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_DEVPORT=y +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +CONFIG_HPET_MMAP_DEFAULT=y +CONFIG_HANGCHECK_TIMER=y +CONFIG_TCG_TPM=y +CONFIG_HW_RANDOM_TPM=y +CONFIG_TCG_TIS_CORE=y +CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_SPI is not set +CONFIG_TCG_TIS_I2C_ATMEL=y +CONFIG_TCG_TIS_I2C_INFINEON=y +CONFIG_TCG_TIS_I2C_NUVOTON=y +CONFIG_TCG_NSC=y +CONFIG_TCG_ATMEL=y +CONFIG_TCG_INFINEON=y +# CONFIG_TCG_CRB is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TCG_TIS_ST33ZP24_SPI is not set +CONFIG_TELCLOCK=y +CONFIG_XILLYBUS=y +CONFIG_XILLYBUS_PCIE=y +# end of Character devices + +# CONFIG_RANDOM_TRUST_CPU is not set +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_ACPI_I2C_OPREGION=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX=y + +# +# Multiplexer I2C Chip support +# +CONFIG_I2C_MUX_GPIO=y +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=y +CONFIG_I2C_MUX_PCA954x=y +# CONFIG_I2C_MUX_REG is not set +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_SMBUS=y +CONFIG_I2C_ALGOBIT=y + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_I801=y +CONFIG_I2C_ISCH=y +CONFIG_I2C_ISMT=y +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# ACPI drivers +# +CONFIG_I2C_SCMI=y + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +CONFIG_I2C_DESIGNWARE_CORE=y +# CONFIG_I2C_DESIGNWARE_SLAVE is not set +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_DESIGNWARE_BAYTRAIL=y +CONFIG_I2C_DESIGNWARE_PCI=y +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_MLXCPLD is not set +# end of I2C Hardware Bus support + +CONFIG_I2C_SLAVE=y +CONFIG_I2C_SLAVE_EEPROM=y +# CONFIG_I2C_SLAVE_TESTUNIT is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_CADENCE is not set +CONFIG_SPI_DESIGNWARE=y +# CONFIG_SPI_DW_DMA is not set +CONFIG_SPI_DW_PCI=y +CONFIG_SPI_DW_MMIO=y +# CONFIG_SPI_NXP_FLEXSPI is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_LANTIQ_SSC is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PXA2XX is not set +# CONFIG_SPI_ROCKCHIP is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +# CONFIG_SPI_MUX is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +CONFIG_PPS_CLIENT_LDISC=y +CONFIG_PPS_CLIENT_GPIO=y + +# +# PPS generators support +# + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_PINMUX=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_AMD is not set +# CONFIG_PINCTRL_MCP23S08 is not set +CONFIG_PINCTRL_SX150X=y +CONFIG_PINCTRL_BAYTRAIL=y +CONFIG_PINCTRL_CHERRYVIEW=y +# CONFIG_PINCTRL_LYNXPOINT is not set +CONFIG_PINCTRL_INTEL=y +# CONFIG_PINCTRL_BROXTON is not set +# CONFIG_PINCTRL_CANNONLAKE is not set +# CONFIG_PINCTRL_CEDARFORK is not set +# CONFIG_PINCTRL_DENVERTON is not set +# CONFIG_PINCTRL_EMMITSBURG is not set +# CONFIG_PINCTRL_GEMINILAKE is not set +# CONFIG_PINCTRL_ICELAKE is not set +# CONFIG_PINCTRL_JASPERLAKE is not set +# CONFIG_PINCTRL_LEWISBURG is not set +# CONFIG_PINCTRL_SUNRISEPOINT is not set +# CONFIG_PINCTRL_TIGERLAKE is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_GPIO_ACPI=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y +CONFIG_GPIO_GENERIC=y +CONFIG_GPIO_MAX730X=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_AMDPT is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_EXAR is not set +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_GPIO_ICH=y +# CONFIG_GPIO_MB86S7X is not set +CONFIG_GPIO_VX855=y +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# Port-mapped I/O GPIO drivers +# +CONFIG_GPIO_F7188X=y +# CONFIG_GPIO_IT87 is not set +CONFIG_GPIO_SCH=y +CONFIG_GPIO_SCH311X=y +# CONFIG_GPIO_WINBOND is not set +# CONFIG_GPIO_WS16C48 is not set +# end of Port-mapped I/O GPIO drivers + +# +# I2C GPIO expanders +# +CONFIG_GPIO_ADP5588=y +# CONFIG_GPIO_ADP5588_IRQ is not set +CONFIG_GPIO_MAX7300=y +CONFIG_GPIO_MAX732X=y +# CONFIG_GPIO_MAX732X_IRQ is not set +CONFIG_GPIO_PCA953X=y +# CONFIG_GPIO_PCA953X_IRQ is not set +# CONFIG_GPIO_PCA9570 is not set +CONFIG_GPIO_PCF857X=y +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +CONFIG_GPIO_AMD8111=y +# CONFIG_GPIO_BT8XX is not set +CONFIG_GPIO_ML_IOH=y +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +CONFIG_GPIO_RDC321X=y +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_MOCKUP is not set +CONFIG_W1=y + +# +# 1-wire Bus Masters +# +# CONFIG_W1_MASTER_MATROX is not set +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_DS2482 is not set +# CONFIG_W1_MASTER_DS1WM is not set +# CONFIG_W1_MASTER_GPIO is not set +# CONFIG_W1_MASTER_SGI is not set +# end of 1-wire Bus Masters + +# +# 1-wire Slaves +# +# CONFIG_W1_SLAVE_THERM is not set +# CONFIG_W1_SLAVE_SMEM is not set +# CONFIG_W1_SLAVE_DS2405 is not set +# CONFIG_W1_SLAVE_DS2408 is not set +# CONFIG_W1_SLAVE_DS2413 is not set +# CONFIG_W1_SLAVE_DS2406 is not set +# CONFIG_W1_SLAVE_DS2423 is not set +# CONFIG_W1_SLAVE_DS2805 is not set +# CONFIG_W1_SLAVE_DS2430 is not set +# CONFIG_W1_SLAVE_DS2431 is not set +# CONFIG_W1_SLAVE_DS2433 is not set +# CONFIG_W1_SLAVE_DS2438 is not set +# CONFIG_W1_SLAVE_DS250X is not set +CONFIG_W1_SLAVE_DS2780=y +CONFIG_W1_SLAVE_DS2781=y +# CONFIG_W1_SLAVE_DS28E04 is not set +# CONFIG_W1_SLAVE_DS28E17 is not set +# end of 1-wire Slaves + +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_RESTART is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +CONFIG_PDA_POWER=y +CONFIG_GENERIC_ADC_BATTERY=y +CONFIG_TEST_POWER=y +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2760 is not set +CONFIG_BATTERY_DS2780=y +CONFIG_BATTERY_DS2781=y +CONFIG_BATTERY_DS2782=y +CONFIG_BATTERY_SBS=y +# CONFIG_CHARGER_SBS is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +CONFIG_BATTERY_MAX17040=y +CONFIG_BATTERY_MAX17042=y +# CONFIG_BATTERY_MAX1721X is not set +CONFIG_CHARGER_ISP1704=y +CONFIG_CHARGER_MAX8903=y +CONFIG_CHARGER_LP8727=y +CONFIG_CHARGER_GPIO=y +CONFIG_CHARGER_MANAGER=y +# CONFIG_CHARGER_LT3651 is not set +CONFIG_CHARGER_BQ2415X=y +CONFIG_CHARGER_BQ24190=y +# CONFIG_CHARGER_BQ24257 is not set +CONFIG_CHARGER_BQ24735=y +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +CONFIG_CHARGER_SMB347=y +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_BD99954 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_ABITUGURU3 is not set +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_K8TEMP is not set +# CONFIG_SENSORS_K10TEMP is not set +# CONFIG_SENSORS_FAM15H_POWER is not set +# CONFIG_SENSORS_AMD_ENERGY is not set +# CONFIG_SENSORS_APPLESMC is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ASPEED is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_DRIVETEMP is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +CONFIG_SENSORS_DELL_SMM=y +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FSCHMD is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_IBMAEM is not set +# CONFIG_SENSORS_IBMPEX is not set +# CONFIG_SENSORS_IIO_HWMON is not set +CONFIG_SENSORS_I5500=y +CONFIG_SENSORS_CORETEMP=y +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6642 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_SMM665 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VIA_CPUTEMP is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_SENSORS_XGENE is not set + +# +# ACPI drivers +# +CONFIG_SENSORS_ACPI_POWER=y +# CONFIG_SENSORS_ATK0110 is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_EMULATION=y + +# +# Intel thermal drivers +# +CONFIG_INTEL_POWERCLAMP=y +CONFIG_X86_PKG_TEMP_THERMAL=y +CONFIG_INTEL_SOC_DTS_IOSF_CORE=y +CONFIG_INTEL_SOC_DTS_THERMAL=y + +# +# ACPI INT340X thermal drivers +# +CONFIG_INT340X_THERMAL=y +CONFIG_ACPI_THERMAL_REL=y +# CONFIG_INT3406_THERMAL is not set +CONFIG_PROC_THERMAL_MMIO_RAPL=y +# end of ACPI INT340X thermal drivers + +# CONFIG_INTEL_PCH_THERMAL is not set +# end of Intel thermal drivers + +# CONFIG_GENERIC_ADC_THERMAL is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +CONFIG_SSB=y +CONFIG_SSB_SPROM=y +CONFIG_SSB_PCIHOST_POSSIBLE=y +CONFIG_SSB_PCIHOST=y +CONFIG_SSB_PCMCIAHOST_POSSIBLE=y +# CONFIG_SSB_PCMCIAHOST is not set +CONFIG_SSB_SDIOHOST_POSSIBLE=y +# CONFIG_SSB_SDIOHOST is not set +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y +CONFIG_SSB_DRIVER_PCICORE=y +# CONFIG_SSB_DRIVER_GPIO is not set +CONFIG_BCMA_POSSIBLE=y +CONFIG_BCMA=y +CONFIG_BCMA_HOST_PCI_POSSIBLE=y +# CONFIG_BCMA_HOST_PCI is not set +# CONFIG_BCMA_HOST_SOC is not set +# CONFIG_BCMA_DRIVER_PCI is not set +# CONFIG_BCMA_DRIVER_GMAC_CMN is not set +# CONFIG_BCMA_DRIVER_GPIO is not set +# CONFIG_BCMA_DEBUG is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set +CONFIG_LPC_ICH=y +CONFIG_LPC_SCH=y +# CONFIG_INTEL_SOC_PMIC is not set +# CONFIG_INTEL_SOC_PMIC_CHTWC is not set +# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set +CONFIG_MFD_INTEL_LPSS=y +CONFIG_MFD_INTEL_LPSS_ACPI=y +CONFIG_MFD_INTEL_LPSS_PCI=y +# CONFIG_MFD_INTEL_PMC_BXT is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_UCB1400_CORE is not set +CONFIG_MFD_RDC321X=y +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SL28CPLD is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_SYSCON is not set +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS68470 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TQMX86 is not set +CONFIG_MFD_VX855=y +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_INTEL_M10_BMC is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y +# CONFIG_REGULATOR_88PG86X is not set +CONFIG_REGULATOR_ACT8865=y +CONFIG_REGULATOR_AD5398=y +CONFIG_REGULATOR_DA9210=y +CONFIG_REGULATOR_DA9211=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_ISL9305=y +CONFIG_REGULATOR_ISL6271A=y +CONFIG_REGULATOR_LP3971=y +CONFIG_REGULATOR_LP3972=y +CONFIG_REGULATOR_LP872X=y +CONFIG_REGULATOR_LP8755=y +CONFIG_REGULATOR_LTC3589=y +# CONFIG_REGULATOR_LTC3676 is not set +CONFIG_REGULATOR_MAX1586=y +CONFIG_REGULATOR_MAX8649=y +CONFIG_REGULATOR_MAX8660=y +CONFIG_REGULATOR_MAX8952=y +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_PCA9450 is not set +CONFIG_REGULATOR_PFUZE100=y +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_SLG51000 is not set +CONFIG_REGULATOR_TPS51632=y +CONFIG_REGULATOR_TPS62360=y +CONFIG_REGULATOR_TPS65023=y +CONFIG_REGULATOR_TPS6507X=y +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_RC_CORE is not set +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +# CONFIG_AGP is not set +CONFIG_INTEL_GTT=y +# CONFIG_VGA_ARB is not set +# CONFIG_VGA_SWITCHEROO is not set +CONFIG_DRM=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_DP_AUX_CHARDEV=y +# CONFIG_DRM_DEBUG_MM is not set +# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_KMS_FB_HELPER=y +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +# CONFIG_DRM_DP_CEC is not set + +# +# I2C encoder or helper chips +# +CONFIG_DRM_I2C_CH7006=y +CONFIG_DRM_I2C_SIL164=y +CONFIG_DRM_I2C_NXP_TDA998X=y +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# end of I2C encoder or helper chips + +# +# ARM devices +# +# end of ARM devices + +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_AMDGPU is not set +# CONFIG_DRM_NOUVEAU is not set +CONFIG_DRM_I915=y +CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +CONFIG_DRM_I915_USERPTR=y +# CONFIG_DRM_I915_GVT is not set + +# +# drm/i915 Debugging +# +CONFIG_DRM_I915_WERROR=y +# CONFIG_DRM_I915_DEBUG is not set +# CONFIG_DRM_I915_DEBUG_MMIO is not set +# CONFIG_DRM_I915_DEBUG_GEM is not set +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set +# CONFIG_DRM_I915_DEBUG_GUC is not set +# CONFIG_DRM_I915_SELFTEST is not set +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set +# end of drm/i915 Debugging + +# +# drm/i915 Profile Guided Optimisation +# +CONFIG_DRM_I915_FENCE_TIMEOUT=10000 +CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 +CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 +CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 +CONFIG_DRM_I915_STOP_TIMEOUT=100 +CONFIG_DRM_I915_TIMESLICE_DURATION=1 +# end of drm/i915 Profile Guided Optimisation + +CONFIG_DRM_VGEM=y +# CONFIG_DRM_VKMS is not set +# CONFIG_DRM_VMWGFX is not set +# CONFIG_DRM_GMA500 is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_AST is not set +# CONFIG_DRM_MGAG200 is not set +# CONFIG_DRM_QXL is not set +# CONFIG_DRM_BOCHS is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# end of Display Interface Bridges + +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_CIRRUS_QEMU is not set +# CONFIG_DRM_GM12U320 is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +# CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_LEGACY is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_VGA16 is not set +# CONFIG_FB_VESA is not set +# CONFIG_FB_N411 is not set +# CONFIG_FB_HGA is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_LE80578 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_VIA is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SM712 is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +CONFIG_LCD_CLASS_DEVICE=y +# CONFIG_LCD_L4F00242T03 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI922X is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +CONFIG_LCD_PLATFORM=y +# CONFIG_LCD_AMS369FG06 is not set +# CONFIG_LCD_LMS501KF03 is not set +# CONFIG_LCD_HX8357 is not set +# CONFIG_LCD_OTM3225A is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_PWM is not set +CONFIG_BACKLIGHT_APPLE=y +# CONFIG_BACKLIGHT_QCOM_WLED is not set +CONFIG_BACKLIGHT_SAHARA=y +CONFIG_BACKLIGHT_ADP8860=y +CONFIG_BACKLIGHT_ADP8870=y +# CONFIG_BACKLIGHT_LM3630A is not set +CONFIG_BACKLIGHT_LM3639=y +# CONFIG_BACKLIGHT_LP855X is not set +CONFIG_BACKLIGHT_GPIO=y +CONFIG_BACKLIGHT_LV5207LP=y +CONFIG_BACKLIGHT_BD6107=y +# CONFIG_BACKLIGHT_ARCXCNN is not set +# end of Backlight & LCD device support + +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y +# end of Graphics support + +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_HWDEP=y +CONFIG_SND_SEQ_DEVICE=y +CONFIG_SND_COMPRESS_OFFLOAD=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SND_DEBUG=y +CONFIG_SND_DEBUG_VERBOSE=y +CONFIG_SND_PCM_XRUN_DEBUG=y +# CONFIG_SND_CTL_VALIDATION is not set +CONFIG_SND_VMASTER=y +CONFIG_SND_DMA_SGBUF=y +CONFIG_SND_SEQUENCER=y +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=y +CONFIG_SND_AC97_CODEC=y +CONFIG_SND_DRIVERS=y +# CONFIG_SND_PCSP is not set +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +# CONFIG_SND_AC97_POWER_SAVE is not set +CONFIG_SND_PCI=y +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALS4000 is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ASIHPI is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_CTXFI is not set +# CONFIG_SND_DARLA20 is not set +# CONFIG_SND_GINA20 is not set +# CONFIG_SND_LAYLA20 is not set +# CONFIG_SND_DARLA24 is not set +# CONFIG_SND_GINA24 is not set +# CONFIG_SND_LAYLA24 is not set +# CONFIG_SND_MONA is not set +# CONFIG_SND_MIA is not set +# CONFIG_SND_ECHO3G is not set +# CONFIG_SND_INDIGO is not set +# CONFIG_SND_INDIGOIO is not set +# CONFIG_SND_INDIGODJ is not set +# CONFIG_SND_INDIGOIOX is not set +# CONFIG_SND_INDIGODJX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +CONFIG_SND_INTEL8X0=y +CONFIG_SND_INTEL8X0M=y +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_LOLA is not set +# CONFIG_SND_LX6464ES is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_RIPTIDE is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_SE6X is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_YMFPCI is not set + +# +# HD-Audio +# +CONFIG_SND_HDA=y +CONFIG_SND_HDA_INTEL=y +CONFIG_SND_HDA_HWDEP=y +CONFIG_SND_HDA_RECONFIG=y +CONFIG_SND_HDA_INPUT_BEEP=y +CONFIG_SND_HDA_INPUT_BEEP_MODE=1 +CONFIG_SND_HDA_PATCH_LOADER=y +# CONFIG_SND_HDA_CODEC_REALTEK is not set +# CONFIG_SND_HDA_CODEC_ANALOG is not set +# CONFIG_SND_HDA_CODEC_SIGMATEL is not set +# CONFIG_SND_HDA_CODEC_VIA is not set +# CONFIG_SND_HDA_CODEC_HDMI is not set +# CONFIG_SND_HDA_CODEC_CIRRUS is not set +# CONFIG_SND_HDA_CODEC_CONEXANT is not set +# CONFIG_SND_HDA_CODEC_CA0110 is not set +# CONFIG_SND_HDA_CODEC_CA0132 is not set +# CONFIG_SND_HDA_CODEC_CMEDIA is not set +# CONFIG_SND_HDA_CODEC_SI3054 is not set +CONFIG_SND_HDA_GENERIC=y +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set +# end of HD-Audio + +CONFIG_SND_HDA_CORE=y +CONFIG_SND_HDA_COMPONENT=y +CONFIG_SND_HDA_I915=y +CONFIG_SND_HDA_PREALLOC_SIZE=64 +CONFIG_SND_INTEL_NHLT=y +CONFIG_SND_INTEL_DSP_CONFIG=y +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_USX2Y is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_US122L is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +# CONFIG_SND_PCMCIA is not set +CONFIG_SND_SOC=y +CONFIG_SND_SOC_COMPRESS=y +CONFIG_SND_SOC_ACPI=y +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_SOC_AMD_ACP3x is not set +# CONFIG_SND_SOC_AMD_RENOIR is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_AUDMIX is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y +# CONFIG_SND_SOC_INTEL_CATPT is not set +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=y +# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI=y +# CONFIG_SND_SOC_INTEL_SKYLAKE is not set +# CONFIG_SND_SOC_INTEL_SKL is not set +# CONFIG_SND_SOC_INTEL_APL is not set +# CONFIG_SND_SOC_INTEL_KBL is not set +# CONFIG_SND_SOC_INTEL_GLK is not set +# CONFIG_SND_SOC_INTEL_CNL is not set +# CONFIG_SND_SOC_INTEL_CFL is not set +# CONFIG_SND_SOC_INTEL_CML_H is not set +# CONFIG_SND_SOC_INTEL_CML_LP is not set +CONFIG_SND_SOC_ACPI_INTEL_MATCH=y +CONFIG_SND_SOC_INTEL_MACH=y +# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set +CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=y +CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=y +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=y +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=y +CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=y +# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH is not set +CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH=y +# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set +CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH=y +# CONFIG_SND_SOC_MTK_BTCVSD is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# CONFIG_ZX_TDM is not set +CONFIG_SND_SOC_I2C_AND_SPI=y + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_BD28623 is not set +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS4234 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CX2072X is not set +CONFIG_SND_SOC_DA7213=y +# CONFIG_SND_SOC_DMIC is not set +CONFIG_SND_SOC_HDMI_CODEC=y +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_MAX98088 is not set +CONFIG_SND_SOC_MAX98090=y +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_RK3328 is not set +CONFIG_SND_SOC_RL6231=y +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +CONFIG_SND_SOC_RT5640=y +CONFIG_SND_SOC_RT5645=y +CONFIG_SND_SOC_RT5651=y +CONFIG_SND_SOC_RT5670=y +# CONFIG_SND_SOC_SGTL5000 is not set +# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set +# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +CONFIG_SND_SOC_TS3A227E=y +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731 is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_ZX_AUD96P22 is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# end of CODEC drivers + +# CONFIG_SND_SIMPLE_CARD is not set +CONFIG_SND_X86=y +CONFIG_HDMI_LPE_AUDIO=y +CONFIG_AC97_BUS=y + +# +# HID support +# +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=y +# CONFIG_HID_ACCUTOUCH is not set +CONFIG_HID_ACRUX=y +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +# CONFIG_HID_ASUS is not set +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +# CONFIG_HID_BETOP_FF is not set +# CONFIG_HID_BIGBEN_FF is not set +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +# CONFIG_HID_CORSAIR is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set +# CONFIG_HID_PRODIKEYS is not set +# CONFIG_HID_CMEDIA is not set +CONFIG_HID_CP2112=y +# CONFIG_HID_CREATIVE_SB0540 is not set +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +# CONFIG_HID_ELAN is not set +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +# CONFIG_HID_VIVALDI is not set +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +# CONFIG_HID_VIEWSONIC is not set +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +CONFIG_HID_LCPOWER=y +CONFIG_HID_LED=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_HID_LOGITECH_HIDPP=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_REDRAGON is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_MULTITOUCH=y +# CONFIG_HID_NTI is not set +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +CONFIG_HID_PICOLCD=y +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +# CONFIG_HID_RETRODE is not set +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=y +# CONFIG_HID_STEAM is not set +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_U2FZERO is not set +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set +# CONFIG_HID_ALPS is not set +# CONFIG_HID_MCP2221 is not set +# end of Special HID drivers + +# +# USB HID support +# +CONFIG_USB_HID=y +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y +# end of USB HID support + +# +# I2C HID support +# +CONFIG_I2C_HID=y +# end of I2C HID support + +# +# Intel ISH HID support +# +# CONFIG_INTEL_ISH_HID is not set +# end of Intel ISH HID support +# end of HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +# CONFIG_USB_LED_TRIG is not set +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_USB_CONN_GPIO is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_MON=y + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=y +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=y +# CONFIG_USB_XHCI_PCI_RENESAS is not set +# CONFIG_USB_XHCI_PLATFORM is not set +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=y +# CONFIG_USB_EHCI_FSL is not set +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PCI=y +# CONFIG_USB_OHCI_HCD_SSB is not set +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_UHCI_HCD=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_BCMA is not set +# CONFIG_USB_HCD_SSB is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +CONFIG_USB_WDM=y +CONFIG_USB_TMC=y + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_REALTEK_AUTOPM=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y +CONFIG_USB_UAS=y + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=y +CONFIG_USB_MICROTEK=y +# CONFIG_USBIP_CORE is not set +# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_SIMPLE=y +CONFIG_USB_SERIAL_AIRCABLE=y +CONFIG_USB_SERIAL_ARK3116=y +CONFIG_USB_SERIAL_BELKIN=y +CONFIG_USB_SERIAL_CH341=y +CONFIG_USB_SERIAL_WHITEHEAT=y +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=y +CONFIG_USB_SERIAL_CP210X=y +CONFIG_USB_SERIAL_CYPRESS_M8=y +CONFIG_USB_SERIAL_EMPEG=y +CONFIG_USB_SERIAL_FTDI_SIO=y +CONFIG_USB_SERIAL_VISOR=y +CONFIG_USB_SERIAL_IPAQ=y +CONFIG_USB_SERIAL_IR=y +CONFIG_USB_SERIAL_EDGEPORT=y +CONFIG_USB_SERIAL_EDGEPORT_TI=y +CONFIG_USB_SERIAL_F81232=y +# CONFIG_USB_SERIAL_F8153X is not set +CONFIG_USB_SERIAL_GARMIN=y +CONFIG_USB_SERIAL_IPW=y +CONFIG_USB_SERIAL_IUU=y +CONFIG_USB_SERIAL_KEYSPAN_PDA=y +CONFIG_USB_SERIAL_KEYSPAN=y +CONFIG_USB_SERIAL_KLSI=y +CONFIG_USB_SERIAL_KOBIL_SCT=y +CONFIG_USB_SERIAL_MCT_U232=y +CONFIG_USB_SERIAL_METRO=y +CONFIG_USB_SERIAL_MOS7720=y +CONFIG_USB_SERIAL_MOS7840=y +CONFIG_USB_SERIAL_MXUPORT=y +CONFIG_USB_SERIAL_NAVMAN=y +CONFIG_USB_SERIAL_PL2303=y +CONFIG_USB_SERIAL_OTI6858=y +CONFIG_USB_SERIAL_QCAUX=y +CONFIG_USB_SERIAL_QUALCOMM=y +CONFIG_USB_SERIAL_SPCP8X5=y +CONFIG_USB_SERIAL_SAFE=y +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=y +CONFIG_USB_SERIAL_SYMBOL=y +CONFIG_USB_SERIAL_TI=y +CONFIG_USB_SERIAL_CYBERJACK=y +CONFIG_USB_SERIAL_XIRCOM=y +CONFIG_USB_SERIAL_WWAN=y +CONFIG_USB_SERIAL_OPTION=y +CONFIG_USB_SERIAL_OMNINET=y +CONFIG_USB_SERIAL_OPTICON=y +CONFIG_USB_SERIAL_XSENS_MT=y +CONFIG_USB_SERIAL_WISHBONE=y +CONFIG_USB_SERIAL_SSU100=y +CONFIG_USB_SERIAL_QT2=y +# CONFIG_USB_SERIAL_UPD78F0730 is not set +CONFIG_USB_SERIAL_DEBUG=y + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +CONFIG_USB_EZUSB_FX2=y +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_GPIO_VBUS=y +CONFIG_USB_ISP1301=y +# end of USB Physical Layer drivers + +# CONFIG_USB_GADGET is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_ROLE_SWITCH is not set +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=8 +CONFIG_SDIO_UART=y +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PCI=y +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI_ACPI=y +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_F_SDH30 is not set +CONFIG_MMC_WBSD=y +CONFIG_MMC_TIFM_SD=y +# CONFIG_MMC_SPI is not set +CONFIG_MMC_SDRICOH_CS=y +CONFIG_MMC_CB710=y +CONFIG_MMC_VIA_SDMMC=y +CONFIG_MMC_VUB300=y +CONFIG_MMC_USHC=y +CONFIG_MMC_USDHI6ROL0=y +CONFIG_MMC_CQHCI=y +# CONFIG_MMC_HSQ is not set +CONFIG_MMC_TOSHIBA_PCI=y +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_CLASS_FLASH is not set +# CONFIG_LEDS_CLASS_MULTICOLOR is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_APU is not set +CONFIG_LEDS_LM3530=y +# CONFIG_LEDS_LM3532 is not set +CONFIG_LEDS_LM3642=y +CONFIG_LEDS_PCA9532=y +CONFIG_LEDS_PCA9532_GPIO=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_LP3944=y +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +CONFIG_LEDS_CLEVO_MAIL=y +CONFIG_LEDS_PCA955X=y +# CONFIG_LEDS_PCA955X_GPIO is not set +CONFIG_LEDS_PCA963X=y +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +CONFIG_LEDS_REGULATOR=y +CONFIG_LEDS_BD2802=y +CONFIG_LEDS_INTEL_SS4200=y +CONFIG_LEDS_TCA6507=y +# CONFIG_LEDS_TLC591XX is not set +CONFIG_LEDS_LM355x=y + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +CONFIG_LEDS_BLINKM=y +# CONFIG_LEDS_MLXCPLD is not set +# CONFIG_LEDS_MLXREG is not set +# CONFIG_LEDS_USER is not set +# CONFIG_LEDS_NIC78BX is not set +# CONFIG_LEDS_TI_LMU_COMMON is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +# CONFIG_LEDS_TRIGGER_DISK is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +# CONFIG_LEDS_TRIGGER_ACTIVITY is not set +CONFIG_LEDS_TRIGGER_GPIO=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=y +CONFIG_LEDS_TRIGGER_CAMERA=y +# CONFIG_LEDS_TRIGGER_PANIC is not set +# CONFIG_LEDS_TRIGGER_NETDEV is not set +# CONFIG_LEDS_TRIGGER_PATTERN is not set +# CONFIG_LEDS_TRIGGER_AUDIO is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +CONFIG_RTC_DRV_DS1307=y +# CONFIG_RTC_DRV_DS1307_CENTURY is not set +CONFIG_RTC_DRV_DS1374=y +CONFIG_RTC_DRV_DS1672=y +CONFIG_RTC_DRV_MAX6900=y +CONFIG_RTC_DRV_RS5C372=y +CONFIG_RTC_DRV_ISL1208=y +CONFIG_RTC_DRV_ISL12022=y +CONFIG_RTC_DRV_X1205=y +CONFIG_RTC_DRV_PCF8523=y +CONFIG_RTC_DRV_PCF85063=y +# CONFIG_RTC_DRV_PCF85363 is not set +CONFIG_RTC_DRV_PCF8563=y +CONFIG_RTC_DRV_PCF8583=y +CONFIG_RTC_DRV_M41T80=y +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_BQ32K=y +CONFIG_RTC_DRV_S35390A=y +CONFIG_RTC_DRV_FM3130=y +# CONFIG_RTC_DRV_RX8010 is not set +CONFIG_RTC_DRV_RX8581=y +CONFIG_RTC_DRV_RX8025=y +CONFIG_RTC_DRV_EM3027=y +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RX6110 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +CONFIG_RTC_DRV_DS3232=y +CONFIG_RTC_DRV_DS3232_HWMON=y +CONFIG_RTC_DRV_PCF2127=y +CONFIG_RTC_DRV_RV3029C2=y +CONFIG_RTC_DRV_RV3029_HWMON=y + +# +# Platform RTC drivers +# +CONFIG_RTC_DRV_CMOS=y +CONFIG_RTC_DRV_DS1286=y +CONFIG_RTC_DRV_DS1511=y +CONFIG_RTC_DRV_DS1553=y +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +CONFIG_RTC_DRV_DS1742=y +CONFIG_RTC_DRV_DS2404=y +CONFIG_RTC_DRV_STK17TA8=y +CONFIG_RTC_DRV_M48T86=y +CONFIG_RTC_DRV_M48T35=y +CONFIG_RTC_DRV_M48T59=y +CONFIG_RTC_DRV_MSM6242=y +CONFIG_RTC_DRV_BQ4802=y +CONFIG_RTC_DRV_RP5C01=y +CONFIG_RTC_DRV_V3020=y + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_FTRTC010 is not set + +# +# HID Sensor RTC drivers +# +CONFIG_RTC_DRV_HID_SENSOR_TIME=y +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_ACPI=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_INTEL_IDXD is not set +CONFIG_INTEL_IOATDMA=y +# CONFIG_PLX_DMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +CONFIG_DW_DMAC_CORE=y +CONFIG_DW_DMAC=y +CONFIG_DW_DMAC_PCI=y +# CONFIG_DW_EDMA is not set +# CONFIG_DW_EDMA_PCIE is not set +# CONFIG_SF_PDMA is not set + +# +# DMA Clients +# +CONFIG_ASYNC_TX_DMA=y +# CONFIG_DMATEST is not set +CONFIG_DMA_ENGINE_RAID=y + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +# CONFIG_UDMABUF is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# end of DMABUF options + +CONFIG_DCA=y +CONFIG_AUXDISPLAY=y +# CONFIG_HD44780 is not set +# CONFIG_IMG_ASCII_LCD is not set +# CONFIG_CHARLCD_BL_OFF is not set +# CONFIG_CHARLCD_BL_ON is not set +CONFIG_CHARLCD_BL_FLASH=y +CONFIG_UIO=y +CONFIG_UIO_CIF=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y +CONFIG_UIO_AEC=y +CONFIG_UIO_SERCOS3=y +CONFIG_UIO_PCI_GENERIC=y +CONFIG_UIO_NETX=y +# CONFIG_UIO_PRUSS is not set +CONFIG_UIO_MF624=y +# CONFIG_VFIO is not set +CONFIG_VIRT_DRIVERS=y +# CONFIG_VBOXGUEST is not set +# CONFIG_NITRO_ENCLAVES is not set +CONFIG_VIRTIO_MENU=y +# CONFIG_VIRTIO_PCI is not set +# CONFIG_VIRTIO_MMIO is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_MENU=y +# CONFIG_VHOST_NET is not set +# CONFIG_VHOST_SCSI is not set +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set + +# +# Microsoft Hyper-V guest support +# +# CONFIG_HYPERV is not set +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_STAGING is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_EEEPC_LAPTOP is not set +# CONFIG_DCDBAS is not set +# CONFIG_DELL_SMBIOS is not set +# CONFIG_DELL_RBTN is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DELL_SMO8800 is not set +# CONFIG_AMILO_RFKILL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_HP_WIRELESS is not set +# CONFIG_IBM_RTL is not set +# CONFIG_IDEAPAD_LAPTOP is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# CONFIG_INTEL_ATOMISP2_LED is not set +# CONFIG_INTEL_ATOMISP2_PM is not set +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_INT0002_VGPIO is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_OAKTRAIL is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_SURFACE_3_BUTTON is not set +# CONFIG_SURFACE_3_POWER_OPREGION is not set +# CONFIG_SURFACE_PRO3_BUTTON is not set +# CONFIG_MSI_LAPTOP is not set +# CONFIG_PCENGINES_APU2 is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_COMPAL_LAPTOP is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_SONY_LAPTOP is not set +# CONFIG_SYSTEM76_ACPI is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# CONFIG_INTEL_PMC_CORE is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +CONFIG_PMC_ATOM=y +CONFIG_CHROME_PLATFORMS=y +CONFIG_CHROMEOS_LAPTOP=y +CONFIG_CHROMEOS_PSTORE=y +# CONFIG_CHROMEOS_TBMC is not set +# CONFIG_CROS_EC is not set +CONFIG_CROS_KBD_LED_BACKLIGHT=y +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_HAVE_CLK=y +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +CONFIG_COMMON_CLK_SI5351=y +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +# end of Clock Source drivers + +CONFIG_MAILBOX=y +CONFIG_PCC=y +# CONFIG_ALTERA_MBOX is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOASID=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_AMD_IOMMU=y +CONFIG_AMD_IOMMU_V2=y +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +# CONFIG_INTEL_IOMMU_SVM is not set +# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +# CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set +CONFIG_IRQ_REMAP=y + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Aspeed SoC drivers +# +# end of Aspeed SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# end of NXP/Freescale QorIQ SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# CONFIG_XILINX_VCU is not set +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# CONFIG_PM_DEVFREQ is not set +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_FSA9480 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_INTEL_INT3496 is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +# CONFIG_EXTCON_USB_GPIO is not set +CONFIG_MEMORY=y +CONFIG_IIO=y +CONFIG_IIO_BUFFER=y +# CONFIG_IIO_BUFFER_CB is not set +# CONFIG_IIO_BUFFER_DMA is not set +# CONFIG_IIO_BUFFER_DMAENGINE is not set +# CONFIG_IIO_BUFFER_HW_CONSUMER is not set +CONFIG_IIO_KFIFO_BUF=y +CONFIG_IIO_TRIGGERED_BUFFER=y +# CONFIG_IIO_CONFIGFS is not set +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set +# CONFIG_IIO_TRIGGERED_EVENT is not set + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_HID_SENSOR_ACCEL_3D is not set +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7091R5 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_AD9467 is not set +# CONFIG_ADI_AXI_ADC is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog Front Ends +# +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Chemical Sensors +# +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_BME680 is not set +# CONFIG_CCS811 is not set +# CONFIG_IAQCORE is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SPS30 is not set +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=y +CONFIG_HID_SENSOR_IIO_TRIGGER=y +# end of Hid Sensor IIO Common + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +# +# Digital to analog converters +# +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DS4424 is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# end of IIO dummy driver + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +# CONFIG_FXAS21002C is not set +# CONFIG_HID_SENSOR_GYRO_3D is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HID_SENSOR_HUMIDITY is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# end of Inertial measurement units + +# +# Light sensors +# +# CONFIG_ACPI_ALS is not set +# CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9960 is not set +# CONFIG_AS73211 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_HID_SENSOR_ALS is not set +# CONFIG_HID_SENSOR_PROX is not set +# CONFIG_JSA1212 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR501 is not set +# CONFIG_LV0104CS is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_NOA1305 is not set +# CONFIG_OPT3001 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL2772 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VEML6030 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +# CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set +# CONFIG_MMC35240 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# end of Magnetometer sensors + +# +# Multiplexers +# +# end of Multiplexers + +# +# Inclinometer sensors +# +# CONFIG_HID_SENSOR_INCLINOMETER_3D is not set +# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set +# end of Inclinometer sensors + +# +# Triggers - standalone +# +# CONFIG_IIO_INTERRUPT_TRIGGER is not set +# CONFIG_IIO_SYSFS_TRIGGER is not set +# end of Triggers - standalone + +# +# Linear and angular position sensors +# +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_BMP280 is not set +# CONFIG_DLHL60D is not set +# CONFIG_DPS310 is not set +# CONFIG_HID_SENSOR_PRESS is not set +# CONFIG_HP03 is not set +# CONFIG_ICP10100 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +# CONFIG_ISL29501 is not set +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_MB1232 is not set +# CONFIG_PING is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VL53L0X_I2C is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_LTC2983 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_HID_SENSOR_TEMP is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_MAX31856 is not set +# end of Temperature sensors + +# CONFIG_NTB is not set +# CONFIG_VME_BUS is not set +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_LPSS_PCI is not set +# CONFIG_PWM_LPSS_PLATFORM is not set +# CONFIG_PWM_PCA9685 is not set + +# +# IRQ chip support +# +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_BRCMSTB_RESCAL is not set +# CONFIG_RESET_TI_SYSCON is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_USB_LGM_PHY is not set +CONFIG_BCM_KONA_USB2_PHY=y +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_INTEL_LGM_EMMC is not set +# end of PHY Subsystem + +CONFIG_POWERCAP=y +CONFIG_INTEL_RAPL_CORE=y +CONFIG_INTEL_RAPL=y +# CONFIG_IDLE_INJECT is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# end of Performance monitor support + +CONFIG_RAS=y +# CONFIG_RAS_CEC is not set +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +CONFIG_DAX=y +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_TEE is not set +# CONFIG_UNISYS_VISORBUS is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +# CONFIG_FS_DAX is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_MANDATORY_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +CONFIG_QUOTA=y +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +# CONFIG_PRINT_QUOTA_WARNING is not set +# CONFIG_QUOTA_DEBUG is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS4_FS is not set +# CONFIG_AUTOFS_FS is not set +CONFIG_FUSE_FS=y +CONFIG_CUSE=y +# CONFIG_VIRTIO_FS is not set +# CONFIG_OVERLAY_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +# CONFIG_EXFAT_FS is not set +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_INODE64 is not set +# CONFIG_HUGETLBFS is not set +CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=y +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=y +CONFIG_ECRYPT_FS_MESSAGING=y +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +# CONFIG_SQUASHFS_FILE_CACHE is not set +CONFIG_SQUASHFS_FILE_DIRECT=y +# CONFIG_SQUASHFS_DECOMP_SINGLE is not set +# CONFIG_SQUASHFS_DECOMP_MULTI is not set +CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +# CONFIG_SQUASHFS_LZ4 is not set +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +# CONFIG_SQUASHFS_ZSTD is not set +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFLATE_COMPRESS=y +# CONFIG_PSTORE_LZO_COMPRESS is not set +# CONFIG_PSTORE_LZ4_COMPRESS is not set +# CONFIG_PSTORE_LZ4HC_COMPRESS is not set +# CONFIG_PSTORE_842_COMPRESS is not set +# CONFIG_PSTORE_ZSTD_COMPRESS is not set +CONFIG_PSTORE_COMPRESS=y +CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y +CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" +# CONFIG_PSTORE_CONSOLE is not set +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_FTRACE is not set +CONFIG_PSTORE_RAM=y +# CONFIG_PSTORE_BLK is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_EROFS_FS is not set +# CONFIG_NETWORK_FILESYSTEMS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +# CONFIG_SECURITY is not set +CONFIG_SECURITYFS=y +CONFIG_PAGE_TABLE_ISOLATION=y +# CONFIG_INTEL_TXT is not set +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +# CONFIG_HARDENED_USERCOPY is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization +# end of Kernel hardening options +# end of Security options + +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_PCRYPT=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_SIMD=y +CONFIG_CRYPTO_GLUE_HELPER_X86=y + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=y +# CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# CONFIG_CRYPTO_CURVE25519_X86 is not set + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=y + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CFB is not set +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_LRW=y +# CONFIG_CRYPTO_OFB is not set +CONFIG_CRYPTO_PCBC=y +CONFIG_CRYPTO_XTS=y +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_ESSIV=y + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_VMAC=y + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32C_INTEL=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32_PCLMUL=y +# CONFIG_CRYPTO_XXHASH is not set +# CONFIG_CRYPTO_BLAKE2B is not set +# CONFIG_CRYPTO_BLAKE2S is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_PCLMUL=y +CONFIG_CRYPTO_GHASH=y +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_RMD128=y +CONFIG_CRYPTO_RMD160=y +CONFIG_CRYPTO_RMD256=y +CONFIG_CRYPTO_RMD320=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_STREEBOG is not set +CONFIG_CRYPTO_TGR192=y +CONFIG_CRYPTO_WP512=y +CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=y + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +CONFIG_CRYPTO_BLOWFISH=y +CONFIG_CRYPTO_BLOWFISH_COMMON=y +CONFIG_CRYPTO_BLOWFISH_X86_64=y +CONFIG_CRYPTO_CAMELLIA=y +CONFIG_CRYPTO_CAMELLIA_X86_64=y +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=y +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=y +CONFIG_CRYPTO_CAST_COMMON=y +CONFIG_CRYPTO_CAST5=y +CONFIG_CRYPTO_CAST5_AVX_X86_64=y +CONFIG_CRYPTO_CAST6=y +CONFIG_CRYPTO_CAST6_AVX_X86_64=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_DES3_EDE_X86_64=y +CONFIG_CRYPTO_FCRYPT=y +CONFIG_CRYPTO_SALSA20=y +# CONFIG_CRYPTO_CHACHA20 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +CONFIG_CRYPTO_SERPENT=y +CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y +CONFIG_CRYPTO_SERPENT_AVX_X86_64=y +CONFIG_CRYPTO_SERPENT_AVX2_X86_64=y +# CONFIG_CRYPTO_SM4 is not set +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_TWOFISH_COMMON=y +CONFIG_CRYPTO_TWOFISH_X86_64=y +CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y +CONFIG_CRYPTO_TWOFISH_AVX_X86_64=y + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y +# CONFIG_CRYPTO_842 is not set +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +# CONFIG_CRYPTO_ZSTD is not set + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_USER_API_RNG is not set +# CONFIG_CRYPTO_USER_API_AEAD is not set +CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +# CONFIG_CRYPTO_LIB_BLAKE2S is not set +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_DEV_PADLOCK=y +CONFIG_CRYPTO_DEV_PADLOCK_AES=y +CONFIG_CRYPTO_DEV_PADLOCK_SHA=y +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +CONFIG_CRYPTO_DEV_CCP=y +CONFIG_CRYPTO_DEV_CCP_DD=y +CONFIG_CRYPTO_DEV_SP_CCP=y +CONFIG_CRYPTO_DEV_CCP_CRYPTO=y +CONFIG_CRYPTO_DEV_SP_PSP=y +# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set +CONFIG_CRYPTO_DEV_QAT=y +CONFIG_CRYPTO_DEV_QAT_DH895xCC=y +# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set +# CONFIG_CRYPTO_DEV_QAT_C62X is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set +# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_LINEAR_RANGES=y +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_CORDIC=y +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC64=y +# CONFIG_CRC4 is not set +CONFIG_CRC7=y +CONFIG_LIBCRC32C=y +CONFIG_CRC8=y +CONFIG_XXHASH=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=y +CONFIG_LZ4HC_COMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_XZ_DEC_TEST=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_INTERVAL_TREE=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_SWIOTLB=y +# CONFIG_DMA_CMA is not set +# CONFIG_DMA_API_DEBUG is not set +CONFIG_SGL_ALLOC=y +CONFIG_CHECK_SIGNATURE=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_CLZ_TAB=y +# CONFIG_IRQ_POLL is not set +CONFIG_MPILIB=y +CONFIG_OID_REGISTRY=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_STRING_SELFTEST is not set +# end of Library routines + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +CONFIG_BOOT_PRINTK_DELAY=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +# +# Compile-time checks and compiler options +# +# CONFIG_DEBUG_INFO is not set +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set +CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_KGDB=y +CONFIG_KGDB_SERIAL_CONSOLE=y +# CONFIG_KGDB_TESTS is not set +CONFIG_KGDB_LOW_LEVEL_TRAP=y +CONFIG_KGDB_KDB=y +CONFIG_KDB_DEFAULT_ENABLE=0x1 +CONFIG_KDB_KEYBOARD=y +CONFIG_KDB_CONTINUE_CATASTROPHIC=0 +CONFIG_ARCH_HAS_EARLY_DEBUG=y +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +# end of Generic Kernel Debugging Instruments + +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +CONFIG_DEBUG_OBJECTS=y +# CONFIG_DEBUG_OBJECTS_SELFTEST is not set +# CONFIG_DEBUG_OBJECTS_FREE is not set +# CONFIG_DEBUG_OBJECTS_TIMERS is not set +# CONFIG_DEBUG_OBJECTS_WORK is not set +# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set +# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set +CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_SCHED_STACK_END_CHECK=y +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 +# CONFIG_WQ_WATCHDOG is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_DEBUG=y +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set +CONFIG_DEBUG_PREEMPT=y + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Debug kernel data structures + +# CONFIG_DEBUG_CREDENTIALS is not set + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACER_MAX_TRACE=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_RING_BUFFER_ALLOW_SWAP=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_FUNCTION_PROFILER=y +CONFIG_STACK_TRACER=y +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +CONFIG_SCHED_TRACER=y +# CONFIG_HWLAT_TRACER is not set +CONFIG_MMIOTRACE=y +CONFIG_FTRACE_SYSCALLS=y +CONFIG_TRACER_SNAPSHOT=y +# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_UPROBE_EVENTS=y +CONFIG_BPF_EVENTS=y +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_FTRACE_MCOUNT_RECORD=y +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_SAMPLES is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set + +# +# x86 Debugging +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_EARLY_PRINTK_USB=y +# CONFIG_X86_VERBOSE_BOOTUP is not set +CONFIG_EARLY_PRINTK=y +CONFIG_EARLY_PRINTK_DBGP=y +# CONFIG_EARLY_PRINTK_USB_XDBC is not set +# CONFIG_DEBUG_TLBFLUSH is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_DEBUG_BOOT_PARAMS is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +CONFIG_X86_DEBUG_FPU=y +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_UNWINDER_ORC=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UNWINDER_GUESS is not set +# end of x86 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +CONFIG_NOTIFIER_ERROR_INJECTION=y +CONFIG_PM_NOTIFIER_ERROR_INJECT=y +# CONFIG_NETDEV_NOTIFIER_ERROR_INJECT is not set +CONFIG_FAULT_INJECTION=y +# CONFIG_FAILSLAB is not set +# CONFIG_FAIL_PAGE_ALLOC is not set +# CONFIG_FAULT_INJECTION_USERCOPY is not set +# CONFIG_FAIL_MAKE_REQUEST is not set +# CONFIG_FAIL_IO_TIMEOUT is not set +# CONFIG_FAIL_FUTEX is not set +# CONFIG_FAULT_INJECTION_DEBUG_FS is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +CONFIG_RUNTIME_TESTING_MENU=y +# CONFIG_LKDTM is not set +# CONFIG_TEST_LIST_SORT is not set +# CONFIG_TEST_MIN_HEAP is not set +# CONFIG_TEST_SORT is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_RBTREE_TEST is not set +# CONFIG_REED_SOLOMON_TEST is not set +# CONFIG_INTERVAL_TREE_TEST is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_TEST_HEXDUMP is not set +# CONFIG_TEST_STRING_HELPERS is not set +# CONFIG_TEST_STRSCPY is not set +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_BITMAP is not set +# CONFIG_TEST_UUID is not set +# CONFIG_TEST_XARRAY is not set +# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_RHASHTABLE is not set +# CONFIG_TEST_HASH is not set +# CONFIG_TEST_IDA is not set +# CONFIG_FIND_BIT_BENCHMARK is not set +CONFIG_TEST_FIRMWARE=y +# CONFIG_TEST_SYSCTL is not set +CONFIG_TEST_UDELAY=y +# CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_STACKINIT is not set +# CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_FREE_PAGES is not set +# CONFIG_TEST_FPU is not set +CONFIG_MEMTEST=y +# end of Kernel Testing and Coverage +# end of Kernel hacking diff --git a/nichrome/Gopkg.lock b/nichrome/Gopkg.lock new file mode 100644 index 000000000..b4645f5d2 --- /dev/null +++ b/nichrome/Gopkg.lock @@ -0,0 +1,196 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "2.x" + digest = "1:f198c9213547e59cb10260bf9c3c1bf6e760298ef5268e1f980d950e0d317880" + name = "github.com/Masterminds/semver" + packages = ["."] + pruneopts = "NUT" + revision = "3c92f33da7a84de8314f3ff82e5f919b89fd1492" + +[[projects]] + digest = "1:5e4de188bac29c98e6d747ff06911d6ce515646c318f7d65f45ffe96c59dc0aa" + name = "github.com/Masterminds/vcs" + packages = ["."] + pruneopts = "NUT" + revision = "f94282d8632a0620f79f0c6ff0e82604e8c5c85b" + version = "v1.13.1" + +[[projects]] + digest = "1:e5ca3dcabf1452b51be600af6e2ce0a93a94978ae231af802cf9736bdbd835cb" + name = "github.com/armon/go-radix" + packages = ["."] + pruneopts = "NUT" + revision = "1a2de0c21c94309923825da3df33a4381872c795" + version = "v1.0.0" + +[[projects]] + digest = "1:a12d94258c5298ead75e142e8001224bf029f302fed9e96cd39c0eaf90f3954d" + name = "github.com/boltdb/bolt" + packages = ["."] + pruneopts = "NUT" + revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" + version = "v1.3.1" + +[[projects]] + digest = "1:b7ffca49e9cfd3dfb04a8e0a59347708c6f78f68476a32c5e0a0edca5d1b258c" + name = "github.com/dustin/go-humanize" + packages = ["."] + pruneopts = "NUT" + revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e" + version = "v1.0.0" + +[[projects]] + digest = "1:ed1c52061aeabab2761bf8a1597f812a3161e04a6a2ea96bd2c5ae8f9096aee1" + name = "github.com/golang/dep" + packages = [ + ".", + "cmd/dep", + "gps", + "gps/internal/pb", + "gps/paths", + "gps/pkgtree", + "gps/verify", + "internal/feedback", + "internal/fs", + "internal/importers", + "internal/importers/base", + "internal/importers/glide", + "internal/importers/glock", + "internal/importers/godep", + "internal/importers/govend", + "internal/importers/govendor", + "internal/importers/gvt", + "internal/importers/vndr", + ] + pruneopts = "NT" + revision = "1f7c19e5f52f49ffb9f956f64c010be14683468b" + version = "v0.5.4" + +[[projects]] + digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "NUT" + revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" + version = "v1.3.2" + +[[projects]] + digest = "1:3c8c26bb118e3f02230d4f5f30b972dbfe0c6b371acea8f190aa99ceaaae7028" + name = "github.com/gorilla/mux" + packages = ["."] + pruneopts = "NUT" + revision = "00bdffe0f3c77e27d2cf6f5c70232a2d3e4d9c15" + version = "v1.7.3" + +[[projects]] + digest = "1:f5169729244becc423886eae4d72547e28ac3f13f861bed8a9d749bc7238a1c3" + name = "github.com/jmank88/nuts" + packages = ["."] + pruneopts = "NUT" + revision = "8b28145dffc87104e66d074f62ea8080edfad7c8" + version = "v0.3.0" + +[[projects]] + branch = "master" + digest = "1:26217ee135b8157549e648efe97dff3282e4bd597a912d784db964df41067f29" + name = "github.com/nightlyone/lockfile" + packages = ["."] + pruneopts = "NUT" + revision = "0ad87eef1443f64d3d8c50da647e2b1552851124" + +[[projects]] + digest = "1:4e9827f31d4fc1ddd732a0e3af4e863d281dd405adb2bfb96a25cc5346a77caf" + name = "github.com/pelletier/go-toml" + packages = ["."] + pruneopts = "NUT" + revision = "728039f679cbcd4f6a54e080d2219a4c4928c546" + version = "v1.4.0" + +[[projects]] + digest = "1:14715f705ff5dfe0ffd6571d7d201dd8e921030f8070321a79380d8ca4ec1a24" + name = "github.com/pkg/errors" + packages = ["."] + pruneopts = "NUT" + revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4" + version = "v0.8.1" + +[[projects]] + branch = "master" + digest = "1:abb4b60c28323cde32c193ce6083bb600fac462d1780cf83461b4c23ed5ce904" + name = "github.com/sdboyer/constext" + packages = ["."] + pruneopts = "NUT" + revision = "836a144573533ea4da4e6929c235fd348aed1c80" + +[[projects]] + digest = "1:9d8420bbf131d1618bde6530af37c3799340d3762cc47210c1d9532a4c3a2779" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "NUT" + revision = "298182f68c66c05229eb03ac171abe6e309ee79a" + version = "v1.0.3" + +[[projects]] + digest = "1:1399e838d21e76f3b54883253f4c586f6b7bbde6b731b586e3ad879390b5b6cf" + name = "github.com/u-root/u-root" + packages = [ + "pkg/cmdline", + "pkg/cpio", + "pkg/gpt", + "pkg/ls", + "pkg/ubinary", + "pkg/uio", + "pkg/uroot/util", + ] + pruneopts = "NUT" + revision = "26a90287872f42e357dc889f6918855fc0fde4dc" + version = "v6.0.0" + +[[projects]] + branch = "master" + digest = "1:f92f6956e4059f6a3efc14924d2dd58ba90da25cc57fe07ae3779ef2f5e0c5f2" + name = "golang.org/x/crypto" + packages = ["pbkdf2"] + pruneopts = "NUT" + revision = "4def268fd1a49955bfb3dda92fe3db4f924f2285" + +[[projects]] + branch = "master" + digest = "1:b521f10a2d8fa85c04a8ef4e62f2d1e14d303599a55d64dabf9f5a02f84d35eb" + name = "golang.org/x/sync" + packages = ["errgroup"] + pruneopts = "NUT" + revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + +[[projects]] + branch = "master" + digest = "1:4296892af119aaeedd6437125dbe67686a9e3043a6e54956fb8425a61d93d764" + name = "golang.org/x/sys" + packages = ["unix"] + pruneopts = "NUT" + revision = "fde4db37ae7ad8191b03d30d27f258b5291ae4e3" + +[[projects]] + digest = "1:18108594151654e9e696b27b181b953f9a90b16bf14d253dd1b397b025a1487f" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "NUT" + revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" + version = "v2.2.2" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/golang/dep/cmd/dep", + "github.com/gorilla/mux", + "github.com/spf13/pflag", + "github.com/u-root/u-root/pkg/cpio", + "github.com/u-root/u-root/pkg/gpt", + "github.com/u-root/u-root/pkg/uroot/util", + "golang.org/x/crypto/pbkdf2", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/nichrome/Gopkg.toml b/nichrome/Gopkg.toml new file mode 100644 index 000000000..ccd1fd607 --- /dev/null +++ b/nichrome/Gopkg.toml @@ -0,0 +1,16 @@ +required = [ + "github.com/golang/dep/cmd/dep" +] + +[[constraint]] + version = "6.0.0" + name = "github.com/u-root/u-root" + +[prune] + non-go = true + go-tests = true + unused-packages = true + + [[prune.project]] + name = "github.com/golang/dep" + unused-packages = false diff --git a/nichrome/LICENSE b/nichrome/LICENSE new file mode 100644 index 000000000..23cb79033 --- /dev/null +++ b/nichrome/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + 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; either version 2 of the License, or + (at your option) any later version. + + 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/nichrome/QRUN b/nichrome/QRUN new file mode 100644 index 000000000..7e854ba11 --- /dev/null +++ b/nichrome/QRUN @@ -0,0 +1,21 @@ +# The file /tmp/t3 was produced as follows: +# go run usb/*.go -dev=/tmp/t +# /tmp/t2 and /tmp/t3 are created and you can use /tmp/t3 +# as hda as shown below. +# -s is gdb +# -monitor allows you to hit ^C in the term window you start +# this from to kill QEMU +qemu-system-x86_64 \ +-m 2048M \ +-cpu max \ +-machine pc-q35-zesty \ +-kernel linux-stable/arch/x86/boot/bzImage \ +-s \ +-monitor /dev/null \ +-serial stdio \ +-vga cirrus \ +-append 'nichromeroot=/dev/sda' \ +-drive id=disk,file=/tmp/t3,if=none \ +-device ich9-ahci,id=ahci \ +-device ide-drive,drive=disk,bus=ahci.0 \ + diff --git a/nichrome/README.md b/nichrome/README.md new file mode 100644 index 000000000..9798c7bfa --- /dev/null +++ b/nichrome/README.md @@ -0,0 +1,30 @@ +NiChrome +======= + +[![Build Status](https://travis-ci.org/u-root/NiChrome.svg?branch=master)](https://travis-ci.org/u-root/NiChrome) [![Go Report Card](https://goreportcard.com/badge/github.com/u-root/NiChrome)](https://goreportcard.com/report/github.com/u-root/NiChrome) [![GoDoc](https://godoc.org/github.com/u-root/NiChrome?status.svg)](https://godoc.org/github.com/u-root/NiChrome) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://github.com/u-root/NiChrome/blob/master/LICENSE) + + +# Description +Things we need for NiChrome. + +To test out USB stick creation, you will need a ChromeOS-formatted boot stick with the right partitions. We don't know how to create those yet. One way to get such an image is with the chromeos recovery tool, found here: +https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai?hl=en + +You can pick any chromebook to get an image from, since the partition layout is the same on all of them, and the usb tool replaces the A image anyway. + +To get an image, for both KERN-[AB] and ROOT-[AB], + +Build the usb tool: (cd usb && go build .) + +Plug in the chromeos-formatted USB stick. + +./usb/usb --fetch=true --dev=/dev/your-usb-stick + +e.g. +./usb/usb --fetch=true --dev=/dev/sdb + +usb will default to /dev/null, which makes it easy to test it. You can also run travis.sh to test. + +You can skip the -fetch=true on second or later runs of usb. + +This defaults to writing the A image (partitions 2 and 3). To use the B image, invoke usb with --useB=true diff --git a/nichrome/RELEASES b/nichrome/RELEASES new file mode 100644 index 000000000..9c3378d58 --- /dev/null +++ b/nichrome/RELEASES @@ -0,0 +1,13 @@ +# Releases + +A new release happens every 6 weeks: + +- 1st day on the first month of each quarter +- 15th day of the second month of each quarter + +## v1.0.0 (2018-10-01) + +- Initial release +- Tested with: + - Linux 4.12.7 + - Golang 1.10.3 diff --git a/nichrome/StandardChromeGPT b/nichrome/StandardChromeGPT new file mode 100644 index 000000000..628edb37e --- /dev/null +++ b/nichrome/StandardChromeGPT @@ -0,0 +1,20774 @@ +[ +{ + "Signature": 6075990659671082565, + "Revision": 65536, + "HeaderSize": 92, + "CRC": 2966418611, + "Reserved": 0, + "CurrentLBA": 1, + "BackupLBA": 4595647, + "FirstLBA": 34, + "LastLBA": 4595614, + "DiskGUID": "52502ffa-7482-4db3-a5a4-5eb5b65f894e", + "PartStart": 2, + "NPart": 128, + "PartSize": 128, + "PartCRC": 1883088094, + "Parts": [ + { + "PartGUID": "a2a0d0eb-e5b9-3344-87c0-68b6b72699c7", + "UniqueGUID": "c802929e-327e-4202-b028-98af23c69f09", + "FirstLBA": 4534272, + "LastLBA": 4562943, + "Attribute": 0, + "Name": [ + 83, + 0, + 84, + 0, + 65, + 0, + 84, + 0, + 69, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "c2e853ba-949a-4852-bbff-41f0e030d2f3", + "FirstLBA": 20480, + "LastLBA": 53247, + "Attribute": 143833713099145216, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 65, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "e08debd8-e1c2-4ef0-a718-1b43a978eea4", + "FirstLBA": 1892352, + "LastLBA": 4534271, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 65, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "c76aab65-c31c-4452-b10e-00edfac4c904", + "FirstLBA": 53248, + "LastLBA": 86015, + "Attribute": 0, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 66, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "16d7f95c-7f25-409b-a93b-1f845dfc4cf9", + "FirstLBA": 1888256, + "LastLBA": 1892351, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 66, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "bbda8f49-d025-4c25-8ae7-cc957e74d56d", + "FirstLBA": 16448, + "LastLBA": 16448, + "Attribute": 0, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 67, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "6ab1b454-ea05-45f8-bbc8-f02658001f0e", + "FirstLBA": 16449, + "LastLBA": 16449, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 67, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "a2a0d0eb-e5b9-3344-87c0-68b6b72699c7", + "UniqueGUID": "673c5166-5e71-46be-835e-254a4601c9d2", + "FirstLBA": 86016, + "LastLBA": 1724415, + "Attribute": 0, + "Name": [ + 79, + 0, + 69, + 0, + 77, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "3d750a2e-489e-b043-8337-b15192cb1b5e", + "UniqueGUID": "9561fb22-8ffe-4eb4-ba96-cbb9ec3417d0", + "FirstLBA": 16450, + "LastLBA": 16450, + "Attribute": 0, + "Name": [ + 114, + 0, + 101, + 0, + 115, + 0, + 101, + 0, + 114, + 0, + 118, + 0, + 101, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "3d750a2e-489e-b043-8337-b15192cb1b5e", + "UniqueGUID": "e84a7f5e-cc26-42ea-bb4e-f568d71f61ee", + "FirstLBA": 16451, + "LastLBA": 16451, + "Attribute": 0, + "Name": [ + 114, + 0, + 101, + 0, + 115, + 0, + 101, + 0, + 114, + 0, + 118, + 0, + 101, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "8ee8b6ca-f3ab-0241-a07a-d4bb9be3c1d3", + "UniqueGUID": "ffeb4bb5-5a6c-4cf4-b36e-9e073a993088", + "FirstLBA": 64, + "LastLBA": 16447, + "Attribute": 0, + "Name": [ + 82, + 0, + 87, + 0, + 70, + 0, + 87, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "28732ac1-1ff8-d211-ba4b-00a0c93ec93b", + "UniqueGUID": "56742ad8-1e43-4aa3-9345-3e7377be9e65", + "FirstLBA": 1855488, + "LastLBA": 1888255, + "Attribute": 0, + "Name": [ + 69, + 0, + 70, + 0, + 73, + 0, + 45, + 0, + 83, + 0, + 89, + 0, + 83, + 0, + 84, + 0, + 69, + 0, + 77, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ] +}, +{ + "Signature": 6075990659671082565, + "Revision": 65536, + "HeaderSize": 92, + "CRC": 3225090498, + "Reserved": 0, + "CurrentLBA": 4595647, + "BackupLBA": 1, + "FirstLBA": 34, + "LastLBA": 4595614, + "DiskGUID": "52502ffa-7482-4db3-a5a4-5eb5b65f894e", + "PartStart": 4595615, + "NPart": 128, + "PartSize": 128, + "PartCRC": 1883088094, + "Parts": [ + { + "PartGUID": "a2a0d0eb-e5b9-3344-87c0-68b6b72699c7", + "UniqueGUID": "c802929e-327e-4202-b028-98af23c69f09", + "FirstLBA": 4534272, + "LastLBA": 4562943, + "Attribute": 0, + "Name": [ + 83, + 0, + 84, + 0, + 65, + 0, + 84, + 0, + 69, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "c2e853ba-949a-4852-bbff-41f0e030d2f3", + "FirstLBA": 20480, + "LastLBA": 53247, + "Attribute": 143833713099145216, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 65, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "e08debd8-e1c2-4ef0-a718-1b43a978eea4", + "FirstLBA": 1892352, + "LastLBA": 4534271, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 65, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "c76aab65-c31c-4452-b10e-00edfac4c904", + "FirstLBA": 53248, + "LastLBA": 86015, + "Attribute": 0, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 66, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "16d7f95c-7f25-409b-a93b-1f845dfc4cf9", + "FirstLBA": 1888256, + "LastLBA": 1892351, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 66, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "5d2a3afe-324f-a741-b725-accc3285a309", + "UniqueGUID": "bbda8f49-d025-4c25-8ae7-cc957e74d56d", + "FirstLBA": 16448, + "LastLBA": 16448, + "Attribute": 0, + "Name": [ + 75, + 0, + 69, + 0, + 82, + 0, + 78, + 0, + 45, + 0, + 67, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "02e2b83c-7e3b-dd47-8a3c-7ff2a13cfcec", + "UniqueGUID": "6ab1b454-ea05-45f8-bbc8-f02658001f0e", + "FirstLBA": 16449, + "LastLBA": 16449, + "Attribute": 0, + "Name": [ + 82, + 0, + 79, + 0, + 79, + 0, + 84, + 0, + 45, + 0, + 67, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "a2a0d0eb-e5b9-3344-87c0-68b6b72699c7", + "UniqueGUID": "673c5166-5e71-46be-835e-254a4601c9d2", + "FirstLBA": 86016, + "LastLBA": 1724415, + "Attribute": 0, + "Name": [ + 79, + 0, + 69, + 0, + 77, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "3d750a2e-489e-b043-8337-b15192cb1b5e", + "UniqueGUID": "9561fb22-8ffe-4eb4-ba96-cbb9ec3417d0", + "FirstLBA": 16450, + "LastLBA": 16450, + "Attribute": 0, + "Name": [ + 114, + 0, + 101, + 0, + 115, + 0, + 101, + 0, + 114, + 0, + 118, + 0, + 101, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "3d750a2e-489e-b043-8337-b15192cb1b5e", + "UniqueGUID": "e84a7f5e-cc26-42ea-bb4e-f568d71f61ee", + "FirstLBA": 16451, + "LastLBA": 16451, + "Attribute": 0, + "Name": [ + 114, + 0, + 101, + 0, + 115, + 0, + 101, + 0, + 114, + 0, + 118, + 0, + 101, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "8ee8b6ca-f3ab-0241-a07a-d4bb9be3c1d3", + "UniqueGUID": "ffeb4bb5-5a6c-4cf4-b36e-9e073a993088", + "FirstLBA": 64, + "LastLBA": 16447, + "Attribute": 0, + "Name": [ + 82, + 0, + 87, + 0, + 70, + 0, + 87, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "28732ac1-1ff8-d211-ba4b-00a0c93ec93b", + "UniqueGUID": "56742ad8-1e43-4aa3-9345-3e7377be9e65", + "FirstLBA": 1855488, + "LastLBA": 1888255, + "Attribute": 0, + "Name": [ + 69, + 0, + 70, + 0, + 73, + 0, + 45, + 0, + 83, + 0, + 89, + 0, + 83, + 0, + 84, + 0, + 69, + 0, + 77, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "PartGUID": "00000000-0000-0000-0000-000000000000", + "UniqueGUID": "00000000-0000-0000-0000-000000000000", + "FirstLBA": 0, + "LastLBA": 0, + "Attribute": 0, + "Name": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ] +} +] diff --git a/nichrome/azure-pipelines.yml b/nichrome/azure-pipelines.yml new file mode 100644 index 000000000..71a521ce3 --- /dev/null +++ b/nichrome/azure-pipelines.yml @@ -0,0 +1,41 @@ +# Go +# Build your Go project. +# Add steps that test, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/go + +trigger: +- master + +pool: + vmImage: 'Ubuntu-16.04' + +variables: + GOBIN: '$(GOPATH)/bin' # Go binaries path + GOROOT: '/usr/local/go1.12' # Go installation path + GOPATH: '$(system.defaultWorkingDirectory)/gopath' # Go workspace path + modulePath: '$(GOPATH)/src/github.com/$(build.repository.name)' # Path to the module's code + +steps: +- script: | + mkdir -p '$(GOBIN)' + mkdir -p '$(GOPATH)/pkg' + mkdir -p '$(modulePath)' + shopt -s extglob + mv !(gopath) '$(modulePath)' + echo '##vso[task.prependpath]$(GOBIN)' + echo '##vso[task.prependpath]$(GOROOT)/bin' + displayName: 'Set up the Go workspace' + +- script: | + go version + go get -v -t -d ./... + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + fi + pwd + echo $GOPATH + (cd usb && go build .) + ./usb/usb --apt=true --fetch=true --dev=/dev/null + workingDirectory: '$(modulePath)' + displayName: 'Get dependencies, then build' diff --git a/nichrome/cmds/install/install.go b/nichrome/cmds/install/install.go new file mode 100644 index 000000000..6dcae17a6 --- /dev/null +++ b/nichrome/cmds/install/install.go @@ -0,0 +1,172 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// install installs a NiChrome image from a USB stick onto the local drive. +// It verifies, first, that it can enumerate the partitions correctly +// on the destination. It uses guid_root to rewrite the GPT partition +// guids for the target partition(s). +// It defaults to only installing the B images, since we assume +// for now we are still in hacker mode. + +// +build go1.11 + +package main + +import ( + "fmt" + flag "github.com/spf13/pflag" + "io" + "io/ioutil" + "log" + "os" + "strings" + + "github.com/u-root/u-root/pkg/cpio" + "github.com/u-root/u-root/pkg/mount/gpt" +) + +var cmdline = make(map[string]string) + +func parseCmdline() { + b, err := ioutil.ReadFile("/proc/cmdline") + if err != nil { + log.Printf("Can't read command line: %v", err) + } + for _, s := range strings.Fields(string(b)) { + f := strings.SplitN(s, "=", 2) + if len(f) == 0 { + continue + } + if len(f) == 1 { + f = []string{f[0], "1"} + } + cmdline[f[0]] = f[1] + } +} + +// Find the boot media containing the root GUID. +func findKernDev(devs ...string) (string, gpt.GUID, error) { + rg, ok := cmdline["guid_root"] + if !ok { + return "", gpt.GUID{}, fmt.Errorf("No guid_root cmdline parameter") + } + for _, d := range devs { + fi, err := os.Stat(d) + if fi == nil || err != nil { + log.Print(err) + continue + } + if fi.Mode()&os.ModeType != os.ModeDevice { + log.Printf("%v is not a device", d) + continue + } + f, err := os.Open(d) + if err != nil { + log.Print(err) + continue + } + pt, err := gpt.New(f) + f.Close() + if err != nil { + log.Print(err) + continue + } + // install media is always KERN-A, second partition. + if pt.Primary.Parts[1].UniqueGUID.String() == rg { + log.Printf("%v: GUID %s matches for partition 2\n", d, rg) + return fmt.Sprintf("%s", d), pt.Primary.Parts[1].UniqueGUID, nil + } + } + return "", gpt.GUID{}, fmt.Errorf("A device with that GUID was not found") +} + +func main() { + flag.Parse() + if len(flag.Args()) < 1 { + flag.Usage() + log.Fatalf("install [options] dest-device") + } + + parseCmdline() + + d, u, err := findKernDev("/dev/sda", "/dev/sdb") + if err != nil { + log.Fatal(err) + } + // For now we always go with the B side. This means we need to change the + // GUID in the GPT for partition 4. + log.Printf("Install Media is on %s", d) + + // We're going to be a bit paranoid in the order in which we do things. + // open the device and read the GPT. + // open both output partitions writeable to make sure that works. + // open input partitions. + // write the unchanged GPT back to the target as a test. + // write KERN-B + // write ROOT-B + // write the changed GPT with the new KERN-B UniqueGUID + // With luck, if there's a problem, we hit it long before + // we doing anything irreversible. + + dest := flag.Args()[0] + destDev, err := os.OpenFile(dest, os.O_RDWR, 0) + if err != nil { + log.Fatal(err) + } + pt, err := gpt.New(destDev) + if err != nil { + log.Fatal(err) + } + + // What a hack. mmc doesn't follow the venerable + // naming conventions. + var hack string + if strings.HasPrefix(dest, "/dev/mmc") { + log.Printf("It's mmc, add hack") + hack = "p" + } + log.Printf("Installing on %s%s{4,5}", dest, hack) + destKern, err := os.OpenFile(dest+hack+"4", os.O_RDWR, 0) + if err != nil { + log.Fatal(err) + } + destRoot, err := os.OpenFile(dest+hack+"5", os.O_RDWR, 0) + if err != nil { + log.Fatal(err) + } + + kern, err := os.Open(d + "2") + if err != nil { + log.Fatal(err) + } + root, err := os.Open(d + "3") + if err != nil { + log.Fatal(err) + } + // Point of no return. Fix the GUID on the device. + // Write the old GPT back first to see if writes even work. + if err := gpt.Write(destDev, pt); err != nil { + log.Fatal(err) + } + if _, err := io.Copy(destKern, kern); err != nil { + log.Fatal(err) + } + + archiver, err := cpio.Format("newc") + if err != nil { + log.Fatalf("newc not supported: %v", err) + } + + r := archiver.Reader(root) + w := archiver.Writer(destRoot) + if err := cpio.Passthrough(r, w); err != nil { + log.Fatal(err) + } + pt.Primary.Parts[3].UniqueGUID = u + pt.Backup.Parts[3].UniqueGUID = u + if err := gpt.Write(destDev, pt); err != nil { + log.Fatal(err) + } + log.Printf("All done. restart in chromeos and cgpt add -i 4 -P 2 -S 0 -T 1 %v", dest) +} diff --git a/nichrome/cmds/sos/sos.go b/nichrome/cmds/sos/sos.go new file mode 100644 index 000000000..b60921c60 --- /dev/null +++ b/nichrome/cmds/sos/sos.go @@ -0,0 +1,22 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "flag" + "log" + "os/exec" + + "github.com/u-root/NiChrome/pkg/sos" +) + +var htmlRoot = flag.String("html", "/etc/sos/html", "Path for root of SOS html files") + +func main() { + if o, err := exec.Command("ip", "link", "set", "dev", "lo", "up").CombinedOutput(); err != nil { + log.Fatalf("ip link set dev lo: %v (%v)", string(o), err) + } + sos.StartServer(sos.NewSosService()) +} diff --git a/nichrome/cmds/timesos/server.go b/nichrome/cmds/timesos/server.go new file mode 100644 index 000000000..6ed2a5fb8 --- /dev/null +++ b/nichrome/cmds/timesos/server.go @@ -0,0 +1,189 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "fmt" + "html/template" + "io/ioutil" + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/u-root/NiChrome/pkg/sos" +) + +const ( + DefHtmlPage = ` + + + + + +

System Time Settings

+ + + + + + + + + +
+ + ` +) + +type TimeServer struct { + service *TimeService +} + +var ( + Port uint +) + +func (ts *TimeServer) displayStateHandle(w http.ResponseWriter, r *http.Request) { + ts.service.Update() + timeData := struct { + Date string + Time string + Port uint + }{ts.service.Date, ts.service.Time, Port} + var tmpl *template.Template + file, err := ioutil.ReadFile(sos.HTMLPath("time.html")) + if err == nil { + html := string(file) + tmpl = template.Must(template.New("SoS").Parse(html)) + } else { + tmpl = template.Must(template.New("SoS").Parse(DefHtmlPage)) + } + tmpl.Execute(w, timeData) +} + +func (ts *TimeServer) autoHandle(w http.ResponseWriter, r *http.Request) { + if err := ts.service.AutoSetTime(); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{fmt.Sprintf("Unable to set time. Are you online?")}) + return + } + json.NewEncoder(w).Encode(nil) +} + +type TimeJsonMsg struct { + Date string + Time string +} + +func (ts *TimeServer) manHandle(w http.ResponseWriter, r *http.Request) { + var msg TimeJsonMsg + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + if err := ts.service.ManSetTime(msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +func (ts *TimeServer) buildRouter() *mux.Router { + r := mux.NewRouter() + r.HandleFunc("/", ts.displayStateHandle).Methods("GET") + r.HandleFunc("/auto", ts.autoHandle).Methods("POST") + r.HandleFunc("/manual", ts.manHandle).Methods("POST") + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(sos.HTMLPath("css"))))) + return r +} + +// Start opens the server at localhost:{port}, where port is provided automatically +// by the SoS. +func (ts *TimeServer) Start() { + listener, port, err := sos.GetListener() + if err != nil { + log.Fatalf("error: %v", err) + } + Port = port + fmt.Println(sos.StartServiceServer(ts.buildRouter(), "time", listener, Port)) +} + +// NewTimeServer creates a server with the given TimeService. +func NewTimeServer(service *TimeService) *TimeServer { + return &TimeServer{ + service: service, + } +} diff --git a/nichrome/cmds/timesos/service.go b/nichrome/cmds/timesos/service.go new file mode 100644 index 000000000..a496955bc --- /dev/null +++ b/nichrome/cmds/timesos/service.go @@ -0,0 +1,68 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "os/exec" + "strconv" + "syscall" + "time" +) + +type TimeService struct { + Date string + Time string +} + +func getCurrentDate() string { + return time.Now().Format("2006-01-02") +} + +func getCurrentTime() string { + return time.Now().Format("15:04") +} + +func parseDate(d TimeJsonMsg) time.Time { + // split date message into integers for each field + YYYY, _ := strconv.Atoi(d.Date[:4]) + MM, _ := strconv.Atoi(d.Date[5:7]) + DD, _ := strconv.Atoi(d.Date[8:]) + + hh, _ := strconv.Atoi(d.Time[:2]) + mm, _ := strconv.Atoi(d.Time[3:]) + + return time.Date(YYYY, time.Month(MM), DD, hh, mm, 0, 0, time.UTC) +} + +// Update sets the TimeService fields to the current system time +func (ts *TimeService) Update() { + ts.Date = getCurrentDate() + ts.Time = getCurrentTime() +} + +// AutoSetTime calls the ntpdate u-root command to get +// the current date from time.google.com +func (ts TimeService) AutoSetTime() error { + return exec.Command("ntpdate").Run() +} + +// ManSetTime sets the system time similarly to u-root's "date" command with +// user-entered fields +func (ts TimeService) ManSetTime(new TimeJsonMsg) error { + userTime := parseDate(new) + tv := syscall.NsecToTimeval(userTime.UnixNano()) + if err := syscall.Settimeofday(&tv); err != nil { + return err + } + return nil +} + +// NewTimeService builds a TimeService with the current system date and time +func NewTimeService() (*TimeService, error) { + return &TimeService{ + Date: getCurrentDate(), + Time: getCurrentTime(), + }, nil +} diff --git a/nichrome/cmds/timesos/time_sos.go b/nichrome/cmds/timesos/time_sos.go new file mode 100644 index 000000000..1ee57ff5b --- /dev/null +++ b/nichrome/cmds/timesos/time_sos.go @@ -0,0 +1,17 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "log" +) + +func main() { + service, err := NewTimeService() + if err != nil { + log.Fatal(err) + } + NewTimeServer(service).Start() +} diff --git a/nichrome/cmds/uinit/uinit.go b/nichrome/cmds/uinit/uinit.go new file mode 100644 index 000000000..433d799d3 --- /dev/null +++ b/nichrome/cmds/uinit/uinit.go @@ -0,0 +1,481 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This is the basic chromebook uinit. + +// +build go1.11 + +package main + +import ( + "fmt" + flag "github.com/spf13/pflag" + "io" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strings" + "syscall" + "time" + + "github.com/u-root/u-root/pkg/cpio" + "github.com/u-root/u-root/pkg/mount/gpt" + "github.com/u-root/u-root/pkg/uroot/util" +) + +// For now we are going to stick with a single +// version of tcz packages. It's not possible +// with their design to mix versions. +const ( + tczs = "/tcz/8.x/*/tcz/*.tcz" + homeEnv = "/home/user" + userEnv = "user" + passwd = "root:x:0:0:root:/:/bin/bash\nuser:x:1000:1000:" + userEnv + ":" + homeEnv + ":/bin/bash\n" + hosts = "127.0.0.1 localhost\n" +) + +var ( + rootStartCmds = []string{"sos", "wifi", "timesos"} + userStartCmds = []string{"wingo", "AppChrome", "upspinsos", "chrome"} + cmdline = make(map[string]string) + debug = func(string, ...interface{}) {} + usernamespace = flag.Bool("usernamespace", false, "Set up user namespaces and spawn login") + user = flag.Bool("user", false, "Ru as a user") + login = flag.Bool("login", false, "Login as a user") + verbose bool +) + +func tczSetup() error { + g, err := filepath.Glob(tczs) + if err != nil { + log.Printf("Glob of %v: %v", tczs, err) + } + debug("Tcz file list: %v", g) + // Now get the basenames, and then install them. + // TODO: fix up tcz to take a path name? + // The glob ensured they all end in .tcz. + // We can just take all but the last 4 chars of the name. + var tczlist []string + for _, p := range g { + b := filepath.Base(p) + tczlist = append(tczlist, b[:len(b)-4]) + } + + log.Printf("Installing %d tinycore packages...", len(tczlist)) + cmd := exec.Command("tcz", append([]string{"-v", "8.x"}, tczlist...)...) + log.Print("Done") + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + return cmd.Run() +} + +func parseCmdline() { + b, err := ioutil.ReadFile("/proc/cmdline") + if err != nil { + log.Printf("Can't read command line: %v", err) + } + for _, s := range strings.Fields(string(b)) { + f := strings.SplitN(s, "=", 2) + if len(f) == 0 { + continue + } + if len(f) == 1 { + f = []string{f[0], "1"} + } + cmdline[f[0]] = f[1] + } +} + +// Find the root GUID. +func findRoot(devs ...string) (string, error) { + rg, ok := cmdline["guid_root"] + if !ok { + return "", fmt.Errorf("No root_guid cmdline parameter") + } + for _, d := range devs { + fi, err := os.Stat(d) + if fi == nil || err != nil { + log.Print(err) + continue + } + if fi.Mode()&os.ModeType != os.ModeDevice { + log.Printf("%v is not a device", d) + continue + } + f, err := os.Open(d) + if err != nil { + log.Print(err) + continue + } + pt, err := gpt.New(f) + f.Close() + if err != nil { + log.Print(err) + continue + } + for i, p := range pt.Primary.Parts { + var zero gpt.GUID + if p.UniqueGUID == zero { + continue + } + if p.UniqueGUID.String() == rg { + log.Printf("%v: GUID %s matches for partition %d (map to %d)\n", d, rg, i, i+2) + // non standard naming. Grumble. + var hack string + if strings.HasPrefix(d, "/dev/mmc") { + hack = "p" + } + return fmt.Sprintf("%s%s%d", d, hack, i+2), nil + } + log.Printf("%v: part %d, Device GUID %v, GUID %s no match", d, i, p.UniqueGUID.String(), rg) + } + } + return "", fmt.Errorf("A device with that GUID was not found") +} + +func x11(n string, args ...string) error { + out := os.Stdout + f, err := ioutil.TempFile("", filepath.Base(n)) + if err != nil { + log.Print(err) + } else { + out = f + } + cmd := exec.Command(n, args...) + cmd.Env = append(os.Environ(), "DISPLAY=:0") + cmd.Stdout, cmd.Stderr = out, out + if err := cmd.Run(); err != nil { + return fmt.Errorf("X11 start %v %v: %v", n, args, err) + } + return nil +} + +// When we make the transition to a new user we need to set up a new namespace for that user. +// So far the only thing we know we need to do is remount ubin, tmp, env, and go/pkg +// The tmp is particularly useful as it avoids races between root-owned files and files +// for this user. +var ( + namespace = []util.Creator{ + util.Mount{Source: "tmpfs", Target: "/go/pkg/linux_amd64", FSType: "tmpfs"}, + util.Mount{Source: "tmpfs", Target: "/dev/shm", FSType: "tmpfs"}, + util.Mount{Source: "tmpfs", Target: "/ubin", FSType: "tmpfs"}, + util.Mount{Source: "tmpfs", Target: "/pkg", FSType: "tmpfs"}, + } + rootFileSystem = []util.Creator{ + util.Dir{Name: "/go/pkg/linux_amd64", Mode: 0777}, + util.Dir{Name: "/dev/shm", Mode: 0777}, + util.Dir{Name: "/pkg", Mode: 0777}, + util.Dir{Name: "/ubin", Mode: 0777}, + // fusermount requires this. When we write our own we can remove this. + util.Symlink{NewPath: "/etc/mtab", Target: "/proc/mounts"}, + // Sigh. + util.Symlink{NewPath: "/bin/sh", Target: "/bin/bash"}, + // Resolve localhost name + util.File{Name: "/etc/hosts", Contents: "127.0.0.1\tlocalhost\n::1\tlocalhost ip6-localhost ip6-loopback\n", Mode: 0644}, + } +) + +func xrun() error { + // At this point we are still root. + if err := os.Symlink("/usr/local/bin/bash", "/bin/bash"); err != nil { + return err + } + if err := os.Symlink("/lib/ld-linux-x86-64.so.2", "/lib64/ld-linux-x86-64.so.2"); err != nil { + return err + } + go func() { + cmd := exec.Command("Xfbdev") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("X11 startup: %v", err) + } + }() + for { + s, err := filepath.Glob("/tmp/.X*/X?") + if err != nil { + return err + } + if len(s) > 0 { + break + } + time.Sleep(time.Second) + } + return nil +} + +func dousernamespace() error { + // start us as a child again with a private name space. + // Limitations of the Go runtime mandate doing it this way. + + // due to limits of Go runtime we have to run ourselves again with -login + // and build a namespace. + cmd := exec.Command("/bbin/uinit", "--login") + cmd.SysProcAttr = &syscall.SysProcAttr{Unshareflags: syscall.CLONE_NEWNS} + cmd.Env = append(os.Environ(), fmt.Sprintf("USER=%v", userEnv), fmt.Sprintf("HOME=%v", homeEnv)) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Start(); err != nil { + return fmt.Errorf("donamespace: %v", err) + } + return nil +} + +func dologin() error { + // Here we need to create the new namespace and then start our children. + var err error + for _, c := range namespace { + if err = c.Create(); err != nil { + return fmt.Errorf("Error creating %s: %vi; not starting user x11 programs", c, err) + } + } + + if err == nil { + // due to limits of Go runtime we have to run ourselves again with -user. + cmd := exec.Command("/bbin/uinit", "--user") + cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: 1000, Gid: 1000, NoSetGroups: true}} + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("X11 user startup: %v", err) + } + } + return nil +} + +func homedir() error { + f, err := os.Open("/usr/user.cpio") + if err != nil { + return err + } + archiver, err := cpio.Format("newc") + if err != nil { + return err + } + rr := archiver.Reader(f) + for { + rec, err := rr.ReadRecord() + if err == io.EOF { + break + } + if err != nil { + return fmt.Errorf("error reading records: %v", err) + } + debug("Creating %s\n", rec) + if err := cpio.CreateFile(rec); err != nil { + log.Printf("Creating %q failed: %v", rec.Name, err) + } + } + return nil +} + +func xrunuser() error { + for _, f := range userStartCmds { + log.Printf("Run %v", f) + go x11(f) + } + + // we block on the aterm. When the aterm exits, we do too. + return x11("/usr/local/bin/aterm") +} + +func cpioRoot(r string) error { + var err error + log.Printf("Try device %v", r) + cmd := exec.Command("cpio", "i") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if cmd.Stdin, err = os.Open(r); err != nil { + return fmt.Errorf("%v", err) + } + if err := cmd.Run(); err != nil { + return fmt.Errorf("cpio of tcz failed %v", err) + } + return nil +} + +// This is a best effort. It does not return an error because +// an error may not really be an error; we may be intentionally +// running without a root. +func guidRoot() { + // USB sucks. + // We've tried a few variants of this loop so far trying for + // 10 seconds and waiting for 1 second each time has been the best. + for i := 0; i < 10; i++ { + r, err := findRoot("/dev/sda", "/dev/sdb", "/dev/mmcblk0", "/dev/mmcblk1") + if err != nil { + log.Printf("Could not find root: %v", err) + } else { + if err := cpioRoot(r); err == nil { + break + } + } + time.Sleep(time.Second) + } +} + +func main() { + // nasty, but I'm sick of losing boot messages. + f, err := os.OpenFile("/log", os.O_RDWR|os.O_CREATE, 0755) + if err == nil { + fd := int(f.Fd()) + if err := syscall.Dup2(fd, 1); err != nil { + log.Printf("Could not dup %v over 1: %v", fd, err) + } + if err := syscall.Dup2(fd, 2); err != nil { + log.Printf("Could not dup %v over 2: %v", fd, err) + } + } else { + log.Printf("Can't open /log: %v", err) + } + log.Print("Welcome to NiChrome!") + flag.Parse() + if *usernamespace { + if err := dousernamespace(); err != nil { + log.Fatal(err) + } + os.Exit(0) + } + + if *login { + if err := dologin(); err != nil { + log.Fatal(err) + } + os.Exit(0) + } + + if *user { + log.Print("Starting up user mode processes") + if err := homedir(); err != nil { + log.Printf("Could not populate %v, err %v: continuing anyway", homeEnv, err) + } + if err := xrunuser(); err != nil { + log.Fatalf("x11 user failed: %v", err) + } + os.Exit(0) + } + + parseCmdline() + + if _, ok := cmdline["uinitdebug"]; ok { + debug = log.Printf + verbose = true + } + + if d, ok := cmdline["nichromeroot"]; ok { + cpioRoot(d) + } else { + guidRoot() + } + + if err := tczSetup(); err != nil { + log.Printf("tczSetup: %v", err) + } + + // buildbin was not populated, potentially, so we have to do it again. + c, err := filepath.Glob("/src/github.com/u-root/*/cmds/*/[a-z]*") + if err != nil || len(c) == 0 { + log.Printf("In a break with tradition, you seem to have NO u-root commands: %v", err) + } + o, err := filepath.Glob("/src/*/*/*") + if err != nil { + log.Printf("Your filepath glob for other commands seems busted: %v", err) + } + c = append(c, o...) + for _, v := range c { + name := filepath.Base(v) + if name == "installcommand" || name == "init" { + continue + } else { + destPath := filepath.Join("/buildbin", name) + source := "/buildbin/installcommand" + if err := os.Symlink(source, destPath); err != nil { + log.Printf("Symlink %v -> %v failed; %v", source, destPath, err) + } + } + } + + a := []string{"build"} + envs := os.Environ() + debug("envs %v", envs) + //os.Setenv("GOBIN", "/buildbin") + // util.CmdsPath vanished + //a = append(a, "-o", "/buildbin/installcommand", filepath.Join(util.CmdsPath, "installcommand")) + a = append(a, "-o", "/buildbin/installcommand", "github.com/u-root/u-root/cmds/core/installcommand") + icmd := exec.Command("go", a...) + installenvs := envs + installenvs = append(envs, "GOBIN=/buildbin") + icmd.Env = installenvs + icmd.Dir = "/" + + icmd.Stdin = os.Stdin + icmd.Stderr = os.Stderr + icmd.Stdout = os.Stdout + debug("Run %v", icmd) + if err := icmd.Run(); err != nil { + log.Printf("%v\n", err) + } + + cmd := exec.Command("ip", "addr", "add", "127.0.0.1/24", "lo") + if o, err := cmd.CombinedOutput(); err != nil { + log.Printf("ip link failed(%v, %v); continuing", string(o), err) + } + cmd = exec.Command("ip", "link", "set", "dev", "lo", "up") + if o, err := cmd.CombinedOutput(); err != nil { + log.Printf("ip link up failed(%v, %v); continuing", string(o), err) + } + + for _, c := range rootFileSystem { + if err = c.Create(); err != nil { + log.Printf("Error creating %s: %vi; not starting user x11 programs", c, err) + } + } + + // AppImages need /dev/fuse to be 0666, even though they also use the + // suid fusermount, which does not need /dev/fuse to be 0666. Oh well. + if err := os.Chmod("/dev/fuse", 0666); err != nil { + log.Printf("chmod of /dev/fuse to 0666 failed: %v", err) + } + + // If they did not supply a password file, we have to supply a simple + // one or tools like fusermount will fail. We hope soon to have a + // u-root implementation of fusermount that's not so particular. + if _, err := os.Stat("/etc/passwd"); err != nil { + if err := ioutil.WriteFile("/etc/passwd", []byte(passwd), os.FileMode(0644)); err != nil { + log.Printf("Error creating /etc/passwd: %v", err) + } + } + // If they did not supply a hosts file, we need one for localhost. + if _, err := os.Stat("/etc/hosts"); err != nil { + if err := ioutil.WriteFile("/etc/hosts", []byte(hosts), os.FileMode(0644)); err != nil { + log.Printf("Error creating /etc/hosts: %v", err) + } + } + if err := xrun(); err != nil { + log.Fatalf("xrun failed %v:", err) + } + + // HACK. + // u-root is setting bogus modes on /. fix it. + // hack for new u-root cpio bug. + // We may just leave this here forever, since the failure is so hard + // to diagnose. + if err := os.Chmod("/", 0777); err != nil { + log.Print(err) + } + + for _, f := range rootStartCmds { + log.Printf("Run %v", f) + go x11(f) + // we have to give it a little time until we make it smarter + time.Sleep(2 * time.Second) + } + + if err := dousernamespace(); err != nil { + log.Printf("dousernamespace: %v", err) + } + + // kick off one user shell so they can do what needs to be done. + // When this ends we exit everything. + if err := x11("/usr/local/bin/aterm"); err != nil { + log.Printf("Starting root aterm: %v", err) + } +} diff --git a/nichrome/cmds/upspinsos/server.go b/nichrome/cmds/upspinsos/server.go new file mode 100644 index 000000000..ec23eb1da --- /dev/null +++ b/nichrome/cmds/upspinsos/server.go @@ -0,0 +1,223 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "fmt" + "html/template" + "io/ioutil" + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/u-root/NiChrome/pkg/sos" +) + +const ( + DefHtmlPage = ` + + + + + + + {{$user := .User}} + {{$dir := .Dir}} + {{$store := .Store}} + {{$seed := .Seed}} +

Upspin

+ + + + + + + + + + + + + + + +
UsernameDir ServerStore ServerSecret Seed
+ +` +) + +type UpspinServer struct { + service *UpspinService +} + +var ( + Port uint +) + +func (us *UpspinServer) editHandle(w http.ResponseWriter, r *http.Request) { + us.service.ToggleFlag() + json.NewEncoder(w).Encode(nil) +} + +type UpspinAcctJsonMsg struct { + User string + Dir string + Store string + Seed string +} + +func (us *UpspinServer) submitHandle(w http.ResponseWriter, r *http.Request) { + us.service.ToggleFlag() + var msg UpspinAcctJsonMsg + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + if err := us.service.SetConfig(msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +func (us *UpspinServer) displayStateHandle(w http.ResponseWriter, r *http.Request) { + us.service.Update() + upspinData := struct { + Configured bool + User string + Dir string + Store string + Seed string + Port uint + }{us.service.Configured, us.service.User, us.service.Dir, us.service.Store, us.service.Seed, Port} + var tmpl *template.Template + file, err := ioutil.ReadFile(sos.HTMLPath("upspin.html")) + if err == nil { + html := string(file) + tmpl = template.Must(template.New("SoS").Parse(html)) + } else { + tmpl = template.Must(template.New("SoS").Parse(DefHtmlPage)) + } + tmpl.Execute(w, upspinData) +} + +func (us *UpspinServer) buildRouter() *mux.Router { + r := mux.NewRouter() + r.HandleFunc("/", us.displayStateHandle).Methods("GET") + r.HandleFunc("/edit", us.editHandle).Methods("POST") + r.HandleFunc("/submit", us.submitHandle).Methods("POST") + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(sos.HTMLPath("css"))))) + return r +} + +func (us *UpspinServer) Start() { + listener, port, err := sos.GetListener() + if err != nil { + log.Fatalf("error: %v", err) + } + Port = port + fmt.Println(sos.StartServiceServer(us.buildRouter(), "upspin", listener, Port)) +} + +func NewUpspinServer(service *UpspinService) *UpspinServer { + return &UpspinServer{ + service: service, + } +} diff --git a/nichrome/cmds/upspinsos/service.go b/nichrome/cmds/upspinsos/service.go new file mode 100644 index 000000000..36836172b --- /dev/null +++ b/nichrome/cmds/upspinsos/service.go @@ -0,0 +1,139 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +var ( + upspinConfigDir = flag.String("configdir", filepath.Join(os.Getenv("HOME"), "upspin"), "path for Upspin config file") + upspinKeyDir = flag.String("keydir", filepath.Join(os.Getenv("HOME"), ".ssh"), "path for username directory to hold key files") +) + +type UpspinService struct { + Configured bool + User string + Dir string + Store string + Seed string +} + +func makeUserDirectories(dir string) error { + if _, err := os.Stat(dir); os.IsNotExist(err) { + if err := os.MkdirAll(dir, 0777); err != nil { + return err + } + return filepath.Walk(dir, func(name string, info os.FileInfo, err error) error { + if err == nil { + err = os.Chown(name, 1000, 1000) + } + return err + }) + } + return nil +} + +func getFileData(path string) map[string]string { + userData := make(map[string]string) + b, err := ioutil.ReadFile(path) + if err != nil { + // start in unconfigured mode using empty map + return userData + } + // regex for finding key-val separator ": [remote,]" and port ":443" + splitpoint := regexp.MustCompile("(: )(.*,|)") + port := regexp.MustCompile("(:443)") + for _, s := range strings.Split(string(b), "\n") { + s := port.ReplaceAllString(s, "") + keyval := splitpoint.Split(s, -1) + if len(keyval) == 2 { + userData[keyval[0]] = keyval[1] + } + } + return userData +} + +func (us UpspinService) setFileData(path string) error { + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + f.WriteString(fmt.Sprintf("username: %v\n", us.User)) + // hardcoded default server prefix and suffix + f.WriteString(fmt.Sprintf("dirserver: remote,%v:443\n", us.Dir)) + f.WriteString(fmt.Sprintf("storeserver: remote,%v:443\n", us.Store)) + f.WriteString("packing: ee\n") + return nil +} + +func (us UpspinService) setKeys(path string) error { + // check if keys are set already + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + args := []string{"keygen", fmt.Sprintf("-secretseed=%v", us.Seed)} + // if the directory is populated, rotate the keys instead of generating new ones + // this method of appending args is ugly, but they have to be in this specific order: + // upspin keygen <-rotate> -secretseed= path + if _, err = f.Readdir(1); err == nil { + args = append(args, "-rotate") + } + + return exec.Command("upspin", append(args, path)...).Run() +} + +func (us *UpspinService) Update() { + data := getFileData(filepath.Join(*upspinConfigDir, "config")) + us.User = data["username"] + us.Dir = data["dirserver"] + us.Store = data["storeserver"] +} + +func (us *UpspinService) ToggleFlag() { + us.Configured = !us.Configured +} + +func (us *UpspinService) SetConfig(new UpspinAcctJsonMsg) error { + us.User = new.User + us.Dir = new.Dir + us.Store = new.Store + us.Seed = new.Seed + makeUserDirectories(*upspinConfigDir) + if err := us.setFileData(filepath.Join(*upspinConfigDir, "config")); err != nil { + return err + } + fullKeyPath := filepath.Join(*upspinKeyDir, us.User) + makeUserDirectories(fullKeyPath) + if err := us.setKeys(fullKeyPath); err != nil { + return err + } + return nil +} + +func NewUpspinService() (*UpspinService, error) { + data := getFileData(filepath.Join(*upspinConfigDir, "config")) + config := false + if len(data) > 0 { + config = true + } + return &UpspinService{ + Configured: config, + User: data["username"], + Dir: data["dirserver"], + Store: data["storeserver"], + Seed: "", + }, nil +} diff --git a/nichrome/cmds/upspinsos/upspin_sos.go b/nichrome/cmds/upspinsos/upspin_sos.go new file mode 100644 index 000000000..e8cf3575b --- /dev/null +++ b/nichrome/cmds/upspinsos/upspin_sos.go @@ -0,0 +1,17 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "log" +) + +func main() { + service, err := NewUpspinService() + if err != nil { + log.Fatal(err) + } + NewUpspinServer(service).Start() +} diff --git a/nichrome/cmds/wifi/server.go b/nichrome/cmds/wifi/server.go new file mode 100644 index 000000000..423e53047 --- /dev/null +++ b/nichrome/cmds/wifi/server.go @@ -0,0 +1,295 @@ +// Copyright 2017 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "fmt" + "html/template" + "io" + "io/ioutil" + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/u-root/NiChrome/pkg/sos" + "github.com/u-root/NiChrome/pkg/wifi" +) + +const ( + DefHtmlPage = ` + + + + + +{{$NoEnc := 0}} +{{$WpaPsk := 1}} +{{$WpaEap := 2}} +{{$connectedEssid := .ConnectedEssid}} +{{$connectingEssid := .ConnectingEssid}} +

Please choose your Wifi

+ + + + + + + + {{range $idx, $opt := .WifiOpts}} + {{if eq $opt.AuthSuite $NoEnc}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else if eq $opt.AuthSuite $WpaPsk}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else if eq $opt.AuthSuite $WpaEap}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else}} + + + + + {{end}} + {{else}} + + {{end}} +
EssidIdentityPassword / Passphrase
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}Not a supported protocol
No essids found
+ +{{if and (ne $connectingEssid "") (ne $connectingEssid $connectedEssid) }} + +{{end}} + +` +) + +var ( + Port uint +) + +type WifiServer struct { + service *WifiService +} + +func userInputValidation(essid, pass, id string) ([]string, error) { + switch { + case essid != "" && pass != "" && id != "": + return []string{essid, pass, id}, nil + case essid != "" && pass != "" && id == "": + return []string{essid, pass}, nil + case essid != "" && pass == "" && id == "": + return []string{essid}, nil + default: + return nil, fmt.Errorf("Invalid user input") + } +} + +func (ws WifiServer) refreshHandle(w http.ResponseWriter, r *http.Request) { + if err := ws.service.Refresh(); err != nil { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +type ConnectJsonMsg struct { + Essid string + Pass string + Id string +} + +func (ws WifiServer) connectHandle(w http.ResponseWriter, r *http.Request) { + var msg ConnectJsonMsg + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + a, err := userInputValidation(msg.Essid, msg.Pass, msg.Id) + if err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + + if err := ws.service.Connect(a); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + // Connect Successful + json.NewEncoder(w).Encode(nil) +} + +func (ws WifiServer) displayStateHandle(w http.ResponseWriter, r *http.Request) { + s := ws.service.GetState() + displayWifi(w, s.NearbyWifis, s.CurEssid, s.ConnectingEssid) +} + +func (ws WifiServer) buildRouter() *mux.Router { + r := mux.NewRouter() + r.HandleFunc("/", ws.displayStateHandle).Methods("GET") + r.HandleFunc("/refresh", ws.refreshHandle).Methods("POST") + r.HandleFunc("/connect", ws.connectHandle).Methods("POST") + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(sos.HTMLPath("css"))))) + return r +} + +func (ws WifiServer) Start() { + defer ws.service.Shutdown() + listener, port, err := sos.GetListener() + if err != nil { + log.Fatalf("error: %v", err) + } + Port = port + fmt.Println(sos.StartServiceServer(ws.buildRouter(), "wifi", listener, Port)) +} + +func displayWifi(wr io.Writer, wifiOpts []wifi.Option, connectedEssid, connectingEssid string) error { + wifiData := struct { + WifiOpts []wifi.Option + ConnectedEssid string + ConnectingEssid string + Port uint + }{wifiOpts, connectedEssid, connectingEssid, Port} + + var tmpl *template.Template + file, err := ioutil.ReadFile(sos.HTMLPath("wifi.html")) + if err == nil { + html := string(file) + tmpl = template.Must(template.New("name").Parse(html)) + } else { + tmpl = template.Must(template.New("name").Parse(DefHtmlPage)) + } + return tmpl.Execute(wr, wifiData) +} + +func NewWifiServer(service *WifiService) *WifiServer { + return &WifiServer{ + service: service, + } +} diff --git a/nichrome/cmds/wifi/server_test.go b/nichrome/cmds/wifi/server_test.go new file mode 100644 index 000000000..5bc6436b7 --- /dev/null +++ b/nichrome/cmds/wifi/server_test.go @@ -0,0 +1,298 @@ +// Copyright 2017 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "math/rand" + "net/http" + "net/http/httptest" + "reflect" + "sync" + "testing" +) + +type UserInputValidationTestcase struct { + name string + essid string + pass string + id string + exp []string + err error +} + +var ( + EssidStub = "stub" + IdStub = "stub" + PassStub = "123456789" + + userInputValidationTestcases = []UserInputValidationTestcase{ + { + name: "Essid, passphrase, Id", + essid: EssidStub, + pass: PassStub, + id: IdStub, + exp: []string{EssidStub, PassStub, IdStub}, + err: nil, + }, + { + name: "Essid, passphrase", + essid: EssidStub, + pass: PassStub, + id: "", + exp: []string{EssidStub, PassStub}, + err: nil, + }, + { + name: "Essid", + essid: EssidStub, + pass: "", + id: "", + exp: []string{EssidStub}, + err: nil, + }, + { + name: "No Essid", + essid: "", + pass: PassStub, + id: IdStub, + exp: nil, + err: fmt.Errorf("Invalid user input"), + }, + { + name: "Essid, Id", + essid: EssidStub, + pass: "", + id: IdStub, + exp: nil, + err: fmt.Errorf("Invalid user input"), + }, + } +) + +func TestUserInputValidation(t *testing.T) { + for _, test := range userInputValidationTestcases { + out, err := userInputValidation(test.essid, test.pass, test.id) + if !reflect.DeepEqual(err, test.err) || !reflect.DeepEqual(out, test.exp) { + t.Logf("TEST %v", test.name) + fncCall := fmt.Sprintf("userInputValidation(%v, %v, %v)", test.essid, test.pass, test.id) + t.Errorf("%s\ngot:[%v, %v]\nwant:[%v, %v]", fncCall, out, err, test.exp, test.err) + } + } +} + +func setupStubServer() (*WifiServer, error) { + service, err := setupStubService() + if err != nil { + return nil, err + } + service.Start() + return NewWifiServer(service), nil +} + +func TestConnectHandlerSuccess(t *testing.T) { + // Set Up + server, err := setupStubServer() + if err != nil { + t.Fatal(err) + } + defer server.service.Shutdown() + router := server.buildRouter() + ts := httptest.NewServer(router) + defer ts.Close() + m := ConnectJsonMsg{EssidStub, PassStub, IdStub} + b, err := json.Marshal(m) + if err != nil { + t.Errorf("error: %v", err) + return + } + req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Execute + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Errorf("error: %v", err) + return + } + // Assert + decoder := json.NewDecoder(res.Body) + defer res.Body.Close() + var retMsg struct{ Error string } + if err := decoder.Decode(&retMsg); err != nil { + t.Errorf("Error Decode JSON Response") + return + } + // nil in response + if retMsg != struct{ Error string }{} { + t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) + return + } + // Check for State change + state := server.service.GetState() + if state.CurEssid != EssidStub { + t.Errorf("\ngot:%v\nwant:%v", state.CurEssid, EssidStub) + } +} + +func TestConnectHandlerFail(t *testing.T) { + // Set Up + server, err := setupStubServer() + if err != nil { + t.Fatal(err) + } + defer server.service.Shutdown() + router := server.buildRouter() + ts := httptest.NewServer(router) + defer ts.Close() + m := ConnectJsonMsg{EssidStub, "", IdStub} + b, err := json.Marshal(m) + if err != nil { + t.Errorf("error: %v", err) + return + } + req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Execute + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Errorf("error: %v", err) + return + } + // Assert + decoder := json.NewDecoder(res.Body) + defer res.Body.Close() + var retMsg struct{ Error string } + if err := decoder.Decode(&retMsg); err != nil { + t.Errorf("Error Decode JSON Response") + return + } + // Error message in response + if retMsg != struct{ Error string }{"Invalid user input"} { + t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) + return + } +} + +func TestRefreshHandler(t *testing.T) { + // Set Up + server, err := setupStubServer() + if err != nil { + t.Fatal(err) + } + defer server.service.Shutdown() + router := server.buildRouter() + ts := httptest.NewServer(router) + defer ts.Close() + req, err := http.NewRequest("POST", ts.URL+"/refresh", nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Execute + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Assert + decoder := json.NewDecoder(res.Body) + defer res.Body.Close() + var retMsg struct{ Error string } + if err := decoder.Decode(&retMsg); err != nil { + t.Errorf("Error Decode JSON Response") + return + } + // nil in response + if retMsg != struct{ Error string }{} { + t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) + return + } +} + +func TestHandlersRace(t *testing.T) { + // Set Up + numConnectRoutines, numRefreshGoRoutines, numReadGoRoutines := 10, 10, 100 + server, err := setupStubServer() + if err != nil { + t.Fatal(err) + } + defer server.service.Shutdown() + router := server.buildRouter() + ts := httptest.NewServer(router) + defer ts.Close() + + essidChoices := []string{"stub1", "stub2", "stub3"} + + // Execute + var wg sync.WaitGroup + + for i := 0; i < numConnectRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + idx := rand.Intn(len(essidChoices)) + m := ConnectJsonMsg{essidChoices[idx], "", ""} + b, err := json.Marshal(m) + if err != nil { + t.Errorf("error: %v", err) + return + } + req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) + if err != nil { + t.Errorf("error: %v", err) + return + } + if _, err = http.DefaultClient.Do(req); err != nil { + t.Errorf("error: %v", err) + return + } + }() + } + + for i := 0; i < numRefreshGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("POST", ts.URL+"/refresh", nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + if _, err = http.DefaultClient.Do(req); err != nil { + t.Errorf("error: %v", err) + return + } + }() + } + + for i := 0; i < numReadGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("GET", ts.URL+"/", nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + if _, err = http.DefaultClient.Do(req); err != nil { + t.Errorf("error: %v", err) + return + } + }() + } + wg.Wait() +} diff --git a/nichrome/cmds/wifi/service.go b/nichrome/cmds/wifi/service.go new file mode 100644 index 000000000..6d543c21e --- /dev/null +++ b/nichrome/cmds/wifi/service.go @@ -0,0 +1,224 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + + "github.com/u-root/NiChrome/pkg/wifi" +) + +// Exported Constants + +var ( + DefaultBufferSize = 4 +) + +// Exported Types + +type State struct { + CurEssid string + ConnectingEssid string + Refreshing bool + NearbyWifis []wifi.Option +} + +type ConnectReqMsg struct { + // private channel that the requesting routine is listening on + c chan (error) + args []string +} + +type RefreshReqMsg chan error + +type StateReqMsg chan State + +type WifiService struct { + // Share Resource between goroutines + wifiWorker wifi.WiFi + + // Communicating Channels between internal goroutines + connectArbitratorQuit chan bool + refreshPoolerQuit chan bool + stateTrackerQuit chan bool + stateUpdateChan chan stateUpdateMsg + + // Communicating Channels with Server goroutines + connectReqChan chan ConnectReqMsg + refreshReqChan chan RefreshReqMsg + stateReqChan chan StateReqMsg +} + +// Internal type + +type stateComponent int + +const ( + curEssidComp stateComponent = iota + connectingEssidComp + refreshingComp + nearbyWifisComp +) + +type stateUpdateMsg struct { + key stateComponent + val interface{} + doneUpdate chan bool // Used when need to ensure happening before relationship + +} + +func (ws WifiService) startConnectWifiArbitrator() { + curEssid, connectingEssid := "", "" + workDone := make(chan error, 1) + var winningChan chan error + for { + select { + case req := <-ws.connectReqChan: + if connectingEssid == "" { + // The requesting routine wins + connectingEssid = req.args[0] + ws.stateUpdateChan <- stateUpdateMsg{connectingEssidComp, connectingEssid, nil} + winningChan = req.c + // Starts connection + go func(args ...string) { + workDone <- ws.wifiWorker.Connect(args...) + }(req.args...) + } else { + // The requesting routine loses + req.c <- fmt.Errorf("Service is trying to connect to %s", connectingEssid) + } + case err := <-workDone: + // Update states + if err != nil { + curEssid, _ = ws.wifiWorker.GetID() + } else { + curEssid = connectingEssid + } + doneUpdate := make(chan bool, 2) + ws.stateUpdateChan <- stateUpdateMsg{curEssidComp, curEssid, doneUpdate} + connectingEssid = "" + ws.stateUpdateChan <- stateUpdateMsg{connectingEssidComp, connectingEssid, doneUpdate} + <-doneUpdate + <-doneUpdate + winningChan <- err + case <-ws.connectArbitratorQuit: + return + } + } +} + +func (ws WifiService) startRefreshPooler() { + workDone := make(chan bool, 1) + pool := make(chan RefreshReqMsg, DefaultBufferSize) + refreshing := false + // Pooler + for { + select { + case req := <-ws.refreshReqChan: + if !refreshing { + refreshing = true + ws.stateUpdateChan <- stateUpdateMsg{refreshingComp, refreshing, nil} + + // Notifier + go func(p chan RefreshReqMsg) { + o, err := ws.wifiWorker.Scan() + doneUpdate := make(chan bool, 1) + ws.stateUpdateChan <- stateUpdateMsg{nearbyWifisComp, o, doneUpdate} + <-doneUpdate + workDone <- true + for ch := range p { + ch <- err + } + }(pool) + } + pool <- req + case <-workDone: + close(pool) + refreshing = false + ws.stateUpdateChan <- stateUpdateMsg{refreshingComp, refreshing, nil} + pool = make(chan RefreshReqMsg, DefaultBufferSize) + case <-ws.refreshPoolerQuit: + return + } + } +} + +func (ws WifiService) startStateTracker() { + state := State{ + CurEssid: "", + ConnectingEssid: "", + Refreshing: false, + NearbyWifis: nil, + } + for { + select { + case r := <-ws.stateReqChan: + r <- state + case updateMsg := <-ws.stateUpdateChan: + updateState(&state, updateMsg) + if updateMsg.doneUpdate != nil { + updateMsg.doneUpdate <- true + } + case <-ws.stateTrackerQuit: + return + } + } +} + +func updateState(state *State, update stateUpdateMsg) { + switch update.key { + case curEssidComp: + state.CurEssid = update.val.(string) + case connectingEssidComp: + state.ConnectingEssid = update.val.(string) + case refreshingComp: + state.Refreshing = update.val.(bool) + case nearbyWifisComp: + state.NearbyWifis = update.val.([]wifi.Option) + } +} + +func NewWifiService(w wifi.WiFi) (*WifiService, error) { + return &WifiService{ + wifiWorker: w, + connectArbitratorQuit: make(chan bool, 1), + refreshPoolerQuit: make(chan bool, 1), + stateTrackerQuit: make(chan bool, 1), + stateUpdateChan: make(chan stateUpdateMsg, 4), + connectReqChan: make(chan ConnectReqMsg, DefaultBufferSize), + refreshReqChan: make(chan RefreshReqMsg, DefaultBufferSize), + stateReqChan: make(chan StateReqMsg, DefaultBufferSize), + }, nil +} + +func (ws WifiService) Start() { + go ws.startConnectWifiArbitrator() + go ws.startRefreshPooler() + go ws.startStateTracker() +} + +func (ws WifiService) Shutdown() { + ws.connectArbitratorQuit <- true + ws.refreshPoolerQuit <- true + ws.stateTrackerQuit <- true +} + +func (ws WifiService) GetState() State { + c := make(chan State, 1) + ws.stateReqChan <- (c) + return <-c +} + +func (ws WifiService) Connect(args []string) error { + c := make(chan error, 1) + ws.connectReqChan <- ConnectReqMsg{c, args} + return <-c +} + +func (ws WifiService) Refresh() error { + c := make(chan error, 1) + ws.refreshReqChan <- (c) + return <-c +} diff --git a/nichrome/cmds/wifi/service_test.go b/nichrome/cmds/wifi/service_test.go new file mode 100644 index 000000000..7d6757da8 --- /dev/null +++ b/nichrome/cmds/wifi/service_test.go @@ -0,0 +1,208 @@ +// Copyright 2017 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "math/rand" + "reflect" + "sync" + "testing" + + "github.com/u-root/NiChrome/pkg/wifi" +) + +func setupStubService() (*WifiService, error) { + wifiWorker, err := wifi.NewStubWorker("", NearbyWifisStub...) + if err != nil { + return nil, err + } + return NewWifiService(wifiWorker) +} + +func TestGetState(t *testing.T) { + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + service.Start() + defer service.Shutdown() + + expectedInitialState := State{ + CurEssid: "", + ConnectingEssid: "", + Refreshing: false, + NearbyWifis: nil, + } + state := service.GetState() + if !reflect.DeepEqual(expectedInitialState, state) { + t.Errorf("\ngot:%v\nwant:%v\n", state, expectedInitialState) + } +} + +func TestRaceGetState(t *testing.T) { + // Set Up + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + service.Start() + defer service.Shutdown() + numGoRoutines := 100 + + var wg sync.WaitGroup + for i := 0; i < numGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.GetState() + }() + } + wg.Wait() +} + +func TestConnect(t *testing.T) { + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + service.Start() + defer service.Shutdown() + + if err := service.Connect([]string{EssidStub}); err != nil { + t.Errorf("error: %v", err) + return + } + s := service.GetState() + if s.CurEssid != EssidStub { + t.Errorf("\ngot:%v\nwant:%v\n", s.CurEssid, EssidStub) + } +} + +func TestRaceConnect(t *testing.T) { + //Set Up + numGoRoutines := 100 + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + + service.Start() + defer service.Shutdown() + + var wg sync.WaitGroup + for i := 0; i < numGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.Connect([]string{EssidStub}) + }() + } + wg.Wait() +} + +func TestRefresh(t *testing.T) { + //Set Up + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + service.Start() + defer service.Shutdown() + + if err := service.Refresh(); err != nil { + t.Fatalf("Refresh: error: %v", err) + } + s := service.GetState() + if !reflect.DeepEqual(s.NearbyWifis, NearbyWifisStub) { + t.Errorf("\ngot:%v\nwant:%v\n", s.NearbyWifis, NearbyWifisStub) + } +} + +func TestRaceRefreshWithinDefaultBufferSize(t *testing.T) { + //Set Up + numGoRoutines := DefaultBufferSize + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + + service.Start() + defer service.Shutdown() + + var wg sync.WaitGroup + for i := 0; i < numGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.Refresh() + }() + } + wg.Wait() +} + +func TestRaceRefreshOverDefaultBufferSize(t *testing.T) { + // Set Up + numGoRoutines := DefaultBufferSize * 2 + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + + service.Start() + defer service.Shutdown() + + var wg sync.WaitGroup + for i := 0; i < numGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.Refresh() + }() + } + wg.Wait() +} + +func TestRaceCond(t *testing.T) { + // Set Up + numConnectRoutines, numRefreshGoRoutines, numReadGoRoutines := 10, 10, 100 + service, err := setupStubService() + if err != nil { + t.Fatal(err) + } + + service.Start() + defer service.Shutdown() + + essidChoices := []string{"stub1", "stub2", "stub3"} + + var wg sync.WaitGroup + + for i := 0; i < numConnectRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + idx := rand.Intn(len(essidChoices)) + service.Connect([]string{essidChoices[idx]}) + }() + } + + for i := 0; i < numRefreshGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.Refresh() + }() + } + + for i := 0; i < numReadGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + service.GetState() + }() + } + + wg.Wait() +} diff --git a/nichrome/cmds/wifi/wifi.go b/nichrome/cmds/wifi/wifi.go new file mode 100644 index 000000000..0bedecf03 --- /dev/null +++ b/nichrome/cmds/wifi/wifi.go @@ -0,0 +1,146 @@ +// Copyright 2017 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "regexp" + "strings" + + "github.com/u-root/NiChrome/pkg/wifi" +) + +const ( + cmd = "wifi [options] essid [passphrase] [identity]" +) + +var ( + // flags + iface = flag.String("i", "wlan0", "interface to use") + list = flag.Bool("l", false, "list all nearby WiFi") + show = flag.Bool("s", false, "list interfaces allowed with WiFi extension") + test = flag.Bool("test", false, "set up a test server") + wType = flag.String("worker", "iwl", "What kind of wireless layer to use") + + // RegEx for parsing iwconfig output + iwconfigRE = regexp.MustCompile("(?m)^[a-zA-Z0-9]+\\s*IEEE 802.11.*$") + + // Stub data for simple end-to-end interaction test + NearbyWifisStub = []wifi.Option{ + {"Stub1", wifi.NoEnc}, + {"Stub2", wifi.WpaPsk}, + {"Stub3", wifi.WpaEap}, + {"Stub4", wifi.NotSupportedProto}, + } + workers = map[string]func(string) (wifi.WiFi, error){ + "iwl": wifi.NewIWLWorker, + "native": wifi.NewNativeWorker, + } +) + +func parseIwconfig(o []byte) (res []string) { + interfaces := iwconfigRE.FindAll(o, -1) + for _, i := range interfaces { + res = append(res, strings.Split(string(i), " ")[0]) + } + return +} + +func init() { + defUsage := flag.Usage + flag.Usage = func() { + os.Args[0] = cmd + defUsage() + } +} + +func main() { + flag.Parse() + + // Start a Server with Stub data + // for manual end-to-end testing + // This is probably in need of a change. + if *test { + worker, err := wifi.NewStubWorker("", NearbyWifisStub...) + if err != nil { + log.Fatal(err) + } + service, err := NewWifiService(worker) + if err != nil { + log.Fatal(err) + } + service.Start() + NewWifiServer(service).Start() // this function shutdown service upon return + return + } + + if *show { + o, err := exec.Command("iwconfig").CombinedOutput() + if err != nil { + log.Fatalf("iwconfig: %v (%v)", string(o), err) + } + for _, i := range parseIwconfig(o) { + fmt.Println(i) + } + return + } + + f, ok := workers[*wType] + if !ok { + log.Fatalf("%v: not in %v", *wType, workers) + } + worker, err := f(*iface) + if err != nil { + log.Fatal(err) + } + if *list { + wifiOpts, err := worker.Scan() + if err != nil { + log.Fatalf("error: %v", err) + } + for _, wifiOpt := range wifiOpts { + switch wifiOpt.AuthSuite { + case wifi.NoEnc: + fmt.Printf("%s: No Passphrase\n", wifiOpt.Essid) + case wifi.WpaPsk: + fmt.Printf("%s: WPA-PSK (only passphrase)\n", wifiOpt.Essid) + case wifi.WpaEap: + fmt.Printf("%s: WPA-EAP (passphrase and identity)\n", wifiOpt.Essid) + case wifi.NotSupportedProto: + fmt.Printf("%s: Not a supported protocol\n", wifiOpt.Essid) + } + } + return + } + + a := flag.Args() + if len(a) > 3 { + flag.Usage() + os.Exit(1) + } + + // Experimental Part + if len(a) == 0 { + if o, err := exec.Command("ip", "link", "set", "dev", "lo", "up").CombinedOutput(); err != nil { + log.Fatalf("ip link set dev lo: %v (%v)", string(o), err) + } + service, err := NewWifiService(worker) + if err != nil { + log.Fatal(err) + } + service.Start() + go service.Refresh() + NewWifiServer(service).Start() // this function shutdown service upon return + return + } + + if err := worker.Connect(a...); err != nil { + log.Fatalf("error: %v", err) + } +} diff --git a/nichrome/cmds/wifi/wifi_test.go b/nichrome/cmds/wifi/wifi_test.go new file mode 100644 index 000000000..4e2bc9e4d --- /dev/null +++ b/nichrome/cmds/wifi/wifi_test.go @@ -0,0 +1,109 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "reflect" + "testing" +) + +func TestIwconfigRE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\nlo no wireless extensions.\n", false}, + {"blahblahblah\nwlp4s0 IEEE 802.11 ESSID:\"stub\"", true}, + {"blahblahblah\n Mode:Managed Frequency:5.58 GHz Access Point: 00:00:00:00:00:00\n", false}, + } + for _, test := range testcases { + if out := iwconfigRE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestParseIwconfig(t *testing.T) { + testcases := []struct { + name string + o []byte + exp []string + }{ + { + name: "nil input", + o: nil, + exp: nil, + }, + { + name: "empty string input", + o: []byte(""), + exp: nil, + }, + { + name: "No Wireless in input", + o: []byte(` +lo no wireless extensions. + +eno1 no wireless extensions. + +`), + exp: nil, + }, + { + name: "One (1) Wireless extension", + o: []byte(` +wlp4s0 IEEE 802.11 ESSID:"stub" + Mode:Managed Frequency:5.58 GHz Access Point: 00:00:00:00:00:00 + Bit Rate=22 Mb/s Tx-Power=22 dBm + Retry short limit:7 RTS thr:off Fragment thr:off + Power Management:on + Link Quality=27/70 Signal level=-53 dBm + Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 + Tx excessive retries:0 Invalid misc:0 Missed beacon:0 + +lo no wireless extensions. + +enp0s31f6 no wireless extensions. + +`), + exp: []string{"wlp4s0"}, + }, + { + name: "Two (2) Wireless extensions", + o: []byte(` +wlp4s0 IEEE 802.11 ESSID:"stub" + Mode:Managed Frequency:5.58 GHz Access Point: 00:00:00:00:00:00 + Bit Rate=22 Mb/s Tx-Power=22 dBm + Retry short limit:7 RTS thr:off Fragment thr:off + Power Management:on + Link Quality=27/70 Signal level=-53 dBm + Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 + Tx excessive retries:0 Invalid misc:0 Missed beacon:0 + +wlp4s1 IEEE 802.11 ESSID:"stub" + Mode:Managed Frequency:5.58 GHz Access Point: 00:00:00:00:00:00 + Bit Rate=22 Mb/s Tx-Power=22 dBm + Retry short limit:7 RTS thr:off Fragment thr:off + Power Management:on + Link Quality=27/70 Signal level=-53 dBm + Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 + Tx excessive retries:0 Invalid misc:0 Missed beacon:0 + +lo no wireless extensions. + +enp0s31f6 no wireless extensions. + +`), + exp: []string{"wlp4s0", "wlp4s1"}, + }, + } + + for _, test := range testcases { + out := parseIwconfig(test.o) + if !reflect.DeepEqual(out, test.exp) { + t.Errorf("%v\ngot:%v\nwant:%v", test.name, out, test.exp) + } + } +} diff --git a/nichrome/cmds/xinit/xinit.go b/nichrome/cmds/xinit/xinit.go new file mode 100644 index 000000000..d30e78baf --- /dev/null +++ b/nichrome/cmds/xinit/xinit.go @@ -0,0 +1,63 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "time" +) + +func x11(n string, args ...string) error { + cmd := exec.Command(n, args...) + cmd.Env = append(os.Environ(), "DISPLAY=:0") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("X11 start %v %v: %v", n, args, err) + } + return nil +} + +func setup() error { + if err := os.Symlink("/usr/local/bin/bash", "/bin/bash"); err != nil { + return err + } + if err := os.Symlink("/lib/ld-linux-x86-64.so.2", "/lib64/ld-linux-x86-64.so.2"); err != nil { + return err + } + go func() { + cmd := exec.Command("Xfbdev") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("X11 startup: %v", err) + } + }() + for { + s, err := filepath.Glob("/tmp/.X*/X?") + if err != nil { + return err + } + if len(s) > 0 { + break + } + time.Sleep(time.Second) + } + for _, f := range []string{"wingo", "flwm", "chrome"} { + log.Printf("Run %v", f) + go x11(f) + } + + // we block on the aterm. When the aterm exits, we do too. + return x11("aterm") +} + +func main() { + if err := setup(); err != nil { + log.Fatal(err) + } +} diff --git a/nichrome/examples/sos/README.md b/nichrome/examples/sos/README.md new file mode 100644 index 000000000..fa6aed29a --- /dev/null +++ b/nichrome/examples/sos/README.md @@ -0,0 +1,31 @@ +# Example Service for Service of Services + +the Service of Services (SoS) is a web-based UI for configuring system settings, on localhost:8000. There are a number of services in u-root by default, but you can easily build your own. + +An SoS service consists of a number of files: +* `your_sos.go` contains main() and starts your service, in `cmds/your_sos` +* `service.go` contains all the functionality of your service, in `cmds/your_sos` +* `server.go` routes data between the webpage and the service, in `cmds/your_sos` +* `your_sos.html`, the HTML and Javascript frontend, placed in `pkg/sos/html` + +The logic in service.go is heavily dependent on what you are trying to implement, but everything else follows this general pattern: +1. main constructs a new service, passes it to a new server, and starts the server. +2. the server gets a port from the SoS, builds its router, and adds itself to the SoS table. +3. the server's router maps URLs to user-defined Go functions. +4. the server's displayStateHandle function updates the service and renders the webpage with service data. +5. the webpage contains input fields, which are sent back as JSON through URLs defined in the router. +6. The server's router passes the JSON to a Go function, which it decodes and sends to a service method. +7. The service method operates on this input, updating its fields once it's done. +8. The webpage reloads on completion, rerendering with the updated service data. + +the example Service in this dir is heavily commented with more details. + +To start a service on startup, call it in your uinit. + +To test services on your build machine: +1. navigate to `cmds/sos`, run `go build .`, then `sudo ./sos` +2. navigate to your service, `cmds/your_sos`, run `go build .`, then `./your_sos` + +You can then open the SoS table in a browser at localhost:8000 and access your service. +This will use the builtin HTML string, not your HTML file, due to path issues. Until we +implement a flag, you can manually change `htmlRoot` in `pkg/sos/server.go` and rebuild sos. diff --git a/nichrome/examples/sos/example_sos.go b/nichrome/examples/sos/example_sos.go new file mode 100644 index 000000000..7ba8c30a9 --- /dev/null +++ b/nichrome/examples/sos/example_sos.go @@ -0,0 +1,19 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "log" +) + +func main() { + // Build a new example service + service, err := NewExampleService() + if err != nil { + log.Fatal(err) + } + // Build a new example server with this service, then start it + NewExampleServer(service).Start() +} diff --git a/nichrome/examples/sos/example_sos.html b/nichrome/examples/sos/example_sos.html new file mode 100644 index 000000000..045c9212c --- /dev/null +++ b/nichrome/examples/sos/example_sos.html @@ -0,0 +1,91 @@ + + + + + + + {{$example := .Example}} +

Example

+ + +
+
+

Example

+
+
+ + + + + +
+
+
+
+ diff --git a/nichrome/examples/sos/server.go b/nichrome/examples/sos/server.go new file mode 100644 index 000000000..3b4246a63 --- /dev/null +++ b/nichrome/examples/sos/server.go @@ -0,0 +1,202 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "html/template" + "io/ioutil" + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/u-root/NiChrome/pkg/sos" +) + +const ( + // it's ugly, but we have to define a basic HTML string to fall back on if our .html is + // missing. If you are implementing a simple service, you may be able to get away with + // only this. example_sos.html is exactly the same as this string, except we use divs + // and the CSS stylesheet instead of tables, with more documentation. + DefHtmlPage = ` + + + + + + {{$example := .Example}} +

Example

+ + + + + + +
+ + ` +) + +var Port uint + +// our server contains an instance of our service. +type ExampleServer struct { + service *ExampleService +} + +// displayStateHandle renders our webpage with the data from our service +// * update your service (if required). +// * copy your service's fields to a data struct, with the port we got from SoS. +// * load the HTML file. If it doesn't exist, use the HTML string defined above. +// * Render the HTML with our data. +func (es *ExampleServer) displayStateHandle(w http.ResponseWriter, r *http.Request) { + // if your service has an update function, call it here to refresh its fields. + // es.service.Update() + exampleData := struct { + Example string + Port uint + }{es.service.Example, Port} + var tmpl *template.Template + file, err := ioutil.ReadFile(sos.HTMLPath("example.html")) + if err == nil { + html := string(file) + tmpl = template.Must(template.New("SoS").Parse(html)) + } else { + tmpl = template.Must(template.New("SoS").Parse(DefHtmlPage)) + } + tmpl.Execute(w, exampleData) +} + +// define a JsonMsg struct for easily passing around our data. Though it isn't +// necessary in this example, once you have multiple values associated with your +// service it makes things much easier. This JSON must be defined exactly as it is +// in the HTML file. +type ExampleJsonMsg struct { + Example string +} + +// this is a basic JSON handler function, dealing with string passed back as JSON. +// * decode the returned JSON message and store the fields in our JsonMsg struct, +// with proper error checking. +// * call the associated service function, passing in this JsonMsg, with proper error checking. +func (es *ExampleServer) yourHandleFunc1(w http.ResponseWriter, r *http.Request) { + var msg ExampleJsonMsg + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + if err := es.service.ExampleServiceFunc1(msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +// if your service function doesn't require input, i.e. a button press, you can omit the +// JSON decoding step. +func (es *ExampleServer) yourHandleFunc2(w http.ResponseWriter, r *http.Request) { + if err := es.service.ExampleServiceFunc2(); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +// define our router +// * the "/" handler is required, as it is what updates our service and renders the webpage. +// * if you plan on using the Material Design CSS in pkg/sos/html/css, you need to define +// the pathPrefix for it. +// * All other handlers are user-defined. +func (es *ExampleServer) buildRouter() *mux.Router { + r := mux.NewRouter() + r.HandleFunc("/", es.displayStateHandle).Methods("GET") + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(sos.HTMLPath("css"))))) + r.HandleFunc("/your_url_here_1", es.yourHandleFunc1).Methods("POST") + r.HandleFunc("/your_url_here_2", es.yourHandleFunc2).Methods("POST") + return r +} + +// start our server +// * get a listener and an open port from the SoS +// * build our router (see above) and add our service to the SoS table, with the label "example" +func (es *ExampleServer) Start() { + listener, port, err := sos.GetListener() + if err != nil { + log.Fatalf("error: %v", err) + } + Port = port + sos.StartServiceServer(es.buildRouter(), "example", listener, Port) +} + +// build a new server with the service passed in. +func NewExampleServer(service *ExampleService) *ExampleServer { + return &ExampleServer{ + service: service, + } +} diff --git a/nichrome/examples/sos/service.go b/nichrome/examples/sos/service.go new file mode 100644 index 000000000..db5709f2d --- /dev/null +++ b/nichrome/examples/sos/service.go @@ -0,0 +1,41 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +// Your service.go file will be heavily tailored for the problem you are trying to solve. +// a type representing your service and a constructor for that service are all that is +// specifically required. If you are depending on something outside of the program, such +// as text files or system settings, add an update function which loads that data into your +// service struct. + +// the one field in our example service is a string, set by the user. +type ExampleService struct { + Example string +} + +// here is where you'd define an update function. Since this demo does not depend on any +// system settings, I have omitted it. + +// define any service functionality here. +// ExampleServiceFunc1: Set service variable to input +func (es *ExampleService) ExampleServiceFunc1(input ExampleJsonMsg) error { + es.Example = input.Example + return nil +} + +// ExampleServiceFunc2: Reset service variable to empty string +func (es *ExampleService) ExampleServiceFunc2() error { + es.Example = "" + return nil +} + +// NewExampleService: construct a new service +// If your service controls system settings, make a getCurrentSetting() function to +// initialize your service. +func NewExampleService() (*ExampleService, error) { + return &ExampleService{ + Example: "", + }, nil +} diff --git a/nichrome/go.mod b/nichrome/go.mod new file mode 100644 index 000000000..556f9a6da --- /dev/null +++ b/nichrome/go.mod @@ -0,0 +1,18 @@ +module github.com/u-root/NiChrome + +go 1.17 + +require ( + github.com/gorilla/mux v1.8.0 + github.com/spf13/pflag v1.0.5 + github.com/u-root/u-root v0.0.0-00010101000000-000000000000 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 +) + +require ( + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/pierrec/lz4/v4 v4.1.11 // indirect + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect +) + +replace github.com/u-root/u-root => ../u-root diff --git a/nichrome/go.sum b/nichrome/go.sum new file mode 100644 index 000000000..c65aa2318 --- /dev/null +++ b/nichrome/go.sum @@ -0,0 +1,276 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= +github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cenkalti/backoff/v4 v4.0.2 h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4eamEDs= +github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72/go.mod h1:PjfxuH4FZdUyfMdtBio2lsRr1AKEaVPwelzuHuh8Lqc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gliderlabs/ssh v0.1.2-0.20181113160402-cbabf5414432 h1:DGWE1Z/9om1Ny/BvHHIQB81DOzm95VUkTzwmtGtVzK0= +github.com/gliderlabs/ssh v0.1.2-0.20181113160402-cbabf5414432/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gojuno/minimock/v3 v3.0.4/go.mod h1:HqeqnwV8mAABn3pO5hqF+RE7gjA0jsN8cbbSogoGrzI= +github.com/gojuno/minimock/v3 v3.0.8/go.mod h1:TPKxc8tiB8O83YH2//pOzxvEjaI3TMhd6ev/GmlMiYA= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-tpm v0.1.2-0.20190725015402-ae6dd98980d4/go.mod h1:H9HbmUG2YgV/PHITkO7p6wxEEj/v5nlsVWIwumwH2NI= +github.com/google/go-tpm v0.2.1-0.20200615092505-5d8a91de9ae3 h1:aAaYhJmscls+Mps41+Be4fI9ID4siVn5gVFDRDXPJMo= +github.com/google/go-tpm v0.2.1-0.20200615092505-5d8a91de9ae3/go.mod h1:iVLWvrPp/bHeEkxTFi9WG6K9w0iy2yIszHwZGHPbzAw= +github.com/google/go-tpm-tools v0.0.0-20190906225433-1614c142f845/go.mod h1:AVfHadzbdzHo54inR2x1v640jdi1YSi3NauM2DUsxk0= +github.com/google/goexpect v0.0.0-20191001010744-5b6988669ffa/go.mod h1:qtE5aAEkt0vOSA84DBh8aJsz6riL8ONfqfULY7lBjqc= +github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexdigest/gowrap v1.1.7/go.mod h1:Z+nBFUDLa01iaNM+/jzoOA1JJ7sm51rnYFauKFUB5fs= +github.com/hexdigest/gowrap v1.1.8/go.mod h1:H/JiFmQMp//tedlV8qt2xBdGzmne6bpbaSuiHmygnMw= +github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/insomniacslk/dhcp v0.0.0-20211209223715-7d93572ebe8e h1:IQpunlq7T+NiJJMO7ODYV2YWBiv/KnObR3gofX0mWOo= +github.com/insomniacslk/dhcp v0.0.0-20211209223715-7d93572ebe8e/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= +github.com/intel-go/cpuid v0.0.0-20200819041909-2aa72927c3e2 h1:h+RKaNPjka7LRJGoeub/IQBdXSoEaJjfADkBq02hvjw= +github.com/intel-go/cpuid v0.0.0-20200819041909-2aa72927c3e2/go.mod h1:RmeVYf9XrPRbRc3XIx0gLYA8qOFvNoPOfaEZduRlEp4= +github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= +github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= +github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= +github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c h1:7cpGGTQO6+OuYQWkueqeXuErSjs1NZtpALpv1x7Mq4g= +github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kaey/framebuffer v0.0.0-20140402104929-7b385489a1ff/go.mod h1:tS4qtlcKqtt3tCIHUflVSqeP3CLH5Qtv2szX9X2SyhU= +github.com/klauspost/compress v1.10.6 h1:SP6zavvTG3YjOosWePXFDlExpKIWMTO4SE/Y8MZB2vI= +github.com/klauspost/compress v1.10.6/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A= +github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 h1:lez6TS6aAau+8wXUP3G9I3TGlmPFEq2CTxBaRqY6AGE= +github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y= +github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= +github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= +github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= +github.com/mdlayher/netlink v1.1.1 h1:VqG+Voq9V4uZ+04vjIrcSCWDpf91B1xxbP4QBUmUJE8= +github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= +github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= +github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065 h1:aFkJ6lx4FPip+S+Uw4aTegFMct9shDvP+79PsSxpm3w= +github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/orangecms/go-framebuffer v0.0.0-20200613202404-a0700d90c330 h1:zJBTzBuTR7EdFzmCGx0xp0pbOOb82sAh0+YUK4JTDEI= +github.com/orangecms/go-framebuffer v0.0.0-20200613202404-a0700d90c330/go.mod h1:3Myb/UszJY32F2G7yGkUtcW/ejHpjlGfYLim7cv2uKA= +github.com/pborman/getopt/v2 v2.1.0 h1:eNfR+r+dWLdWmV8g5OlpyrTYHkhVNxHBdN2cCrJmOEA= +github.com/pborman/getopt/v2 v2.1.0/go.mod h1:4NtW75ny4eBw9fO1bhtNdYTlZKYX5/tBLtsOpwKIKd0= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pierrec/lz4/v4 v4.1.11 h1:LVs17FAZJFOjgmJXl9Tf13WfLUvZq7/RjfEJrnwZ9OE= +github.com/pierrec/lz4/v4 v4.1.11/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/rck/unit v0.0.3 h1:q3/Ui9gcrFKpEneZXw2gNmNEbzv5jLrZnH6qhX1ypZ0= +github.com/rck/unit v0.0.3/go.mod h1:jTOnzP4s1OjIP1vdxb4n76b23QPKS4EurYg7sYMr2DM= +github.com/rekby/gpt v0.0.0-20200219180433-a930afbc6edc h1:goZGTwEEn8mWLcY012VouWZWkJ8GrXm9tS3VORMxT90= +github.com/rekby/gpt v0.0.0-20200219180433-a930afbc6edc/go.mod h1:scrOqOnnHVKCHENvFw8k9ajCb88uqLQDA4BvuJNJ2ew= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/twitchtv/twirp v5.8.0+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= +github.com/u-root/gobusybox/src v0.0.0-20210529132627-adc854ea4425/go.mod h1:GlxAKinWMNShbNp8BI+zRr/hUdwNogaNWrnpbh1mOuI= +github.com/u-root/iscsinl v0.1.1-0.20210528121423-84c32645822a h1:A0sK7WEodak7eVd21MOEatnh2pfAAwZaEPSIEEsjctQ= +github.com/u-root/iscsinl v0.1.1-0.20210528121423-84c32645822a/go.mod h1:RWIgJWqm9/0gjBZ0Hl8iR6MVGzZ+yAda2uqqLmetE2I= +github.com/u-root/uio v0.0.0-20210528114334-82958018845c/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA= +github.com/u-root/uio v0.0.0-20210528151154-e40b768296a7 h1:XMAtQHwKjWHIRwg+8Nj/rzUomQY1q6cM3ncA0wP8GU4= +github.com/u-root/uio v0.0.0-20210528151154-e40b768296a7/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20211118161826-650dca95af54 h1:8mhqcHPqTMhSPoslhGYihEgSfc77+7La1P6kiB6+9So= +github.com/vishvananda/netlink v1.1.1-0.20211118161826-650dca95af54/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vtolstov/go-ioctl v0.0.0-20151206205506-6be9cced4810 h1:X6ps8XHfpQjw8dUStzlMi2ybiKQ2Fmdw7UM+TinwvyM= +github.com/vtolstov/go-ioctl v0.0.0-20151206205506-6be9cced4810/go.mod h1:dF0BBJ2YrV1+2eAIyEI+KeSidgA6HqoIP1u5XTlMq/o= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4= +golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs= +golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +pack.ag/tftp v1.0.1-0.20181129014014-07909dfbde3c h1:4DHuGX0VtxRIyjXlVpcjSGEmZ7OnIK7Hvo+INnxI8yk= +pack.ag/tftp v1.0.1-0.20181129014014-07909dfbde3c/go.mod h1:N1Pyo5YG+K90XHoR2vfLPhpRuE8ziqbgMn/r/SghZas= +src.elv.sh v0.16.3 h1:VNTUa0BNNUMtKzd8vpIPK3I8+iEOsyWD2yZvhJMpl/s= +src.elv.sh v0.16.3/go.mod h1:WxJAMoN8uQcg1ZwRvtjmbYAo6uKeJ8F7b25etVZ743w= diff --git a/nichrome/home/user/.config/google-chrome/Consent To Send Stats b/nichrome/home/user/.config/google-chrome/Consent To Send Stats new file mode 100644 index 000000000..9ea7c6f7e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Consent To Send Stats @@ -0,0 +1 @@ +e663dba7-466a-43d0-8a03-826b03f69486 \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Cookies b/nichrome/home/user/.config/google-chrome/Default/Cookies new file mode 100644 index 000000000..401f09539 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Cookies differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Cookies-journal b/nichrome/home/user/.config/google-chrome/Default/Cookies-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Current Session b/nichrome/home/user/.config/google-chrome/Default/Current Session new file mode 100644 index 000000000..e53f9ed78 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Current Session differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Current Tabs b/nichrome/home/user/.config/google-chrome/Default/Current Tabs new file mode 100644 index 000000000..0627f2659 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Current Tabs differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/000003.log b/nichrome/home/user/.config/google-chrome/Default/Extension State/000003.log new file mode 100644 index 000000000..5c4f697d0 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extension State/000003.log differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/CURRENT b/nichrome/home/user/.config/google-chrome/Default/Extension State/CURRENT new file mode 100644 index 000000000..7ed683d17 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/LOCK b/nichrome/home/user/.config/google-chrome/Default/Extension State/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG b/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG new file mode 100644 index 000000000..c20058da2 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG @@ -0,0 +1,3 @@ +2018/07/20-17:25:36.214 2887 Reusing MANIFEST /home/user/.config/google-chrome/Default/Extension State/MANIFEST-000001 +2018/07/20-17:25:36.214 2887 Recovering log #3 +2018/07/20-17:25:36.214 2887 Reusing old log /home/user/.config/google-chrome/Default/Extension State/000003.log diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG.old b/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG.old new file mode 100644 index 000000000..265acbc7b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extension State/LOG.old @@ -0,0 +1 @@ +2018/07/20-17:13:48.848 2566 Reusing MANIFEST /home/user/.config/google-chrome/Default/Extension State/MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Extension State/MANIFEST-000001 b/nichrome/home/user/.config/google-chrome/Default/Extension State/MANIFEST-000001 new file mode 100644 index 000000000..18e5cab72 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extension State/MANIFEST-000001 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_128.png b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_128.png new file mode 100644 index 000000000..fefcf61a3 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_128.png differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_16.png b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_16.png new file mode 100644 index 000000000..443c7125f Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/icon_16.png differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.html b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.html new file mode 100644 index 000000000..1d0a501f1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.js b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.js new file mode 100644 index 000000000..0b1b4944c --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/main.js @@ -0,0 +1 @@ +document.location.href = "https://docs.google.com/document/create?chromeApp=1"; \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/manifest.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/manifest.json new file mode 100644 index 000000000..76e4e579a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/aohghmighlieiainnegkcijnfilokake/0.0.0.6_0/manifest.json @@ -0,0 +1,18 @@ +{ + "app": { + "launch": { + "local_path": "main.html" + } + }, + "description": "Create, share, and access your Google Docs from anywhere.", + "icons": { + "128": "icon_128.png", + "16": "icon_16.png" + }, + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJhLK6fk/BWTEvJhywpk7jDe4A2r0bGXGOLZW4/AdBp3IiD9o9nx4YjLAtv0tIPxi7MvFd/GUUbQBwHT5wQWONJj1z/0Rc2qBkiJA0yqXh42p0snuA8dCfdlhOLsp7/XTMEwAVasjV5hC4awl78eKfJYlZ+8fM/UldLWJ/51iBQwIDAQAB", + "manifest_version": 2, + "name": "Docs", + "offline_enabled": true, + "update_url": "http://clients2.google.com/service/update2/crx", + "version": "0.0.0.6" +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/128.png b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/128.png new file mode 100644 index 000000000..d2496fbea Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/128.png differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ar/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ar/messages.json new file mode 100644 index 000000000..e9e3db6e1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ar/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: إنشاء ومشاركة وحفظ جميع أشيائك في مكان واحد." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/bg/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/bg/messages.json new file mode 100644 index 000000000..cffb8adfd --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/bg/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Диск: създавайте, споделяйте и пазете всичките си неща на едно място." + }, + "appName": { + "description": "App name.", + "message": "Google Диск" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ca/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ca/messages.json new file mode 100644 index 000000000..1c91aac22 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ca/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: creeu, compartiu i manteniu totes les vostres coses en un sol lloc." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/cs/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/cs/messages.json new file mode 100644 index 000000000..6bc05da54 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/cs/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Disk Google: vytvářejte, sdílejte a ukládejte soubory na jednom místě." + }, + "appName": { + "description": "App name.", + "message": "Disk Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/da/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/da/messages.json new file mode 100644 index 000000000..4f9716935 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/da/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drev: Opret, del, og gem alle dine ting på ét sted." + }, + "appName": { + "description": "App name.", + "message": "Google Drev" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/de/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/de/messages.json new file mode 100644 index 000000000..469489464 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/de/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: Alle Inhalte an einem Ort erstellen, teilen und speichern." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/el/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/el/messages.json new file mode 100644 index 000000000..b193b11aa --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/el/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: δημιουργήστε, μοιραστείτε και διατηρήστε όλο το υλικό σας σε ένα μέρος." + }, + "appName": { + "description": "App name.", + "message": "Google Drive " + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_GB/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_GB/messages.json new file mode 100644 index 000000000..5173f7576 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_GB/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: create, share and keep all your stuff in one place." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_US/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_US/messages.json new file mode 100644 index 000000000..5173f7576 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/en_US/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: create, share and keep all your stuff in one place." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es/messages.json new file mode 100644 index 000000000..6e14e026b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: crea, comparte y almacena todo tu contenido en un solo lugar." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es_419/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es_419/messages.json new file mode 100644 index 000000000..6e14e026b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/es_419/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: crea, comparte y almacena todo tu contenido en un solo lugar." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/et/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/et/messages.json new file mode 100644 index 000000000..d028e1e36 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/et/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: looge, jagage ja hoidke kõiki oma faile ühes kohas." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/eu/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/eu/messages.json new file mode 100644 index 000000000..9eca7bc73 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/eu/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "Google Drive", + "description": "App name." + }, + "appDesc": { + "message": "Google Drive: sortu, partekatu eta mantendu zure fitxategi guztiak toki berean.", + "description":"App description." + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fi/messages.json new file mode 100644 index 000000000..7d0f0e717 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: luo, jaa ja säilytä kaikki sisältösi yhdessä paikassa." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fil/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fil/messages.json new file mode 100644 index 000000000..57b07b0e8 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fil/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: lumikha, magbahagi at itago lahat ng gamit mo sa isang lugar. " + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fr/messages.json new file mode 100644 index 000000000..040bfe6c4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/fr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive : votre nouvel espace pour créer, stocker et partager" + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/he/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/he/messages.json new file mode 100644 index 000000000..4da8fab1d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/he/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "כונן Google: צור, שתף ושמור את כל הדברים שלך במקום אחד." + }, + "appName": { + "description": "App name.", + "message": "כונן Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hi/messages.json new file mode 100644 index 000000000..fe8744f63 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google डिस्क: बनाएं, साझा करें और अपनी सारी सामग्री एक जगह रखें" + }, + "appName": { + "description": "App name.", + "message": "Google डिस्क" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hr/messages.json new file mode 100644 index 000000000..9bfc7c948 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google disk: stvarajte, dijelite i spremite sve svoje datoteke na jednom mjestu." + }, + "appName": { + "description": "App name.", + "message": "Google disk" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hu/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hu/messages.json new file mode 100644 index 000000000..ce02b9a79 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/hu/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: minden dolgot egy helyen hozhat létre, oszthat meg és tárolhat." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/id/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/id/messages.json new file mode 100644 index 000000000..69ca3dfb4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/id/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: buat, bagikan, dan simpan semua dokumen Anda dalam satu tempat." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/it/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/it/messages.json new file mode 100644 index 000000000..564d93a2f --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/it/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: crea, condividi e conserva tutti i tuoi file in unico posto." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ja/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ja/messages.json new file mode 100644 index 000000000..73c7f44a1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ja/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google ドライブ: あらゆるファイルの作成、共有、保存を 1 か所で行えます。" + }, + "appName": { + "description": "App name.", + "message": "Google ドライブ" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ko/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ko/messages.json new file mode 100644 index 000000000..5332bf380 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ko/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google 드라이브: 모든 콘텐츠를 한 곳에서 작성, 공유 및 보관하세요." + }, + "appName": { + "description": "App name.", + "message": "Google 드라이브" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lt/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lt/messages.json new file mode 100644 index 000000000..59fb67741 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lt/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "„Google“ diskas: kurkite, bendrinkite ir saugokite visą savo medžiagą vienoje vietoje." + }, + "appName": { + "description": "App name.", + "message": "„Google“ diskas " + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lv/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lv/messages.json new file mode 100644 index 000000000..dc916f5ec --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/lv/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google disks: veidojiet, koplietojiet un glabājiet visu saturu vienuviet." + }, + "appName": { + "description": "App name.", + "message": "Google disks" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ms/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ms/messages.json new file mode 100644 index 000000000..b510c8b8e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ms/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: buat, kongsi dan simpan semua bahan anda di satu tempat." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/nl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/nl/messages.json new file mode 100644 index 000000000..96c7f8f19 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/nl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: alles op één plek maken, delen en bewaren." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/no/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/no/messages.json new file mode 100644 index 000000000..8a0fb20da --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/no/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "Google Disk", + "description": "App name." + }, + "appDesc": { + "message": "Google Disk: opprett, del og oppbevar alt på ett sted.", + "description":"App description." + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pl/messages.json new file mode 100644 index 000000000..08ecaa7a4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Dysk Google: zapisuj, udostępniaj i przechowuj wszystko w jednym miejscu." + }, + "appName": { + "description": "App name.", + "message": "Dysk Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_BR/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_BR/messages.json new file mode 100644 index 000000000..69d468d8a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_BR/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: crie, compartilhe e guarde tudo em um só lugar." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_PT/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_PT/messages.json new file mode 100644 index 000000000..57bef27f4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/pt_PT/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: crie, partilhe e guarde todos os seus conteúdos num único local." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ro/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ro/messages.json new file mode 100644 index 000000000..78700c7b0 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ro/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Disc Google: creaţi, permiteţi accesul şi păstraţi-vă toate documentele într-un singur loc." + }, + "appName": { + "description": "App name.", + "message": "Disc Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ru/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ru/messages.json new file mode 100644 index 000000000..ea2ff30d2 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/ru/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Диск Google: создавайте, публикуйте и храните все свои файлы с помощью одного сервиса." + }, + "appName": { + "description": "App name.", + "message": "Диск Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sk/messages.json new file mode 100644 index 000000000..fc61d49f0 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Disk Google – vytvárajte, zdieľajte a ukladajte všetky svoje súbory na jednom mieste." + }, + "appName": { + "description": "App name.", + "message": "Disk Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sl/messages.json new file mode 100644 index 000000000..4c54115b3 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: ustvarjanje, skupna raba in shranjevanje vseh elementov na enem mestu." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sr/messages.json new file mode 100644 index 000000000..8765e2a8b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google диск: правите, делите и чувајте све на једном месту." + }, + "appName": { + "description": "App name.", + "message": "Google диск" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sv/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sv/messages.json new file mode 100644 index 000000000..aafd05c97 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/sv/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: skapa, dela och spara alla dina grejer på ett ställe." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/th/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/th/messages.json new file mode 100644 index 000000000..359c87d4e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/th/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google ไดรฟ์: สร้าง แบ่งปัน และเก็บข้อมูลทั้งหมดไว้ในที่เดียว " + }, + "appName": { + "description": "App name.", + "message": "Google ไดรฟ์" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/tr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/tr/messages.json new file mode 100644 index 000000000..90b4ca80d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/tr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: Tüm dosyalarınızı tek bir yerde oluşturun, paylaşın ve saklayın." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/uk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/uk/messages.json new file mode 100644 index 000000000..967823d5c --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/uk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Диск Google: створюйте, зберігайте всі ваші файли та діліться ними за допомогою однієї служби." + }, + "appName": { + "description": "App name.", + "message": "Диск Google" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/vi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/vi/messages.json new file mode 100644 index 000000000..cda96888d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/vi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google Drive: tạo, chia sẻ và lưu giữ tất cả nội dung của bạn ở một nơi." + }, + "appName": { + "description": "App name.", + "message": "Google Drive" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_CN/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_CN/messages.json new file mode 100644 index 000000000..a4476d2d1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_CN/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google 云端硬盘:在一个位置创建、共享和存储您的所有资料。" + }, + "appName": { + "description": "App name.", + "message": "Google 云端硬盘" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_TW/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_TW/messages.json new file mode 100644 index 000000000..59847a89e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/_locales/zh_TW/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Google 雲端硬碟:檔案製作、分享、存放,全部集中一處。" + }, + "appName": { + "description": "App name.", + "message": "Google 雲端硬碟" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/manifest.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/manifest.json new file mode 100644 index 000000000..6c7383292 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/apdfllckaahabafndbhieahigkjlhalf/6.2_0/manifest.json @@ -0,0 +1,24 @@ +{ + "app": { + "launch": { + "web_url": "https://drive.google.com/" + }, + "urls": [ "http://docs.google.com/", "http://drive.google.com/", "https://docs.google.com/", "https://drive.google.com/" ] + }, + "background": { + "allow_js_access": false + }, + "default_locale": "en_US", + "description": "__MSG_appDesc__", + "icons": { + "128": "128.png" + }, + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIl5KlKwL2TSkntkpY3naLLz5jsN0YwjhZyObcTOK6Nda4Ie21KRqZau9lx5SHcLh7pE2/S9OiArb+na2dn7YK5EvH+aRXS1ec3uxVlBhqLdnleVgwgwlg5fH95I52IeHcoeK6pR4hW/Nv39GNlI/Uqk6O6GBCCsAxYrdxww9BiQIDAQAB", + "manifest_version": 2, + "name": "__MSG_appName__", + "offline_enabled": true, + "options_page": "https://drive.google.com/settings", + "permissions": [ "background", "clipboardRead", "clipboardWrite", "notifications", "unlimitedStorage" ], + "update_url": "http://clients2.google.com/service/update2/crx", + "version": "6.2" +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/128.png b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/128.png new file mode 100644 index 000000000..5c0d6b37e Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/128.png differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ar/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ar/messages.json new file mode 100644 index 000000000..5f68bb58f --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ar/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "منتدى الفيديو الأكثر شيوعًَا على الإنترنت." + }, + "appName": { + "description": "App name.", + "message": "Youtube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/bg/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/bg/messages.json new file mode 100644 index 000000000..002715599 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/bg/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Най-популярната общност за онлайн видео в света." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ca/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ca/messages.json new file mode 100644 index 000000000..075fe5911 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ca/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "La comunitat de vídeo en línia més popular del món." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/cs/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/cs/messages.json new file mode 100644 index 000000000..e9f54d1dc --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/cs/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Nejoblíbenější komunita online videa na světě." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/da/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/da/messages.json new file mode 100644 index 000000000..af5e5205c --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/da/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Verdens mest populære videofællesskab på nettet." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/de/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/de/messages.json new file mode 100644 index 000000000..ccb997769 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/de/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Die beliebteste Online-Video-Community der Welt" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/el/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/el/messages.json new file mode 100644 index 000000000..bca048824 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/el/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Η πιο δημοφιλής διαδικτυακή κοινότητα βίντεο στον κόσμο." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/en/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/en/messages.json new file mode 100644 index 000000000..e35605271 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/en/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "The world's most popular online video community." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/es/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/es/messages.json new file mode 100644 index 000000000..0c4b006ff --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/es/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "La comunidad de vídeos online más popular del mundo" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fi/messages.json new file mode 100644 index 000000000..494ce616a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Maailman suosituin verkkovideoyhteisö." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fil/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fil/messages.json new file mode 100644 index 000000000..4b57d7ac6 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fil/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Ang pinakasikat na online na komunidad ng video sa mundo." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fr/messages.json new file mode 100644 index 000000000..443a69cc4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/fr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "La communauté de vidéos en ligne la plus populaire au monde." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/he/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/he/messages.json new file mode 100644 index 000000000..017b2b246 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/he/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "קהילת הסרטונים המקוונת הפופולרית ביותר בעולם." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hi/messages.json new file mode 100644 index 000000000..8c1af1122 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "विश्व का सबसे लोकप्रिय ऑनलाइन वीडियो समुदाय." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hr/messages.json new file mode 100644 index 000000000..80941db1e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Najpopularnija videozajednica na svijetu." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hu/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hu/messages.json new file mode 100644 index 000000000..03ffe239f --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/hu/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "A világ legnépszerűbb online videoközössége." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/id/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/id/messages.json new file mode 100644 index 000000000..11b798eb5 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/id/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Komunitas video daring yang paling populer di dunia." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/it/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/it/messages.json new file mode 100644 index 000000000..2407cfe25 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/it/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "La più famosa community di video online." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ja/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ja/messages.json new file mode 100644 index 000000000..b0f71f4a1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ja/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "YouTube は世界で最も人気のあるオンライン動画コミュニティです。" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ko/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ko/messages.json new file mode 100644 index 000000000..2f128ec4d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ko/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "세계에서 가장 인기있는 온라인 동영상 커뮤니티입니다." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lt/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lt/messages.json new file mode 100644 index 000000000..cb7781210 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lt/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Populiariausia pasaulyje internetinė vaizdo įrašų bendruomenė." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lv/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lv/messages.json new file mode 100644 index 000000000..37950b8a4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/lv/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Pasaules populārākā tiešsaistes video kopiena." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/nl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/nl/messages.json new file mode 100644 index 000000000..2c345d2ed --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/nl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "'s Werelds populairste online video community." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/no/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/no/messages.json new file mode 100644 index 000000000..8b6c2665b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/no/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "YouTube", + "description": "App name." + }, + "appDesc": { + "message": "Verdens mest populære videofellesskap på nett.", + "description":"App description." + } +} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pl/messages.json new file mode 100644 index 000000000..126cd5239 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Najpopularniejsza społeczność odbiorców filmów online na świecie." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_BR/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_BR/messages.json new file mode 100644 index 000000000..91fb37993 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_BR/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "A comunidade de vídeos on-line mais popular do mundo." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_PT/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_PT/messages.json new file mode 100644 index 000000000..ea022864b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/pt_PT/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "A comunidade de vídeo on-line mais popular do mundo." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ro/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ro/messages.json new file mode 100644 index 000000000..41b7d238a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ro/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Cea mai populară comunitate video online din întreaga lume." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ru/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ru/messages.json new file mode 100644 index 000000000..7b39443da --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/ru/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Самое популярное в мире видеосообщество." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sk/messages.json new file mode 100644 index 000000000..70d63ae64 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Najobľúbenejšia komunita videa online na svete." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sl/messages.json new file mode 100644 index 000000000..763bb5d90 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Najbolj priljubljena spletna skupnost za izmenjavo videoposnetkov." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sr/messages.json new file mode 100644 index 000000000..da9fae39d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Најпопуларнија светска видео заједница на мрежи." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sv/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sv/messages.json new file mode 100644 index 000000000..6cebf32c5 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/sv/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Världens populäraste videomötesplats online." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/th/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/th/messages.json new file mode 100644 index 000000000..7a549e1d5 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/th/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "ชุมชนวิดีโอออนไลน์ยอดนิยมของโลก" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/tr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/tr/messages.json new file mode 100644 index 000000000..57c77aab0 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/tr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Dünyanın en popüler çevrimiçi video topluluğu." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/uk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/uk/messages.json new file mode 100644 index 000000000..15b7917e0 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/uk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Найпопулярніша онлайнова відеоспільнота у світі." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/vi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/vi/messages.json new file mode 100644 index 000000000..77bf16391 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/vi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Cộng đồng video trực tuyến được ưa chuộng nhất trên thế giới." + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_CN/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_CN/messages.json new file mode 100644 index 000000000..afe9c06f0 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_CN/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "全球最热门的在线视频社区。" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_TW/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_TW/messages.json new file mode 100644 index 000000000..aeafc0043 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/_locales/zh_TW/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "全世界最受歡迎的線上影片社群。" + }, + "appName": { + "description": "App name.", + "message": "YouTube" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/manifest.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/manifest.json new file mode 100644 index 000000000..ad840b2be --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0/manifest.json @@ -0,0 +1,22 @@ +{ + "app": { + "launch": { + "container": "tab", + "web_url": "http://www.youtube.com/" + }, + "web_content": { + "enabled": true, + "origin": "http://www.youtube.com" + } + }, + "default_locale": "en", + "description": "__MSG_appDesc__", + "icons": { + "128": "128.png" + }, + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC/HotmFlyuz5FaHaIbVBhhL4BwbcUtsfWwzgUMpZt5ZsLB2nW/Y5xwNkkPANYGdVsJkT2GPpRRIKBO5QiJ7jPMa3EZtcZHpkygBlQLSjMhdrAKevpKgIl6YTkwzNvExY6rzVDzeE9zqnIs33eppY4S5QcoALMxuSWlMKqgFQjHQIDAQAB", + "name": "__MSG_appName__", + "permissions": [ "appNotifications" ], + "update_url": "http://clients2.google.com/service/update2/crx", + "version": "4.2.5" +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/128.png b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/128.png new file mode 100644 index 000000000..617317e0d Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/128.png differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ar/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ar/messages.json new file mode 100644 index 000000000..12a26a9bf --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ar/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "بريد إلكتروني يوفر إمكانية البحث مع مقدار أقل من الرسائل غير المرغوب فيها." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/bg/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/bg/messages.json new file mode 100644 index 000000000..f8c25f30b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/bg/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Бърза електронна поща, в която може да се търси, с по-малко спам." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ca/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ca/messages.json new file mode 100644 index 000000000..65cc8596a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ca/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Correu electrònic ràpid i on es poden fer cerques, amb menys correu brossa." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/cs/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/cs/messages.json new file mode 100644 index 000000000..e73970cf4 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/cs/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Rychlý e-mail s možností vyhledávání a menším množstvím spamu." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/da/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/da/messages.json new file mode 100644 index 000000000..cc2302e37 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/da/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Hurtig e-mail, hvor der kan søges, og som har mindre spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/de/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/de/messages.json new file mode 100644 index 000000000..ce22c6f47 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/de/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Schneller E-Mail-Dienst mit Suchfunktion und wenig Spam." + }, + "appName": { + "description": "App name.", + "message": "Google Mail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/el/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/el/messages.json new file mode 100644 index 000000000..55398f4ec --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/el/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Γρήγορο ηλεκτρονικό ταχυδρομείο με δυνατότητα αναζήτησης και λιγότερα ανεπιθύμητα." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/en/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/en/messages.json new file mode 100644 index 000000000..e799ca1dc --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/en/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Fast, searchable email with less spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/es/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/es/messages.json new file mode 100644 index 000000000..f21d322d6 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/es/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Un servicio de correo electrónico rápido con menos spam y que permite realizar búsquedas." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fi/messages.json new file mode 100644 index 000000000..c1f2818b5 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Nopea, vähemmän roskapostia sisältävä sähköpostipalvelu hakutoiminnolla." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fil/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fil/messages.json new file mode 100644 index 000000000..a695a7799 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fil/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "\r\nMabilis, nahahanap na email na may mas kaunting spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fr/messages.json new file mode 100644 index 000000000..bfeb25f7c --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/fr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Profitez d'une messagerie rapide, avec moins de spam et dotée d'une fonction de recherche." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hi/messages.json new file mode 100644 index 000000000..5b46da035 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "कम स्पैम के साथ तेज़ और खोज करने योग्य ईमेल." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hr/messages.json new file mode 100644 index 000000000..665458b33 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Brza, pretraživa e-pošta s manje neželjene pošte." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hu/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hu/messages.json new file mode 100644 index 000000000..fdcb16adc --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/hu/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Gyors, kereshető e-mail fiók, kevesebb spammel." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/id/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/id/messages.json new file mode 100644 index 000000000..9752200ca --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/id/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Email yang cepat dan dapat ditelusuri dengan lebih sedikit spam. " + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/it/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/it/messages.json new file mode 100644 index 000000000..7fce1763e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/it/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Servizio di posta veloce in cui è possibile cercare i messaggi, con meno spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ja/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ja/messages.json new file mode 100644 index 000000000..7eec01120 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ja/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "高速で検索機能に優れた、迷惑メールの少ないメール システムです。" + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ko/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ko/messages.json new file mode 100644 index 000000000..904416deb --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ko/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "빠르고 검색 가능하며 스팸은 줄어든 이메일 서비스입니다." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lt/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lt/messages.json new file mode 100644 index 000000000..357457dfe --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lt/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Greitas el. paštas, kuriame galima ieškoti ir pateikiama mažiau slamšto." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lv/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lv/messages.json new file mode 100644 index 000000000..b4c49d643 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/lv/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Ātrs un pārlūkojams e-pasts ar mazāku mēstuļu daudzumu." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/nl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/nl/messages.json new file mode 100644 index 000000000..a1c005677 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/nl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Een snelle, doorzoekbare e-mailfunctie met minder spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/no/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/no/messages.json new file mode 100644 index 000000000..8ed177f72 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/no/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "Gmail", + "description": "App name." + }, + "appDesc": { + "message": "Rask, søkbar e-post med mindre nettsøppel.", + "description":"App description." + } +} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pl/messages.json new file mode 100644 index 000000000..ebbff20b3 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Szybka usługa poczty e-mail z możliwością wyszukiwania i mniejszą ilością spamu." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_BR/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_BR/messages.json new file mode 100644 index 000000000..2f8943e3b --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_BR/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "E-mail rápido e pesquisável com menos spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_PT/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_PT/messages.json new file mode 100644 index 000000000..71b3a3931 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/pt_PT/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "E-mail rápido e pesquisável, com menos spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ro/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ro/messages.json new file mode 100644 index 000000000..add4a9e74 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ro/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Serviciu de e-mail rapid, în care se pot efectua căutări, cu mai puţine mesaje spam." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ru/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ru/messages.json new file mode 100644 index 000000000..414769ab6 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/ru/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Быстрая почта без спама, в которой легко найти любое письмо." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/se/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/se/messages.json new file mode 100644 index 000000000..880b991e3 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/se/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "Gmail", + "description": "App name." + }, + "appDesc": { + "message": "Snabb, sökbar e-post med mindre skräppost.", + "description":"App description." + } +} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sk/messages.json new file mode 100644 index 000000000..0c178c68d --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Rýchly e-mail s vyhľadávaním a bez spamu." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sl/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sl/messages.json new file mode 100644 index 000000000..b850e9525 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sl/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Hitra in organizirana e-pošta – manj neželene pošte." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sr/messages.json new file mode 100644 index 000000000..5feff2a42 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/sr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Брза е-пошта са мање непожељних порука и функцијом претраживања." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/th/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/th/messages.json new file mode 100644 index 000000000..88b9ad6d6 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/th/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "บริการอีเมลที่รวดเร็วและค้นหาได้โดยมีสแปมน้อยกว่า" + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/tr/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/tr/messages.json new file mode 100644 index 000000000..1f83e9b63 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/tr/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Daha az spam içeren hızlı, arama yapılabilir e-posta." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/uk/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/uk/messages.json new file mode 100644 index 000000000..e2c5a1cc5 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/uk/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Швидка, доступна для пошуку електронна пошта з меншим напливом спаму." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/vi/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/vi/messages.json new file mode 100644 index 000000000..d3ab2620a --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/vi/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "Email nhanh, có thể tìm kiếm với ít spam hơn." + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_CN/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_CN/messages.json new file mode 100644 index 000000000..def62e1ff --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_CN/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "快捷的电子邮件服务,可以搜索邮件且有效减少了垃圾邮件。" + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_TW/messages.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_TW/messages.json new file mode 100644 index 000000000..006e42f90 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/_locales/zh_TW/messages.json @@ -0,0 +1,10 @@ +{ + "appDesc": { + "description": "App description.", + "message": "垃圾郵件更少、迅速,並且可供搜尋的電子郵件服務。" + }, + "appName": { + "description": "App name.", + "message": "Gmail" + } +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/manifest.json b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/manifest.json new file mode 100644 index 000000000..15102ba20 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Extensions/pjkljhegncpnkpknbcohdijeoejaedia/7_0/manifest.json @@ -0,0 +1,20 @@ +{ + "app": { + "launch": { + "container": "tab", + "web_url": "https://mail.google.com/mail/ca" + }, + "urls": [ "*://mail.google.com/mail/ca" ] + }, + "default_locale": "en", + "description": "__MSG_appDesc__", + "icons": { + "128": "128.png" + }, + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCuGglK43iAz3J9BEYK/Mz6ZhloIMMDqQSAaf3vJt4eHbTbSDsu4WdQ9dQDRcKlg8nwQdePBt0C3PSUBtiSNSS37Z3qEGfS7LCju3h6pI1Yr9MQtxw+jUa7kXXIS09VV73pEFUT/F7c6Qe8L5ZxgAcBvXBh1Fie63qb02I9XQ/CQIDAQAB", + "name": "__MSG_appName__", + "options_page": "https://mail.google.com/mail/ca/#settings", + "permissions": [ "notifications" ], + "update_url": "http://clients2.google.com/service/update2/crx", + "version": "7" +} diff --git a/nichrome/home/user/.config/google-chrome/Default/Favicons b/nichrome/home/user/.config/google-chrome/Default/Favicons new file mode 100644 index 000000000..1abc0e5f7 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Favicons differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Favicons-journal b/nichrome/home/user/.config/google-chrome/Default/Favicons-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_0 b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_0 new file mode 100644 index 000000000..d76fb77e9 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_0 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_1 b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_1 new file mode 100644 index 000000000..dcaafa974 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_1 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_2 b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_2 new file mode 100644 index 000000000..c7e2eb9ad Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_2 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_3 b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_3 new file mode 100644 index 000000000..5eec97358 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/GPUCache/data_3 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/GPUCache/index b/nichrome/home/user/.config/google-chrome/Default/GPUCache/index new file mode 100644 index 000000000..85b9d75bd Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/GPUCache/index differ diff --git a/nichrome/home/user/.config/google-chrome/Default/History b/nichrome/home/user/.config/google-chrome/Default/History new file mode 100644 index 000000000..b15afd739 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/History differ diff --git a/nichrome/home/user/.config/google-chrome/Default/History Provider Cache b/nichrome/home/user/.config/google-chrome/Default/History Provider Cache new file mode 100644 index 000000000..68a83b164 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/History Provider Cache differ diff --git a/nichrome/home/user/.config/google-chrome/Default/History-journal b/nichrome/home/user/.config/google-chrome/Default/History-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Last Session b/nichrome/home/user/.config/google-chrome/Default/Last Session new file mode 100644 index 000000000..024990d0d Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Last Session differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Last Tabs b/nichrome/home/user/.config/google-chrome/Default/Last Tabs new file mode 100644 index 000000000..71e38e0ce Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Last Tabs differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/000003.log b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/000003.log new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/CURRENT b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/CURRENT new file mode 100644 index 000000000..7ed683d17 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/LOCK b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/LOG b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/LOG new file mode 100644 index 000000000..f8a786df1 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/LOG @@ -0,0 +1 @@ +2018/07/20-17:14:36.354 2566 Reusing MANIFEST leveldb/MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/MANIFEST-000001 b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/MANIFEST-000001 new file mode 100644 index 000000000..18e5cab72 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Local Storage/leveldb/MANIFEST-000001 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Login Data b/nichrome/home/user/.config/google-chrome/Default/Login Data new file mode 100644 index 000000000..0baca2d7a Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Login Data differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Login Data-journal b/nichrome/home/user/.config/google-chrome/Default/Login Data-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Network Action Predictor b/nichrome/home/user/.config/google-chrome/Default/Network Action Predictor new file mode 100644 index 000000000..d51d91ac0 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Network Action Predictor differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Network Action Predictor-journal b/nichrome/home/user/.config/google-chrome/Default/Network Action Predictor-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Origin Bound Certs b/nichrome/home/user/.config/google-chrome/Default/Origin Bound Certs new file mode 100644 index 000000000..4adbd3374 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Origin Bound Certs differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Origin Bound Certs-journal b/nichrome/home/user/.config/google-chrome/Default/Origin Bound Certs-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Preferences b/nichrome/home/user/.config/google-chrome/Default/Preferences new file mode 100644 index 000000000..09be8554e --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Preferences @@ -0,0 +1 @@ +{"account_id_migration_state":2,"account_tracker_service_last_update":"13176580426263893","browser":{"has_seen_welcome_page":true,"window_placement":{"bottom":764,"left":687,"maximized":false,"right":1362,"top":388,"work_area_bottom":768,"work_area_left":0,"work_area_right":1366,"work_area_top":0}},"countryid_at_install":-1,"data_reduction":{"daily_original_length":[],"daily_original_length_application":"0","daily_original_length_unknown":"0","daily_original_length_via_data_reduction_proxy":[],"daily_original_length_via_data_reduction_proxy_application":"0","daily_original_length_via_data_reduction_proxy_unknown":"0","daily_original_length_via_data_reduction_proxy_video":"0","daily_original_length_video":"0","daily_original_length_with_data_reduction_proxy_enabled":[],"daily_original_length_with_data_reduction_proxy_enabled_application":"0","daily_original_length_with_data_reduction_proxy_enabled_unknown":"0","daily_original_length_with_data_reduction_proxy_enabled_video":"0","daily_received_length":[],"daily_received_length_application":"0","daily_received_length_https_with_data_reduction_proxy_enabled":[],"daily_received_length_long_bypass_with_data_reduction_proxy_enabled":[],"daily_received_length_short_bypass_with_data_reduction_proxy_enabled":[],"daily_received_length_unknown":"0","daily_received_length_unknown_with_data_reduction_proxy_enabled":[],"daily_received_length_via_data_reduction_proxy":[],"daily_received_length_via_data_reduction_proxy_application":"0","daily_received_length_via_data_reduction_proxy_unknown":"0","daily_received_length_via_data_reduction_proxy_video":"0","daily_received_length_video":"0","daily_received_length_with_data_reduction_proxy_enabled":[],"daily_received_length_with_data_reduction_proxy_enabled_application":"0","daily_received_length_with_data_reduction_proxy_enabled_unknown":"0","daily_received_length_with_data_reduction_proxy_enabled_video":"0","last_update_date":"0"},"data_reduction_lo_fi":{"load_images_requests_per_session":0,"load_images_snackbars_shown_per_session":0,"was_used_this_session":false},"default_apps_install_state":3,"dns_prefetching":{"host_referral_list":[2],"startup_list":[1,"http://localhost:8000/","https://www.google.com/","https://www.googleapis.com/"]},"download":{"directory_upgrade":true},"extensions":{"alerts":{"initialized":true},"autoupdate":{"next_check":"13176584164948483"},"chrome_url_overrides":{"bookmarks":[{"active":true,"entry":"chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html"}]},"last_chrome_version":"61.0.3163.100","settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"manifest_permissions":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"events":[],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"install_time":"13176580426197283","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover great apps, games, extensions and themes for Google Chrome.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"never_activated_since_loaded":true,"page_ordinal":"n","path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/web_store","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"aohghmighlieiainnegkcijnfilokake":{"ack_external":true,"active_permissions":{"api":[],"manifest_permissions":[]},"app_launcher_ordinal":"x","commands":{},"content_settings":[],"creation_flags":137,"events":[],"from_bookmark":false,"from_webstore":true,"granted_permissions":{"api":[],"manifest_permissions":[]},"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580428704276","location":1,"manifest":{"app":{"launch":{"local_path":"main.html"}},"description":"Create, share, and access your Google Docs from anywhere.","icons":{"128":"icon_128.png","16":"icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJhLK6fk/BWTEvJhywpk7jDe4A2r0bGXGOLZW4/AdBp3IiD9o9nx4YjLAtv0tIPxi7MvFd/GUUbQBwHT5wQWONJj1z/0Rc2qBkiJA0yqXh42p0snuA8dCfdlhOLsp7/XTMEwAVasjV5hC4awl78eKfJYlZ+8fM/UldLWJ/51iBQwIDAQAB","manifest_version":2,"name":"Docs","offline_enabled":true,"update_url":"http://clients2.google.com/service/update2/crx","version":"0.0.0.6"},"never_activated_since_loaded":true,"page_ordinal":"n","path":"aohghmighlieiainnegkcijnfilokake/0.0.0.6_0","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":true,"was_installed_by_oem":false},"apdfllckaahabafndbhieahigkjlhalf":{"ack_external":true,"active_permissions":{"api":["background","clipboardRead","clipboardWrite","notifications","unlimitedStorage"],"manifest_permissions":[]},"app_launcher_ordinal":"w","commands":{},"content_settings":[],"creation_flags":137,"events":[],"from_bookmark":false,"from_webstore":true,"granted_permissions":{"api":["background","clipboardRead","clipboardWrite","notifications","unlimitedStorage"],"manifest_permissions":[]},"incognito_content_settings":[],"incognito_preferences":{},"install_time":"13176580428607199","location":1,"manifest":{"app":{"launch":{"web_url":"https://drive.google.com/"},"urls":["http://docs.google.com/","http://drive.google.com/","https://docs.google.com/","https://drive.google.com/"]},"background":{"allow_js_access":false},"current_locale":"en_US","default_locale":"en_US","description":"Google Drive: create, share and keep all your stuff in one place.","icons":{"128":"128.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIl5KlKwL2TSkntkpY3naLLz5jsN0YwjhZyObcTOK6Nda4Ie21KRqZau9lx5SHcLh7pE2/S9OiArb+na2dn7YK5EvH+aRXS1ec3uxVlBhqLdnleVgwgwlg5fH95I52IeHcoeK6pR4hW/Nv39GNlI/Uqk6O6GBCCsAxYrdxww9BiQIDAQAB","manifest_version":2,"name":"Google Drive","offline_enabled":true,"options_page":"https://drive.google.com/settings","permissions":["background","clipboardRead","clipboardWrite","notifications","unlimitedStorage"],"update_url":"http://clients2.google.com/service/update2/crx","version":"6.2"},"never_activated_since_loaded":true,"page_ordinal":"n","path":"apdfllckaahabafndbhieahigkjlhalf/6.2_0","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":true,"was_installed_by_oem":false},"bepbmhgboaologfdajaanbcjmnhjmhfn":{"disable_reasons":1,"state":0},"blpcfgokakmgnkcojhhkbfbldkacnbeo":{"ack_external":true,"active_permissions":{"api":[],"manifest_permissions":[]},"app_launcher_ordinal":"yn","commands":{},"content_settings":[],"creation_flags":153,"events":[],"from_bookmark":true,"from_webstore":true,"granted_permissions":{"api":[],"manifest_permissions":[]},"incognito_content_settings":[],"incognito_preferences":{},"install_time":"13176580428806137","location":1,"manifest":{"app":{"launch":{"container":"tab","web_url":"http://www.youtube.com/"},"web_content":{"enabled":true,"origin":"http://www.youtube.com"}},"current_locale":"en_US","default_locale":"en","description":"The world's most popular online video community.","icons":{"128":"128.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC/HotmFlyuz5FaHaIbVBhhL4BwbcUtsfWwzgUMpZt5ZsLB2nW/Y5xwNkkPANYGdVsJkT2GPpRRIKBO5QiJ7jPMa3EZtcZHpkygBlQLSjMhdrAKevpKgIl6YTkwzNvExY6rzVDzeE9zqnIs33eppY4S5QcoALMxuSWlMKqgFQjHQIDAQAB","name":"YouTube","permissions":["appNotifications"],"update_url":"http://clients2.google.com/service/update2/crx","version":"4.2.5"},"never_activated_since_loaded":true,"page_ordinal":"n","path":"blpcfgokakmgnkcojhhkbfbldkacnbeo/4.2.5_0","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":true,"was_installed_by_oem":false},"eemcgdkfndhakfknompkggombfjjjeno":{"active_permissions":{"api":["bookmarks","bookmarkManagerPrivate","metricsPrivate","systemPrivate","tabs"],"explicit_host":["chrome://favicon/*","chrome://resources/*"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":[],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426186521","location":5,"manifest":{"chrome_url_overrides":{"bookmarks":"main.html"},"content_security_policy":"object-src 'none'; script-src chrome://resources 'self' blob: filesystem:","description":"Bookmark Manager","icons":{},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQcByy+eN9jzazWF/DPn7NW47sW7lgmpk6eKc0BQM18q8hvEM3zNm2n7HkJv/R6fU+X5mtqkDuKvq5skF6qqUF4oEyaleWDFhd1xFwV7JV+/DU7bZ00w2+6gzqsabkerFpoP33ZRIw7OviJenP0c0uWqDWF8EGSyMhB3txqhOtiQIDAQAB","manifest_version":2,"name":"Bookmark Manager","permissions":["bookmarks","bookmarkManagerPrivate","metricsPrivate","systemPrivate","tabs","chrome://favicon/","chrome://resources/"],"version":"0.1"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/bookmark_manager","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"gfdkimpbcpahaombhbimeihdjnejgicl":{"active_permissions":{"api":["feedbackPrivate"],"explicit_host":["chrome://resources/*"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":["feedbackPrivate.onFeedbackRequested","runtime.onMessageExternal"],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426198677","location":5,"manifest":{"app":{"background":{"scripts":["js/event_handler.js"]},"content_security_policy":"default-src 'none'; script-src 'self' blob: filesystem: chrome://resources; style-src 'unsafe-inline' blob: chrome: file: filesystem: data: *; img-src * blob: chrome: file: filesystem: data:; media-src 'self' blob: filesystem:"},"description":"User feedback extension","display_in_launcher":false,"display_in_new_tab_page":false,"icons":{"32":"images/icon32.png","64":"images/icon64.png"},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMZElzFX2J1g1nRQ/8S3rg/1CjFyDltWOxQg+9M8aVgNVxbutEWFQz+oQzIP9BB67mJifULgiv12ToFKsae4NpEUR8sPZjiKDIHumc6pUdixOm8SJ5Rs16SMR6+VYxFUjlVW+5CA3IILptmNBxgpfyqoK0qRpBDIhGk1KDEZ4zqQIDAQAB","manifest_version":2,"name":"Feedback","permissions":["feedbackPrivate","chrome://resources/"],"version":"1.0"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/feedback","preferences":{},"regular_only_preferences":{},"running":false,"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"kmendfapggjehodndflmmgagdbamhnfd":{"active_permissions":{"api":["cryptotokenPrivate","externally_connectable.all_urls","hid","tabs","u2fDevices","usb",{"usbDevices":[{"interfaceClass":-1,"interfaceId":-1,"productId":529,"vendorId":4176}]},"webConnectable"],"explicit_host":["http://*/*","https://*/*"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":["runtime.onConnectExternal","runtime.onMessageExternal"],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426204529","location":5,"manifest":{"background":{"persistent":false,"scripts":["util.js","b64.js","sha256.js","timer.js","countdown.js","countdowntimer.js","devicestatuscodes.js","approvedorigins.js","errorcodes.js","webrequest.js","messagetypes.js","factoryregistry.js","closeable.js","requesthelper.js","enroller.js","requestqueue.js","signer.js","origincheck.js","textfetcher.js","appid.js","watchdog.js","logging.js","webrequestsender.js","window-timer.js","cryptotokenorigincheck.js","cryptotokenapprovedorigins.js","gnubbydevice.js","hidgnubbydevice.js","usbgnubbydevice.js","gnubbies.js","gnubby.js","gnubby-u2f.js","gnubbyfactory.js","singlesigner.js","multiplesigner.js","generichelper.js","inherits.js","individualattest.js","devicefactoryregistry.js","usbhelper.js","usbenrollhandler.js","usbsignhandler.js","usbgnubbyfactory.js","googlecorpindividualattest.js","cryptotokenbackground.js"]},"description":"CryptoToken Component Extension","externally_connectable":{"accepts_tls_channel_id":true,"ids":["fjajfjhkeibgmiggdfehjplbhmfkialk"],"matches":["\u003Call_urls>"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq7zRobvA+AVlvNqkHSSVhh1sEWsHSqz4oR/XptkDe/Cz3+gW9ZGumZ20NCHjaac8j1iiesdigp8B1LJsd/2WWv2Dbnto4f8GrQ5MVphKyQ9WJHwejEHN2K4vzrTcwaXqv5BSTXwxlxS/mXCmXskTfryKTLuYrcHEWK8fCHb+0gvr8b/kvsi75A1aMmb6nUnFJvETmCkOCPNX5CHTdy634Ts/x0fLhRuPlahk63rdf7agxQv5viVjQFk+tbgv6aa9kdSd11Js/RZ9yZjrFgHOBWgP4jTBqud4+HUglrzu8qynFipyNRLCZsaxhm+NItTyNgesxLdxZcwOz56KD1Q4IQIDAQAB","manifest_version":2,"name":"CryptoTokenExtension","permissions":["hid","u2fDevices","usb","cryptotokenPrivate","externally_connectable.all_urls","tabs","https://*/*","http://*/*",{"usbDevices":[{"productId":529,"vendorId":4176}]}],"version":"0.9.46"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/cryptotoken","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"mfehgcgbbipciphmccgaenjidiccnmng":{"active_permissions":{"api":["cloudPrintPrivate"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":[],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"install_time":"13176580426196595","location":5,"manifest":{"app":{"launch":{"web_url":"https://www.google.com/cloudprint"},"urls":["https://www.google.com/cloudprint/enable_chrome_connector"]},"description":"Cloud Print","display_in_launcher":false,"icons":{},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDqOhnwk4+HXVfGyaNsAQdU/js1Na56diW08oF1MhZiwzSnJsEaeuMN9od9q9N4ZdK3o1xXOSARrYdE+syV7Dl31nf6qz3A6K+D5NHe6sSB9yvYlIiN37jdWdrfxxE0pRYEVYZNTe3bzq3NkcYJlOdt1UPcpJB+isXpAGUKUvt7EQIDAQAB","name":"Cloud Print","permissions":["cloudPrintPrivate"],"version":"0.1"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/cloud_print","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"active_permissions":{"api":["resourcesPrivate"],"explicit_host":["\u003Call_urls>","chrome://favicon/*"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":[],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426206349","location":5,"manifest":{"content_security_policy":"script-src 'self' blob: filesystem: chrome://resources; object-src * blob: externalfile: file: filesystem: data:; plugin-types application/x-google-chrome-pdf","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"index.html","name":"Chrome PDF Viewer","offline_enabled":true,"permissions":["\u003Call_urls>","resourcesPrivate"],"version":"1","web_accessible_resources":["*.js","*.html","*.css","*.png"]},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/pdf","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"neajdppkdcdipfabeoofebfddakdcjhd":{"active_permissions":{"api":["systemPrivate","ttsEngine"],"explicit_host":["https://www.google.com/*"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":["ttsEngine.onPause","ttsEngine.onResume","ttsEngine.onSpeak","ttsEngine.onStop"],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426203666","location":5,"manifest":{"background":{"persistent":false,"scripts":["tts_extension.js"]},"description":"Component extension providing speech via the Google network text-to-speech service.","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8GSbNUMGygqQTNDMFGIjZNcwXsHLzkNkHjWbuY37PbNdSDZ4VqlVjzbWqODSe+MjELdv5Keb51IdytnoGYXBMyqKmWpUrg+RnKvQ5ibWr4MW9pyIceOIdp9GrzC1WZGgTmZismYR3AjaIpufZ7xDdQQv+XrghPWCkdVqLN+qZDA1HU+DURznkMICiDDSH2sU0egm9UbWfS218bZqzKeQDiC3OnTPlaxcbJtKUuupIm5knjze3Wo9Ae9poTDMzKgchg0VlFCv3uqox+wlD8sjXBoyBCCK9HpImdVAF1a7jpdgiUHpPeV/26oYzM9/grltwNR3bzECQgSpyXp0eyoegwIDAQAB","manifest_version":2,"name":"Google Network Speech","permissions":["systemPrivate","ttsEngine","https://www.google.com/"],"tts_engine":{"voices":[{"event_types":["start","end","error"],"gender":"female","lang":"de-DE","remote":true,"voice_name":"Google Deutsch"},{"event_types":["start","end","error"],"gender":"female","lang":"en-US","remote":true,"voice_name":"Google US English"},{"event_types":["start","end","error"],"gender":"female","lang":"en-GB","remote":true,"voice_name":"Google UK English Female"},{"event_types":["start","end","error"],"gender":"male","lang":"en-GB","remote":true,"voice_name":"Google UK English Male"},{"event_types":["start","end","error"],"gender":"female","lang":"es-ES","remote":true,"voice_name":"Google español"},{"event_types":["start","end","error"],"gender":"female","lang":"es-US","remote":true,"voice_name":"Google español de Estados Unidos"},{"event_types":["start","end","error"],"gender":"female","lang":"fr-FR","remote":true,"voice_name":"Google français"},{"event_types":["start","end","error"],"gender":"female","lang":"hi-IN","remote":true,"voice_name":"Google हिन्दी"},{"event_types":["start","end","error"],"gender":"female","lang":"id-ID","remote":true,"voice_name":"Google Bahasa Indonesia"},{"event_types":["start","end","error"],"gender":"female","lang":"it-IT","remote":true,"voice_name":"Google italiano"},{"event_types":["start","end","error"],"gender":"female","lang":"ja-JP","remote":true,"voice_name":"Google 日本語"},{"event_types":["start","end","error"],"gender":"female","lang":"ko-KR","remote":true,"voice_name":"Google 한국의"},{"event_types":["start","end","error"],"gender":"female","lang":"nl-NL","remote":true,"voice_name":"Google Nederlands"},{"event_types":["start","end","error"],"gender":"female","lang":"pl-PL","remote":true,"voice_name":"Google polski"},{"event_types":["start","end","error"],"gender":"female","lang":"pt-BR","remote":true,"voice_name":"Google português do Brasil"},{"event_types":["start","end","error"],"gender":"female","lang":"ru-RU","remote":true,"voice_name":"Google русский"},{"event_types":["start","end","error"],"gender":"female","lang":"zh-CN","remote":true,"voice_name":"Google 普通话(中国大陆)"},{"event_types":["start","end","error"],"gender":"female","lang":"zh-HK","remote":true,"voice_name":"Google 粤語(香港)"},{"event_types":["start","end","error"],"gender":"female","lang":"zh-TW","remote":true,"voice_name":"Google 國語(臺灣)"}]},"version":"1.0"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/network_speech_synthesis","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"nkeimhogjdpnpccoofpliimaahmaaome":{"active_permissions":{"api":["desktopCapture","processes","webConnectable","webrtcAudioPrivate","webrtcDesktopCapturePrivate","webrtcLoggingPrivate","system.cpu"],"manifest_permissions":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":["runtime.onConnectExternal","runtime.onMessageExternal"],"from_bookmark":false,"from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"initial_keybindings_set":true,"install_time":"13176580426198008","location":5,"manifest":{"background":{"page":"background.html","persistent":false},"externally_connectable":{"matches":["https://*.google.com/*","*://localhost/*"]},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAQt2ZDdPfoSe/JI6ID5bgLHRCnCu9T36aYczmhw/tnv6QZB2I6WnOCMZXJZlRdqWc7w9jo4BWhYS50Vb4weMfh/I0On7VcRwJUgfAxW2cHB+EkmtI1v4v/OU24OqIa1Nmv9uRVeX0GjhQukdLNhAE6ACWooaf5kqKlCeK+1GOkQIDAQAB","manifest_version":2,"name":"Google Hangouts","permissions":["desktopCapture","processes","system.cpu","webrtcAudioPrivate","webrtcDesktopCapturePrivate","webrtcLoggingPrivate"],"version":"1.3.4"},"never_activated_since_loaded":true,"path":"/tmp/.mount_chromerNG7Rq/opt/google/chrome/resources/hangout_services","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"pjkljhegncpnkpknbcohdijeoejaedia":{"ack_external":true,"active_permissions":{"api":["notifications"],"manifest_permissions":[]},"app_launcher_ordinal":"y","commands":{},"content_settings":[],"creation_flags":137,"events":[],"from_bookmark":false,"from_webstore":true,"granted_permissions":{"api":["notifications"],"manifest_permissions":[]},"incognito_content_settings":[],"incognito_preferences":{},"install_time":"13176580428773173","location":1,"manifest":{"app":{"launch":{"container":"tab","web_url":"https://mail.google.com/mail/ca"},"urls":["*://mail.google.com/mail/ca"]},"current_locale":"en_US","default_locale":"en","description":"Fast, searchable email with less spam.","icons":{"128":"128.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCuGglK43iAz3J9BEYK/Mz6ZhloIMMDqQSAaf3vJt4eHbTbSDsu4WdQ9dQDRcKlg8nwQdePBt0C3PSUBtiSNSS37Z3qEGfS7LCju3h6pI1Yr9MQtxw+jUa7kXXIS09VV73pEFUT/F7c6Qe8L5ZxgAcBvXBh1Fie63qb02I9XQ/CQIDAQAB","name":"Gmail","options_page":"https://mail.google.com/mail/ca/#settings","permissions":["notifications"],"update_url":"http://clients2.google.com/service/update2/crx","version":"7"},"never_activated_since_loaded":true,"page_ordinal":"n","path":"pjkljhegncpnkpknbcohdijeoejaedia/7_0","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":true,"was_installed_by_oem":false}},"toolbar":[]},"gcm":{"product_category_for_subtypes":"com.chrome.linux"},"http_original_content_length":"0","http_received_content_length":"0","invalidator":{"client_id":"x6cJ4hkDPcTtgUa+csbaeA=="},"language_model_counters":{"en":1},"media":{"device_id_salt":"j0B8rEZ8ji9OpqjrgXC85w=="},"pinned_tabs":[],"plugins":{"plugins_list":[]},"profile":{"avatar_bubble_tutorial_shown":2,"avatar_index":26,"content_settings":{"domain_to_origin_migration_status":1,"exceptions":{"app_banner":{},"auto_select_certificate":{},"automatic_downloads":{},"autoplay":{},"background_sync":{},"bluetooth_guard":{},"cookies":{},"durable_storage":{},"geolocation":{},"images":{},"important_site_info":{},"javascript":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"notifications":{},"password_protection":{},"permission_autoblocking_data":{},"plugins":{},"popups":{},"ppapi_broker":{},"prompt_no_decision_count":{},"protocol_handler":{},"site_engagement":{},"sound":{},"ssl_cert_decisions":{},"subresource_filter":{},"subresource_filter_data":{},"usb_chooser_data":{}},"pref_version":1},"created_by_version":"61.0.3163.100","exit_type":"Normal","exited_cleanly":true,"local_profile_id":1600579,"managed_user_id":"","name":"Person 1","was_obsolete_http_data_cleaned":true},"protection":{"macs":{"browser":{"show_home_button":"9DDE23BD288B95F7CE675BBD01A9E2B63A7624B8C3CDB431097FDF3F63AB4E51"},"default_search_provider_data":{"template_url_data":"705F2D2FDD2FF483A1A9E675DFD71CCB223E81A2CEBF5D20C031A68B0020CF77"},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"0FACA21761F5C3C55A185815143676F25C5B9999CDE55683A1DAAA8F14CF43C7","aohghmighlieiainnegkcijnfilokake":"6FDAFC85728A6DAA39F4B7511D63202C34177A16A74C66D9E7434FF5423F3121","apdfllckaahabafndbhieahigkjlhalf":"7EA584EC2447622593D62423388BD9EBDD5301F59B5B2D497E5375CF3DBF330E","bepbmhgboaologfdajaanbcjmnhjmhfn":"1AF5697DC58855220EC37C72526ED6ADDC2D3D47161F97F5D99B6A849DB352D6","blpcfgokakmgnkcojhhkbfbldkacnbeo":"2E9C5F2E2257AFEC55D38438E75257FDAC52AC359E1C95C6F4B86169C4B02DFF","eemcgdkfndhakfknompkggombfjjjeno":"072CFBAA1125243D5CF25A4CB628747D1C160F2361435B43EAF6836C671A3A58","gfdkimpbcpahaombhbimeihdjnejgicl":"0CF62E42F1DDF107D90B9E552138565E970976856E54961F7EB7695AC2D13EEB","kmendfapggjehodndflmmgagdbamhnfd":"E250B95C88E352BE90C3A2C7BEEEAE0D5262C838841B5D1B1981766ACD8B9413","mfehgcgbbipciphmccgaenjidiccnmng":"C15FE16FFD5CCB478ABF593D8A95E3492AF9524D48585A9F8C71D1FBEC024D82","mhjfbmdgcfjbbpaeojofohoefgiehjai":"B08FBC6056E1041E83C81557B788114F3FCE26A250EE813DC29F872888D1B374","neajdppkdcdipfabeoofebfddakdcjhd":"9E766EFBA9F666D9A0DCB822C0AFAC0FDFC342BCC35EA7A50358CE85144FEE0C","nkeimhogjdpnpccoofpliimaahmaaome":"D5611CA0586D1FED0E07597645AC555D066C91283FBE63FBF8E389A94DF53E8D","pjkljhegncpnkpknbcohdijeoejaedia":"533DB683C863A1D815B1849069AF6166BDEF22FBEE3B4F732169348971BD0167"}},"google":{"services":{"account_id":"07620F46EF9994C94D86883494C13E89DC6509B3D4E8978B2E18F6776C85CDBF","last_account_id":"8452449E1468A5CF585BF23BDC52A3CA1BED67E36262AAE4BAC3583936F8B7AB","last_username":"C202CF3B01A560B8B7D71D3B0076B61126EF72F4B11D79B3EA6E3661DB757E93","username":"1CA30EB4EEE885888D93E71C93383D2E2A14715338EDF9B157FF935504B57767"}},"homepage":"B2A199504AEACAAD5C3A7BB4A96D9C3A9536D7A29672EB4DA3B9552B8D39C49C","homepage_is_newtabpage":"306C67E79E036278678ED45B3C668C4421665A206FC4B97F053015981C8BAAE2","pinned_tabs":"14F8B2B035A86C0AEA5637DFD2AA7F5BDEADD0AAFF13141260E56C9477047715","prefs":{"preference_reset_time":"7B22235E8A603BE387D81441C8C88F0C4E591567147FA05BE235C96189AC4490"},"safebrowsing":{"incidents_sent":"F1827D0C55798CE7843DAF5DDEAB06A9BB2F9628970A5DCDA2543102436E4749"},"search_provider_overrides":"99AC1EA12DA6196886F08A934B3B5006A725063DF41E9D0EE38F1FCFFDFDD5B0","session":{"restore_on_startup":"7BADFD2212B8A15263FDE51964FD3BAA8E29BF70E76A05BFC8C68CFFEE5706AA","startup_urls":"C1B359171D6112C9E4C5F9FA96ABAF6B61E8A18C14D75E6A86F5561B2FB9AD2A"}}},"protocol_handler":{"excluded_schemes":{"afp":true,"data":true,"disk":true,"disks":true,"file":true,"hcp":true,"javascript":true,"mailto":false,"ms-help":true,"news":false,"nntp":true,"shell":true,"snews":false,"vbscript":true,"view-source":true,"vnd":{"ms":{"radio":true}}}},"safebrowsing":{"scout_group_selected":true},"session":{"restore_on_startup":4,"startup_urls":["http://localhost:8000/"]},"spellcheck":{"dictionaries":["en-US"],"dictionary":""}} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/QuotaManager b/nichrome/home/user/.config/google-chrome/Default/QuotaManager new file mode 100644 index 000000000..5f3869624 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/QuotaManager differ diff --git a/nichrome/home/user/.config/google-chrome/Default/QuotaManager-journal b/nichrome/home/user/.config/google-chrome/Default/QuotaManager-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/README b/nichrome/home/user/.config/google-chrome/Default/README new file mode 100644 index 000000000..98d9d2785 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/README @@ -0,0 +1 @@ +Google Chrome settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Google Chrome defined APIs. \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Secure Preferences b/nichrome/home/user/.config/google-chrome/Default/Secure Preferences new file mode 100644 index 000000000..f06075202 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Secure Preferences @@ -0,0 +1 @@ +{"protection":{"super_mac":"33F663353631B144EA660B5F809D89BA41CAF954EE5776BE5004BB589CA96BE1"}} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Default/Session Storage/000003.log b/nichrome/home/user/.config/google-chrome/Default/Session Storage/000003.log new file mode 100644 index 000000000..e81ba6766 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Session Storage/000003.log differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Session Storage/CURRENT b/nichrome/home/user/.config/google-chrome/Default/Session Storage/CURRENT new file mode 100644 index 000000000..7ed683d17 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Session Storage/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Session Storage/LOCK b/nichrome/home/user/.config/google-chrome/Default/Session Storage/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Session Storage/LOG b/nichrome/home/user/.config/google-chrome/Default/Session Storage/LOG new file mode 100644 index 000000000..114e9f882 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/Session Storage/LOG @@ -0,0 +1 @@ +2018/07/20-17:15:01.520 2498 Reusing MANIFEST /home/user/.config/google-chrome/Default/Session Storage/MANIFEST-000001 diff --git a/nichrome/home/user/.config/google-chrome/Default/Session Storage/MANIFEST-000001 b/nichrome/home/user/.config/google-chrome/Default/Session Storage/MANIFEST-000001 new file mode 100644 index 000000000..18e5cab72 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Session Storage/MANIFEST-000001 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Shortcuts b/nichrome/home/user/.config/google-chrome/Default/Shortcuts new file mode 100644 index 000000000..27fef1a73 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Shortcuts differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Shortcuts-journal b/nichrome/home/user/.config/google-chrome/Default/Shortcuts-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Top Sites b/nichrome/home/user/.config/google-chrome/Default/Top Sites new file mode 100644 index 000000000..2ceff122e Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Top Sites differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Top Sites-journal b/nichrome/home/user/.config/google-chrome/Default/Top Sites-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/Visited Links b/nichrome/home/user/.config/google-chrome/Default/Visited Links new file mode 100644 index 000000000..69b38d8f4 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Visited Links differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Web Data b/nichrome/home/user/.config/google-chrome/Default/Web Data new file mode 100644 index 000000000..a05857713 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/Web Data differ diff --git a/nichrome/home/user/.config/google-chrome/Default/Web Data-journal b/nichrome/home/user/.config/google-chrome/Default/Web Data-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/000005.log b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/000005.log new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/CURRENT b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/CURRENT new file mode 100644 index 000000000..cacca7574 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000004 diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOCK b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG new file mode 100644 index 000000000..ab274fffe --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG @@ -0,0 +1,3 @@ +2018/07/20-17:25:34.212 2883 Recovering log #3 +2018/07/20-17:25:34.212 2883 Delete type=3 #2 +2018/07/20-17:25:34.212 2883 Delete type=0 #3 diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG.old b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG.old new file mode 100644 index 000000000..29925d614 --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/LOG.old @@ -0,0 +1 @@ +2018/07/20-17:13:46.148 2498 Delete type=3 #1 diff --git a/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/MANIFEST-000004 b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/MANIFEST-000004 new file mode 100644 index 000000000..0a6e9237f Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/data_reduction_proxy_leveldb/MANIFEST-000004 differ diff --git a/nichrome/home/user/.config/google-chrome/Default/databases/Databases.db b/nichrome/home/user/.config/google-chrome/Default/databases/Databases.db new file mode 100644 index 000000000..c330fac20 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/databases/Databases.db differ diff --git a/nichrome/home/user/.config/google-chrome/Default/databases/Databases.db-journal b/nichrome/home/user/.config/google-chrome/Default/databases/Databases.db-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Default/previews_opt_out.db b/nichrome/home/user/.config/google-chrome/Default/previews_opt_out.db new file mode 100644 index 000000000..5c951f52b Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Default/previews_opt_out.db differ diff --git a/nichrome/home/user/.config/google-chrome/Default/previews_opt_out.db-journal b/nichrome/home/user/.config/google-chrome/Default/previews_opt_out.db-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/First Run b/nichrome/home/user/.config/google-chrome/First Run new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/Local State b/nichrome/home/user/.config/google-chrome/Local State new file mode 100644 index 000000000..75d5541fb --- /dev/null +++ b/nichrome/home/user/.config/google-chrome/Local State @@ -0,0 +1 @@ +{"browser":{"last_redirect_origin":""},"easy_unlock":{"device_id":"db633022-5ddd-4b74-bc8d-53c5bd2e17b2"},"gl_renderer_string":"Google SwiftShader","gl_vendor_string":"Google Inc.","gl_version_string":"OpenGL ES 2.0 SwiftShader","hardware_acceleration_mode_previous":true,"policy":{"last_statistics_update":"13176580425380815"},"profile":{"info_cache":{"Default":{"active_time":1532106841.514689,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_26","background_apps":false,"gaia_id":"","is_ephemeral":false,"is_omitted_from_profile_list":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","name":"Person 1","user_name":""}},"last_active_profiles":["Default"]},"rappor":{"cohort_seed":477,"last_daily_sample":"13176580456555149","secret":"TgqgQjiH7x1jJ68Bhrxfr9dMf/ujpRLwh7o0ruPucXvmP7GHTBQtvoHtj1kqKt2o"},"show-first-run-bubble-option":0,"shutdown":{"num_processes":2,"num_processes_slow":0,"type":1},"startup_metric":{"last_startup_timestamp":"13176581131070000","last_startup_version":"61.0.3163.100","same_version_startup_count":1},"supervised_users":{"whitelists":{}},"uninstall_metrics":{"installation_date2":"1532106825","launch_count":"2","page_load_count":"12","uptime_sec":"691"},"user_experience_metrics":{"client_id2":"e663dba7-466a-43d0-8a03-826b03f69486","client_id_timestamp":"1532106841","default_opt_in":2,"initial_logs2":[],"last_seen":{"CrashpadMetrics":"0"},"low_entropy_source2":3566,"ongoing_logs2":[{"data":"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","hash":"8qIYXPNO/LvSoVBYeyjm/qi2rSs=","timestamp":"1532106901"},{"data":"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","hash":"ciG35VTSvwjaMwAHAofSIO5+bVo=","timestamp":"1532107517"}],"reporting_enabled":true,"session_id":1,"stability":{"breakpad_registration_fail":0,"breakpad_registration_ok":1,"child_process_crash_count":1,"crash_count":0,"debugger_not_present":1,"debugger_present":0,"deferred_count":0,"discard_count":0,"execution_phase":700,"exited_cleanly":true,"extension_renderer_crash_count":0,"extension_renderer_failed_launch_count":0,"extension_renderer_launch_count":0,"incomplete_session_end_count":0,"launch_count":1,"page_load_count":9,"plugin_stats2":[],"renderer_crash_count":0,"renderer_failed_launch_count":0,"renderer_hang_count":0,"renderer_launch_count":4,"saved_system_profile":"CNDrh84FEhA2MS4wLjMxNjMuMTAwLTY0GJCqyNoFIgVlbi1VUyoPCgVMaW51eBIGNC4xMi43MnIKBng4Nl82NBDpHSIAKAEw1go4gAZCOggAEAAaBzMuMy4wLjIiCjIwMTcvMDQvMDcyC0dvb2dsZSBJbmMuOhJHb29nbGUgU3dpZnRTaGFkZXJlAACAP2oUCgxHZW51aW5lSW50ZWwQyY0UGAKCAQCKAQA6OwoRQ2hyb21lIFBERiBWaWV3ZXISIG1oamZibWRnY2ZqYmJwYWVvam9mb2hvZWZnaWVoamFpGgAgACgAOjsKD1Nob2Nrd2F2ZSBGbGFzaBIYaW50ZXJuYWwtbm90LXlldC1wcmVzZW50GgoyNC4wLjAuMTg5IAAoATpOCiJXaWRldmluZSBDb250ZW50IERlY3J5cHRpb24gTW9kdWxlEhhsaWJ3aWRldmluZWNkbWFkYXB0ZXIuc28aCjEuNC44LjEwMDggACgBOisKDU5hdGl2ZSBDbGllbnQSFGludGVybmFsLW5hY2wtcGx1Z2luGgAgACgBOi4KEUNocm9tZSBQREYgUGx1Z2luEhNpbnRlcm5hbC1wZGYtdmlld2VyGgAgACgBSgoNMZBVDBX09Ec9UARiAGoMCAAQBxgAIAY4AEAAgAGQqsjaBZABlgGQAdEBkAHvAZAB4AKQAYgDkAGRBJABtgSQAeQEkAHHBZAB7QaQAZMHkAGnB5gBArABAQ==","saved_system_profile_hash":"518D024AB868CFDB52F6C346B7B6DC2C8F267874","session_end_completed":true,"stats_buildtime":"1505883600","stats_version":"61.0.3163.100-64","version_mismatch_count":0}},"was":{"restarted":false}} \ No newline at end of file diff --git a/nichrome/home/user/.config/google-chrome/Safe Browsing Cookies b/nichrome/home/user/.config/google-chrome/Safe Browsing Cookies new file mode 100644 index 000000000..401f09539 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/Safe Browsing Cookies differ diff --git a/nichrome/home/user/.config/google-chrome/Safe Browsing Cookies-journal b/nichrome/home/user/.config/google-chrome/Safe Browsing Cookies-journal new file mode 100644 index 000000000..e69de29bb diff --git a/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_0 b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_0 new file mode 100644 index 000000000..d76fb77e9 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_0 differ diff --git a/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_1 b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_1 new file mode 100644 index 000000000..a545dac39 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_1 differ diff --git a/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_2 b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_2 new file mode 100644 index 000000000..c7e2eb9ad Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_2 differ diff --git a/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_3 b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_3 new file mode 100644 index 000000000..5eec97358 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/data_3 differ diff --git a/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/index b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/index new file mode 100644 index 000000000..99361f7e0 Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/ShaderCache/GPUCache/index differ diff --git a/nichrome/home/user/.config/google-chrome/chrome_shutdown_ms.txt b/nichrome/home/user/.config/google-chrome/chrome_shutdown_ms.txt new file mode 100644 index 000000000..f5c03ffce Binary files /dev/null and b/nichrome/home/user/.config/google-chrome/chrome_shutdown_ms.txt differ diff --git a/nichrome/logo/logo_linux_clut224.ppm b/nichrome/logo/logo_linux_clut224.ppm new file mode 100644 index 000000000..9f6ce73cc --- /dev/null +++ b/nichrome/logo/logo_linux_clut224.ppm @@ -0,0 +1,24303 @@ +P3 +90 90 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +4 +2 +2 +4 +2 +2 +4 +2 +2 +4 +2 +2 +4 +2 +2 +4 +2 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +1 +4 +2 +2 +4 +4 +2 +6 +4 +2 +6 +6 +2 +8 +6 +3 +8 +8 +3 +10 +8 +4 +10 +8 +4 +10 +8 +4 +10 +8 +4 +10 +8 +4 +10 +8 +4 +8 +8 +3 +8 +6 +3 +6 +6 +2 +6 +4 +2 +4 +4 +2 +4 +2 +2 +2 +2 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +4 +2 +2 +6 +4 +2 +6 +6 +3 +10 +8 +4 +12 +8 +4 +14 +10 +5 +16 +12 +6 +20 +14 +7 +22 +16 +8 +23 +18 +9 +25 +19 +9 +25 +19 +9 +27 +19 +10 +27 +19 +10 +25 +19 +9 +25 +19 +9 +23 +18 +9 +22 +16 +8 +20 +14 +7 +16 +12 +6 +14 +10 +5 +12 +10 +4 +10 +8 +4 +6 +6 +3 +6 +4 +2 +4 +2 +2 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +8 +6 +3 +12 +8 +4 +14 +10 +5 +20 +14 +7 +23 +18 +9 +27 +21 +11 +33 +25 +13 +37 +27 +14 +40 +31 +15 +46 +34 +18 +49 +36 +18 +51 +38 +20 +53 +40 +20 +55 +41 +21 +55 +41 +21 +53 +40 +20 +51 +38 +20 +49 +36 +18 +46 +34 +18 +40 +31 +15 +37 +27 +13 +33 +25 +13 +27 +21 +11 +23 +18 +9 +20 +14 +7 +16 +12 +6 +12 +8 +4 +8 +6 +3 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +0 +4 +4 +2 +6 +6 +2 +10 +8 +4 +15 +12 +5 +20 +16 +7 +25 +19 +9 +33 +25 +13 +40 +31 +16 +48 +36 +18 +55 +41 +21 +62 +47 +23 +69 +52 +26 +74 +55 +28 +80 +60 +30 +85 +64 +33 +89 +65 +34 +90 +69 +34 +92 +68 +35 +92 +68 +35 +90 +69 +34 +89 +65 +34 +84 +64 +32 +80 +60 +30 +74 +55 +28 +69 +52 +26 +62 +47 +23 +55 +41 +21 +48 +36 +18 +40 +31 +16 +33 +25 +13 +27 +19 +10 +22 +16 +8 +16 +12 +6 +10 +8 +4 +8 +6 +2 +4 +4 +2 +2 +2 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +4 +2 +8 +6 +2 +12 +8 +4 +18 +14 +7 +23 +18 +9 +33 +25 +13 +42 +31 +16 +51 +38 +20 +62 +47 +23 +74 +55 +28 +84 +62 +32 +93 +68 +36 +101 +75 +39 +109 +81 +42 +115 +85 +43 +118 +88 +45 +125 +93 +47 +128 +95 +49 +132 +98 +50 +134 +100 +51 +134 +100 +51 +132 +98 +50 +128 +95 +49 +125 +93 +47 +119 +90 +46 +115 +85 +43 +109 +81 +42 +101 +75 +39 +93 +68 +36 +84 +62 +32 +74 +55 +28 +62 +47 +24 +53 +40 +20 +42 +32 +16 +33 +25 +13 +25 +19 +9 +18 +14 +7 +12 +10 +4 +8 +6 +2 +4 +4 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +6 +6 +2 +12 +8 +4 +18 +14 +7 +25 +19 +9 +37 +27 +13 +48 +36 +18 +60 +45 +23 +74 +55 +28 +87 +65 +33 +100 +75 +38 +112 +84 +43 +123 +91 +47 +132 +98 +50 +142 +106 +55 +157 +120 +69 +174 +139 +90 +195 +163 +120 +214 +185 +147 +223 +196 +163 +231 +207 +177 +238 +216 +189 +238 +216 +189 +231 +207 +177 +223 +196 +163 +214 +185 +147 +195 +163 +120 +174 +139 +90 +157 +120 +69 +142 +106 +55 +132 +98 +50 +123 +91 +47 +112 +84 +43 +101 +75 +39 +89 +65 +34 +74 +55 +28 +62 +45 +23 +49 +36 +18 +37 +27 +14 +27 +19 +10 +18 +14 +7 +12 +8 +4 +8 +6 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +6 +4 +2 +10 +8 +4 +18 +12 +7 +25 +19 +9 +37 +27 +14 +51 +38 +20 +65 +48 +25 +80 +60 +31 +96 +72 +37 +112 +83 +43 +125 +93 +47 +138 +103 +52 +164 +128 +76 +198 +166 +123 +238 +216 +189 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +238 +216 +189 +198 +166 +123 +164 +128 +76 +140 +105 +53 +127 +94 +48 +112 +84 +43 +98 +73 +37 +81 +60 +30 +67 +48 +25 +51 +38 +20 +38 +27 +15 +25 +19 +9 +18 +12 +7 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +8 +6 +3 +14 +10 +5 +23 +18 +9 +35 +25 +13 +49 +36 +18 +65 +48 +25 +84 +62 +32 +101 +75 +39 +118 +88 +45 +134 +100 +51 +157 +120 +69 +200 +169 +128 +252 +233 +212 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +234 +213 +209 +181 +143 +161 +126 +77 +135 +101 +51 +119 +90 +46 +103 +76 +39 +85 +64 +33 +65 +48 +25 +49 +36 +18 +35 +27 +13 +23 +18 +9 +15 +12 +5 +8 +6 +3 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +10 +8 +4 +18 +14 +7 +29 +21 +11 +44 +32 +17 +60 +45 +23 +80 +60 +31 +100 +75 +39 +119 +90 +46 +137 +102 +53 +171 +136 +89 +238 +216 +189 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +234 +213 +236 +212 +185 +223 +196 +163 +206 +176 +137 +189 +157 +114 +181 +148 +101 +177 +141 +91 +171 +136 +89 +171 +136 +89 +177 +141 +91 +181 +148 +101 +194 +161 +116 +206 +176 +137 +223 +196 +163 +236 +212 +185 +252 +234 +213 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +242 +220 +194 +178 +144 +98 +138 +103 +52 +121 +90 +46 +101 +75 +39 +80 +60 +31 +62 +45 +23 +44 +32 +17 +29 +21 +11 +18 +14 +7 +10 +8 +4 +6 +4 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +12 +10 +5 +22 +16 +9 +35 +27 +13 +53 +40 +20 +72 +54 +28 +95 +70 +36 +116 +87 +44 +135 +101 +51 +178 +144 +98 +246 +225 +201 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +209 +181 +143 +181 +148 +101 +151 +114 +61 +140 +105 +53 +134 +100 +51 +128 +95 +49 +123 +91 +47 +119 +90 +46 +118 +88 +45 +116 +87 +44 +116 +87 +44 +118 +88 +45 +119 +90 +46 +123 +91 +47 +128 +95 +49 +134 +100 +51 +140 +105 +53 +153 +116 +63 +181 +148 +101 +209 +181 +143 +240 +218 +192 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +243 +222 +198 +178 +144 +98 +136 +101 +51 +116 +87 +44 +95 +70 +36 +72 +54 +28 +53 +40 +20 +35 +27 +13 +22 +16 +9 +12 +10 +5 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +14 +10 +5 +25 +19 +9 +40 +31 +15 +60 +45 +23 +82 +62 +31 +106 +79 +40 +128 +95 +49 +157 +120 +69 +234 +210 +181 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +249 +228 +206 +214 +185 +147 +174 +139 +90 +142 +106 +55 +131 +98 +50 +121 +90 +46 +110 +82 +42 +101 +75 +39 +95 +70 +36 +89 +65 +34 +84 +62 +32 +79 +59 +30 +77 +57 +30 +74 +56 +28 +74 +56 +28 +77 +57 +30 +79 +59 +30 +84 +62 +32 +89 +65 +34 +95 +70 +36 +101 +75 +39 +110 +82 +42 +121 +90 +46 +131 +98 +50 +142 +105 +54 +174 +139 +90 +214 +185 +147 +249 +229 +207 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +237 +214 +187 +161 +126 +77 +128 +95 +49 +106 +79 +40 +84 +62 +32 +60 +45 +23 +40 +31 +16 +25 +19 +9 +14 +10 +5 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +27 +21 +11 +44 +32 +17 +65 +48 +25 +90 +67 +34 +116 +87 +44 +138 +103 +52 +206 +176 +137 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +247 +227 +204 +206 +176 +137 +155 +117 +63 +134 +100 +51 +119 +90 +46 +106 +79 +40 +93 +68 +36 +81 +60 +30 +72 +54 +28 +62 +47 +24 +55 +41 +21 +51 +38 +20 +48 +36 +18 +44 +32 +17 +42 +32 +16 +42 +31 +16 +42 +31 +16 +42 +32 +16 +44 +32 +17 +48 +36 +18 +51 +38 +20 +55 +41 +21 +62 +47 +24 +72 +54 +28 +81 +60 +30 +93 +68 +36 +106 +79 +40 +118 +88 +45 +134 +100 +51 +153 +116 +63 +200 +169 +128 +246 +225 +201 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +206 +176 +137 +140 +105 +53 +116 +87 +44 +90 +69 +34 +67 +50 +25 +44 +32 +17 +27 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +29 +21 +11 +48 +36 +18 +70 +54 +27 +96 +72 +37 +123 +91 +47 +153 +116 +63 +237 +214 +187 +255 +237 +218 +255 +237 +218 +255 +237 +218 +251 +231 +210 +204 +173 +133 +151 +114 +61 +131 +98 +50 +113 +85 +43 +97 +73 +37 +82 +62 +31 +69 +50 +26 +55 +41 +21 +48 +34 +18 +40 +29 +15 +33 +25 +13 +29 +21 +11 +25 +19 +9 +23 +18 +9 +22 +16 +8 +20 +16 +7 +20 +14 +7 +20 +14 +7 +20 +16 +7 +22 +16 +8 +23 +18 +9 +25 +19 +9 +29 +21 +11 +33 +25 +13 +40 +29 +15 +48 +34 +18 +55 +41 +21 +69 +50 +26 +81 +60 +30 +97 +73 +37 +113 +85 +43 +131 +97 +50 +151 +114 +61 +204 +173 +133 +251 +231 +210 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +157 +119 +65 +123 +91 +47 +96 +72 +37 +70 +54 +27 +48 +36 +18 +29 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +29 +21 +11 +49 +36 +18 +74 +55 +28 +101 +75 +39 +128 +95 +49 +174 +139 +90 +252 +234 +213 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +161 +126 +77 +134 +100 +51 +113 +85 +43 +95 +70 +36 +77 +57 +30 +62 +45 +23 +48 +36 +18 +37 +29 +14 +29 +21 +11 +23 +18 +9 +18 +14 +7 +15 +12 +5 +12 +10 +4 +10 +8 +4 +10 +8 +4 +8 +6 +2 +8 +6 +2 +8 +6 +2 +8 +6 +2 +8 +6 +2 +8 +6 +3 +10 +8 +4 +10 +8 +4 +12 +10 +4 +15 +12 +5 +18 +14 +7 +23 +18 +9 +29 +21 +11 +38 +29 +15 +48 +36 +18 +62 +45 +23 +77 +57 +30 +95 +70 +36 +113 +85 +43 +134 +100 +51 +164 +128 +76 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +233 +212 +174 +139 +90 +128 +95 +49 +101 +75 +39 +74 +55 +28 +49 +36 +18 +31 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +6 +6 +2 +15 +12 +5 +27 +21 +11 +48 +36 +18 +74 +55 +28 +103 +76 +39 +128 +96 +49 +185 +153 +108 +255 +237 +218 +255 +237 +218 +255 +237 +218 +251 +231 +210 +194 +161 +116 +140 +105 +53 +121 +90 +46 +98 +73 +37 +79 +59 +30 +60 +45 +23 +46 +34 +18 +33 +25 +13 +25 +19 +9 +18 +14 +7 +14 +10 +5 +10 +8 +4 +8 +6 +3 +6 +4 +2 +4 +4 +2 +4 +2 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +4 +2 +2 +4 +4 +2 +6 +4 +2 +8 +6 +3 +10 +8 +4 +14 +10 +5 +18 +14 +7 +23 +20 +9 +33 +25 +13 +45 +34 +17 +60 +45 +23 +77 +59 +30 +98 +73 +37 +119 +90 +46 +140 +105 +53 +194 +161 +116 +251 +231 +210 +255 +237 +218 +255 +237 +218 +255 +237 +218 +189 +157 +114 +131 +98 +50 +103 +78 +39 +74 +55 +28 +49 +36 +19 +29 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +4 +23 +18 +9 +44 +32 +17 +70 +52 +27 +100 +75 +38 +128 +95 +49 +198 +166 +123 +255 +237 +218 +255 +237 +218 +255 +237 +218 +238 +216 +189 +170 +134 +84 +132 +98 +50 +109 +81 +42 +85 +64 +33 +65 +48 +25 +48 +34 +18 +33 +25 +13 +23 +18 +9 +16 +12 +6 +10 +8 +4 +8 +6 +2 +4 +4 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +4 +4 +2 +8 +6 +2 +10 +8 +4 +16 +12 +6 +23 +18 +9 +33 +25 +13 +48 +34 +18 +65 +48 +25 +85 +64 +33 +109 +81 +42 +132 +98 +50 +170 +134 +84 +240 +218 +192 +255 +237 +218 +255 +237 +218 +255 +237 +218 +200 +169 +128 +132 +98 +50 +103 +78 +39 +74 +55 +28 +48 +36 +18 +27 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +18 +14 +7 +35 +27 +13 +60 +45 +23 +90 +67 +34 +122 +91 +46 +198 +166 +123 +255 +237 +218 +255 +237 +218 +255 +237 +218 +231 +207 +177 +155 +117 +63 +125 +93 +47 +100 +75 +39 +74 +56 +28 +55 +41 +21 +38 +29 +15 +25 +19 +9 +16 +12 +6 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +10 +8 +4 +16 +12 +6 +25 +19 +9 +38 +27 +15 +55 +41 +21 +74 +56 +28 +100 +75 +39 +125 +93 +47 +153 +116 +63 +231 +207 +177 +255 +237 +218 +255 +237 +218 +255 +237 +218 +200 +169 +128 +132 +98 +50 +101 +75 +39 +70 +52 +27 +44 +32 +17 +23 +18 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +46 +34 +18 +74 +55 +28 +106 +79 +40 +178 +144 +98 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +146 +110 +59 +118 +88 +45 +93 +70 +36 +69 +50 +26 +48 +34 +18 +31 +23 +11 +20 +14 +7 +12 +8 +4 +6 +6 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +6 +6 +2 +12 +10 +4 +20 +16 +7 +31 +23 +11 +48 +36 +18 +69 +52 +26 +93 +70 +36 +121 +90 +46 +148 +112 +59 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +189 +157 +114 +128 +96 +49 +95 +72 +36 +62 +47 +23 +35 +27 +13 +18 +14 +7 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +53 +40 +20 +82 +62 +31 +157 +120 +69 +255 +237 +218 +255 +237 +218 +255 +237 +218 +223 +196 +163 +140 +105 +53 +116 +87 +44 +90 +67 +34 +62 +47 +24 +42 +32 +16 +27 +19 +10 +16 +12 +6 +8 +6 +3 +4 +4 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +10 +6 +4 +16 +12 +6 +27 +19 +10 +42 +32 +16 +65 +48 +25 +93 +70 +36 +125 +93 +47 +151 +114 +61 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +174 +139 +90 +118 +88 +45 +80 +60 +31 +48 +36 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +31 +23 +11 +53 +40 +20 +93 +71 +40 +252 +234 +213 +255 +237 +218 +255 +237 +218 +228 +203 +173 +134 +100 +51 +109 +81 +42 +85 +64 +33 +60 +45 +23 +40 +29 +15 +23 +18 +9 +14 +10 +5 +8 +6 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +2 +14 +10 +5 +25 +19 +9 +44 +32 +17 +69 +52 +26 +101 +75 +39 +137 +102 +53 +168 +130 +77 +234 +210 +181 +255 +237 +218 +255 +237 +218 +252 +234 +213 +146 +110 +59 +97 +73 +37 +60 +45 +23 +31 +23 +12 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +2 +16 +12 +6 +29 +21 +11 +51 +38 +19 +171 +136 +89 +189 +157 +114 +195 +163 +120 +185 +153 +108 +117 +88 +46 +98 +73 +37 +79 +59 +30 +56 +43 +22 +38 +29 +15 +23 +18 +9 +14 +10 +5 +8 +6 +3 +4 +4 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +2 +16 +12 +6 +29 +21 +11 +53 +40 +20 +87 +65 +33 +125 +94 +47 +157 +119 +65 +177 +141 +91 +252 +233 +212 +255 +237 +218 +255 +237 +218 +236 +212 +185 +106 +79 +40 +67 +50 +25 +37 +27 +13 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +6 +4 +2 +10 +8 +4 +18 +14 +7 +29 +21 +11 +44 +32 +17 +62 +47 +23 +77 +57 +30 +87 +65 +33 +90 +67 +34 +84 +62 +32 +72 +54 +28 +55 +41 +21 +40 +31 +15 +27 +21 +11 +18 +14 +7 +14 +10 +5 +10 +8 +4 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +8 +6 +3 +6 +6 +3 +6 +4 +2 +6 +4 +2 +4 +4 +2 +4 +4 +2 +2 +2 +1 +2 +2 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +49 +36 +18 +84 +62 +32 +125 +93 +47 +157 +119 +65 +200 +169 +128 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +109 +81 +42 +69 +52 +26 +37 +27 +14 +18 +14 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +1 +6 +4 +2 +10 +8 +4 +16 +12 +6 +23 +18 +9 +33 +25 +13 +44 +32 +17 +55 +41 +21 +65 +48 +25 +70 +54 +27 +72 +54 +28 +67 +50 +25 +56 +43 +22 +48 +34 +18 +38 +29 +15 +31 +23 +11 +25 +19 +9 +23 +18 +9 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +22 +16 +8 +20 +16 +7 +20 +14 +7 +18 +14 +7 +16 +12 +6 +14 +10 +5 +12 +10 +4 +10 +8 +4 +8 +6 +2 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +55 +40 +20 +90 +67 +34 +131 +97 +50 +168 +130 +77 +246 +225 +201 +255 +237 +218 +255 +237 +218 +255 +237 +218 +161 +126 +77 +103 +78 +39 +65 +48 +25 +35 +27 +13 +18 +14 +6 +8 +6 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +6 +4 +2 +12 +10 +5 +20 +16 +7 +29 +21 +11 +38 +29 +15 +49 +36 +18 +56 +43 +22 +65 +48 +25 +70 +52 +27 +72 +54 +28 +72 +54 +28 +69 +50 +26 +63 +47 +25 +56 +43 +22 +53 +40 +20 +49 +36 +19 +48 +36 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +46 +34 +18 +44 +32 +17 +42 +31 +16 +40 +29 +15 +37 +27 +14 +33 +25 +13 +29 +21 +11 +23 +18 +9 +20 +14 +7 +14 +10 +5 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +18 +14 +7 +37 +27 +14 +67 +50 +25 +103 +78 +39 +142 +106 +55 +214 +185 +147 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +134 +100 +51 +93 +70 +36 +58 +43 +23 +35 +25 +13 +20 +14 +7 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +6 +4 +2 +14 +10 +5 +25 +19 +9 +38 +29 +15 +53 +40 +20 +67 +50 +25 +79 +59 +30 +87 +63 +33 +92 +68 +35 +93 +70 +36 +95 +70 +36 +93 +70 +36 +92 +68 +35 +90 +67 +34 +87 +65 +33 +85 +64 +33 +84 +62 +32 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +82 +62 +31 +81 +60 +30 +80 +60 +31 +77 +59 +30 +74 +55 +28 +69 +52 +26 +63 +47 +25 +55 +41 +21 +49 +36 +18 +40 +31 +15 +31 +23 +12 +23 +18 +9 +16 +12 +6 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +5 +27 +19 +11 +51 +38 +20 +85 +64 +33 +123 +91 +47 +168 +130 +77 +252 +233 +212 +255 +237 +218 +255 +237 +218 +242 +220 +194 +155 +117 +63 +116 +87 +44 +80 +60 +31 +53 +40 +20 +35 +25 +13 +23 +18 +9 +18 +12 +7 +12 +8 +4 +8 +6 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +4 +25 +19 +9 +42 +31 +16 +62 +47 +24 +85 +64 +33 +103 +78 +39 +118 +88 +45 +127 +94 +48 +128 +96 +49 +131 +97 +50 +131 +97 +50 +131 +97 +50 +128 +95 +49 +128 +95 +49 +128 +96 +49 +127 +94 +48 +127 +94 +48 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +125 +94 +47 +127 +94 +48 +127 +94 +48 +127 +94 +48 +127 +94 +48 +127 +94 +48 +127 +94 +48 +127 +94 +48 +125 +94 +47 +125 +93 +47 +121 +90 +46 +116 +87 +44 +112 +83 +43 +103 +78 +39 +95 +72 +36 +85 +64 +33 +72 +54 +28 +60 +45 +23 +46 +34 +18 +33 +25 +13 +23 +18 +9 +14 +10 +5 +8 +6 +3 +4 +4 +2 +2 +2 +0 +2 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +20 +14 +7 +38 +29 +15 +69 +52 +26 +106 +78 +40 +142 +105 +54 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +185 +153 +108 +134 +100 +51 +100 +75 +38 +70 +54 +27 +53 +40 +20 +42 +32 +16 +37 +27 +13 +29 +21 +11 +22 +16 +9 +14 +10 +5 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +6 +4 +20 +16 +7 +38 +29 +15 +63 +47 +25 +93 +68 +36 +137 +102 +53 +185 +153 +108 +214 +185 +147 +214 +185 +147 +196 +162 +116 +196 +162 +116 +196 +162 +116 +196 +162 +116 +196 +162 +116 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +162 +115 +195 +163 +120 +200 +169 +128 +200 +169 +128 +168 +130 +77 +160 +123 +71 +148 +112 +59 +138 +103 +52 +127 +94 +48 +112 +84 +43 +96 +72 +37 +79 +59 +30 +60 +45 +23 +44 +32 +17 +29 +21 +11 +18 +14 +7 +10 +8 +4 +6 +4 +2 +2 +2 +1 +2 +2 +1 +6 +4 +2 +14 +10 +5 +29 +21 +11 +55 +41 +21 +90 +67 +34 +128 +95 +49 +181 +148 +101 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +148 +112 +59 +113 +85 +43 +85 +64 +33 +65 +48 +25 +58 +43 +23 +58 +43 +22 +67 +51 +27 +49 +36 +18 +38 +29 +15 +25 +19 +9 +14 +10 +5 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +55 +41 +21 +87 +65 +33 +122 +91 +46 +240 +218 +192 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +247 +227 +204 +209 +181 +143 +164 +128 +76 +136 +101 +51 +116 +87 +44 +95 +72 +36 +74 +55 +28 +51 +38 +20 +33 +25 +13 +20 +16 +7 +10 +8 +4 +6 +4 +2 +6 +4 +2 +10 +8 +4 +22 +16 +9 +42 +32 +16 +74 +55 +28 +110 +82 +42 +148 +112 +59 +237 +214 +187 +255 +237 +218 +255 +237 +218 +252 +234 +213 +170 +134 +84 +127 +94 +48 +95 +72 +36 +74 +55 +28 +67 +50 +25 +72 +54 +28 +80 +60 +31 +209 +181 +143 +74 +55 +28 +58 +43 +22 +40 +29 +15 +23 +18 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +20 +14 +7 +40 +31 +15 +72 +54 +28 +109 +81 +42 +160 +123 +71 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +170 +134 +84 +132 +98 +50 +107 +81 +42 +80 +60 +31 +55 +41 +21 +35 +25 +13 +20 +14 +7 +12 +8 +4 +10 +8 +4 +18 +12 +7 +33 +25 +13 +60 +45 +23 +95 +70 +36 +133 +99 +51 +198 +166 +123 +255 +237 +218 +255 +237 +218 +255 +237 +218 +214 +185 +147 +140 +105 +53 +106 +79 +40 +79 +59 +30 +67 +50 +26 +72 +54 +28 +89 +65 +34 +171 +136 +89 +255 +237 +218 +125 +94 +51 +81 +60 +30 +56 +43 +22 +35 +25 +13 +18 +14 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +51 +38 +20 +87 +65 +33 +127 +94 +48 +209 +181 +143 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +142 +106 +55 +112 +83 +43 +80 +60 +31 +53 +40 +20 +31 +23 +12 +20 +14 +7 +18 +14 +7 +27 +19 +11 +48 +36 +18 +79 +59 +30 +116 +87 +44 +157 +119 +65 +247 +227 +204 +255 +237 +218 +255 +237 +218 +246 +225 +201 +157 +119 +65 +118 +88 +45 +87 +65 +33 +65 +48 +25 +63 +49 +25 +79 +59 +30 +108 +82 +45 +243 +222 +198 +255 +237 +218 +198 +166 +123 +103 +78 +39 +74 +56 +28 +46 +34 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +33 +25 +13 +62 +47 +23 +101 +75 +39 +142 +105 +54 +252 +234 +213 +255 +237 +218 +255 +237 +218 +195 +162 +115 +177 +141 +91 +168 +130 +77 +160 +123 +71 +159 +121 +68 +157 +119 +65 +157 +119 +65 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +155 +117 +63 +157 +119 +65 +157 +119 +65 +157 +119 +65 +157 +119 +65 +157 +119 +65 +157 +119 +65 +159 +121 +68 +160 +123 +71 +160 +123 +71 +160 +123 +71 +160 +123 +71 +160 +123 +71 +159 +121 +68 +159 +121 +68 +157 +119 +65 +159 +121 +68 +168 +130 +77 +177 +141 +91 +196 +162 +116 +223 +196 +163 +249 +229 +207 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +242 +220 +194 +146 +110 +59 +103 +78 +39 +72 +54 +28 +44 +32 +17 +29 +21 +11 +27 +19 +11 +40 +29 +15 +65 +48 +25 +101 +75 +39 +140 +104 +53 +214 +185 +147 +255 +237 +218 +255 +237 +218 +255 +237 +218 +198 +166 +123 +134 +100 +51 +97 +73 +37 +69 +50 +26 +55 +41 +21 +62 +45 +23 +85 +64 +33 +137 +102 +53 +255 +237 +218 +255 +237 +218 +252 +233 +212 +127 +94 +48 +92 +68 +35 +58 +43 +23 +31 +23 +12 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +3 +20 +14 +7 +40 +31 +15 +74 +55 +28 +112 +84 +43 +168 +130 +77 +255 +237 +218 +255 +237 +218 +242 +220 +194 +168 +130 +77 +155 +117 +63 +138 +103 +52 +125 +93 +47 +116 +87 +44 +112 +84 +43 +110 +82 +42 +110 +82 +42 +110 +82 +42 +110 +82 +42 +110 +82 +42 +110 +82 +42 +110 +82 +42 +110 +82 +42 +112 +83 +43 +112 +84 +43 +112 +84 +43 +115 +85 +43 +115 +85 +44 +116 +87 +44 +116 +87 +44 +115 +85 +44 +113 +85 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +112 +84 +43 +116 +87 +44 +119 +90 +46 +127 +94 +48 +135 +101 +51 +144 +108 +55 +159 +121 +68 +200 +169 +128 +249 +228 +206 +255 +237 +218 +255 +237 +218 +255 +237 +218 +249 +229 +207 +125 +94 +51 +87 +65 +33 +56 +43 +22 +40 +29 +15 +38 +29 +15 +55 +41 +21 +85 +64 +33 +123 +91 +47 +170 +134 +84 +252 +234 +213 +255 +237 +218 +255 +237 +218 +237 +214 +187 +148 +112 +59 +112 +83 +43 +74 +56 +28 +51 +38 +20 +45 +34 +17 +56 +43 +22 +85 +64 +33 +121 +90 +46 +240 +218 +192 +255 +237 +218 +255 +237 +218 +161 +126 +77 +107 +81 +42 +70 +54 +27 +40 +29 +15 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +84 +62 +32 +123 +91 +47 +200 +169 +128 +255 +237 +218 +255 +237 +218 +214 +185 +147 +151 +114 +61 +125 +93 +47 +101 +75 +39 +84 +62 +33 +74 +55 +28 +69 +52 +26 +67 +50 +26 +67 +50 +26 +67 +50 +26 +67 +50 +26 +67 +50 +26 +67 +50 +26 +67 +50 +26 +69 +52 +26 +70 +52 +27 +72 +54 +28 +74 +55 +28 +79 +59 +30 +80 +60 +31 +82 +62 +31 +80 +60 +31 +79 +59 +30 +74 +56 +28 +72 +54 +28 +70 +54 +27 +70 +52 +27 +69 +52 +26 +69 +52 +26 +69 +52 +26 +70 +52 +27 +70 +52 +27 +74 +55 +28 +77 +57 +30 +84 +62 +32 +93 +70 +36 +106 +79 +40 +125 +93 +47 +142 +105 +54 +164 +128 +76 +231 +207 +177 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +95 +70 +36 +65 +48 +25 +49 +36 +18 +53 +40 +20 +74 +55 +28 +107 +81 +42 +144 +108 +55 +228 +203 +173 +255 +237 +218 +255 +237 +218 +255 +237 +218 +178 +144 +98 +127 +94 +48 +90 +67 +34 +58 +43 +22 +38 +29 +15 +37 +27 +13 +51 +38 +20 +84 +62 +32 +121 +90 +46 +209 +181 +143 +255 +237 +218 +255 +237 +218 +195 +163 +120 +121 +90 +46 +82 +62 +31 +48 +36 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +12 +8 +4 +27 +21 +11 +55 +41 +21 +93 +68 +36 +132 +98 +50 +237 +214 +187 +255 +237 +218 +255 +237 +218 +181 +148 +101 +132 +98 +50 +100 +73 +38 +70 +52 +27 +51 +38 +20 +42 +31 +16 +37 +27 +13 +35 +25 +13 +35 +25 +13 +35 +25 +13 +35 +25 +13 +35 +25 +13 +35 +25 +13 +37 +27 +13 +38 +27 +15 +40 +31 +15 +46 +34 +18 +53 +40 +20 +60 +45 +23 +65 +48 +25 +67 +50 +25 +63 +49 +25 +58 +43 +22 +51 +38 +20 +46 +34 +18 +40 +31 +15 +38 +29 +15 +37 +27 +13 +37 +27 +13 +37 +27 +13 +37 +27 +13 +37 +29 +13 +38 +29 +15 +42 +32 +16 +48 +36 +18 +55 +41 +21 +69 +52 +26 +85 +64 +33 +103 +78 +39 +127 +94 +48 +146 +110 +59 +219 +192 +156 +255 +237 +218 +255 +237 +218 +209 +181 +143 +92 +68 +35 +69 +50 +26 +58 +43 +22 +69 +50 +26 +95 +70 +36 +128 +96 +49 +185 +153 +108 +255 +237 +218 +255 +237 +218 +255 +237 +218 +223 +196 +163 +142 +106 +55 +103 +78 +39 +69 +52 +26 +42 +31 +16 +27 +19 +11 +29 +21 +11 +46 +34 +18 +77 +57 +30 +116 +87 +44 +181 +148 +101 +255 +237 +218 +255 +237 +218 +237 +214 +187 +131 +97 +50 +92 +68 +35 +55 +41 +21 +27 +21 +11 +12 +8 +4 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +33 +25 +13 +62 +47 +23 +101 +75 +39 +142 +106 +55 +255 +237 +218 +255 +237 +218 +252 +234 +213 +155 +117 +63 +116 +87 +44 +80 +60 +30 +51 +38 +20 +31 +23 +11 +22 +16 +8 +18 +14 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +18 +14 +6 +22 +16 +8 +27 +21 +11 +38 +29 +15 +51 +38 +20 +62 +47 +24 +72 +54 +28 +74 +55 +28 +69 +50 +26 +56 +43 +22 +44 +32 +17 +33 +25 +13 +23 +18 +9 +20 +14 +7 +18 +14 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +16 +12 +6 +18 +14 +6 +20 +14 +7 +23 +18 +9 +29 +21 +11 +38 +29 +15 +51 +38 +20 +69 +52 +26 +90 +67 +34 +109 +81 +42 +127 +94 +48 +223 +196 +163 +251 +231 +210 +125 +94 +51 +84 +62 +32 +69 +50 +26 +69 +50 +26 +85 +64 +33 +116 +87 +44 +151 +114 +61 +240 +218 +192 +255 +237 +218 +255 +237 +218 +252 +233 +212 +164 +128 +76 +121 +90 +46 +84 +62 +32 +51 +38 +20 +29 +21 +11 +20 +14 +7 +22 +16 +9 +40 +29 +15 +70 +52 +27 +109 +81 +42 +151 +114 +61 +252 +234 +213 +255 +237 +218 +255 +237 +218 +142 +106 +55 +100 +75 +39 +62 +47 +23 +33 +25 +13 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +37 +27 +14 +69 +50 +26 +107 +81 +42 +157 +120 +69 +255 +237 +218 +255 +237 +218 +236 +212 +185 +142 +105 +54 +103 +78 +39 +67 +50 +25 +38 +27 +15 +20 +14 +7 +12 +8 +4 +8 +6 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +8 +6 +2 +10 +8 +4 +16 +12 +6 +27 +19 +10 +44 +32 +17 +62 +47 +24 +82 +62 +31 +95 +70 +36 +96 +72 +37 +87 +65 +33 +70 +52 +27 +51 +38 +20 +33 +25 +13 +20 +14 +7 +12 +8 +4 +8 +6 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +8 +6 +2 +10 +8 +4 +12 +10 +5 +18 +14 +7 +27 +21 +11 +40 +31 +16 +56 +43 +22 +74 +55 +28 +89 +65 +34 +108 +82 +45 +178 +144 +98 +81 +60 +30 +70 +54 +27 +67 +50 +26 +79 +59 +30 +103 +78 +39 +138 +103 +52 +204 +173 +133 +255 +237 +218 +255 +237 +218 +255 +237 +218 +206 +176 +137 +137 +102 +53 +98 +73 +37 +63 +47 +25 +37 +27 +13 +20 +14 +7 +14 +10 +5 +18 +14 +6 +35 +25 +13 +62 +47 +24 +101 +75 +39 +140 +104 +53 +237 +214 +187 +255 +237 +218 +255 +237 +218 +157 +120 +69 +107 +81 +42 +69 +50 +26 +37 +27 +14 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +2 +20 +14 +7 +40 +31 +16 +74 +55 +28 +115 +85 +43 +174 +139 +90 +255 +237 +218 +255 +237 +218 +223 +196 +163 +134 +100 +51 +95 +72 +36 +58 +43 +22 +31 +23 +11 +15 +12 +5 +6 +6 +2 +4 +2 +1 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +4 +4 +1 +8 +6 +2 +18 +14 +6 +33 +25 +13 +55 +41 +21 +84 +62 +32 +125 +94 +51 +234 +210 +181 +236 +212 +185 +234 +210 +181 +161 +126 +77 +62 +47 +23 +37 +29 +13 +20 +16 +7 +10 +8 +4 +4 +4 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +4 +4 +2 +8 +6 +3 +14 +10 +5 +22 +16 +8 +33 +25 +13 +44 +32 +17 +55 +41 +21 +62 +47 +23 +65 +48 +25 +62 +45 +23 +62 +45 +23 +70 +52 +27 +92 +68 +35 +123 +91 +47 +160 +123 +71 +249 +229 +207 +255 +237 +218 +255 +237 +218 +243 +222 +198 +155 +117 +63 +115 +85 +43 +77 +57 +30 +46 +34 +18 +23 +18 +9 +12 +10 +4 +8 +6 +3 +14 +10 +5 +29 +21 +11 +56 +43 +22 +95 +70 +36 +134 +100 +51 +223 +196 +163 +255 +237 +218 +255 +237 +218 +174 +139 +90 +113 +85 +43 +74 +55 +28 +40 +31 +15 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +22 +16 +8 +46 +34 +18 +79 +59 +30 +119 +90 +46 +195 +163 +120 +255 +237 +218 +255 +237 +218 +206 +176 +137 +128 +95 +49 +89 +65 +34 +51 +38 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +22 +16 +8 +42 +31 +16 +72 +54 +28 +106 +79 +40 +200 +169 +128 +255 +237 +218 +255 +237 +218 +247 +227 +204 +110 +82 +42 +72 +54 +28 +42 +31 +16 +22 +16 +8 +8 +6 +3 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +6 +4 +2 +10 +8 +4 +16 +12 +6 +23 +18 +9 +31 +23 +12 +38 +29 +15 +42 +31 +16 +48 +36 +18 +60 +45 +23 +80 +60 +30 +110 +82 +42 +144 +108 +55 +219 +192 +156 +255 +237 +218 +255 +237 +218 +255 +237 +218 +195 +162 +115 +131 +97 +50 +93 +68 +36 +58 +43 +22 +31 +23 +12 +16 +12 +6 +8 +6 +2 +6 +4 +2 +12 +8 +4 +25 +19 +9 +51 +38 +20 +89 +65 +34 +128 +95 +49 +206 +176 +137 +255 +237 +218 +255 +237 +218 +195 +163 +120 +118 +88 +45 +79 +59 +30 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +85 +64 +33 +125 +93 +47 +214 +185 +147 +255 +237 +218 +255 +237 +218 +189 +157 +114 +123 +91 +47 +84 +62 +32 +48 +36 +18 +23 +18 +9 +10 +6 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +12 +8 +4 +25 +19 +9 +51 +38 +20 +87 +65 +33 +125 +93 +47 +247 +227 +204 +255 +237 +218 +255 +237 +218 +214 +185 +147 +115 +85 +44 +79 +59 +30 +44 +32 +17 +22 +16 +8 +10 +6 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +8 +6 +2 +12 +8 +4 +18 +12 +7 +23 +18 +9 +31 +23 +11 +44 +32 +17 +65 +48 +25 +95 +70 +36 +128 +96 +49 +174 +139 +90 +254 +236 +216 +255 +237 +218 +255 +237 +218 +234 +210 +181 +144 +108 +55 +109 +81 +42 +72 +54 +28 +42 +31 +16 +22 +16 +8 +10 +8 +4 +4 +4 +2 +4 +4 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +84 +62 +32 +123 +91 +47 +189 +157 +114 +255 +237 +218 +255 +237 +218 +209 +181 +143 +125 +93 +47 +84 +62 +33 +48 +36 +18 +23 +18 +9 +10 +6 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +25 +19 +9 +51 +38 +20 +89 +65 +34 +128 +95 +49 +223 +196 +163 +255 +237 +218 +255 +237 +218 +181 +148 +101 +119 +90 +46 +79 +59 +30 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +14 +10 +5 +31 +23 +11 +58 +43 +23 +98 +73 +37 +142 +106 +55 +255 +237 +218 +255 +237 +218 +255 +237 +218 +185 +153 +108 +121 +90 +46 +80 +60 +31 +46 +34 +18 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +6 +4 +2 +10 +8 +4 +18 +12 +7 +31 +21 +11 +51 +38 +20 +79 +59 +30 +115 +85 +43 +148 +112 +59 +231 +207 +177 +255 +237 +218 +255 +237 +218 +254 +236 +216 +177 +141 +91 +125 +93 +47 +87 +65 +33 +53 +40 +20 +29 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +1 +4 +2 +2 +8 +6 +3 +22 +16 +8 +44 +32 +17 +79 +59 +30 +119 +90 +46 +181 +148 +101 +255 +237 +218 +255 +237 +218 +219 +192 +156 +128 +95 +49 +89 +65 +34 +51 +38 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +27 +19 +10 +53 +40 +20 +92 +68 +35 +131 +98 +50 +231 +207 +177 +255 +237 +218 +255 +237 +218 +177 +141 +91 +118 +88 +45 +77 +57 +30 +42 +32 +16 +20 +16 +7 +8 +6 +3 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +33 +25 +13 +63 +49 +25 +103 +78 +39 +157 +120 +69 +255 +237 +218 +255 +237 +218 +255 +237 +218 +177 +141 +91 +121 +90 +46 +79 +59 +30 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +10 +6 +4 +20 +14 +7 +37 +27 +14 +63 +49 +25 +100 +75 +38 +137 +102 +53 +214 +185 +147 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +142 +105 +54 +103 +76 +39 +67 +50 +25 +38 +29 +15 +20 +14 +7 +8 +6 +3 +4 +2 +2 +2 +2 +0 +2 +2 +1 +8 +6 +3 +20 +16 +7 +42 +32 +16 +77 +57 +30 +118 +88 +45 +178 +144 +98 +255 +237 +218 +255 +237 +218 +228 +203 +173 +131 +97 +50 +90 +67 +34 +53 +40 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +12 +8 +4 +27 +19 +11 +55 +41 +21 +92 +68 +35 +134 +100 +51 +238 +216 +189 +255 +237 +218 +255 +237 +218 +170 +134 +84 +116 +87 +44 +74 +56 +28 +42 +31 +16 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +35 +25 +13 +67 +50 +25 +107 +81 +42 +164 +128 +76 +255 +237 +218 +255 +237 +218 +255 +237 +218 +164 +128 +76 +122 +91 +46 +79 +59 +30 +44 +32 +17 +20 +16 +7 +8 +6 +3 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +5 +27 +19 +11 +51 +38 +20 +84 +62 +32 +122 +91 +46 +159 +121 +68 +252 +234 +213 +255 +237 +218 +255 +237 +218 +249 +229 +207 +160 +123 +71 +119 +90 +46 +81 +60 +30 +49 +36 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +2 +0 +0 +2 +2 +0 +8 +6 +3 +20 +14 +7 +42 +31 +16 +74 +56 +28 +116 +87 +44 +171 +136 +89 +255 +237 +218 +255 +237 +218 +237 +214 +187 +132 +98 +50 +92 +68 +35 +55 +41 +21 +27 +19 +11 +12 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +12 +8 +4 +27 +19 +11 +55 +41 +21 +92 +68 +35 +134 +100 +51 +238 +216 +189 +255 +237 +218 +255 +237 +218 +170 +134 +84 +116 +87 +44 +74 +56 +28 +42 +31 +16 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +35 +25 +13 +67 +50 +25 +109 +81 +42 +164 +128 +76 +255 +237 +218 +255 +237 +218 +255 +237 +218 +168 +130 +77 +125 +93 +47 +80 +60 +31 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +20 +14 +7 +38 +29 +15 +69 +50 +26 +106 +78 +40 +144 +108 +55 +231 +207 +177 +255 +237 +218 +255 +237 +218 +255 +237 +218 +204 +173 +133 +136 +101 +51 +98 +73 +37 +62 +47 +23 +35 +25 +13 +18 +12 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +3 +20 +14 +7 +42 +31 +16 +74 +56 +28 +116 +87 +44 +171 +136 +89 +255 +237 +218 +255 +237 +218 +237 +214 +187 +132 +98 +50 +92 +68 +35 +55 +41 +21 +27 +19 +11 +12 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +27 +19 +10 +53 +40 +20 +92 +68 +35 +131 +98 +50 +231 +207 +177 +255 +237 +218 +255 +237 +218 +177 +141 +91 +118 +88 +45 +77 +57 +30 +42 +32 +16 +20 +16 +7 +8 +6 +3 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +33 +25 +13 +65 +48 +25 +106 +79 +40 +157 +120 +69 +255 +237 +218 +255 +237 +218 +255 +237 +218 +177 +141 +91 +128 +95 +49 +85 +64 +33 +49 +36 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +55 +41 +21 +90 +67 +34 +128 +95 +49 +177 +141 +91 +255 +237 +218 +255 +237 +218 +255 +237 +218 +242 +220 +194 +153 +116 +63 +115 +85 +43 +77 +57 +30 +46 +34 +18 +23 +18 +9 +10 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +3 +20 +16 +7 +42 +32 +16 +77 +57 +30 +118 +88 +45 +178 +144 +98 +255 +237 +218 +255 +237 +218 +228 +203 +173 +131 +97 +50 +90 +67 +34 +53 +40 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +25 +19 +9 +51 +38 +20 +89 +65 +34 +128 +95 +49 +223 +196 +163 +255 +237 +218 +255 +237 +218 +181 +148 +101 +119 +90 +46 +79 +59 +30 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +14 +10 +5 +31 +23 +11 +62 +45 +23 +101 +75 +39 +148 +112 +59 +255 +237 +218 +255 +237 +218 +255 +237 +218 +195 +162 +115 +136 +101 +51 +93 +70 +36 +55 +41 +21 +29 +21 +11 +12 +10 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +22 +16 +8 +42 +31 +16 +74 +55 +28 +110 +82 +42 +148 +112 +59 +242 +220 +194 +255 +237 +218 +255 +237 +218 +255 +237 +218 +185 +153 +108 +131 +97 +50 +92 +68 +35 +56 +43 +22 +31 +23 +11 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +22 +16 +8 +45 +34 +17 +79 +59 +30 +119 +90 +46 +181 +148 +101 +255 +237 +218 +255 +237 +218 +219 +192 +156 +128 +95 +49 +89 +65 +34 +51 +38 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +49 +36 +18 +85 +64 +33 +125 +93 +47 +214 +185 +147 +255 +237 +218 +255 +237 +218 +189 +157 +114 +123 +91 +47 +84 +62 +32 +48 +36 +18 +23 +18 +9 +10 +6 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +12 +8 +4 +27 +21 +11 +55 +41 +21 +95 +70 +36 +136 +101 +51 +247 +227 +204 +255 +237 +218 +255 +237 +218 +223 +196 +163 +144 +108 +55 +106 +79 +40 +67 +50 +25 +37 +27 +14 +18 +14 +6 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +2 +16 +12 +6 +33 +25 +13 +60 +45 +23 +95 +70 +36 +133 +99 +51 +189 +157 +114 +255 +237 +218 +255 +237 +218 +255 +237 +218 +231 +207 +177 +144 +108 +55 +109 +81 +42 +72 +54 +28 +40 +31 +15 +22 +16 +8 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +6 +4 +23 +18 +9 +48 +36 +18 +84 +62 +32 +123 +91 +47 +189 +157 +114 +255 +237 +218 +255 +237 +218 +214 +185 +147 +125 +93 +47 +84 +62 +33 +48 +36 +18 +23 +18 +9 +10 +6 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +22 +16 +8 +46 +34 +18 +79 +59 +30 +119 +90 +46 +195 +163 +120 +255 +237 +218 +255 +237 +218 +206 +176 +137 +128 +95 +49 +89 +65 +34 +51 +38 +20 +25 +19 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +85 +64 +33 +127 +94 +48 +209 +181 +143 +255 +237 +218 +255 +237 +218 +249 +228 +206 +159 +121 +68 +122 +91 +46 +82 +62 +31 +48 +36 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +27 +21 +11 +49 +36 +18 +80 +60 +31 +118 +88 +45 +151 +114 +61 +249 +229 +207 +255 +237 +218 +255 +237 +218 +254 +236 +216 +174 +139 +90 +125 +93 +47 +87 +65 +33 +53 +40 +20 +27 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +25 +19 +9 +51 +38 +20 +89 +65 +34 +128 +95 +49 +206 +176 +137 +255 +237 +218 +255 +237 +218 +195 +163 +120 +118 +88 +45 +79 +59 +30 +44 +32 +17 +22 +16 +8 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +2 +20 +14 +7 +40 +31 +16 +74 +55 +28 +115 +85 +43 +174 +139 +90 +255 +237 +218 +255 +237 +218 +223 +196 +163 +134 +100 +51 +95 +70 +36 +55 +41 +21 +29 +21 +11 +12 +10 +4 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +3 +20 +14 +7 +40 +31 +15 +74 +55 +28 +113 +85 +43 +168 +130 +77 +255 +237 +218 +255 +237 +218 +255 +237 +218 +200 +169 +128 +140 +104 +53 +101 +75 +39 +63 +49 +25 +35 +27 +13 +18 +12 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +0 +4 +4 +2 +8 +6 +3 +14 +10 +5 +25 +19 +9 +44 +32 +17 +72 +54 +28 +103 +78 +39 +140 +105 +53 +204 +173 +133 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +140 +104 +53 +101 +75 +39 +65 +48 +25 +37 +27 +14 +18 +14 +7 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +12 +10 +5 +29 +21 +11 +56 +43 +22 +95 +70 +36 +134 +100 +51 +223 +196 +163 +255 +237 +218 +255 +237 +218 +174 +139 +90 +113 +85 +43 +74 +55 +28 +40 +31 +15 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +37 +27 +14 +69 +50 +26 +107 +81 +42 +157 +120 +69 +255 +237 +218 +255 +237 +218 +236 +212 +185 +140 +105 +53 +101 +75 +39 +63 +47 +25 +33 +25 +13 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +33 +25 +13 +62 +45 +23 +100 +75 +38 +140 +104 +53 +234 +210 +181 +255 +237 +218 +255 +237 +218 +252 +233 +212 +159 +121 +68 +123 +91 +47 +84 +62 +33 +51 +38 +20 +27 +19 +11 +12 +10 +5 +6 +4 +2 +2 +2 +1 +2 +2 +0 +2 +2 +1 +4 +4 +2 +8 +6 +3 +12 +8 +4 +18 +14 +7 +29 +21 +11 +45 +34 +17 +69 +50 +26 +98 +73 +37 +131 +98 +50 +168 +130 +77 +249 +229 +207 +255 +237 +218 +255 +237 +218 +249 +229 +207 +157 +119 +65 +115 +85 +44 +79 +59 +30 +48 +34 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +35 +25 +13 +63 +47 +25 +103 +76 +39 +140 +105 +53 +237 +214 +187 +255 +237 +218 +255 +237 +218 +157 +120 +69 +107 +81 +42 +69 +50 +26 +37 +27 +14 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +33 +25 +13 +62 +47 +23 +101 +75 +39 +142 +106 +55 +255 +237 +218 +255 +237 +218 +252 +234 +213 +153 +116 +63 +110 +82 +42 +72 +54 +28 +40 +29 +15 +18 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +49 +36 +18 +84 +62 +32 +125 +93 +47 +181 +148 +101 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +144 +108 +55 +106 +78 +40 +69 +50 +26 +38 +29 +15 +20 +14 +7 +10 +6 +4 +6 +4 +2 +6 +4 +2 +8 +6 +2 +12 +8 +4 +18 +14 +6 +25 +19 +9 +37 +27 +13 +51 +38 +20 +74 +55 +28 +100 +73 +38 +128 +95 +49 +157 +119 +65 +234 +210 +181 +255 +237 +218 +255 +237 +218 +255 +237 +218 +168 +130 +77 +128 +95 +49 +92 +68 +35 +58 +43 +22 +33 +25 +13 +16 +12 +6 +6 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +2 +18 +14 +7 +40 +29 +15 +72 +54 +28 +112 +83 +43 +153 +116 +63 +252 +234 +213 +255 +237 +218 +255 +237 +218 +142 +106 +55 +100 +75 +39 +62 +47 +23 +33 +25 +13 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +12 +8 +4 +27 +21 +11 +55 +41 +21 +92 +68 +35 +132 +98 +50 +237 +214 +187 +255 +237 +218 +255 +237 +218 +181 +148 +101 +121 +90 +46 +81 +60 +30 +48 +34 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +2 +18 +14 +7 +37 +27 +14 +67 +50 +26 +106 +79 +40 +148 +112 +59 +249 +229 +207 +255 +237 +218 +255 +237 +218 +255 +237 +218 +177 +141 +91 +128 +95 +49 +90 +67 +34 +55 +41 +21 +31 +23 +11 +16 +12 +6 +10 +8 +4 +10 +8 +4 +16 +12 +6 +23 +18 +9 +35 +27 +13 +49 +36 +18 +65 +48 +25 +85 +64 +33 +106 +79 +40 +132 +98 +50 +157 +119 +65 +223 +196 +163 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +138 +103 +52 +103 +76 +39 +69 +50 +26 +40 +31 +15 +22 +16 +8 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +81 +60 +30 +121 +90 +46 +181 +148 +101 +255 +237 +218 +255 +237 +218 +237 +214 +187 +132 +98 +50 +92 +68 +35 +55 +41 +21 +27 +21 +11 +12 +8 +4 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +48 +36 +18 +84 +62 +32 +122 +91 +46 +198 +166 +123 +255 +237 +218 +255 +237 +218 +209 +181 +143 +132 +98 +50 +93 +70 +36 +55 +41 +21 +29 +21 +11 +14 +10 +5 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +10 +4 +27 +19 +11 +53 +40 +20 +87 +65 +33 +127 +94 +48 +185 +153 +108 +255 +237 +218 +255 +237 +218 +255 +237 +218 +243 +222 +198 +148 +112 +59 +112 +84 +43 +74 +55 +28 +44 +32 +17 +25 +19 +9 +18 +12 +7 +20 +14 +7 +27 +21 +11 +42 +31 +16 +60 +45 +23 +79 +59 +30 +100 +75 +38 +121 +90 +46 +142 +105 +54 +168 +130 +77 +234 +210 +181 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +146 +110 +59 +112 +83 +43 +77 +57 +30 +48 +36 +18 +25 +19 +9 +12 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +14 +10 +5 +29 +21 +11 +56 +43 +22 +93 +70 +36 +132 +98 +50 +214 +185 +147 +255 +237 +218 +255 +237 +218 +198 +166 +123 +123 +91 +47 +84 +62 +32 +48 +36 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +3 +20 +14 +7 +40 +31 +15 +74 +55 +28 +112 +84 +43 +164 +128 +76 +255 +237 +218 +255 +237 +218 +240 +218 +192 +142 +105 +54 +106 +79 +40 +69 +50 +26 +38 +29 +15 +18 +14 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +20 +14 +7 +38 +29 +15 +69 +52 +26 +106 +79 +40 +144 +108 +55 +231 +207 +177 +255 +237 +218 +255 +237 +218 +255 +237 +218 +198 +166 +123 +134 +100 +51 +95 +72 +36 +60 +45 +23 +37 +27 +14 +27 +19 +11 +31 +23 +11 +44 +32 +17 +65 +48 +25 +90 +67 +34 +112 +84 +43 +135 +101 +51 +155 +117 +63 +200 +169 +128 +249 +228 +206 +255 +237 +218 +255 +237 +218 +255 +237 +218 +249 +229 +207 +153 +116 +63 +118 +88 +45 +84 +62 +32 +55 +40 +20 +31 +23 +11 +16 +12 +6 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +2 +18 +14 +7 +38 +29 +15 +69 +50 +26 +106 +79 +40 +142 +106 +55 +242 +220 +194 +255 +237 +218 +255 +237 +218 +164 +128 +76 +112 +84 +43 +72 +54 +28 +40 +31 +15 +20 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +33 +25 +13 +62 +47 +23 +100 +75 +39 +138 +103 +52 +252 +233 +212 +255 +237 +218 +255 +237 +218 +174 +139 +90 +119 +90 +46 +81 +60 +30 +48 +36 +18 +25 +19 +9 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +10 +5 +27 +19 +11 +51 +38 +20 +85 +64 +33 +125 +93 +47 +170 +134 +84 +252 +234 +213 +255 +237 +218 +255 +237 +218 +252 +233 +212 +155 +117 +63 +118 +88 +45 +80 +60 +31 +53 +40 +20 +40 +29 +15 +42 +32 +16 +62 +47 +24 +108 +82 +45 +146 +110 +59 +181 +148 +101 +219 +192 +156 +249 +229 +207 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +238 +216 +189 +153 +116 +63 +118 +88 +45 +89 +65 +34 +58 +43 +23 +35 +27 +13 +18 +14 +7 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +25 +19 +9 +48 +36 +18 +82 +62 +31 +121 +90 +46 +177 +141 +91 +255 +237 +218 +255 +237 +218 +252 +233 +212 +138 +103 +52 +100 +75 +39 +62 +47 +24 +33 +25 +13 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +4 +2 +12 +8 +4 +27 +19 +10 +51 +38 +20 +87 +65 +33 +127 +94 +48 +206 +176 +137 +255 +237 +218 +255 +237 +218 +214 +185 +147 +134 +100 +51 +96 +72 +37 +62 +45 +23 +33 +25 +13 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +18 +14 +7 +37 +27 +14 +65 +48 +25 +103 +76 +39 +140 +105 +53 +214 +185 +147 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +140 +104 +53 +101 +75 +39 +70 +52 +27 +51 +38 +20 +53 +40 +20 +70 +52 +27 +195 +163 +120 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +144 +108 +55 +116 +87 +44 +87 +65 +33 +60 +45 +23 +37 +27 +14 +22 +16 +8 +10 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +33 +25 +13 +62 +45 +23 +97 +73 +37 +134 +100 +51 +214 +185 +147 +255 +237 +218 +255 +237 +218 +206 +176 +137 +125 +94 +47 +87 +65 +33 +51 +38 +20 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +20 +16 +7 +42 +31 +16 +74 +55 +28 +112 +84 +43 +161 +126 +77 +255 +237 +218 +255 +237 +218 +249 +229 +207 +153 +116 +63 +112 +84 +43 +77 +57 +30 +46 +34 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +48 +36 +18 +80 +60 +30 +118 +88 +45 +159 +121 +68 +247 +227 +204 +255 +237 +218 +255 +237 +218 +252 +233 +212 +164 +128 +76 +122 +91 +46 +90 +67 +34 +65 +48 +25 +62 +45 +23 +74 +55 +28 +108 +82 +45 +243 +222 +198 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +170 +134 +84 +132 +98 +50 +109 +81 +42 +82 +62 +31 +58 +43 +22 +37 +29 +14 +22 +16 +8 +12 +8 +4 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +46 +34 +18 +77 +57 +30 +113 +85 +43 +153 +116 +63 +249 +229 +207 +255 +237 +218 +255 +237 +218 +161 +126 +77 +112 +84 +43 +74 +55 +28 +42 +31 +16 +20 +16 +7 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +33 +25 +13 +62 +45 +23 +97 +73 +37 +134 +100 +51 +242 +220 +194 +255 +237 +218 +255 +237 +218 +204 +173 +133 +131 +97 +50 +95 +70 +36 +60 +45 +23 +33 +25 +13 +16 +12 +6 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +6 +2 +16 +12 +6 +33 +25 +13 +60 +45 +23 +96 +72 +37 +134 +100 +51 +198 +166 +123 +255 +237 +218 +255 +237 +218 +255 +237 +218 +214 +185 +147 +142 +105 +54 +106 +79 +40 +79 +59 +30 +67 +50 +25 +72 +54 +28 +90 +69 +34 +178 +144 +98 +255 +237 +218 +246 +225 +201 +204 +173 +133 +160 +123 +71 +134 +100 +51 +116 +87 +44 +95 +72 +36 +74 +55 +28 +53 +40 +20 +35 +25 +13 +22 +16 +8 +12 +8 +4 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +2 +16 +12 +6 +33 +25 +13 +60 +45 +23 +95 +70 +36 +131 +97 +50 +204 +173 +133 +255 +237 +218 +255 +237 +218 +240 +218 +192 +134 +100 +51 +96 +72 +37 +60 +45 +23 +33 +25 +13 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +10 +8 +4 +25 +19 +9 +48 +36 +18 +81 +60 +30 +118 +88 +45 +177 +141 +91 +255 +237 +218 +255 +237 +218 +247 +227 +204 +151 +114 +61 +113 +85 +43 +79 +59 +30 +48 +34 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +10 +8 +4 +23 +18 +9 +44 +32 +17 +74 +55 +28 +112 +84 +43 +148 +112 +59 +237 +214 +187 +255 +237 +218 +255 +237 +218 +252 +234 +213 +170 +134 +84 +127 +94 +48 +95 +70 +36 +74 +55 +28 +67 +50 +25 +74 +56 +28 +90 +67 +34 +107 +81 +42 +112 +84 +43 +112 +84 +43 +106 +79 +40 +93 +70 +36 +79 +59 +30 +60 +45 +23 +44 +32 +17 +29 +21 +11 +18 +14 +7 +10 +8 +4 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +48 +34 +18 +79 +59 +30 +113 +85 +43 +151 +114 +61 +247 +227 +204 +255 +237 +218 +255 +237 +218 +177 +141 +91 +118 +88 +45 +80 +60 +31 +48 +36 +18 +23 +18 +9 +10 +8 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +8 +6 +2 +18 +14 +7 +37 +27 +14 +65 +48 +25 +101 +75 +39 +138 +103 +52 +243 +222 +198 +255 +237 +218 +255 +237 +218 +204 +173 +133 +134 +100 +51 +98 +73 +37 +65 +48 +25 +37 +29 +14 +20 +14 +7 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +55 +41 +21 +90 +67 +34 +128 +95 +49 +181 +148 +101 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +144 +108 +55 +112 +84 +43 +84 +62 +32 +65 +48 +25 +60 +45 +23 +65 +48 +25 +72 +54 +28 +74 +56 +28 +74 +55 +28 +67 +50 +25 +58 +43 +22 +46 +34 +18 +33 +25 +13 +23 +18 +9 +16 +12 +6 +8 +6 +3 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +20 +14 +7 +38 +29 +15 +65 +48 +25 +98 +73 +37 +134 +100 +51 +206 +176 +137 +255 +237 +218 +255 +237 +218 +246 +225 +201 +138 +103 +52 +101 +75 +39 +65 +48 +25 +37 +27 +14 +18 +14 +7 +8 +6 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +10 +4 +27 +19 +10 +51 +38 +20 +84 +62 +32 +119 +90 +46 +178 +144 +98 +255 +237 +218 +255 +237 +218 +252 +233 +212 +164 +128 +76 +121 +90 +46 +85 +64 +33 +55 +41 +21 +31 +23 +12 +16 +12 +6 +8 +6 +2 +2 +2 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +20 +16 +7 +40 +29 +15 +69 +52 +26 +106 +79 +40 +142 +105 +54 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +181 +148 +101 +131 +98 +50 +96 +72 +37 +69 +52 +26 +53 +40 +20 +46 +34 +18 +44 +32 +17 +44 +32 +17 +42 +31 +16 +37 +27 +14 +29 +21 +11 +23 +18 +9 +16 +12 +6 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +2 +16 +12 +6 +31 +23 +12 +55 +41 +21 +85 +64 +33 +121 +90 +46 +164 +128 +76 +251 +231 +210 +255 +237 +218 +255 +237 +218 +178 +144 +98 +119 +90 +46 +84 +62 +32 +51 +38 +20 +27 +19 +10 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +18 +14 +7 +37 +29 +14 +65 +48 +25 +101 +75 +38 +135 +101 +51 +234 +210 +181 +255 +237 +218 +255 +237 +218 +226 +200 +167 +140 +105 +53 +109 +81 +42 +74 +56 +28 +48 +34 +18 +27 +19 +10 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +5 +27 +19 +11 +51 +38 +20 +84 +62 +32 +122 +91 +46 +168 +130 +77 +252 +233 +212 +255 +237 +218 +255 +237 +218 +240 +218 +192 +151 +114 +61 +115 +85 +43 +80 +60 +31 +55 +41 +21 +37 +27 +14 +27 +21 +11 +23 +18 +9 +20 +16 +7 +18 +12 +7 +14 +10 +5 +10 +6 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +27 +19 +10 +48 +34 +18 +74 +56 +28 +109 +81 +42 +142 +105 +54 +228 +203 +173 +255 +237 +218 +255 +237 +218 +236 +212 +185 +135 +101 +51 +100 +75 +39 +65 +48 +25 +37 +27 +14 +18 +14 +7 +8 +6 +3 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +25 +19 +9 +49 +36 +18 +80 +60 +31 +116 +87 +44 +160 +123 +71 +255 +237 +218 +255 +237 +218 +255 +237 +218 +195 +163 +120 +132 +98 +50 +100 +75 +39 +69 +52 +26 +42 +31 +16 +23 +18 +9 +12 +10 +4 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +3 +18 +14 +7 +37 +27 +13 +63 +47 +25 +100 +75 +38 +138 +103 +52 +209 +181 +143 +255 +237 +218 +255 +237 +218 +255 +237 +218 +200 +169 +128 +135 +101 +51 +98 +73 +37 +65 +48 +25 +40 +29 +15 +23 +18 +9 +15 +12 +5 +10 +8 +4 +8 +6 +2 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +8 +4 +23 +18 +9 +42 +31 +16 +69 +50 +26 +100 +75 +39 +132 +98 +50 +195 +163 +120 +255 +237 +218 +255 +237 +218 +255 +237 +218 +157 +120 +69 +115 +85 +44 +80 +60 +31 +49 +36 +18 +25 +19 +9 +12 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +1 +8 +6 +2 +18 +14 +6 +35 +25 +13 +60 +45 +23 +93 +70 +36 +128 +95 +49 +206 +176 +137 +255 +237 +218 +255 +237 +218 +251 +231 +210 +170 +134 +84 +125 +93 +47 +93 +70 +36 +63 +49 +25 +40 +29 +15 +23 +18 +9 +12 +10 +4 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +12 +8 +4 +23 +18 +9 +46 +34 +18 +79 +59 +30 +115 +85 +44 +155 +117 +63 +246 +225 +201 +255 +237 +218 +255 +237 +218 +249 +229 +207 +159 +121 +68 +118 +88 +45 +81 +60 +30 +49 +36 +18 +27 +21 +11 +14 +10 +5 +8 +6 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +4 +22 +18 +8 +38 +31 +15 +63 +49 +25 +93 +70 +36 +125 +94 +47 +170 +134 +84 +252 +233 +212 +255 +237 +218 +255 +237 +218 +204 +173 +133 +128 +95 +49 +93 +70 +36 +60 +45 +23 +35 +25 +13 +18 +12 +7 +8 +6 +2 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +10 +8 +4 +23 +18 +9 +44 +32 +17 +72 +54 +28 +106 +79 +40 +140 +105 +53 +237 +214 +187 +255 +237 +218 +255 +237 +218 +240 +218 +192 +155 +117 +63 +121 +90 +46 +90 +67 +34 +62 +47 +23 +38 +29 +15 +23 +18 +9 +12 +10 +4 +6 +4 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +16 +12 +6 +33 +25 +13 +58 +43 +22 +93 +70 +36 +132 +98 +50 +195 +162 +115 +255 +237 +218 +255 +237 +218 +255 +237 +218 +214 +185 +147 +140 +104 +53 +101 +75 +39 +65 +48 +25 +38 +27 +15 +20 +14 +7 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +12 +8 +4 +22 +16 +8 +38 +29 +15 +62 +45 +23 +90 +67 +34 +121 +90 +46 +155 +117 +63 +240 +218 +192 +255 +237 +218 +255 +237 +218 +236 +212 +185 +138 +103 +52 +106 +79 +40 +72 +54 +28 +44 +32 +17 +23 +18 +9 +10 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +53 +40 +20 +82 +62 +31 +116 +87 +44 +153 +116 +63 +252 +233 +212 +255 +237 +218 +255 +237 +218 +234 +210 +181 +148 +112 +59 +118 +88 +45 +90 +67 +34 +62 +47 +23 +40 +29 +15 +23 +18 +9 +14 +10 +5 +8 +6 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +10 +8 +4 +22 +16 +8 +42 +31 +16 +72 +54 +28 +110 +82 +42 +144 +108 +55 +234 +210 +181 +255 +237 +218 +255 +237 +218 +254 +236 +216 +170 +134 +84 +125 +93 +47 +85 +64 +33 +53 +40 +20 +27 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +2 +14 +10 +5 +23 +18 +9 +40 +29 +15 +62 +45 +23 +89 +65 +34 +118 +88 +45 +148 +112 +59 +231 +207 +177 +255 +237 +218 +255 +237 +218 +252 +234 +213 +153 +116 +63 +115 +85 +44 +82 +62 +31 +51 +38 +20 +29 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +18 +14 +7 +35 +25 +13 +60 +45 +23 +90 +67 +34 +122 +91 +46 +174 +139 +90 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +144 +108 +55 +118 +88 +45 +90 +67 +34 +63 +47 +25 +42 +31 +16 +27 +19 +10 +16 +12 +6 +8 +6 +3 +4 +4 +2 +2 +2 +0 +2 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +14 +10 +5 +29 +21 +11 +53 +40 +20 +87 +65 +33 +125 +94 +47 +177 +141 +91 +254 +236 +216 +255 +237 +218 +255 +237 +218 +231 +207 +177 +144 +108 +55 +107 +81 +42 +70 +52 +27 +40 +31 +15 +22 +16 +8 +10 +6 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +4 +2 +8 +6 +3 +16 +12 +6 +27 +19 +10 +42 +31 +16 +63 +47 +25 +90 +67 +34 +118 +88 +45 +146 +110 +59 +226 +200 +167 +255 +237 +218 +255 +237 +218 +255 +237 +218 +171 +136 +89 +123 +91 +47 +90 +67 +34 +60 +45 +23 +35 +25 +13 +18 +14 +7 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +10 +8 +4 +22 +16 +8 +40 +31 +15 +65 +48 +25 +96 +72 +37 +128 +95 +49 +185 +153 +108 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +148 +112 +59 +121 +90 +46 +93 +70 +36 +69 +52 +26 +48 +36 +18 +31 +23 +11 +20 +14 +7 +12 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +20 +14 +7 +38 +29 +15 +67 +50 +25 +103 +78 +39 +142 +105 +54 +223 +196 +163 +255 +237 +218 +255 +237 +218 +255 +237 +218 +185 +153 +108 +128 +96 +49 +92 +68 +35 +55 +41 +21 +31 +23 +11 +16 +12 +6 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +12 +8 +4 +20 +14 +7 +31 +23 +11 +48 +36 +18 +69 +50 +26 +93 +70 +36 +119 +90 +46 +148 +112 +59 +223 +196 +163 +255 +237 +218 +255 +237 +218 +255 +237 +218 +189 +157 +114 +128 +95 +49 +96 +72 +37 +65 +48 +25 +40 +31 +15 +22 +16 +8 +10 +8 +4 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +6 +4 +2 +12 +10 +5 +25 +19 +9 +45 +34 +17 +70 +54 +27 +101 +75 +39 +131 +97 +50 +195 +163 +120 +255 +237 +218 +255 +237 +218 +255 +237 +218 +234 +210 +181 +155 +117 +63 +125 +93 +47 +100 +75 +39 +74 +56 +28 +55 +41 +21 +38 +29 +15 +25 +19 +9 +16 +12 +6 +10 +8 +4 +6 +4 +2 +4 +4 +2 +4 +2 +2 +6 +4 +2 +12 +10 +5 +27 +19 +10 +49 +36 +18 +82 +62 +31 +119 +90 +46 +164 +128 +76 +251 +231 +210 +255 +237 +218 +255 +237 +218 +242 +220 +194 +151 +114 +61 +113 +85 +43 +74 +56 +28 +45 +34 +17 +23 +18 +9 +10 +8 +4 +4 +4 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +10 +8 +4 +16 +12 +6 +25 +19 +9 +37 +29 +14 +55 +41 +21 +74 +56 +28 +100 +75 +38 +125 +93 +47 +153 +116 +63 +231 +207 +177 +255 +237 +218 +255 +237 +218 +255 +237 +218 +198 +166 +123 +131 +97 +50 +101 +75 +39 +70 +52 +27 +44 +32 +17 +25 +19 +9 +12 +10 +5 +6 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +1 +6 +4 +2 +14 +10 +5 +27 +21 +11 +48 +36 +18 +74 +55 +28 +103 +76 +39 +132 +98 +50 +198 +166 +123 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +170 +134 +84 +132 +98 +50 +109 +81 +42 +85 +64 +33 +65 +48 +25 +48 +36 +18 +33 +25 +13 +23 +18 +9 +16 +12 +6 +10 +8 +4 +8 +6 +3 +8 +6 +2 +10 +8 +4 +20 +14 +7 +37 +27 +14 +63 +47 +25 +98 +73 +37 +136 +101 +51 +206 +176 +137 +255 +237 +218 +255 +237 +218 +255 +237 +218 +204 +173 +133 +135 +101 +51 +98 +73 +37 +62 +47 +23 +35 +25 +13 +18 +14 +6 +8 +6 +3 +6 +4 +2 +6 +4 +2 +6 +6 +2 +10 +8 +4 +16 +12 +6 +23 +18 +9 +33 +25 +13 +48 +36 +18 +65 +48 +25 +87 +63 +33 +109 +81 +42 +132 +98 +50 +170 +134 +84 +240 +218 +192 +255 +237 +218 +255 +237 +218 +255 +237 +218 +198 +166 +123 +132 +98 +50 +103 +76 +39 +74 +55 +28 +48 +36 +18 +27 +21 +11 +14 +10 +5 +6 +4 +2 +2 +2 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +29 +21 +11 +49 +36 +18 +74 +55 +28 +103 +76 +39 +131 +97 +50 +185 +153 +108 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +233 +212 +198 +166 +123 +142 +105 +54 +121 +90 +46 +98 +73 +37 +79 +59 +30 +60 +45 +23 +46 +34 +18 +33 +25 +13 +25 +19 +9 +18 +14 +7 +15 +12 +5 +14 +10 +5 +18 +14 +6 +27 +21 +11 +48 +36 +18 +77 +59 +30 +115 +85 +43 +153 +116 +63 +242 +220 +194 +255 +237 +218 +255 +237 +218 +251 +231 +210 +160 +123 +71 +121 +90 +46 +84 +62 +32 +51 +38 +20 +29 +21 +11 +18 +14 +7 +14 +10 +5 +15 +12 +5 +18 +14 +7 +23 +20 +9 +33 +25 +13 +46 +34 +18 +60 +45 +23 +79 +59 +30 +98 +73 +37 +121 +90 +46 +142 +105 +54 +194 +161 +116 +251 +231 +210 +255 +237 +218 +255 +237 +218 +255 +237 +218 +185 +153 +108 +131 +97 +50 +103 +76 +39 +74 +55 +28 +49 +36 +19 +29 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +29 +21 +11 +49 +36 +18 +74 +55 +28 +101 +75 +39 +128 +95 +49 +174 +139 +90 +252 +233 +212 +255 +237 +218 +255 +237 +218 +255 +237 +218 +226 +200 +167 +164 +128 +76 +134 +100 +51 +115 +85 +43 +95 +70 +36 +77 +57 +30 +62 +45 +23 +49 +36 +18 +38 +29 +15 +29 +21 +11 +25 +19 +9 +23 +18 +9 +27 +19 +10 +38 +29 +15 +62 +47 +23 +95 +70 +36 +131 +98 +50 +189 +157 +114 +255 +237 +218 +255 +237 +218 +255 +237 +218 +219 +192 +156 +142 +105 +54 +106 +79 +40 +74 +55 +28 +49 +36 +18 +35 +25 +13 +31 +23 +11 +31 +23 +12 +38 +29 +15 +49 +36 +18 +62 +45 +23 +77 +57 +30 +95 +70 +36 +115 +85 +43 +134 +100 +51 +164 +128 +76 +228 +203 +173 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +233 +212 +171 +136 +89 +128 +95 +49 +101 +75 +39 +74 +55 +28 +49 +36 +18 +31 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +29 +21 +11 +48 +36 +18 +70 +52 +27 +96 +72 +37 +122 +91 +46 +151 +114 +61 +234 +210 +181 +255 +237 +218 +255 +237 +218 +255 +237 +218 +251 +231 +210 +204 +173 +133 +151 +114 +61 +131 +98 +50 +113 +85 +43 +98 +73 +37 +82 +62 +31 +69 +52 +26 +55 +41 +21 +48 +34 +18 +40 +29 +15 +37 +27 +14 +40 +29 +15 +53 +40 +20 +79 +59 +30 +112 +84 +43 +144 +108 +55 +231 +207 +177 +255 +237 +218 +255 +237 +218 +254 +236 +216 +177 +141 +91 +132 +98 +50 +101 +75 +39 +74 +55 +28 +60 +45 +23 +55 +41 +21 +60 +45 +23 +70 +52 +27 +82 +62 +31 +98 +73 +37 +113 +85 +43 +131 +97 +50 +151 +114 +61 +206 +176 +137 +252 +233 +212 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +153 +116 +63 +122 +91 +46 +96 +72 +37 +70 +52 +27 +48 +36 +18 +29 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +16 +12 +6 +27 +19 +11 +44 +32 +17 +65 +48 +25 +90 +67 +34 +115 +85 +43 +138 +103 +52 +204 +173 +133 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +249 +228 +206 +206 +176 +137 +155 +117 +63 +134 +100 +51 +121 +90 +46 +106 +79 +40 +92 +68 +35 +79 +59 +30 +67 +50 +25 +55 +41 +21 +51 +38 +20 +53 +40 +20 +67 +50 +25 +93 +70 +36 +128 +95 +49 +174 +139 +90 +254 +236 +216 +255 +237 +218 +255 +237 +218 +234 +210 +181 +155 +117 +63 +131 +98 +50 +109 +81 +42 +95 +72 +36 +92 +68 +35 +98 +73 +37 +107 +81 +42 +121 +90 +46 +135 +101 +51 +153 +116 +63 +200 +169 +128 +246 +225 +201 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +204 +173 +133 +138 +103 +52 +115 +85 +44 +90 +67 +34 +65 +48 +25 +44 +32 +17 +27 +21 +11 +16 +12 +6 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +3 +14 +10 +5 +25 +19 +9 +40 +29 +15 +60 +45 +23 +81 +60 +30 +106 +78 +40 +128 +95 +49 +157 +120 +69 +234 +210 +181 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +249 +229 +207 +214 +185 +147 +174 +139 +90 +142 +105 +54 +128 +96 +49 +116 +87 +44 +101 +75 +39 +85 +64 +33 +72 +54 +28 +62 +47 +23 +63 +49 +25 +80 +60 +31 +109 +81 +42 +142 +105 +54 +219 +192 +156 +255 +237 +218 +255 +237 +218 +255 +237 +218 +198 +166 +123 +157 +119 +65 +144 +108 +55 +134 +100 +51 +132 +98 +50 +136 +101 +51 +144 +108 +55 +177 +141 +91 +214 +185 +147 +249 +229 +207 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +236 +212 +185 +160 +123 +71 +128 +95 +49 +106 +79 +40 +82 +62 +31 +60 +45 +23 +40 +31 +15 +25 +19 +9 +14 +10 +5 +8 +6 +3 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +4 +2 +2 +6 +4 +2 +12 +10 +5 +22 +16 +9 +35 +25 +13 +51 +38 +20 +72 +54 +28 +93 +70 +36 +115 +85 +43 +135 +101 +51 +178 +144 +98 +243 +222 +198 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +209 +181 +143 +178 +144 +98 +142 +106 +55 +116 +87 +44 +96 +72 +37 +77 +57 +30 +67 +50 +26 +72 +54 +28 +92 +68 +35 +123 +91 +47 +160 +123 +71 +249 +229 +207 +255 +237 +218 +255 +237 +218 +246 +225 +201 +177 +141 +91 +168 +130 +77 +168 +130 +77 +185 +153 +108 +214 +185 +147 +242 +220 +194 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +243 +222 +198 +178 +144 +98 +135 +101 +51 +116 +87 +44 +93 +70 +36 +72 +54 +28 +51 +38 +20 +35 +25 +13 +22 +16 +9 +12 +10 +5 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +6 +4 +2 +10 +8 +4 +18 +14 +7 +29 +21 +11 +44 +32 +17 +60 +45 +23 +80 +60 +30 +100 +75 +38 +118 +88 +45 +138 +103 +52 +171 +136 +89 +237 +214 +187 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +234 +213 +234 +210 +181 +171 +136 +89 +92 +68 +35 +72 +54 +28 +67 +50 +25 +77 +57 +30 +103 +76 +39 +136 +101 +51 +206 +176 +137 +255 +237 +218 +255 +237 +218 +255 +237 +218 +240 +218 +192 +240 +218 +192 +254 +236 +216 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +242 +220 +194 +178 +144 +98 +138 +103 +52 +121 +90 +46 +101 +75 +39 +80 +60 +31 +62 +47 +23 +44 +32 +17 +29 +21 +11 +18 +14 +7 +10 +8 +4 +6 +4 +2 +2 +2 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +4 +2 +8 +6 +3 +14 +10 +5 +23 +18 +9 +35 +25 +13 +48 +36 +18 +65 +48 +25 +82 +62 +31 +101 +75 +39 +118 +88 +45 +134 +100 +51 +157 +120 +69 +200 +169 +128 +252 +233 +212 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +251 +231 +210 +117 +88 +46 +74 +55 +28 +62 +45 +23 +62 +47 +24 +82 +62 +31 +112 +84 +43 +148 +112 +59 +252 +234 +213 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +252 +234 +213 +209 +181 +143 +161 +126 +77 +135 +101 +51 +119 +90 +46 +103 +76 +39 +84 +62 +33 +65 +48 +25 +49 +36 +18 +35 +25 +13 +23 +18 +9 +14 +10 +5 +8 +6 +3 +4 +4 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +10 +8 +4 +18 +14 +6 +25 +19 +9 +37 +27 +14 +51 +38 +19 +65 +48 +25 +80 +60 +31 +96 +72 +37 +110 +82 +42 +125 +93 +47 +138 +103 +52 +161 +126 +77 +195 +163 +120 +237 +214 +187 +255 +237 +218 +255 +237 +218 +255 +237 +218 +209 +181 +143 +70 +52 +27 +53 +40 +20 +51 +38 +20 +62 +47 +24 +87 +65 +33 +118 +88 +45 +189 +157 +114 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +255 +237 +218 +237 +214 +187 +198 +166 +123 +168 +130 +77 +140 +105 +53 +127 +94 +48 +112 +84 +43 +98 +73 +37 +81 +60 +30 +65 +48 +25 +51 +38 +20 +37 +27 +14 +25 +19 +9 +18 +14 +6 +10 +8 +4 +6 +4 +2 +4 +2 +2 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +2 +2 +8 +6 +2 +12 +8 +4 +18 +14 +7 +25 +19 +9 +37 +27 +13 +48 +36 +18 +60 +45 +23 +74 +55 +28 +87 +65 +33 +100 +75 +38 +110 +82 +42 +118 +88 +45 +125 +93 +47 +127 +94 +48 +133 +99 +51 +146 +110 +59 +161 +126 +77 +88 +65 +34 +44 +32 +17 +38 +29 +15 +44 +32 +17 +62 +47 +23 +87 +65 +33 +112 +84 +43 +185 +153 +108 +189 +157 +114 +171 +136 +89 +160 +123 +71 +144 +108 +55 +134 +100 +51 +125 +93 +47 +112 +84 +43 +101 +75 +39 +89 +65 +34 +74 +55 +28 +62 +45 +23 +49 +36 +18 +37 +27 +14 +27 +19 +11 +18 +14 +7 +12 +8 +4 +8 +6 +3 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +0 +4 +4 +2 +8 +6 +2 +12 +10 +4 +18 +14 +7 +23 +18 +9 +33 +25 +13 +42 +31 +16 +51 +38 +20 +62 +47 +23 +72 +54 +28 +80 +60 +31 +87 +63 +33 +87 +65 +33 +84 +62 +32 +74 +55 +28 +60 +45 +23 +44 +32 +17 +31 +23 +11 +25 +19 +9 +27 +21 +11 +40 +29 +15 +56 +43 +22 +74 +56 +28 +92 +68 +35 +103 +76 +39 +106 +79 +40 +106 +79 +40 +101 +75 +39 +93 +68 +36 +84 +62 +32 +74 +55 +28 +62 +47 +24 +53 +40 +20 +42 +32 +16 +33 +25 +13 +25 +19 +9 +18 +14 +7 +12 +10 +4 +8 +6 +2 +4 +4 +2 +2 +2 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +0 +4 +4 +2 +6 +6 +2 +10 +8 +4 +15 +12 +5 +20 +16 +7 +25 +19 +9 +33 +25 +13 +40 +31 +15 +46 +34 +18 +51 +38 +20 +53 +40 +20 +51 +38 +20 +46 +34 +18 +37 +27 +14 +27 +21 +11 +20 +14 +7 +16 +12 +6 +16 +12 +6 +23 +18 +9 +33 +25 +13 +46 +34 +18 +55 +41 +21 +62 +47 +24 +65 +48 +25 +65 +48 +25 +60 +45 +23 +55 +41 +21 +48 +36 +18 +40 +31 +16 +33 +25 +13 +27 +19 +10 +22 +16 +8 +16 +12 +6 +10 +8 +4 +8 +6 +2 +4 +4 +2 +2 +2 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +4 +2 +2 +6 +4 +2 +8 +6 +3 +12 +8 +4 +16 +12 +6 +20 +14 +7 +23 +16 +8 +25 +19 +9 +27 +19 +10 +27 +19 +10 +25 +19 +9 +20 +16 +7 +16 +12 +6 +10 +8 +4 +8 +6 +3 +8 +6 +3 +12 +8 +4 +16 +12 +6 +23 +18 +9 +29 +21 +11 +33 +25 +13 +35 +25 +13 +35 +25 +13 +31 +23 +11 +27 +19 +10 +23 +18 +9 +20 +14 +7 +16 +12 +6 +12 +8 +4 +8 +6 +3 +6 +4 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +1 +4 +2 +2 +6 +4 +2 +6 +6 +3 +8 +6 +3 +10 +8 +4 +12 +10 +4 +12 +10 +4 +10 +8 +4 +10 +8 +4 +6 +6 +2 +4 +4 +2 +4 +2 +2 +4 +2 +2 +4 +4 +2 +6 +6 +2 +10 +8 +4 +12 +10 +5 +14 +10 +5 +16 +12 +6 +15 +12 +5 +14 +10 +5 +12 +8 +4 +10 +8 +4 +8 +6 +3 +6 +4 +2 +4 +2 +2 +4 +2 +2 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +0 +4 +2 +2 +4 +2 +2 +4 +4 +2 +4 +4 +2 +4 +4 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +1 +4 +2 +2 +4 +4 +2 +6 +4 +2 +6 +4 +2 +6 +4 +2 +4 +4 +2 +4 +4 +2 +4 +2 +2 +2 +2 +0 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/nichrome/logo/nichrome.png b/nichrome/logo/nichrome.png new file mode 100644 index 000000000..1a6aa0f7a Binary files /dev/null and b/nichrome/logo/nichrome.png differ diff --git a/nichrome/logo/nichrome.svg b/nichrome/logo/nichrome.svg new file mode 100644 index 000000000..afef0dae1 --- /dev/null +++ b/nichrome/logo/nichrome.svg @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/nichrome/logo/nichrome_stylized.png b/nichrome/logo/nichrome_stylized.png new file mode 100644 index 000000000..ef88d2593 Binary files /dev/null and b/nichrome/logo/nichrome_stylized.png differ diff --git a/nichrome/pkg/sos/client.go b/nichrome/pkg/sos/client.go new file mode 100644 index 000000000..94c74b262 --- /dev/null +++ b/nichrome/pkg/sos/client.go @@ -0,0 +1,147 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net" + "net/http" + "os" + "os/signal" + "strconv" + "strings" + "syscall" + + "github.com/gorilla/mux" +) + +// RegistersNecessaryPatterns registers all the necessary patterns needed +// to make a service becomes a SoS client. +func RegistersNecessaryPatterns(router *mux.Router) { + router.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("pong")) + }).Methods("GET") +} + +// RegisterServiceWithSos tries to register a service with SoS. +// If an non-nil error is returned, the service needs to exit immediately. +func RegisterServiceWithSos(service string, port uint) error { + return registerServiceWithSos(service, port, "http://localhost:"+PortNum) +} + +func registerServiceWithSos(service string, port uint, sosServerURL string) error { + m := RegisterReqJson{service, port} + return makeRequestToServer("POST", sosServerURL+"/register", m) +} + +// UnregisterServiceWithSos makes a request to SoS Server to unregister the service. +// This function should be called before a service exit. +func UnregisterServiceWithSos(service string) error { + return unregisterServiceWithSos(service, "http://localhost:"+PortNum) +} + +func unregisterServiceWithSos(service string, sosServerURL string) error { + m := UnRegisterReqJson{service} + return makeRequestToServer("POST", sosServerURL+"/unregister", m) +} + +func makeRequestToServer(reqType, url string, reqJSON interface{}) error { + b, err := json.Marshal(reqJSON) + if err != nil { + return err + } + + req, err := http.NewRequest(reqType, url, bytes.NewBuffer(b)) + if err != nil { + return err + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + + if res.StatusCode < 200 || res.StatusCode >= 300 { + decoder := json.NewDecoder(res.Body) + defer res.Body.Close() + var retMsg struct{ Error string } + if err := decoder.Decode(&retMsg); err != nil { + return err + } + if retMsg.Error != "" { + return fmt.Errorf(retMsg.Error) + } + } + + return nil +} + +// GetListener starts listener on a random port in localhost +// and returns the listener and the port that the listener is on. +// Remember to close the listener with: +// +// defer listener.close() +// +// or if it's used in a server, remember to shutdown the server. +func GetListener() (net.Listener, uint, error) { + listener, err := net.Listen("tcp", "localhost:0") + if err != nil { + return nil, 0, err + } + + addrSplit := strings.Split(listener.Addr().String(), ":") + if len(addrSplit) != 2 { + listener.Close() + return nil, 0, fmt.Errorf("Address format not recognized: %v", listener.Addr().String()) + } + + port, err := strconv.ParseUint(addrSplit[1], 10, 32) + if err != nil { + listener.Close() + return nil, 0, err + } + return listener, uint(port), nil +} + +// StartServiceServer establishes registers all necessary patterns to the router passed in, +// registers the service with SoS using the port passed in, and starts serving the service on the +// listener passed in. If any of the above step fails, this function will return an error. +// This function wraps around RegistersNecessaryPatterns, RegisterServiceWithSos, and UnregisterServiceWithSos. +// If no extenral settings are required, instead of calling each of the above separately, one can call +// the GetListener function and pass the result into this function to start and serve their HTTP server right away. +func StartServiceServer(router *mux.Router, serviceName string, listener net.Listener, port uint) error { + RegistersNecessaryPatterns(router) + if err := RegisterServiceWithSos(serviceName, port); err != nil { + return err + } + defer UnregisterServiceWithSos(serviceName) + + shutdownChan := make(chan bool, 2) + server := http.Server{Handler: router} + defer func() { + shutdownChan <- true + }() // Use to collect any other failure besides signals + + // Signals Collector + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT) + go func() { + sig := <-sigs + fmt.Printf("Received: %v\n", sig) + shutdownChan <- true + }() + + // Server Shutdown code + go func() { + <-shutdownChan + fmt.Println("Shutting down...") + server.Shutdown(context.Background()) + }() + + return server.Serve(listener) +} diff --git a/nichrome/pkg/sos/html/css/stylesheet.css b/nichrome/pkg/sos/html/css/stylesheet.css new file mode 100644 index 000000000..e1d3e71a2 --- /dev/null +++ b/nichrome/pkg/sos/html/css/stylesheet.css @@ -0,0 +1,116 @@ +body { + font: 12px Helvetica, sans-serif; + background-color: #f1f1f1 +} + +h1 { + margin-left: 40px; +} + +h2.center, h2.centernarrow { + padding: 5px; + color: #616161 +} + +.banner { + background-color: #3367d6; + color: white; + position: absolute; + top: 0px; + right: 0; + left: 0; + margin: 0 auto; +} + +.bannerbtn { + text-decoration: none; + color: white; +} + +.content { + margin-top: 100px; +} + +.center { + margin: auto; + padding: 5px; + width: 75% +} + +.centernarrow { + margin: auto; + padding: 5px; + width: 50% +} + +.button { + background-color: #4885ed; + border: none; + color: white; + padding: 16px 32px; + text-align: center; + text-transform: uppercase; + font-size: 16px; + margin: 4px 2px; + transition: 0.3s; + display: inline-block; + text-decoration: none; + cursor: pointer; + border-radius: 4px; +} + +.textbutton { + color: #3367d6; + background-color: white; + border: none; + font-size: 16px; + cursor: pointer; +} + +.submitbtn { + float: right; + margin-right: 25%; + margin-top: 20px; +} + +.button:hover { + background-color: #3875d8; +} + +table { + background-color: white; + margin:auto; + border-collapse: collapse; + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); +} + +td, th { + border: 1px solid #dddddd; + text-align: center; + padding: 8px; +} + +.card { + background-color: white; + margin:auto; + width: 50%; + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + padding-bottom: 10px; +} + +.label { + padding: 20px; + padding-bottom: 0px; + margin-bottom: 5px; + margin-top: 0; +} + +input.form[type=text] { + width: 75%; + box-sizing: border-box; + border: none; + border-bottom: 2px solid #bbbbbb; + padding: 0px; + margin-left: 20px; + margin-bottom: 10px; +} \ No newline at end of file diff --git a/nichrome/pkg/sos/html/sos.html b/nichrome/pkg/sos/html/sos.html new file mode 100644 index 000000000..243c1bd3b --- /dev/null +++ b/nichrome/pkg/sos/html/sos.html @@ -0,0 +1,32 @@ + + Service of Services + + + + + + +
+
+

Current Services

+ + + + + + {{range $key, $value := .}} + + + + + {{else}} + + + + {{end}} +
ServicePort Number
{{$key}}{{$value}}
No services
+
+
+ \ No newline at end of file diff --git a/nichrome/pkg/sos/html/time.html b/nichrome/pkg/sos/html/time.html new file mode 100644 index 000000000..d50caca4e --- /dev/null +++ b/nichrome/pkg/sos/html/time.html @@ -0,0 +1,73 @@ + + Time + + + + + + +
+
+

System Time Settings

+
+
+ + + +
+
+ +
+
+ diff --git a/nichrome/pkg/sos/html/upspin.html b/nichrome/pkg/sos/html/upspin.html new file mode 100644 index 000000000..2ceba60d2 --- /dev/null +++ b/nichrome/pkg/sos/html/upspin.html @@ -0,0 +1,124 @@ + + Upspin + + + + + + +
+ + {{$user := .User}} + {{$dir := .Dir}} + {{$store := .Store}} + {{$seed := .Seed}} +
+

Upspin Config Settings

+
+

Username

+ +

Dir Server

+ +

Store Server

+ +

Secret Seed

+ +
+ + +
+
+ + diff --git a/nichrome/pkg/sos/html/wifi.html b/nichrome/pkg/sos/html/wifi.html new file mode 100644 index 000000000..02cc16fa6 --- /dev/null +++ b/nichrome/pkg/sos/html/wifi.html @@ -0,0 +1,154 @@ + + + WiFi + + + + + + + +
+ {{$NoEnc := 0}} + {{$WpaPsk := 1}} + {{$WpaEap := 2}} + {{$connectedEssid := .ConnectedEssid}} + {{$connectingEssid := .ConnectingEssid}} +
+

Available Networks

+ + + + + + + + {{range $idx, $opt := .WifiOpts}} + {{if eq $opt.AuthSuite $NoEnc}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else if eq $opt.AuthSuite $WpaPsk}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else if eq $opt.AuthSuite $WpaEap}} + + + + + {{if and (eq $connectedEssid $opt.Essid) (ne $connectedEssid "")}} + + {{else if and (and (eq $connectingEssid $opt.Essid) (ne $connectingEssid "")) (ne $connectingEssid $connectedEssid) }} + + {{else}} + + {{end}} + + {{else}} + + + + + {{end}} + {{else}} + + {{end}} +
EssidIdentityPassword / Passphrase
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}ConnectedConnecting...
{{$opt.Essid}}Not a supported protocol
No essids found
+
+ + {{if and (ne $connectingEssid "") (ne $connectingEssid $connectedEssid) }} + + {{end}} +
+ + diff --git a/nichrome/pkg/sos/server.go b/nichrome/pkg/sos/server.go new file mode 100644 index 000000000..92006f2ac --- /dev/null +++ b/nichrome/pkg/sos/server.go @@ -0,0 +1,181 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "encoding/json" + "fmt" + "html/template" + "io/ioutil" + "log" + "net/http" + "path/filepath" + + "github.com/gorilla/mux" +) + +const ( + PortNum = "8000" + DefHtmlPage = ` + + + + + +

Current Services (html embedded)

+ + + + + + + {{range $key, $value := .}} + + + + + + {{else}} + + + + {{end}} +
ServicePort Number
{{$key}}{{$value}}Go there!
No services
+ +` +) + +// default path +var htmlRoot = "/etc/sos/html" + +type SosServer struct { + service *SosService +} + +type RegisterReqJson struct { + Service string + Port uint +} + +// set htmlRoot var to array of dirs p +func SetHTMLRoot(p ...string) { + if len(p) > 0 { + htmlRoot = filepath.Join(p...) + } +} + +// HTMLPath returns the HTMLPath formed by joining the arguments together. +// If there are no arguments, it simply returns the HTML root directory. +func HTMLPath(n ...string) string { + return filepath.Join(htmlRoot, filepath.Join(n...)) +} + +func (s SosServer) registerHandle(w http.ResponseWriter, r *http.Request) { + var msg RegisterReqJson + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + + if err := s.service.Register(msg.Service, msg.Port); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(nil) +} + +type UnRegisterReqJson struct { + ServiceName string +} + +func (s SosServer) unregisterHandle(w http.ResponseWriter, r *http.Request) { + var msg UnRegisterReqJson + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + if err := decoder.Decode(&msg); err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + s.service.Unregister(msg.ServiceName) + json.NewEncoder(w).Encode(nil) +} + +type GetServiceResJson struct { + Port uint +} + +func (s SosServer) getServiceHandle(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + port, err := s.service.Read(vars["service"]) + if err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusNotFound) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + json.NewEncoder(w).Encode(GetServiceResJson{port}) +} + +func (s SosServer) redirectToResourceHandle(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + port, err := s.service.Read(vars["service"]) + if err != nil { + log.Printf("error: %v", err) + w.WriteHeader(http.StatusNotFound) + json.NewEncoder(w).Encode(struct{ Error string }{err.Error()}) + return + } + http.Redirect(w, r, fmt.Sprintf("http://localhost:%v/", port), http.StatusTemporaryRedirect) +} + +func (s SosServer) displaySosHandle(w http.ResponseWriter, r *http.Request) { + snap := s.service.SnapshotRegistry() + var tmpl *template.Template + file, err := ioutil.ReadFile(HTMLPath("sos.html")) + if err == nil { + html := string(file) + tmpl = template.Must(template.New("SoS").Parse(html)) + } else { + tmpl = template.Must(template.New("SoS").Parse(DefHtmlPage)) + } + tmpl.Execute(w, snap) +} + +func (s SosServer) buildRouter() http.Handler { + r := mux.NewRouter() + r.HandleFunc("/", s.displaySosHandle).Methods("GET") + r.HandleFunc("/register", s.registerHandle).Methods("POST") + r.HandleFunc("/unregister", s.unregisterHandle).Methods("POST") + r.HandleFunc("/service/{service}", s.getServiceHandle).Methods("GET") + r.HandleFunc("/go/{service}", s.redirectToResourceHandle).Methods("GET") + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(HTMLPath("css"))))) + return r +} + +func StartServer(service *SosService) { + server := SosServer{service} + fmt.Println(http.ListenAndServe(fmt.Sprintf(":%s", PortNum), server.buildRouter())) +} diff --git a/nichrome/pkg/sos/server_test.go b/nichrome/pkg/sos/server_test.go new file mode 100644 index 000000000..2be9bfc0f --- /dev/null +++ b/nichrome/pkg/sos/server_test.go @@ -0,0 +1,203 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "encoding/json" + "fmt" + "math/rand" + "net/http" + "net/http/httptest" + "path/filepath" + "reflect" + "sync" + "testing" +) + +func TestSOSHtmlPath(t *testing.T) { + var tests = []struct { + paths []string + result string + }{ + {paths: []string{""}, result: htmlRoot}, + {paths: []string{"css"}, result: filepath.Join(htmlRoot, "css")}, + {paths: []string{"html", "wifi.html"}, result: filepath.Join(htmlRoot, "html/wifi.html")}, + {paths: []string{"html/wifi.html"}, result: filepath.Join(htmlRoot, "html/wifi.html")}, + } + + for _, test := range tests { + if p := HTMLPath(test.paths...); p != test.result { + t.Errorf("%v: want %v, got %v", test, test.result, p) + } + } +} + +func TestSOSHtmlPathWithPresetRoot(t *testing.T) { + //set up + testRoot := "/a/b/html" + SetHTMLRoot("/a", "b", "html") + + var tests = []struct { + paths []string + result string + }{ + {paths: []string{""}, result: testRoot}, + {paths: []string{"css"}, result: filepath.Join(testRoot, "css")}, + {paths: []string{"html", "wifi.html"}, result: filepath.Join(testRoot, "html/wifi.html")}, + {paths: []string{"html/wifi.html"}, result: filepath.Join(testRoot, "html/wifi.html")}, + } + + for _, test := range tests { + if p := HTMLPath(test.paths...); p != test.result { + t.Errorf("%v: want %v, got %v", test, test.result, p) + } + } +} + +func TestRegisterHandle(t *testing.T) { + // Set up + s := SosServer{NewSosService()} + r := s.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + m := RegisterReqJson{knownServ1.service, knownServ1.port} + + // Execute + if err := makeRequestToServer("POST", ts.URL+"/register", m); err != nil { + t.Errorf("error: %v", err) + return + } + + // Assert + if s.service.registry[knownServ1.service] != knownServ1.port { + t.Errorf("got:(%v)\nwant:(%v)", s.service.registry[knownServ1.service], knownServ1.port) + } +} + +func TestUnregisterHandle(t *testing.T) { + // Set up + s := SosServer{setUpKnownServices()} + r := s.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + m := UnRegisterReqJson{knownServ1.service} + + // Execute + if err := makeRequestToServer("POST", ts.URL+"/unregister", m); err != nil { + t.Errorf("error: %v", err) + return + } + // Assert + if _, err := s.service.Read(knownServ1.service); !reflect.DeepEqual(err, fmt.Errorf("%v is not in the registry", knownServ1.service)) { + t.Errorf("\ngot:(%v)\nwant:(%v)", err, fmt.Errorf("%v is not in the registry", knownServ1.service)) + } +} + +func TestGetService(t *testing.T) { + // Set up + r := SosServer{setUpKnownServices()}.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + req, err := http.NewRequest("GET", ts.URL+"/service/"+knownServ1.service, nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Execute + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Assert + decoder := json.NewDecoder(res.Body) + defer res.Body.Close() + var retMsg GetServiceResJson + if err := decoder.Decode(&retMsg); err != nil { + t.Errorf("Error Decode JSON Response") + return + } + if retMsg.Port != knownServ1.port { + t.Errorf("\ngot:(%v)\nwant:(%v)", retMsg.Port, knownServ1.port) + } +} + +func TestGetServiceFails(t *testing.T) { + // Set up + r := SosServer{NewSosService()}.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + req, err := http.NewRequest("GET", ts.URL+"/service/"+knownServ1.service, nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Execute + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Errorf("error: %v", err) + return + } + + // Assert + if res.StatusCode != http.StatusNotFound { + t.Errorf("\ngot:(%v)\nwant:(%v)", res.StatusCode, http.StatusNotFound) + } +} + +func TestRace(t *testing.T) { + // Set Up + numRegisterGoRoutines, numUnregisterGoRoutines, numReadGoRoutines := 10, 10, 100 + serviceChoices := []RegistryEntryStub{ + knownServ1, knownServ2, knownServ3, + newServ1, newServ2, newServ3, + } + + r := SosServer{setUpKnownServices()}.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + + // Execute + var wg sync.WaitGroup + + for i := 0; i < numRegisterGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + idx := rand.Intn(len(serviceChoices)) + m := RegisterReqJson{serviceChoices[idx].service, serviceChoices[idx].port} + makeRequestToServer("POST", ts.URL+"/register", m) + }() + } + + for i := 0; i < numUnregisterGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + idx := rand.Intn(len(serviceChoices)) + m := UnRegisterReqJson{serviceChoices[idx].service} + makeRequestToServer("POST", ts.URL+"/unregister", m) + }() + } + + for i := 0; i < numReadGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + idx := rand.Intn(len(serviceChoices)) + req, err := http.NewRequest("GET", ts.URL+"/service/"+serviceChoices[idx].service, nil) + if err != nil { + t.Errorf("error: %v", err) + return + } + http.DefaultClient.Do(req) + }() + } + + wg.Wait() +} diff --git a/nichrome/pkg/sos/service.go b/nichrome/pkg/sos/service.go new file mode 100644 index 000000000..651380b13 --- /dev/null +++ b/nichrome/pkg/sos/service.go @@ -0,0 +1,60 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "fmt" + "sync" +) + +type Registry map[string]uint + +type SosService struct { + rWLock sync.RWMutex + registry Registry +} + +func (s *SosService) Read(serviceName string) (uint, error) { + s.rWLock.RLock() + defer s.rWLock.RUnlock() + port, exists := s.registry[serviceName] + if !exists { + return 0, fmt.Errorf("%v is not in the registry", serviceName) + } + return port, nil +} + +func (s *SosService) Register(serviceName string, portNum uint) error { + s.rWLock.Lock() + defer s.rWLock.Unlock() + _, exists := s.registry[serviceName] + if exists { + return fmt.Errorf("%v already exists", serviceName) + } + s.registry[serviceName] = portNum + return nil +} + +func (s *SosService) Unregister(serviceName string) { + s.rWLock.Lock() + defer s.rWLock.Unlock() + delete(s.registry, serviceName) +} + +func (s *SosService) SnapshotRegistry() Registry { + s.rWLock.RLock() + defer s.rWLock.RUnlock() + snapshot := make(map[string]uint) + for name, port := range s.registry { + snapshot[name] = port + } + return snapshot +} + +func NewSosService() *SosService { + return &SosService{ + registry: make(map[string]uint), + } +} diff --git a/nichrome/pkg/sos/serviceFuncs_test.go b/nichrome/pkg/sos/serviceFuncs_test.go new file mode 100644 index 000000000..deb3c6fd0 --- /dev/null +++ b/nichrome/pkg/sos/serviceFuncs_test.go @@ -0,0 +1,96 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/gorilla/mux" +) + +func TestRegistersNecessaryPatterns(t *testing.T) { + router := mux.NewRouter() + RegistersNecessaryPatterns(router) + ts := httptest.NewServer(router) + defer ts.Close() + + res, err := http.Get(ts.URL + "/ping") + if err != nil { + t.Errorf("error: %v", err) + return + } + + if res.StatusCode != http.StatusOK { + t.Errorf("Status Code\ngot:%v\nwant:%v", res.StatusCode, http.StatusOK) + return + } + + msg, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + t.Errorf("error: %v", err) + return + } + + if string(msg) != "pong" { + t.Errorf("Body\ngot:%v\nwant:%v", string(msg), "pong") + } +} + +func TestRegisterServiceWithSosSuccess(t *testing.T) { + // Set up + service := NewSosService() + server := SosServer{service} + r := server.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + + if err := registerServiceWithSos(knownServ1.service, knownServ1.port, ts.URL); err != nil { + t.Errorf("error: %v", err) + return + } + + if service.registry[knownServ1.service] != knownServ1.port { + t.Errorf("In Registry\ngot:%v\nwant:%v", service.registry[knownServ1.service], knownServ1.port) + } +} + +func TestRegisterServiceWithSosFail(t *testing.T) { + // Set up + service := setUpKnownServices() + server := SosServer{service} + r := server.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + + err := registerServiceWithSos(knownServ1.service, knownServ1.port, ts.URL) + if !reflect.DeepEqual(err, fmt.Errorf("%v already exists", knownServ1.service)) { + t.Errorf("\ngot:%v\nwant:%v", err, fmt.Errorf("%v already exists", knownServ1.service)) + } +} + +func TestUnregisterServiceWithSosSuccess(t *testing.T) { + // Set up + service := setUpKnownServices() + server := SosServer{service} + r := server.buildRouter() + ts := httptest.NewServer(r) + defer ts.Close() + + if err := unregisterServiceWithSos(knownServ1.service, ts.URL); err != nil { + t.Errorf("error: %v", err) + return + } + + if _, err := service.Read(knownServ1.service); !reflect.DeepEqual(err, fmt.Errorf("%v is not in the registry", knownServ1.service)) { + t.Errorf("unregister(%v)\ngot:(%v)\nwant:(%v)", knownServ1.service, err, fmt.Errorf("%v is not in the registry", knownServ1.service)) + } + +} diff --git a/nichrome/pkg/sos/service_test.go b/nichrome/pkg/sos/service_test.go new file mode 100644 index 000000000..392bb90af --- /dev/null +++ b/nichrome/pkg/sos/service_test.go @@ -0,0 +1,135 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sos + +import ( + "fmt" + "reflect" + "sync" + "testing" +) + +type RegistryEntryStub struct { + service string + port uint +} + +var ( + knownServ1 = RegistryEntryStub{"stub1", 1} + knownServ2 = RegistryEntryStub{"stub2", 2} + knownServ3 = RegistryEntryStub{"stub3", 3} + newServ1 = RegistryEntryStub{"stub4", 4} + newServ2 = RegistryEntryStub{"stub5", 5} + newServ3 = RegistryEntryStub{"stub6", 6} +) + +func setUpKnownServices() *SosService { + service := NewSosService() + service.registry[knownServ1.service] = knownServ1.port + service.registry[knownServ2.service] = knownServ2.port + service.registry[knownServ3.service] = knownServ3.port + return service +} + +func TestReadNonExist(t *testing.T) { + s := NewSosService() + if _, err := s.Read(knownServ1.service); !reflect.DeepEqual(err, fmt.Errorf("%v is not in the registry", knownServ1.service)) { + t.Errorf("read(%v)\ngot:(%v)\nwant:(%v)", knownServ1.service, err, fmt.Errorf("%v is not in the registry", knownServ1.service)) + } +} + +func TestRead(t *testing.T) { + s := setUpKnownServices() + if port, err := s.Read(knownServ1.service); err != nil || port != knownServ1.port { + t.Errorf("read(%v)\ngot:(%v, %v)\nwant:(%v, %v)", knownServ1.service, port, err, knownServ1.port, nil) + } +} + +func TestRegisterAlreadyExists(t *testing.T) { + s := setUpKnownServices() + err := s.Register(knownServ1.service, knownServ1.port) + if !reflect.DeepEqual(err, fmt.Errorf("%v already exists", knownServ1.service)) { + t.Errorf("Already Exists Register\ngot:(%v)\nwant:(%v)", err, fmt.Errorf("%v already exists", knownServ1.service)) + } +} + +func TestRegisterSuccess(t *testing.T) { + s := NewSosService() + s.Register(knownServ1.service, knownServ1.port) + if port, err := s.Read(knownServ1.service); err != nil || port != knownServ1.port { + t.Errorf("register(%v)\ngot:(%v, %v)\nwant:(%v, %v)", knownServ1, port, err, knownServ1.port, nil) + } +} + +func TestUnregisterNonExist(t *testing.T) { + s := NewSosService() + s.Unregister(knownServ1.service) + // should not panic +} + +func TestUnregister(t *testing.T) { + s := setUpKnownServices() + s.Unregister(knownServ1.service) + if _, err := s.Read(knownServ1.service); !reflect.DeepEqual(err, fmt.Errorf("%v is not in the registry", knownServ1.service)) { + t.Errorf("unregister(%v)\ngot:(%v)\nwant:(%v)", knownServ1.service, err, fmt.Errorf("%v is not in the registry", knownServ1.service)) + } +} + +func TestSnapshot(t *testing.T) { + s := setUpKnownServices().SnapshotRegistry() + if port, exists := s[knownServ1.service]; !exists || port != knownServ1.port { + t.Errorf("%v\ngot:(%v, %v)\nwant:(%v, %v)", knownServ1, port, exists, knownServ1.port, true) + } + if port, exists := s[knownServ2.service]; !exists || port != knownServ2.port { + t.Errorf("%v\ngot:(%v, %v)\nwant:(%v, %v)", knownServ2, port, exists, knownServ2.port, true) + } + if port, exists := s[knownServ3.service]; !exists || port != knownServ3.port { + t.Errorf("%v\ngot:(%v, %v)\nwant:(%v, %v)", knownServ3, port, exists, knownServ1.port, true) + } +} + +func TestRaceCondtion(t *testing.T) { + //Set Up + s := NewSosService() + numReadGoRoutines := 10 + numRegisterGoRoutines := 20 + numUnregisterGoRoutines := 20 + numSnapshotGoRoutines := 10 + + var wg sync.WaitGroup + for i := 0; i < numRegisterGoRoutines; i++ { + wg.Add(1) + go func(idx uint) { + defer wg.Done() + s.Register(fmt.Sprintf("stub%v", idx), idx) + }(uint(i)) + } + + for i := 0; i < numReadGoRoutines; i++ { + wg.Add(1) + go func(idx uint) { + defer wg.Done() + s.Read(fmt.Sprintf("stub%v", idx)) + }(uint(i)) + } + + for i := 0; i < numUnregisterGoRoutines; i++ { + wg.Add(1) + go func(idx uint) { + defer wg.Done() + s.Unregister(fmt.Sprintf("stub%v", idx)) + }(uint(i)) + } + + for i := 0; i < numSnapshotGoRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + s.SnapshotRegistry() + }() + } + + wg.Wait() +} diff --git a/nichrome/pkg/wifi/iwl.go b/nichrome/pkg/wifi/iwl.go new file mode 100644 index 000000000..54684965c --- /dev/null +++ b/nichrome/pkg/wifi/iwl.go @@ -0,0 +1,197 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "os/exec" + "regexp" + "strings" + "time" + + "github.com/u-root/NiChrome/pkg/wpa/passphrase" +) + +const ( + nopassphrase = `network={ + ssid="%s" + proto=RSN + key_mgmt=NONE + }` + eap = `network={ + ssid="%s" + key_mgmt=WPA-EAP + identity="%s" + password="%s" + }` +) + +var ( + // RegEx for parsing iwlist output + cellRE = regexp.MustCompile("(?m)^\\s*Cell") + essidRE = regexp.MustCompile("(?m)^\\s*ESSID.*") + encKeyOptRE = regexp.MustCompile("(?m)^\\s*Encryption key:(on|off)$") + wpa2RE = regexp.MustCompile("(?m)^\\s*IE: IEEE 802.11i/WPA2 Version 1$") + authSuitesRE = regexp.MustCompile("(?m)^\\s*Authentication Suites .*$") +) + +type SecProto int + +const ( + NoEnc SecProto = iota + WpaPsk + WpaEap + NotSupportedProto +) + +// IWLWorker implements the WiFi interface using the Intel Wireless LAN commands +type IWLWorker struct { + Interface string +} + +func NewIWLWorker(i string) (WiFi, error) { + if o, err := exec.Command("ip", "link", "set", "dev", i, "up").CombinedOutput(); err != nil { + return &IWLWorker{""}, fmt.Errorf("ip link set dev %v up: %v (%v)", i, string(o), err) + } + return &IWLWorker{i}, nil +} + +func (w *IWLWorker) Scan() ([]Option, error) { + o, err := exec.Command("iwlist", w.Interface, "scanning").CombinedOutput() + if err != nil { + return nil, fmt.Errorf("iwlist: %v (%v)", string(o), err) + } + return parseIwlistOut(o), nil +} + +/* + * Assumptions: + * 1) Cell, essid, and encryption key option are 1:1 match + * 2) We only support IEEE 802.11i/WPA2 Version 1 + * 3) Each Wifi only support (1) authentication suites (based on observations) + */ + +func parseIwlistOut(o []byte) []Option { + cells := cellRE.FindAllIndex(o, -1) + essids := essidRE.FindAll(o, -1) + encKeyOpts := encKeyOptRE.FindAll(o, -1) + + if cells == nil { + return nil + } + + var res []Option + knownEssids := make(map[string]bool) + + // Assemble all the Wifi options + for i := 0; i < len(cells); i++ { + essid := strings.Trim(strings.Split(string(essids[i]), ":")[1], "\"\n") + if knownEssids[essid] { + continue + } + knownEssids[essid] = true + encKeyOpt := strings.Trim(strings.Split(string(encKeyOpts[i]), ":")[1], "\n") + if encKeyOpt == "off" { + res = append(res, Option{essid, NoEnc}) + continue + } + // Find the proper Authentication Suites + start, end := cells[i][0], len(o) + if i != len(cells)-1 { + end = cells[i+1][0] + } + // Narrow down the scope when looking for WPA Tag + wpa2SearchArea := o[start:end] + l := wpa2RE.FindIndex(wpa2SearchArea) + if l == nil { + res = append(res, Option{essid, NotSupportedProto}) + continue + } + // Narrow down the scope when looking for Authorization Suites + authSearchArea := wpa2SearchArea[l[0]:] + authSuites := strings.Trim(strings.Split(string(authSuitesRE.Find(authSearchArea)), ":")[1], "\n ") + switch authSuites { + case "PSK": + res = append(res, Option{essid, WpaPsk}) + case "802.1x": + res = append(res, Option{essid, WpaEap}) + default: + res = append(res, Option{essid, NotSupportedProto}) + } + } + return res +} + +func (w *IWLWorker) GetID() (string, error) { + o, err := exec.Command("iwgetid", "-r").CombinedOutput() + if err != nil { + return "", err + } + return strings.Trim(string(o), " \n"), nil +} + +func (w *IWLWorker) Connect(a ...string) error { + // format of a: [essid, pass, id] + conf, err := generateConfig(a...) + if err != nil { + return err + } + + if err := ioutil.WriteFile("/tmp/wifi.conf", conf, 0444); err != nil { + return fmt.Errorf("/tmp/wifi.conf: %v", err) + } + + // Each request has a 30 second window to make a connection + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + c := make(chan error, 1) + + // There's no telling how long the supplicant will take, but on the other hand, + // it's been almost instantaneous. But, further, it needs to keep running. + go func() { + cmd := exec.CommandContext(ctx, "wpa_supplicant", "-i"+w.Interface, "-c/tmp/wifi.conf") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr //For an easier time debugging + cmd.Run() + }() + + // dhclient might never return on incorrect passwords or identity + go func() { + cmd := exec.CommandContext(ctx, "dhclient", "-ipv4=true", "-ipv6=false", "-v", w.Interface) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr //For an easier time debugging + if err := cmd.Run(); err != nil { + c <- err + } else { + c <- nil + } + }() + + select { + case err := <-c: + return err + case <-ctx.Done(): + return fmt.Errorf("Connection timeout") + } +} + +func generateConfig(a ...string) (conf []byte, err error) { + // format of a: [essid, pass, id] + switch { + case len(a) == 3: + conf = []byte(fmt.Sprintf(eap, a[0], a[2], a[1])) + case len(a) == 2: + conf, err = passphrase.Run(a[0], a[1]) + if err != nil { + return nil, fmt.Errorf("essid: %v, pass: %v : %v", a[0], a[1], err) + } + case len(a) == 1: + conf = []byte(fmt.Sprintf(nopassphrase, a[0])) + default: + return nil, fmt.Errorf("generateConfig needs 1, 2, or 3 args") + } + return +} diff --git a/nichrome/pkg/wifi/iwl_test.go b/nichrome/pkg/wifi/iwl_test.go new file mode 100644 index 000000000..83cef43dd --- /dev/null +++ b/nichrome/pkg/wifi/iwl_test.go @@ -0,0 +1,245 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +import ( + "bytes" + "fmt" + "io/ioutil" + "reflect" + "testing" + + "github.com/u-root/NiChrome/pkg/wpa/passphrase" +) + +type GenerateConfigTestCase struct { + name string + args []string + exp []byte + err error +} + +var ( + EssidStub = "stub" + IdStub = "stub" + PassStub = "123456789" + BadWpaPskPass = "123" + expWpaPsk, _ = passphrase.Run(EssidStub, PassStub) + _, expWpaPskErr = passphrase.Run(EssidStub, BadWpaPskPass) + + generateConfigTestcases = []GenerateConfigTestCase{ + { + name: "No Pass Phrase", + args: []string{EssidStub}, + exp: []byte(fmt.Sprintf(nopassphrase, EssidStub)), + err: nil, + }, + { + name: "WPA-PSK", + args: []string{EssidStub, PassStub}, + exp: expWpaPsk, + err: nil, + }, + { + name: "WPA-EAP", + args: []string{EssidStub, PassStub, IdStub}, + exp: []byte(fmt.Sprintf(eap, EssidStub, IdStub, PassStub)), + err: nil, + }, + { + name: "WPA-PSK Error", + args: []string{EssidStub, BadWpaPskPass}, + exp: nil, + err: fmt.Errorf("essid: %v, pass: %v : %v", EssidStub, BadWpaPskPass, expWpaPskErr), + }, + { + name: "Invalid Args Length Error", + args: nil, + exp: nil, + err: fmt.Errorf("generateConfig needs 1, 2, or 3 args"), + }, + } +) + +func TestGenerateConfig(t *testing.T) { + for _, test := range generateConfigTestcases { + out, err := generateConfig(test.args...) + if !reflect.DeepEqual(err, test.err) || !bytes.Equal(out, test.exp) { + t.Logf("TEST %v", test.name) + fncCall := fmt.Sprintf("genrateConfig(%v)", test.args) + t.Errorf("%s\ngot:[%v, %v]\nwant:[%v, %v]", fncCall, string(out), err, string(test.exp), test.err) + } + } +} + +func TestCellRE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\n Cell 01:", true}, + {"blahblahblah\n Cell 01: blah blah", true}, + {"\"Cell\"", false}, + {"\"blah blah Cell blah blah\"", false}, + } + for _, test := range testcases { + if out := cellRE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestEssidRE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\n ESSID:\"stub\"", true}, + {"blahblahblah\n ESSID:\"stub\"\n", true}, + {"blahblahblah\n ESSID:\"stub-stub\"", true}, + {"blahblahblah\n ESSID:\"stub-stub\"\n", true}, + {"blah blah ESSID blah", false}, + } + for _, test := range testcases { + if out := essidRE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestEncKeyOptRE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\n Encryption key:on\n", true}, + {"blahblahblah\n Encryption key:on", true}, + {"blahblahblah\n Encryption key:off\n", true}, + {"blahblahblah\n Encryption key:off", true}, + {"blah blah Encryption key blah blah", false}, + {"blah blah Encryption key:on blah blah", false}, + {"blah blah Encryption key:off blah blah", false}, + } + for _, test := range testcases { + if out := encKeyOptRE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestWpa2RE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\n IE: IEEE 802.11i/WPA2 Version 1\n", true}, + {"blahblahblah\n IE: IEEE 802.11i/WPA2 Version 1", true}, + {"blah blah IE: IEEE 802.11i/WPA2 Version 1", false}, + } + for _, test := range testcases { + if out := wpa2RE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestAuthSuitesRE(t *testing.T) { + testcases := []struct { + s string + exp bool + }{ + {"blahblahblah\n Authentication Suites (1) : 802.1x\n", true}, + {"blahblahblah\n Authentication Suites (1) : 802.1x", true}, + {"blahblahblah\n Authentication Suites (1) : PSK\n", true}, + {"blahblahblah\n Authentication Suites (1) : PSK\n", true}, + {"blahblahblah\n Authentication Suites (2) : blah, blah\n", true}, + {"blahblahblah\n Authentication Suites (1) : other protocol\n", true}, + {"blahblahblah\n Authentication Suites (1) : other protocol", true}, + {"blah blah Authentication Suites : blah blah", false}, + } + for _, test := range testcases { + if out := authSuitesRE.MatchString(test.s); out != test.exp { + t.Errorf("%s\ngot:%v\nwant:%v", test.s, out, test.exp) + } + } +} + +func TestParseIwlistOutput(t *testing.T) { + var ( + o []byte + exp, out []Option + err error + ) + + // No WiFi present + o = nil + exp = nil + out = parseIwlistOut(o) + if !reflect.DeepEqual(out, exp) { + t.Errorf("\ngot:[%v]\nwant:[%v]", out, exp) + } + + // Only 1 WiFi present + o = []byte(` +wlan0 Scan completed : + Cell 01 - Address: 00:00:00:00:00:01 + Channel:001 + Frequency:5.58 GHz (Channel 001) + Quality=1/2 Signal level=-23 dBm + Encryption key:on + ESSID:"stub-wpa-eap-1" + Bit Rates:36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 1260ms ago + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : 802.1x + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 +`) + exp = []Option{ + {"stub-wpa-eap-1", WpaEap}, + } + out = parseIwlistOut(o) + if !reflect.DeepEqual(out, exp) { + t.Errorf("\ngot:[%v]\nwant:[%v]", out, exp) + } + + // Regular scenarios (many choices) + exp = []Option{ + {"stub-wpa-eap-1", WpaEap}, + {"stub-rsa-1", NoEnc}, + {"stub-wpa-psk-1", WpaPsk}, + {"stub-rsa-2", NoEnc}, + {"stub-wpa-psk-2", WpaPsk}, + } + o, err = ioutil.ReadFile("iwlistStubOutput.txt") + if err != nil { + t.Errorf("error reading iwlistStubOutput.txt: %v", err) + } + out = parseIwlistOut(o) + if !reflect.DeepEqual(out, exp) { + t.Errorf("\ngot:[%v]\nwant:[%v]", out, exp) + } +} + +func BenchmarkParseIwlistOutput(b *testing.B) { + // Set Up + o, err := ioutil.ReadFile("iwlistStubOutput.txt") + if err != nil { + b.Errorf("error reading iwlistStubOutput.txt: %v", err) + } + for i := 0; i < b.N; i++ { + parseIwlistOut(o) + } +} diff --git a/nichrome/pkg/wifi/iwlistStubOutput.txt b/nichrome/pkg/wifi/iwlistStubOutput.txt new file mode 100644 index 000000000..8f9ee1f3c --- /dev/null +++ b/nichrome/pkg/wifi/iwlistStubOutput.txt @@ -0,0 +1,184 @@ +wlan0 Scan completed : + Cell 01 - Address: 00:00:00:00:00:01 + Channel:001 + Frequency:5.58 GHz (Channel 001) + Quality=1/2 Signal level=-23 dBm + Encryption key:on + ESSID:"stub-wpa-eap-1" + Bit Rates:36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 1260ms ago + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : 802.1x + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + Cell 02 - Address: 00:00:00:00:00:02 + Channel:002 + Frequency:5.58 GHz (Channel 001) + Quality=1/2 Signal level=-23 dBm + Encryption key:on + ESSID:"stub-wpa-eap-1" + Bit Rates:36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 1260ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : 802.1x + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + Cell 03 - Address: 00:00:00:00:00:03 + Channel:003 + Frequency:5.785 GHz + Quality=50/70 Signal level=-60 dBm + Encryption key:off + ESSID:"stub-rsa-1" + Bit Rates:36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 188ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + Cell 04 - Address: 00:00:00:00:00:04 + Channel:004 + Frequency:5.785 GHz + Quality=50/70 Signal level=-60 dBm + Encryption key:on + ESSID:"stub-wpa-psk-1" + Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 188ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : PSK + Cell 05 - Address: 00:00:00:00:00:05 + Channel:005 + Frequency:2.412 GHz (Channel 1) + Quality=48/70 Signal level=-62 dBm + Encryption key:off + ESSID:"stub-rsa-2" + Bit Rates:36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 3416ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + Cell 06 - Address: 00:00:00:00:00:06 + Channel:006 + Frequency:5.785 GHz + Quality=50/70 Signal level=-60 dBm + Encryption key:on + ESSID:"stub-wpa-psk-2" + Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 188ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : PSK + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + Cell 07 - Address: 00:00:00:00:00:07 + Channel:007 + Frequency:5.785 GHz + Quality=50/70 Signal level=-60 dBm + Encryption key:on + ESSID:"stub-wpa-psk-2" + Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s + Mode:Master + Extra:tsf=000000000000000000 + Extra: Last beacon: 188ms ago + IE: Unknown: 0000000000000000000000000 + IE: Unknown: 0000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 00000000000000000000000 + IE: Unknown: 000000000000000000 + IE: IEEE 802.11i/WPA2 Version 1 + Group Cipher : CCMP + Pairwise Ciphers (1) : CCMP + Authentication Suites (1) : PSK + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 0000000000000000000 + IE: Unknown: 0000000000000000000000 + IE: Unknown: 00000000000000000000 + IE: Unknown: 000000000000000 + IE: Unknown: 000000000000000000 + IE: Unknown: 000000000000000000 diff --git a/nichrome/pkg/wifi/native.go b/nichrome/pkg/wifi/native.go new file mode 100644 index 000000000..d0590ccf2 --- /dev/null +++ b/nichrome/pkg/wifi/native.go @@ -0,0 +1,38 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +import ( + "fmt" + "syscall" + "unsafe" +) + +type NativeWorker struct { + Interface string + FD int + Range IWRange +} + +func NewNativeWorker(i string) (WiFi, error) { + s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_IP) + if err != nil { + return nil, err + } + return &NativeWorker{FD: s, Interface: i}, nil +} + +func (w *NativeWorker) Scan() ([]Option, error) { + return nil, fmt.Errorf("Not Yet") +} + +func (w *NativeWorker) GetID() (string, error) { + return "", fmt.Errorf("Not Yet") +} + +func (w *NativeWorker) Connect(a ...string) error { + _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(w.FD), SIOCGIWRANGE, uintptr(unsafe.Pointer(&w.Range))) + return err +} diff --git a/nichrome/pkg/wifi/native_test.go b/nichrome/pkg/wifi/native_test.go new file mode 100644 index 000000000..e6d69153c --- /dev/null +++ b/nichrome/pkg/wifi/native_test.go @@ -0,0 +1,26 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +import ( + "testing" +) + +func TestNative(t *testing.T) { + // Some things may fail as there may be no wlan or we might not + // have the right privs. So just bail out of the test if some early + // ops fail. + w, err := NewNativeWorker("wlan0") + if err != nil { + t.Log(err) + return + } + t.Logf("Native is %v", w) + err = w.Connect() + if err != nil { + t.Log(err) + return + } +} diff --git a/nichrome/pkg/wifi/stub.go b/nichrome/pkg/wifi/stub.go new file mode 100644 index 000000000..c7c31b5e6 --- /dev/null +++ b/nichrome/pkg/wifi/stub.go @@ -0,0 +1,28 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +var _ = WiFi(&StubWorker{}) + +type StubWorker struct { + Options []Option + ID string +} + +func (w *StubWorker) Scan() ([]Option, error) { + return w.Options, nil +} + +func (w *StubWorker) GetID() (string, error) { + return w.ID, nil +} + +func (*StubWorker) Connect(a ...string) error { + return nil +} + +func NewStubWorker(id string, options ...Option) (WiFi, error) { + return &StubWorker{ID: id, Options: options}, nil +} diff --git a/nichrome/pkg/wifi/types.go b/nichrome/pkg/wifi/types.go new file mode 100644 index 000000000..7d00ba875 --- /dev/null +++ b/nichrome/pkg/wifi/types.go @@ -0,0 +1,16 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +type Option struct { + Essid string + AuthSuite SecProto +} + +type WiFi interface { + Scan() ([]Option, error) + GetID() (string, error) + Connect(a ...string) error +} diff --git a/nichrome/pkg/wifi/wireless.go b/nichrome/pkg/wifi/wireless.go new file mode 100644 index 000000000..5bfd4c4d8 --- /dev/null +++ b/nichrome/pkg/wifi/wireless.go @@ -0,0 +1,2252 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package wifi + +import "unsafe" // yuck +// This file is from the linux wifi definitions. We leave the +// original in here for reference. We'll probably remove it later. +var _ = ` +/* + * This file define a set of standard wireless extensions + * + * Version : 22 16.3.07 + * + * Authors : Jean Tourrilhes - HPL - + * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved. + */ + +#ifndef _LINUX_WIRELESS_H +#define _LINUX_WIRELESS_H + +/************************** DOCUMENTATION **************************/ +/* + * Initial APIs (1996 -> onward) : + * ----------------------------- + * Basically, the wireless extensions are for now a set of standard ioctl + * call + /proc/net/wireless + * + * The entry /proc/net/wireless give statistics and information on the + * driver. + * This is better than having each driver having its entry because + * its centralised and we may remove the driver module safely. + * + * Ioctl are used to configure the driver and issue commands. This is + * better than command line options of insmod because we may want to + * change dynamically (while the driver is running) some parameters. + * + * The ioctl mechanimsm are copied from standard devices ioctl. + * We have the list of command plus a structure descibing the + * data exchanged... + * Note that to add these ioctl, I was obliged to modify : + * # net/core/dev.c (two place + add include) + * # net/ipv4/af_inet.c (one place + add include) + * + * /proc/net/wireless is a copy of /proc/net/dev. + * We have a structure for data passed from the driver to /proc/net/wireless + * Too add this, I've modified : + * # net/core/dev.c (two other places) + * # include/linux/netdevice.h (one place) + * # include/linux/proc_fs.h (one place) + * + * New driver API (2002 -> onward) : + * ------------------------------- + * This file is only concerned with the user space API and common definitions. + * The new driver API is defined and documented in : + * # include/net/iw_handler.h + * + * Note as well that /proc/net/wireless implementation has now moved in : + * # net/core/wireless.c + * + * Wireless Events (2002 -> onward) : + * -------------------------------- + * Events are defined at the end of this file, and implemented in : + * # net/core/wireless.c + * + * Other comments : + * -------------- + * Do not add here things that are redundant with other mechanisms + * (drivers init, ifconfig, /proc/net/dev, ...) and with are not + * wireless specific. + * + * These wireless extensions are not magic : each driver has to provide + * support for them... + * + * IMPORTANT NOTE : As everything in the kernel, this is very much a + * work in progress. Contact me if you have ideas of improvements... + */ + +/***************************** INCLUDES *****************************/ + +#include /* for __u* and __s* typedefs */ +#include /* for "struct sockaddr" et al */ +#include /* for IFNAMSIZ and co... */ + +/***************************** VERSION *****************************/ +/* + * This constant is used to know the availability of the wireless + * extensions and to know which version of wireless extensions it is + * (there is some stuff that will be added in the future...) + * I just plan to increment with each new version. + */ +#define WIRELESS_EXT 22 + +/* + * Changes : + * + * V2 to V3 + * -------- + * Alan Cox start some incompatibles changes. I've integrated a bit more. + * - Encryption renamed to Encode to avoid US regulation problems + * - Frequency changed from float to struct to avoid problems on old 386 + * + * V3 to V4 + * -------- + * - Add sensitivity + * + * V4 to V5 + * -------- + * - Missing encoding definitions in range + * - Access points stuff + * + * V5 to V6 + * -------- + * - 802.11 support (ESSID ioctls) + * + * V6 to V7 + * -------- + * - define IW_ESSID_MAX_SIZE and IW_MAX_AP + * + * V7 to V8 + * -------- + * - Changed my e-mail address + * - More 802.11 support (nickname, rate, rts, frag) + * - List index in frequencies + * + * V8 to V9 + * -------- + * - Support for 'mode of operation' (ad-hoc, managed...) + * - Support for unicast and multicast power saving + * - Change encoding to support larger tokens (>64 bits) + * - Updated iw_params (disable, flags) and use it for NWID + * - Extracted iw_point from iwreq for clarity + * + * V9 to V10 + * --------- + * - Add PM capability to range structure + * - Add PM modifier : MAX/MIN/RELATIVE + * - Add encoding option : IW_ENCODE_NOKEY + * - Add TxPower ioctls (work like TxRate) + * + * V10 to V11 + * ---------- + * - Add WE version in range (help backward/forward compatibility) + * - Add retry ioctls (work like PM) + * + * V11 to V12 + * ---------- + * - Add SIOCSIWSTATS to get /proc/net/wireless programatically + * - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space + * - Add new statistics (frag, retry, beacon) + * - Add average quality (for user space calibration) + * + * V12 to V13 + * ---------- + * - Document creation of new driver API. + * - Extract union iwreq_data from struct iwreq (for new driver API). + * - Rename SIOCSIWNAME as SIOCSIWCOMMIT + * + * V13 to V14 + * ---------- + * - Wireless Events support : define struct iw_event + * - Define additional specific event numbers + * - Add "addr" and "param" fields in union iwreq_data + * - AP scanning stuff (SIOCSIWSCAN and friends) + * + * V14 to V15 + * ---------- + * - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg + * - Make struct iw_freq signed (both m & e), add explicit padding + * - Add IWEVCUSTOM for driver specific event/scanning token + * - Add IW_MAX_GET_SPY for driver returning a lot of addresses + * - Add IW_TXPOW_RANGE for range of Tx Powers + * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points + * - Add IW_MODE_MONITOR for passive monitor + * + * V15 to V16 + * ---------- + * - Increase the number of bitrates in iw_range to 32 (for 802.11g) + * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a) + * - Reshuffle struct iw_range for increases, add filler + * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses + * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support + * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy" + * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index + * + * V16 to V17 + * ---------- + * - Add flags to frequency -> auto/fixed + * - Document (struct iw_quality *)->updated, add new flags (INVALID) + * - Wireless Event capability in struct iw_range + * - Add support for relative TxPower (yick !) + * + * V17 to V18 (From Jouni Malinen ) + * ---------- + * - Add support for WPA/WPA2 + * - Add extended encoding configuration (SIOCSIWENCODEEXT and + * SIOCGIWENCODEEXT) + * - Add SIOCSIWGENIE/SIOCGIWGENIE + * - Add SIOCSIWMLME + * - Add SIOCSIWPMKSA + * - Add struct iw_range bit field for supported encoding capabilities + * - Add optional scan request parameters for SIOCSIWSCAN + * - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA + * related parameters (extensible up to 4096 parameter values) + * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE, + * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND + * + * V18 to V19 + * ---------- + * - Remove (struct iw_point *)->pointer from events and streams + * - Remove header includes to help user space + * - Increase IW_ENCODING_TOKEN_MAX from 32 to 64 + * - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros + * - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM + * - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros + * + * V19 to V20 + * ---------- + * - RtNetlink requests support (SET/GET) + * + * V20 to V21 + * ---------- + * - Remove (struct net_device *)->get_wireless_stats() + * - Change length in ESSID and NICK to strlen() instead of strlen()+1 + * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers + * - Power/Retry relative values no longer * 100000 + * - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI + * + * V21 to V22 + * ---------- + * - Prevent leaking of kernel space in stream on 64 bits. + */ + +/**************************** CONSTANTS ****************************/ + +/* -------------------------- IOCTL LIST -------------------------- */ + +/* Wireless Identification */ +#define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */ +#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ +/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. + * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... + * Don't put the name of your driver there, it's useless. */ + +/* Basic operations */ +#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ +#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ +#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ +#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ +#define SIOCSIWMODE 0x8B06 /* set operation mode */ +#define SIOCGIWMODE 0x8B07 /* get operation mode */ +#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ +#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ + +/* Informative stuff */ +#define SIOCSIWRANGE 0x8B0A /* Unused */ +#define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ +#define SIOCSIWPRIV 0x8B0C /* Unused */ +#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ +#define SIOCSIWSTATS 0x8B0E /* Unused */ +#define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */ +/* SIOCGIWSTATS is strictly used between user space and the kernel, and + * is never passed to the driver (i.e. the driver will never see it). */ + +/* Spy support (statistics per MAC address - used for Mobile IP support) */ +#define SIOCSIWSPY 0x8B10 /* set spy addresses */ +#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ +#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */ +#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */ + +/* Access Point manipulation */ +#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ +#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ +#define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */ +#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ +#define SIOCGIWSCAN 0x8B19 /* get scanning results */ + +/* 802.11 specific support */ +#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ +#define SIOCGIWESSID 0x8B1B /* get ESSID */ +#define SIOCSIWNICKN 0x8B1C /* set node name/nickname */ +#define SIOCGIWNICKN 0x8B1D /* get node name/nickname */ +/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit + * within the 'iwreq' structure, so we need to use the 'data' member to + * point to a string in user space, like it is done for RANGE... */ + +/* Other parameters useful in 802.11 and some other devices */ +#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ +#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ +#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ +#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ +#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ +#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ +#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ +#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ +#define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */ +#define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */ + +/* Encoding stuff (scrambling, hardware security, WEP...) */ +#define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */ +#define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */ +/* Power saving stuff (power management, unicast and multicast) */ +#define SIOCSIWPOWER 0x8B2C /* set Power Management settings */ +#define SIOCGIWPOWER 0x8B2D /* get Power Management settings */ + +/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM). + * This ioctl uses struct iw_point and data buffer that includes IE id and len + * fields. More than one IE may be included in the request. Setting the generic + * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers + * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers + * are required to report the used IE as a wireless event, e.g., when + * associating with an AP. */ +#define SIOCSIWGENIE 0x8B30 /* set generic IE */ +#define SIOCGIWGENIE 0x8B31 /* get generic IE */ + +/* WPA : IEEE 802.11 MLME requests */ +#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses + * struct iw_mlme */ +/* WPA : Authentication mode parameters */ +#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */ +#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */ + +/* WPA : Extended version of encoding configuration */ +#define SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */ +#define SIOCGIWENCODEEXT 0x8B35 /* get encoding token & mode */ + +/* WPA2 : PMKSA cache management */ +#define SIOCSIWPMKSA 0x8B36 /* PMKSA cache operation */ + +/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */ + +/* These 32 ioctl are wireless device private, for 16 commands. + * Each driver is free to use them for whatever purpose it chooses, + * however the driver *must* export the description of those ioctls + * with SIOCGIWPRIV and *must* use arguments as defined below. + * If you don't follow those rules, DaveM is going to hate you (reason : + * it make mixed 32/64bit operation impossible). + */ +#define SIOCIWFIRSTPRIV 0x8BE0 +#define SIOCIWLASTPRIV 0x8BFF +/* Previously, we were using SIOCDEVPRIVATE, but we now have our + * separate range because of collisions with other tools such as + * 'mii-tool'. + * We now have 32 commands, so a bit more space ;-). + * Also, all 'even' commands are only usable by root and don't return the + * content of ifr/iwr to user (but you are not obliged to use the set/get + * convention, just use every other two command). More details in iwpriv.c. + * And I repeat : you are not forced to use them with iwpriv, but you + * must be compliant with it. + */ + +/* ------------------------- IOCTL STUFF ------------------------- */ + +/* The first and the last (range) */ +#define SIOCIWFIRST 0x8B00 +#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ +#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) +#define IW_HANDLER(id, func) \ + [IW_IOCTL_IDX(id)] = func + +/* Odd : get (world access), even : set (root access) */ +#define IW_IS_SET(cmd) (!((cmd) & 0x1)) +#define IW_IS_GET(cmd) ((cmd) & 0x1) + +/* ----------------------- WIRELESS EVENTS ----------------------- */ +/* Those are *NOT* ioctls, do not issue request on them !!! */ +/* Most events use the same identifier as ioctl requests */ + +#define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */ +#define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */ +#define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */ +#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ +#define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */ +#define IWEVGENIE 0x8C05 /* Generic IE (WPA, RSN, WMM, ..) + * (scan results); This includes id and + * length fields. One IWEVGENIE may + * contain more than one IE. Scan + * results may contain one or more + * IWEVGENIE events. */ +#define IWEVMICHAELMICFAILURE 0x8C06 /* Michael MIC failure + * (struct iw_michaelmicfailure) + */ +#define IWEVASSOCREQIE 0x8C07 /* IEs used in (Re)Association Request. + * The data includes id and length + * fields and may contain more than one + * IE. This event is required in + * Managed mode if the driver + * generates its own WPA/RSN IE. This + * should be sent just before + * IWEVREGISTERED event for the + * association. */ +#define IWEVASSOCRESPIE 0x8C08 /* IEs used in (Re)Association + * Response. The data includes id and + * length fields and may contain more + * than one IE. This may be sent + * between IWEVASSOCREQIE and + * IWEVREGISTERED events for the + * association. */ +#define IWEVPMKIDCAND 0x8C09 /* PMKID candidate for RSN + * pre-authentication + * (struct iw_pmkid_cand) */ + +#define IWEVFIRST 0x8C00 +#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) + +/* ------------------------- PRIVATE INFO ------------------------- */ +/* + * The following is used with SIOCGIWPRIV. It allow a driver to define + * the interface (name, type of data) for its private ioctl. + * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV + */ + +#define IW_PRIV_TYPE_MASK 0x7000 /* Type of arguments */ +#define IW_PRIV_TYPE_NONE 0x0000 +#define IW_PRIV_TYPE_BYTE 0x1000 /* Char as number */ +#define IW_PRIV_TYPE_CHAR 0x2000 /* Char as character */ +#define IW_PRIV_TYPE_INT 0x4000 /* 32 bits int */ +#define IW_PRIV_TYPE_FLOAT 0x5000 /* struct iw_freq */ +#define IW_PRIV_TYPE_ADDR 0x6000 /* struct sockaddr */ + +#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed number of args */ + +#define IW_PRIV_SIZE_MASK 0x07FF /* Max number of those args */ + +/* + * Note : if the number of args is fixed and the size < 16 octets, + * instead of passing a pointer we will put args in the iwreq struct... + */ + +/* ----------------------- OTHER CONSTANTS ----------------------- */ + +/* Maximum frequencies in the range struct */ +#define IW_MAX_FREQUENCIES 32 +/* Note : if you have something like 80 frequencies, + * don't increase this constant and don't fill the frequency list. + * The user will be able to set by channel anyway... */ + +/* Maximum bit rates in the range struct */ +#define IW_MAX_BITRATES 32 + +/* Maximum tx powers in the range struct */ +#define IW_MAX_TXPOWER 8 +/* Note : if you more than 8 TXPowers, just set the max and min or + * a few of them in the struct iw_range. */ + +/* Maximum of address that you may set with SPY */ +#define IW_MAX_SPY 8 + +/* Maximum of address that you may get in the + list of access points in range */ +#define IW_MAX_AP 64 + +/* Maximum size of the ESSID and NICKN strings */ +#define IW_ESSID_MAX_SIZE 32 + +/* Modes of operation */ +#define IW_MODE_AUTO 0 /* Let the driver decides */ +#define IW_MODE_ADHOC 1 /* Single cell network */ +#define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */ +#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */ +#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ +#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ +#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ +#define IW_MODE_MESH 7 /* Mesh (IEEE 802.11s) network */ + +/* Statistics flags (bitmask in updated) */ +#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */ +#define IW_QUAL_LEVEL_UPDATED 0x02 +#define IW_QUAL_NOISE_UPDATED 0x04 +#define IW_QUAL_ALL_UPDATED 0x07 +#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */ +#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */ +#define IW_QUAL_LEVEL_INVALID 0x20 +#define IW_QUAL_NOISE_INVALID 0x40 +#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */ +#define IW_QUAL_ALL_INVALID 0x70 + +/* Frequency flags */ +#define IW_FREQ_AUTO 0x00 /* Let the driver decides */ +#define IW_FREQ_FIXED 0x01 /* Force a specific value */ + +/* Maximum number of size of encoding token available + * they are listed in the range structure */ +#define IW_MAX_ENCODING_SIZES 8 + +/* Maximum size of the encoding token in bytes */ +#define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */ + +/* Flags for encoding (along with the token) */ +#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ +#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ +#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ +#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ +#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ +#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ +#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ +#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ +#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ + +/* Power management flags available (along with the value, if any) */ +#define IW_POWER_ON 0x0000 /* No details... */ +#define IW_POWER_TYPE 0xF000 /* Type of parameter */ +#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ +#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ +#define IW_POWER_MODE 0x0F00 /* Power Management mode */ +#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ +#define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */ +#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ +#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ +#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ +#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */ +#define IW_POWER_MIN 0x0001 /* Value is a minimum */ +#define IW_POWER_MAX 0x0002 /* Value is a maximum */ +#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ + +/* Transmit Power flags available */ +#define IW_TXPOW_TYPE 0x00FF /* Type of value */ +#define IW_TXPOW_DBM 0x0000 /* Value is in dBm */ +#define IW_TXPOW_MWATT 0x0001 /* Value is in mW */ +#define IW_TXPOW_RELATIVE 0x0002 /* Value is in arbitrary units */ +#define IW_TXPOW_RANGE 0x1000 /* Range of value between min/max */ + +/* Retry limits and lifetime flags available */ +#define IW_RETRY_ON 0x0000 /* No details... */ +#define IW_RETRY_TYPE 0xF000 /* Type of parameter */ +#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/ +#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */ +#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */ +#define IW_RETRY_MIN 0x0001 /* Value is a minimum */ +#define IW_RETRY_MAX 0x0002 /* Value is a maximum */ +#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ +#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */ +#define IW_RETRY_LONG 0x0020 /* Value is for long packets */ + +/* Scanning request flags */ +#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */ +#define IW_SCAN_ALL_ESSID 0x0001 /* Scan all ESSIDs */ +#define IW_SCAN_THIS_ESSID 0x0002 /* Scan only this ESSID */ +#define IW_SCAN_ALL_FREQ 0x0004 /* Scan all Frequencies */ +#define IW_SCAN_THIS_FREQ 0x0008 /* Scan only this Frequency */ +#define IW_SCAN_ALL_MODE 0x0010 /* Scan all Modes */ +#define IW_SCAN_THIS_MODE 0x0020 /* Scan only this Mode */ +#define IW_SCAN_ALL_RATE 0x0040 /* Scan all Bit-Rates */ +#define IW_SCAN_THIS_RATE 0x0080 /* Scan only this Bit-Rate */ +/* struct iw_scan_req scan_type */ +#define IW_SCAN_TYPE_ACTIVE 0 +#define IW_SCAN_TYPE_PASSIVE 1 +/* Maximum size of returned data */ +#define IW_SCAN_MAX_DATA 4096 /* In bytes */ + +/* Scan capability flags - in (struct iw_range *)->scan_capa */ +#define IW_SCAN_CAPA_NONE 0x00 +#define IW_SCAN_CAPA_ESSID 0x01 +#define IW_SCAN_CAPA_BSSID 0x02 +#define IW_SCAN_CAPA_CHANNEL 0x04 +#define IW_SCAN_CAPA_MODE 0x08 +#define IW_SCAN_CAPA_RATE 0x10 +#define IW_SCAN_CAPA_TYPE 0x20 +#define IW_SCAN_CAPA_TIME 0x40 + +/* Max number of char in custom event - use multiple of them if needed */ +#define IW_CUSTOM_MAX 256 /* In bytes */ + +/* Generic information element */ +#define IW_GENERIC_IE_MAX 1024 + +/* MLME requests (SIOCSIWMLME / struct iw_mlme) */ +#define IW_MLME_DEAUTH 0 +#define IW_MLME_DISASSOC 1 +#define IW_MLME_AUTH 2 +#define IW_MLME_ASSOC 3 + +/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */ +#define IW_AUTH_INDEX 0x0FFF +#define IW_AUTH_FLAGS 0xF000 +/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095) + * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the + * parameter that is being set/get to; value will be read/written to + * struct iw_param value field) */ +#define IW_AUTH_WPA_VERSION 0 +#define IW_AUTH_CIPHER_PAIRWISE 1 +#define IW_AUTH_CIPHER_GROUP 2 +#define IW_AUTH_KEY_MGMT 3 +#define IW_AUTH_TKIP_COUNTERMEASURES 4 +#define IW_AUTH_DROP_UNENCRYPTED 5 +#define IW_AUTH_80211_AUTH_ALG 6 +#define IW_AUTH_WPA_ENABLED 7 +#define IW_AUTH_RX_UNENCRYPTED_EAPOL 8 +#define IW_AUTH_ROAMING_CONTROL 9 +#define IW_AUTH_PRIVACY_INVOKED 10 +#define IW_AUTH_CIPHER_GROUP_MGMT 11 +#define IW_AUTH_MFP 12 + +/* IW_AUTH_WPA_VERSION values (bit field) */ +#define IW_AUTH_WPA_VERSION_DISABLED 0x00000001 +#define IW_AUTH_WPA_VERSION_WPA 0x00000002 +#define IW_AUTH_WPA_VERSION_WPA2 0x00000004 + +/* IW_AUTH_PAIRWISE_CIPHER, IW_AUTH_GROUP_CIPHER, and IW_AUTH_CIPHER_GROUP_MGMT + * values (bit field) */ +#define IW_AUTH_CIPHER_NONE 0x00000001 +#define IW_AUTH_CIPHER_WEP40 0x00000002 +#define IW_AUTH_CIPHER_TKIP 0x00000004 +#define IW_AUTH_CIPHER_CCMP 0x00000008 +#define IW_AUTH_CIPHER_WEP104 0x00000010 +#define IW_AUTH_CIPHER_AES_CMAC 0x00000020 + +/* IW_AUTH_KEY_MGMT values (bit field) */ +#define IW_AUTH_KEY_MGMT_802_1X 1 +#define IW_AUTH_KEY_MGMT_PSK 2 + +/* IW_AUTH_80211_AUTH_ALG values (bit field) */ +#define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001 +#define IW_AUTH_ALG_SHARED_KEY 0x00000002 +#define IW_AUTH_ALG_LEAP 0x00000004 + +/* IW_AUTH_ROAMING_CONTROL values */ +#define IW_AUTH_ROAMING_ENABLE 0 /* driver/firmware based roaming */ +#define IW_AUTH_ROAMING_DISABLE 1 /* user space program used for roaming + * control */ + +/* IW_AUTH_MFP (management frame protection) values */ +#define IW_AUTH_MFP_DISABLED 0 /* MFP disabled */ +#define IW_AUTH_MFP_OPTIONAL 1 /* MFP optional */ +#define IW_AUTH_MFP_REQUIRED 2 /* MFP required */ + +/* SIOCSIWENCODEEXT definitions */ +#define IW_ENCODE_SEQ_MAX_SIZE 8 +/* struct iw_encode_ext ->alg */ +#define IW_ENCODE_ALG_NONE 0 +#define IW_ENCODE_ALG_WEP 1 +#define IW_ENCODE_ALG_TKIP 2 +#define IW_ENCODE_ALG_CCMP 3 +#define IW_ENCODE_ALG_PMK 4 +#define IW_ENCODE_ALG_AES_CMAC 5 +/* struct iw_encode_ext ->ext_flags */ +#define IW_ENCODE_EXT_TX_SEQ_VALID 0x00000001 +#define IW_ENCODE_EXT_RX_SEQ_VALID 0x00000002 +#define IW_ENCODE_EXT_GROUP_KEY 0x00000004 +#define IW_ENCODE_EXT_SET_TX_KEY 0x00000008 + +/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */ +#define IW_MICFAILURE_KEY_ID 0x00000003 /* Key ID 0..3 */ +#define IW_MICFAILURE_GROUP 0x00000004 +#define IW_MICFAILURE_PAIRWISE 0x00000008 +#define IW_MICFAILURE_STAKEY 0x00000010 +#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported) + */ + +/* Bit field values for enc_capa in struct iw_range */ +#define IW_ENC_CAPA_WPA 0x00000001 +#define IW_ENC_CAPA_WPA2 0x00000002 +#define IW_ENC_CAPA_CIPHER_TKIP 0x00000004 +#define IW_ENC_CAPA_CIPHER_CCMP 0x00000008 +#define IW_ENC_CAPA_4WAY_HANDSHAKE 0x00000010 + +/* Event capability macros - in (struct iw_range *)->event_capa + * Because we have more than 32 possible events, we use an array of + * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ +#define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \ + (cmd - SIOCIWFIRSTPRIV + 0x60) : \ + (cmd - SIOCIWFIRST)) +#define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5) +#define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) +/* Event capability constants - event autogenerated by the kernel + * This list is valid for most 802.11 devices, customise as needed... */ +#define IW_EVENT_CAPA_K_0 (IW_EVENT_CAPA_MASK(0x8B04) | \ + IW_EVENT_CAPA_MASK(0x8B06) | \ + IW_EVENT_CAPA_MASK(0x8B1A)) +#define IW_EVENT_CAPA_K_1 (IW_EVENT_CAPA_MASK(0x8B2A)) +/* "Easy" macro to set events in iw_range (less efficient) */ +#define IW_EVENT_CAPA_SET(event_capa, cmd) (event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd)) +#define IW_EVENT_CAPA_SET_KERNEL(event_capa) {event_capa[0] |= IW_EVENT_CAPA_K_0; event_capa[1] |= IW_EVENT_CAPA_K_1; } + + +/****************************** TYPES ******************************/ + +/* --------------------------- SUBTYPES --------------------------- */ +/* + * Generic format for most parameters that fit in an int + */ +struct iw_param { + __s32 value; /* The value of the parameter itself */ + __u8 fixed; /* Hardware should not use auto select */ + __u8 disabled; /* Disable the feature */ + __u16 flags; /* Various specifc flags (if any) */ +}; + +/* + * For all data larger than 16 octets, we need to use a + * pointer to memory allocated in user space. + */ +struct iw_point { + void *pointer; /* Pointer to the data (in user space) */ + __u16 length; /* number of fields or size in bytes */ + __u16 flags; /* Optional params */ +}; + + +/* + * A frequency + * For numbers lower than 10^9, we encode the number in 'm' and + * set 'e' to 0 + * For number greater than 10^9, we divide it by the lowest power + * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... + * The power of 10 is in 'e', the result of the division is in 'm'. + */ +struct iw_freq { + __s32 m; /* Mantissa */ + __s16 e; /* Exponent */ + __u8 i; /* List index (when in range struct) */ + __u8 flags; /* Flags (fixed/auto) */ +}; + +/* + * Quality of the link + */ +struct iw_quality { + __u8 qual; /* link quality (%retries, SNR, + %missed beacons or better...) */ + __u8 level; /* signal level (dBm) */ + __u8 noise; /* noise level (dBm) */ + __u8 updated; /* Flags to know if updated */ +}; + +/* + * Packet discarded in the wireless adapter due to + * "wireless" specific problems... + * Note : the list of counter and statistics in net_device_stats + * is already pretty exhaustive, and you should use that first. + * This is only additional stats... + */ +struct iw_discarded { + __u32 nwid; /* Rx : Wrong nwid/essid */ + __u32 code; /* Rx : Unable to code/decode (WEP) */ + __u32 fragment; /* Rx : Can't perform MAC reassembly */ + __u32 retries; /* Tx : Max MAC retries num reached */ + __u32 misc; /* Others cases */ +}; + +/* + * Packet/Time period missed in the wireless adapter due to + * "wireless" specific problems... + */ +struct iw_missed { + __u32 beacon; /* Missed beacons/superframe */ +}; + +/* + * Quality range (for spy threshold) + */ +struct iw_thrspy { + struct sockaddr addr; /* Source address (hw/mac) */ + struct iw_quality qual; /* Quality of the link */ + struct iw_quality low; /* Low threshold */ + struct iw_quality high; /* High threshold */ +}; + +/* + * Optional data for scan request + * + * Note: these optional parameters are controlling parameters for the + * scanning behavior, these do not apply to getting scan results + * (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and + * provide a merged results with all BSSes even if the previous scan + * request limited scanning to a subset, e.g., by specifying an SSID. + * Especially, scan results are required to include an entry for the + * current BSS if the driver is in Managed mode and associated with an AP. + */ +struct iw_scan_req { + __u8 scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */ + __u8 essid_len; + __u8 num_channels; /* num entries in channel_list; + * 0 = scan all allowed channels */ + __u8 flags; /* reserved as padding; use zero, this may + * be used in the future for adding flags + * to request different scan behavior */ + struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or + * individual address of a specific BSS */ + + /* + * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using + * the current ESSID. This allows scan requests for specific ESSID + * without having to change the current ESSID and potentially breaking + * the current association. + */ + __u8 essid[IW_ESSID_MAX_SIZE]; + + /* + * Optional parameters for changing the default scanning behavior. + * These are based on the MLME-SCAN.request from IEEE Std 802.11. + * TU is 1.024 ms. If these are set to 0, driver is expected to use + * reasonable default values. min_channel_time defines the time that + * will be used to wait for the first reply on each channel. If no + * replies are received, next channel will be scanned after this. If + * replies are received, total time waited on the channel is defined by + * max_channel_time. + */ + __u32 min_channel_time; /* in TU */ + __u32 max_channel_time; /* in TU */ + + struct iw_freq channel_list[IW_MAX_FREQUENCIES]; +}; + +/* ------------------------- WPA SUPPORT ------------------------- */ + +/* + * Extended data structure for get/set encoding (this is used with + * SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_* + * flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and + * only the data contents changes (key data -> this structure, including + * key data). + * + * If the new key is the first group key, it will be set as the default + * TX key. Otherwise, default TX key index is only changed if + * IW_ENCODE_EXT_SET_TX_KEY flag is set. + * + * Key will be changed with SIOCSIWENCODEEXT in all cases except for + * special "change TX key index" operation which is indicated by setting + * key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY. + * + * tx_seq/rx_seq are only used when respective + * IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal + * TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start + * TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally + * used only by an Authenticator (AP or an IBSS station) to get the + * current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and + * RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for + * debugging/testing. + */ +struct iw_encode_ext { + __u32 ext_flags; /* IW_ENCODE_EXT_* */ + __u8 tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ + __u8 rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ + struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast + * (group) keys or unicast address for + * individual keys */ + __u16 alg; /* IW_ENCODE_ALG_* */ + __u16 key_len; + __u8 key[0]; +}; + +/* SIOCSIWMLME data */ +struct iw_mlme { + __u16 cmd; /* IW_MLME_* */ + __u16 reason_code; + struct sockaddr addr; +}; + +/* SIOCSIWPMKSA data */ +#define IW_PMKSA_ADD 1 +#define IW_PMKSA_REMOVE 2 +#define IW_PMKSA_FLUSH 3 + +#define IW_PMKID_LEN 16 + +struct iw_pmksa { + __u32 cmd; /* IW_PMKSA_* */ + struct sockaddr bssid; + __u8 pmkid[IW_PMKID_LEN]; +}; + +/* IWEVMICHAELMICFAILURE data */ +struct iw_michaelmicfailure { + __u32 flags; + struct sockaddr src_addr; + __u8 tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ +}; + +/* IWEVPMKIDCAND data */ +#define IW_PMKID_CAND_PREAUTH 0x00000001 /* RNS pre-authentication enabled */ +struct iw_pmkid_cand { + __u32 flags; /* IW_PMKID_CAND_* */ + __u32 index; /* the smaller the index, the higher the + * priority */ + struct sockaddr bssid; +}; + +/* ------------------------ WIRELESS STATS ------------------------ */ +/* + * Wireless statistics (used for /proc/net/wireless) + */ +struct iw_statistics { + __u16 status; /* Status + * - device dependent for now */ + + struct iw_quality qual; /* Quality of the link + * (instant/mean/max) */ + struct iw_discarded discard; /* Packet discarded counts */ + struct iw_missed miss; /* Packet missed counts */ +}; + +/* ------------------------ IOCTL REQUEST ------------------------ */ +/* + * This structure defines the payload of an ioctl, and is used + * below. + * + * Note that this structure should fit on the memory footprint + * of iwreq (which is the same as ifreq), which mean a max size of + * 16 octets = 128 bits. Warning, pointers might be 64 bits wide... + * You should check this when increasing the structures defined + * above in this file... + */ +union iwreq_data { + /* Config - generic */ + char name[IFNAMSIZ]; + /* Name : used to verify the presence of wireless extensions. + * Name of the protocol/provider... */ + + struct iw_point essid; /* Extended network name */ + struct iw_param nwid; /* network id (or domain - the cell) */ + struct iw_freq freq; /* frequency or channel : + * 0-1000 = channel + * > 1000 = frequency in Hz */ + + struct iw_param sens; /* signal level threshold */ + struct iw_param bitrate; /* default bit rate */ + struct iw_param txpower; /* default transmit power */ + struct iw_param rts; /* RTS threshold threshold */ + struct iw_param frag; /* Fragmentation threshold */ + __u32 mode; /* Operation mode */ + struct iw_param retry; /* Retry limits & lifetime */ + + struct iw_point encoding; /* Encoding stuff : tokens */ + struct iw_param power; /* PM duration/timeout */ + struct iw_quality qual; /* Quality part of statistics */ + + struct sockaddr ap_addr; /* Access point address */ + struct sockaddr addr; /* Destination address (hw/mac) */ + + struct iw_param param; /* Other small parameters */ + struct iw_point data; /* Other large parameters */ +}; + +/* + * The structure to exchange data for ioctl. + * This structure is the same as 'struct ifreq', but (re)defined for + * convenience... + * Do I need to remind you about structure size (32 octets) ? + */ +struct iwreq { + union + { + char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */ + } ifr_ifrn; + + /* Data part (defined just above) */ + union iwreq_data u; +}; + +/* -------------------------- IOCTL DATA -------------------------- */ +/* + * For those ioctl which want to exchange mode data that what could + * fit in the above structure... + */ + +/* + * Range of parameters + */ + +struct iw_range { + /* Informative stuff (to choose between different interface) */ + __u32 throughput; /* To give an idea... */ + /* In theory this value should be the maximum benchmarked + * TCP/IP throughput, because with most of these devices the + * bit rate is meaningless (overhead an co) to estimate how + * fast the connection will go and pick the fastest one. + * I suggest people to play with Netperf or any benchmark... + */ + + /* NWID (or domain id) */ + __u32 min_nwid; /* Minimal NWID we are able to set */ + __u32 max_nwid; /* Maximal NWID we are able to set */ + + /* Old Frequency (backward compat - moved lower ) */ + __u16 old_num_channels; + __u8 old_num_frequency; + + /* Scan capabilities */ + __u8 scan_capa; /* IW_SCAN_CAPA_* bit field */ + + /* Wireless event capability bitmasks */ + __u32 event_capa[6]; + + /* signal level threshold range */ + __s32 sensitivity; + + /* Quality of link & SNR stuff */ + /* Quality range (link, level, noise) + * If the quality is absolute, it will be in the range [0 ; max_qual], + * if the quality is dBm, it will be in the range [max_qual ; 0]. + * Don't forget that we use 8 bit arithmetics... */ + struct iw_quality max_qual; /* Quality of the link */ + /* This should contain the average/typical values of the quality + * indicator. This should be the threshold between a "good" and + * a "bad" link (example : monitor going from green to orange). + * Currently, user space apps like quality monitors don't have any + * way to calibrate the measurement. With this, they can split + * the range between 0 and max_qual in different quality level + * (using a geometric subdivision centered on the average). + * I expect that people doing the user space apps will feedback + * us on which value we need to put in each driver... */ + struct iw_quality avg_qual; /* Quality of the link */ + + /* Rates */ + __u8 num_bitrates; /* Number of entries in the list */ + __s32 bitrate[IW_MAX_BITRATES]; /* list, in bps */ + + /* RTS threshold */ + __s32 min_rts; /* Minimal RTS threshold */ + __s32 max_rts; /* Maximal RTS threshold */ + + /* Frag threshold */ + __s32 min_frag; /* Minimal frag threshold */ + __s32 max_frag; /* Maximal frag threshold */ + + /* Power Management duration & timeout */ + __s32 min_pmp; /* Minimal PM period */ + __s32 max_pmp; /* Maximal PM period */ + __s32 min_pmt; /* Minimal PM timeout */ + __s32 max_pmt; /* Maximal PM timeout */ + __u16 pmp_flags; /* How to decode max/min PM period */ + __u16 pmt_flags; /* How to decode max/min PM timeout */ + __u16 pm_capa; /* What PM options are supported */ + + /* Encoder stuff */ + __u16 encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */ + __u8 num_encoding_sizes; /* Number of entry in the list */ + __u8 max_encoding_tokens; /* Max number of tokens */ + /* For drivers that need a "login/passwd" form */ + __u8 encoding_login_index; /* token index for login token */ + + /* Transmit power */ + __u16 txpower_capa; /* What options are supported */ + __u8 num_txpower; /* Number of entries in the list */ + __s32 txpower[IW_MAX_TXPOWER]; /* list, in bps */ + + /* Wireless Extension version info */ + __u8 we_version_compiled; /* Must be WIRELESS_EXT */ + __u8 we_version_source; /* Last update of source */ + + /* Retry limits and lifetime */ + __u16 retry_capa; /* What retry options are supported */ + __u16 retry_flags; /* How to decode max/min retry limit */ + __u16 r_time_flags; /* How to decode max/min retry life */ + __s32 min_retry; /* Minimal number of retries */ + __s32 max_retry; /* Maximal number of retries */ + __s32 min_r_time; /* Minimal retry lifetime */ + __s32 max_r_time; /* Maximal retry lifetime */ + + /* Frequency */ + __u16 num_channels; /* Number of channels [0; num - 1] */ + __u8 num_frequency; /* Number of entry in the list */ + struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */ + /* Note : this frequency list doesn't need to fit channel numbers, + * because each entry contain its channel index */ + + __u32 enc_capa; /* IW_ENC_CAPA_* bit field */ +}; + +/* + * Private ioctl interface information + */ + +struct iw_priv_args { + __u32 cmd; /* Number of the ioctl to issue */ + __u16 set_args; /* Type and number of args */ + __u16 get_args; /* Type and number of args */ + char name[IFNAMSIZ]; /* Name of the extension */ +}; + +/* ----------------------- WIRELESS EVENTS ----------------------- */ +/* + * Wireless events are carried through the rtnetlink socket to user + * space. They are encapsulated in the IFLA_WIRELESS field of + * a RTM_NEWLINK message. + */ + +/* + * A Wireless Event. Contains basically the same data as the ioctl... + */ +struct iw_event { + __u16 len; /* Real length of this stuff */ + __u16 cmd; /* Wireless IOCTL */ + union iwreq_data u; /* IOCTL fixed payload */ +}; + +/* Size of the Event prefix (including padding and alignement junk) */ +#define IW_EV_LCP_LEN (sizeof(struct iw_event) - sizeof(union iwreq_data)) +/* Size of the various events */ +#define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ) +#define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(__u32)) +#define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq)) +#define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param)) +#define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr)) +#define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality)) + +/* iw_point events are special. First, the payload (extra data) come at + * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second, + * we omit the pointer, so start at an offset. */ +#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \ + (char *) NULL) +#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \ + IW_EV_POINT_OFF) + + +/* Size of the Event prefix when packed in stream */ +#define IW_EV_LCP_PK_LEN (4) +/* Size of the various events when packed in stream */ +#define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ) +#define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(__u32)) +#define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq)) +#define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) +#define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) +#define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) +#define IW_EV_POINT_PK_LEN (IW_EV_LCP_PK_LEN + 4) + +#endif /* _LINUX_WIRELESS_H */ +` + +// This is the standard Unix style binary blob interface with all the +// conversion fun that implies. Bummer. + +/* + * This file define a set of standard wireless extensions + * + * Version : 22 16.3.07 + * + * Authors : Jean Tourrilhes - HPL - + * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved. + */ + +/************************** DOCUMENTATION **************************/ +/* + * Initial APIs (1996 -> onward) : + * ----------------------------- + * Basically, the wireless extensions are for now a set of standard ioctl + * call + /proc/net/wireless + * + * The entry /proc/net/wireless give statistics and information on the + * driver. + * This is better than having each driver having its entry because + * its centralised and we may remove the driver module safely. + * + * Ioctl are used to configure the driver and issue commands. This is + * better than command line options of insmod because we may want to + * change dynamically (while the driver is running) some parameters. + * + * The ioctl mechanimsm are copied from standard devices ioctl. + * We have the list of command plus a structure descibing the + * data exchanged... + * Note that to add these ioctl, I was obliged to modify : + * # net/core/dev.c (two place + add include) + * # net/ipv4/af_inet.c (one place + add include) + * + * /proc/net/wireless is a copy of /proc/net/dev. + * We have a structure for data passed from the driver to /proc/net/wireless + * Too add this, I've modified : + * # net/core/dev.c (two other places) + * # include/linux/netdevice.h (one place) + * # include/linux/proc_fs.h (one place) + * + * New driver API (2002 -> onward) : + * ------------------------------- + * This file is only concerned with the user space API and common definitions. + * The new driver API is defined and documented in : + * # include/net/iw_handler.h + * + * Note as well that /proc/net/wireless implementation has now moved in : + * # net/core/wireless.c + * + * Wireless Events (2002 -> onward) : + * -------------------------------- + * Events are defined at the end of this file, and implemented in : + * # net/core/wireless.c + * + * Other comments : + * -------------- + * Do not add here things that are redundant with other mechanisms + * (drivers init, ifconfig, /proc/net/dev, ...) and with are not + * wireless specific. + * + * These wireless extensions are not magic : each driver has to provide + * support for them... + * + * IMPORTANT NOTE : As everything in the kernel, this is very much a + * work in progress. Contact me if you have ideas of improvements... + */ + +/***************************** VERSION *****************************/ +/* + * This constant is used to know the availability of the wireless + * extensions and to know which version of wireless extensions it is + * (there is some stuff that will be added in the future...) + * I just plan to increment with each new version. + */ +const WIRELESS_EXT = 22 + +/* + * Changes : + * + * V2 to V3 + * -------- + * Alan Cox start some incompatibles changes. I've integrated a bit more. + * - Encryption renamed to Encode to avoid US regulation problems + * - Frequency changed from float to struct to avoid problems on old 386 + * + * V3 to V4 + * -------- + * - Add sensitivity + * + * V4 to V5 + * -------- + * - Missing encoding definitions in range + * - Access points stuff + * + * V5 to V6 + * -------- + * - 802.11 support (ESSID ioctls) + * + * V6 to V7 + * -------- + * - define IW_ESSID_MAX_SIZE and IW_MAX_AP + * + * V7 to V8 + * -------- + * - Changed my e-mail address + * - More 802.11 support (nickname, rate, rts, frag) + * - List index in frequencies + * + * V8 to V9 + * -------- + * - Support for 'mode of operation' (ad-hoc, managed...) + * - Support for unicast and multicast power saving + * - Change encoding to support larger tokens (>64 bits) + * - Updated iw_params (disable, flags) and use it for NWID + * - Extracted iw_point from iwreq for clarity + * + * V9 to V10 + * --------- + * - Add PM capability to range structure + * - Add PM modifier : MAX/MIN/RELATIVE + * - Add encoding option : IW_ENCODE_NOKEY + * - Add TxPower ioctls (work like TxRate) + * + * V10 to V11 + * ---------- + * - Add WE version in range (help backward/forward compatibility) + * - Add retry ioctls (work like PM) + * + * V11 to V12 + * ---------- + * - Add SIOCSIWSTATS to get /proc/net/wireless programatically + * - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space + * - Add new statistics (frag, retry, beacon) + * - Add average quality (for user space calibration) + * + * V12 to V13 + * ---------- + * - Document creation of new driver API. + * - Extract union iwreq_data from struct iwreq (for new driver API). + * - Rename SIOCSIWNAME as SIOCSIWCOMMIT + * + * V13 to V14 + * ---------- + * - Wireless Events support : define struct iw_event + * - Define additional specific event numbers + * - Add "addr" and "param" fields in union iwreq_data + * - AP scanning stuff (SIOCSIWSCAN and friends) + * + * V14 to V15 + * ---------- + * - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg + * - Make struct iw_freq signed (both m & e), add explicit padding + * - Add IWEVCUSTOM for driver specific event/scanning token + * - Add IW_MAX_GET_SPY for driver returning a lot of addresses + * - Add IW_TXPOW_RANGE for range of Tx Powers + * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points + * - Add IW_MODE_MONITOR for passive monitor + * + * V15 to V16 + * ---------- + * - Increase the number of bitrates in iw_range to 32 (for 802.11g) + * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a) + * - Reshuffle struct iw_range for increases, add filler + * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses + * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support + * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy" + * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index + * + * V16 to V17 + * ---------- + * - Add flags to frequency -> auto/fixed + * - Document (struct iw_quality *)->updated, add new flags (INVALID) + * - Wireless Event capability in struct iw_range + * - Add support for relative TxPower (yick !) + * + * V17 to V18 (From Jouni Malinen ) + * ---------- + * - Add support for WPA/WPA2 + * - Add extended encoding configuration (SIOCSIWENCODEEXT and + * SIOCGIWENCODEEXT) + * - Add SIOCSIWGENIE/SIOCGIWGENIE + * - Add SIOCSIWMLME + * - Add SIOCSIWPMKSA + * - Add struct iw_range bit field for supported encoding capabilities + * - Add optional scan request parameters for SIOCSIWSCAN + * - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA + * related parameters (extensible up to 4096 parameter values) + * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE, + * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND + * + * V18 to V19 + * ---------- + * - Remove (struct iw_point *)->pointer from events and streams + * - Remove header includes to help user space + * - Increase IW_ENCODING_TOKEN_MAX from 32 to 64 + * - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros + * - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM + * - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros + * + * V19 to V20 + * ---------- + * - RtNetlink requests support (SET/GET) + * + * V20 to V21 + * ---------- + * - Remove (struct net_device *)->get_wireless_stats() + * - Change length in ESSID and NICK to strlen() instead of strlen()+1 + * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers + * - Power/Retry relative values no longer * 100000 + * - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI + * + * V21 to V22 + * ---------- + * - Prevent leaking of kernel space in stream on 64 bits. + */ + +/**************************** CONSTANTS ****************************/ + +/* -------------------------- IOCTL LIST -------------------------- */ + +/* Wireless Identification */ +const SIOCSIWCOMMIT = 0x8B00 /* Commit pending changes to driver */ +const SIOCGIWNAME = 0x8B01 /* get name == wireless protocol */ +/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. + * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... + * Don't put the name of your driver there, it's useless. */ + +/* Basic operations */ +const SIOCSIWNWID = 0x8B02 /* set network id (pre-802.11) */ +const SIOCGIWNWID = 0x8B03 /* get network id (the cell) */ +const SIOCSIWFREQ = 0x8B04 /* set channel/frequency (Hz) */ +const SIOCGIWFREQ = 0x8B05 /* get channel/frequency (Hz) */ +const SIOCSIWMODE = 0x8B06 /* set operation mode */ +const SIOCGIWMODE = 0x8B07 /* get operation mode */ +const SIOCSIWSENS = 0x8B08 /* set sensitivity (dBm) */ +const SIOCGIWSENS = 0x8B09 /* get sensitivity (dBm) */ + +/* Informative stuff */ +const SIOCSIWRANGE = 0x8B0A /* Unused */ +const SIOCGIWRANGE = 0x8B0B /* Get range of parameters */ +const SIOCSIWPRIV = 0x8B0C /* Unused */ +const SIOCGIWPRIV = 0x8B0D /* get private ioctl interface info */ +const SIOCSIWSTATS = 0x8B0E /* Unused */ +const SIOCGIWSTATS = 0x8B0F /* Get /proc/net/wireless stats */ +/* SIOCGIWSTATS is strictly used between user space and the kernel, and + * is never passed to the driver (i.e. the driver will never see it). */ + +/* Spy support (statistics per MAC address - used for Mobile IP support) */ +const SIOCSIWSPY = 0x8B10 /* set spy addresses */ +const SIOCGIWSPY = 0x8B11 /* get spy info (quality of link) */ +const SIOCSIWTHRSPY = 0x8B12 /* set spy threshold (spy event) */ +const SIOCGIWTHRSPY = 0x8B13 /* get spy threshold */ + +/* Access Point manipulation */ +const SIOCSIWAP = 0x8B14 /* set access point MAC addresses */ +const SIOCGIWAP = 0x8B15 /* get access point MAC addresses */ +const SIOCGIWAPLIST = 0x8B17 /* Deprecated in favor of scanning */ +const SIOCSIWSCAN = 0x8B18 /* trigger scanning (list cells) */ +const SIOCGIWSCAN = 0x8B19 /* get scanning results */ + +/* 802.11 specific support */ +const SIOCSIWESSID = 0x8B1A /* set ESSID (network name) */ +const SIOCGIWESSID = 0x8B1B /* get ESSID */ +const SIOCSIWNICKN = 0x8B1C /* set node name/nickname */ +const SIOCGIWNICKN = 0x8B1D /* get node name/nickname */ +/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit + * within the 'iwreq' structure, so we need to use the 'data' member to + * point to a string in user space, like it is done for RANGE... */ + +/* Other parameters useful in 802.11 and some other devices */ +const SIOCSIWRATE = 0x8B20 /* set default bit rate (bps) */ +const SIOCGIWRATE = 0x8B21 /* get default bit rate (bps) */ +const SIOCSIWRTS = 0x8B22 /* set RTS/CTS threshold (bytes) */ +const SIOCGIWRTS = 0x8B23 /* get RTS/CTS threshold (bytes) */ +const SIOCSIWFRAG = 0x8B24 /* set fragmentation thr (bytes) */ +const SIOCGIWFRAG = 0x8B25 /* get fragmentation thr (bytes) */ +const SIOCSIWTXPOW = 0x8B26 /* set transmit power (dBm) */ +const SIOCGIWTXPOW = 0x8B27 /* get transmit power (dBm) */ +const SIOCSIWRETRY = 0x8B28 /* set retry limits and lifetime */ +const SIOCGIWRETRY = 0x8B29 /* get retry limits and lifetime */ + +/* Encoding stuff (scrambling, hardware security, WEP...) */ +const SIOCSIWENCODE = 0x8B2A /* set encoding token & mode */ +const SIOCGIWENCODE = 0x8B2B /* get encoding token & mode */ +/* Power saving stuff (power management, unicast and multicast) */ +const SIOCSIWPOWER = 0x8B2C /* set Power Management settings */ +const SIOCGIWPOWER = 0x8B2D /* get Power Management settings */ + +/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM). + * This ioctl uses struct iw_point and data buffer that includes IE id and len + * fields. More than one IE may be included in the request. Setting the generic + * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers + * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers + * are required to report the used IE as a wireless event, e.g., when + * associating with an AP. */ +const SIOCSIWGENIE = 0x8B30 /* set generic IE */ +const SIOCGIWGENIE = 0x8B31 /* get generic IE */ + +/* WPA : IEEE 802.11 MLME requests */ +const SIOCSIWMLME = 0x8B16 /* request MLME operation; uses + * struct iw_mlme */ +/* WPA : Authentication mode parameters */ +const SIOCSIWAUTH = 0x8B32 /* set authentication mode params */ +const SIOCGIWAUTH = 0x8B33 /* get authentication mode params */ + +/* WPA : Extended version of encoding configuration */ +const SIOCSIWENCODEEXT = 0x8B34 /* set encoding token & mode */ +const SIOCGIWENCODEEXT = 0x8B35 /* get encoding token & mode */ + +/* WPA2 : PMKSA cache management */ +const SIOCSIWPMKSA = 0x8B36 /* PMKSA cache operation */ + +/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */ + +/* These 32 ioctl are wireless device private, for 16 commands. + * Each driver is free to use them for whatever purpose it chooses, + * however the driver *must* export the description of those ioctls + * with SIOCGIWPRIV and *must* use arguments as defined below. + * If you don't follow those rules, DaveM is going to hate you (reason : + * it make mixed 32/64bit operation impossible). + */ +const SIOCIWFIRSTPRIV = 0x8BE0 +const SIOCIWLASTPRIV = 0x8BFF + +/* Previously, we were using SIOCDEVPRIVATE, but we now have our + * separate range because of collisions with other tools such as + * 'mii-tool'. + * We now have 32 commands, so a bit more space ;-). + * Also, all 'even' commands are only usable by root and don't return the + * content of ifr/iwr to user (but you are not obliged to use the set/get + * convention, just use every other two command). More details in iwpriv.c. + * And I repeat : you are not forced to use them with iwpriv, but you + * must be compliant with it. + */ + +/* ------------------------- IOCTL STUFF ------------------------- */ + +/* The first and the last (range) */ +const SIOCIWFIRST = 0x8B00 +const SIOCIWLAST = SIOCIWLASTPRIV /* 0x8BFF */ +//const IW_IOCTL_IDX(cmd) = ((cmd) - SIOCIWFIRST) +//const IW_HANDLER(id, = func) [IW_IOCTL_IDX(id)] = func + +// What is this stuff? +// Odd is right. +/* Odd : get (world access), even : set (root access) */ +func IW_IS_SET(cmd uint32) bool { + return !(((cmd) & 0x1) != 0) +} +func IW_IS_GET(cmd uint32) bool { + return ((cmd) & 0x1) != 0 +} + +/* ----------------------- WIRELESS EVENTS ----------------------- */ +/* Those are *NOT* ioctls, do not issue request on them !!! */ +/* Most events use the same identifier as ioctl requests */ + +const IWEVTXDROP = 0x8C00 /* Packet dropped to excessive retry */ +const IWEVQUAL = 0x8C01 /* Quality part of statistics (scan) */ +const IWEVCUSTOM = 0x8C02 /* Driver specific ascii string */ +const IWEVREGISTERED = 0x8C03 /* Discovered a new node (AP mode) */ +const IWEVEXPIRED = 0x8C04 /* Expired a node (AP mode) */ +const IWEVGENIE = 0x8C05 /* Generic IE (WPA, RSN, WMM, ..) + * (scan results); This includes id and + * length fields. One IWEVGENIE may + * contain more than one IE. Scan + * results may contain one or more + * IWEVGENIE events. */ +const IWEVMICHAELMICFAILURE = 0x8C06 /* Michael MIC failure + * (struct iw_michaelmicfailure) + */ +const IWEVASSOCREQIE = 0x8C07 /* IEs used in (Re)Association Request. + * The data includes id and length + * fields and may contain more than one + * IE. This event is required in + * Managed mode if the driver + * generates its own WPA/RSN IE. This + * should be sent just before + * IWEVREGISTERED event for the + * association. */ +const IWEVASSOCRESPIE = 0x8C08 /* IEs used in (Re)Association + * Response. The data includes id and + * length fields and may contain more + * than one IE. This may be sent + * between IWEVASSOCREQIE and + * IWEVREGISTERED events for the + * association. */ +const IWEVPMKIDCAND = 0x8C09 /* PMKID candidate for RSN + * pre-authentication + * (struct iw_pmkid_cand) */ + +const IWEVFIRST = 0x8C00 + +func IW_EVENT_IDX(cmd uint32) uint32 { + return cmd - IWEVFIRST +} + +/* ------------------------- PRIVATE INFO ------------------------- */ +/* + * The following is used with SIOCGIWPRIV. It allow a driver to define + * the interface (name, type of data) for its private ioctl. + * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV + */ + +const IW_PRIV_TYPE_MASK = 0x7000 /* Type of arguments */ +const IW_PRIV_TYPE_NONE = 0x0000 +const IW_PRIV_TYPE_BYTE = 0x1000 /* Char as number */ +const IW_PRIV_TYPE_CHAR = 0x2000 /* Char as character */ +const IW_PRIV_TYPE_INT = 0x4000 /* 32 bits int */ +const IW_PRIV_TYPE_FLOAT = 0x5000 /* struct iw_freq */ +const IW_PRIV_TYPE_ADDR = 0x6000 /* struct sockaddr */ + +const IW_PRIV_SIZE_FIXED = 0x0800 /* Variable or fixed number of args */ + +const IW_PRIV_SIZE_MASK = 0x07FF /* Max number of those args */ + +/* + * Note : if the number of args is fixed and the size < 16 octets, + * instead of passing a pointer we will put args in the iwreq struct... + */ + +/* ----------------------- OTHER CONSTANTS ----------------------- */ + +/* Maximum frequencies in the range struct */ +const IW_MAX_FREQUENCIES = 32 + +/* Note : if you have something like 80 frequencies, + * don't increase this constant and don't fill the frequency list. + * The user will be able to set by channel anyway... */ + +/* Maximum bit rates in the range struct */ +const IW_MAX_BITRATES = 32 + +/* Maximum tx powers in the range struct */ +const IW_MAX_TXPOWER = 8 + +/* Note : if you more than 8 TXPowers, just set the max and min or + * a few of them in the struct iw_range. */ + +/* Maximum of address that you may set with SPY */ +const IW_MAX_SPY = 8 + +/* Maximum of address that you may get in the + list of access points in range */ +const IW_MAX_AP = 64 + +/* Maximum size of the ESSID and NICKN strings */ +const IW_ESSID_MAX_SIZE = 32 + +/* Modes of operation */ +const IW_MODE_AUTO = 0 /* Let the driver decides */ +const IW_MODE_ADHOC = 1 /* Single cell network */ +const IW_MODE_INFRA = 2 /* Multi cell network, roaming, ... */ +const IW_MODE_MASTER = 3 /* Synchronisation master or Access Point */ +const IW_MODE_REPEAT = 4 /* Wireless Repeater (forwarder) */ +const IW_MODE_SECOND = 5 /* Secondary master/repeater (backup) */ +const IW_MODE_MONITOR = 6 /* Passive monitor (listen only) */ +const IW_MODE_MESH = 7 /* Mesh (IEEE 802.11s) network */ + +/* Statistics flags (bitmask in updated) */ +const IW_QUAL_QUAL_UPDATED = 0x01 /* Value was updated since last read */ +const IW_QUAL_LEVEL_UPDATED = 0x02 +const IW_QUAL_NOISE_UPDATED = 0x04 +const IW_QUAL_ALL_UPDATED = 0x07 +const IW_QUAL_DBM = 0x08 /* Level + Noise are dBm */ +const IW_QUAL_QUAL_INVALID = 0x10 /* Driver doesn't provide value */ +const IW_QUAL_LEVEL_INVALID = 0x20 +const IW_QUAL_NOISE_INVALID = 0x40 +const IW_QUAL_RCPI = 0x80 /* Level + Noise are 802.11k RCPI */ +const IW_QUAL_ALL_INVALID = 0x70 + +/* Frequency flags */ +const IW_FREQ_AUTO = 0x00 /* Let the driver decides */ +const IW_FREQ_FIXED = 0x01 /* Force a specific value */ + +/* Maximum number of size of encoding token available + * they are listed in the range structure */ +const IW_MAX_ENCODING_SIZES = 8 + +/* Maximum size of the encoding token in bytes */ +const IW_ENCODING_TOKEN_MAX = 64 /* 512 bits (for now) */ + +/* Flags for encoding (along with the token) */ +const IW_ENCODE_INDEX = 0x00FF /* Token index (if needed) */ +const IW_ENCODE_FLAGS = 0xFF00 /* Flags defined below */ +const IW_ENCODE_MODE = 0xF000 /* Modes defined below */ +const IW_ENCODE_DISABLED = 0x8000 /* Encoding disabled */ +const IW_ENCODE_ENABLED = 0x0000 /* Encoding enabled */ +const IW_ENCODE_RESTRICTED = 0x4000 /* Refuse non-encoded packets */ +const IW_ENCODE_OPEN = 0x2000 /* Accept non-encoded packets */ +const IW_ENCODE_NOKEY = 0x0800 /* Key is write only, so not present */ +const IW_ENCODE_TEMP = 0x0400 /* Temporary key */ + +/* Power management flags available (along with the value, if any) */ +const IW_POWER_ON = 0x0000 /* No details... */ +const IW_POWER_TYPE = 0xF000 /* Type of parameter */ +const IW_POWER_PERIOD = 0x1000 /* Value is a period/duration of */ +const IW_POWER_TIMEOUT = 0x2000 /* Value is a timeout (to go asleep) */ +const IW_POWER_MODE = 0x0F00 /* Power Management mode */ +const IW_POWER_UNICAST_R = 0x0100 /* Receive only unicast messages */ +const IW_POWER_MULTICAST_R = 0x0200 /* Receive only multicast messages */ +const IW_POWER_ALL_R = 0x0300 /* Receive all messages though PM */ +const IW_POWER_FORCE_S = 0x0400 /* Force PM procedure for sending unicast */ +const IW_POWER_REPEATER = 0x0800 /* Repeat broadcast messages in PM period */ +const IW_POWER_MODIFIER = 0x000F /* Modify a parameter */ +const IW_POWER_MIN = 0x0001 /* Value is a minimum */ +const IW_POWER_MAX = 0x0002 /* Value is a maximum */ +const IW_POWER_RELATIVE = 0x0004 /* Value is not in seconds/ms/us */ + +/* Transmit Power flags available */ +const IW_TXPOW_TYPE = 0x00FF /* Type of value */ +const IW_TXPOW_DBM = 0x0000 /* Value is in dBm */ +const IW_TXPOW_MWATT = 0x0001 /* Value is in mW */ +const IW_TXPOW_RELATIVE = 0x0002 /* Value is in arbitrary units */ +const IW_TXPOW_RANGE = 0x1000 /* Range of value between min/max */ + +/* Retry limits and lifetime flags available */ +const IW_RETRY_ON = 0x0000 /* No details... */ +const IW_RETRY_TYPE = 0xF000 /* Type of parameter */ +const IW_RETRY_LIMIT = 0x1000 /* Maximum number of retries*/ +const IW_RETRY_LIFETIME = 0x2000 /* Maximum duration of retries in us */ +const IW_RETRY_MODIFIER = 0x00FF /* Modify a parameter */ +const IW_RETRY_MIN = 0x0001 /* Value is a minimum */ +const IW_RETRY_MAX = 0x0002 /* Value is a maximum */ +const IW_RETRY_RELATIVE = 0x0004 /* Value is not in seconds/ms/us */ +const IW_RETRY_SHORT = 0x0010 /* Value is for short packets */ +const IW_RETRY_LONG = 0x0020 /* Value is for long packets */ + +/* Scanning request flags */ +const IW_SCAN_DEFAULT = 0x0000 /* Default scan of the driver */ +const IW_SCAN_ALL_ESSID = 0x0001 /* Scan all ESSIDs */ +const IW_SCAN_THIS_ESSID = 0x0002 /* Scan only this ESSID */ +const IW_SCAN_ALL_FREQ = 0x0004 /* Scan all Frequencies */ +const IW_SCAN_THIS_FREQ = 0x0008 /* Scan only this Frequency */ +const IW_SCAN_ALL_MODE = 0x0010 /* Scan all Modes */ +const IW_SCAN_THIS_MODE = 0x0020 /* Scan only this Mode */ +const IW_SCAN_ALL_RATE = 0x0040 /* Scan all Bit-Rates */ +const IW_SCAN_THIS_RATE = 0x0080 /* Scan only this Bit-Rate */ +/* struct iw_scan_req scan_type */ +const IW_SCAN_TYPE_ACTIVE = 0 +const IW_SCAN_TYPE_PASSIVE = 1 + +/* Maximum size of returned data */ +const IW_SCAN_MAX_DATA = 4096 /* In bytes */ + +/* Scan capability flags - in (struct iw_range *)->scan_capa */ +const IW_SCAN_CAPA_NONE = 0x00 +const IW_SCAN_CAPA_ESSID = 0x01 +const IW_SCAN_CAPA_BSSID = 0x02 +const IW_SCAN_CAPA_CHANNEL = 0x04 +const IW_SCAN_CAPA_MODE = 0x08 +const IW_SCAN_CAPA_RATE = 0x10 +const IW_SCAN_CAPA_TYPE = 0x20 +const IW_SCAN_CAPA_TIME = 0x40 + +/* Max number of char in custom event - use multiple of them if needed */ +const IW_CUSTOM_MAX = 256 /* In bytes */ + +/* Generic information element */ +const IW_GENERIC_IE_MAX = 1024 + +/* MLME requests (SIOCSIWMLME / struct iw_mlme) */ +const IW_MLME_DEAUTH = 0 +const IW_MLME_DISASSOC = 1 +const IW_MLME_AUTH = 2 +const IW_MLME_ASSOC = 3 + +/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */ +const IW_AUTH_INDEX = 0x0FFF +const IW_AUTH_FLAGS = 0xF000 + +/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095) + * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the + * parameter that is being set/get to; value will be read/written to + * struct iw_param value field) */ +const IW_AUTH_WPA_VERSION = 0 +const IW_AUTH_CIPHER_PAIRWISE = 1 +const IW_AUTH_CIPHER_GROUP = 2 +const IW_AUTH_KEY_MGMT = 3 +const IW_AUTH_TKIP_COUNTERMEASURES = 4 +const IW_AUTH_DROP_UNENCRYPTED = 5 +const IW_AUTH_80211_AUTH_ALG = 6 +const IW_AUTH_WPA_ENABLED = 7 +const IW_AUTH_RX_UNENCRYPTED_EAPOL = 8 +const IW_AUTH_ROAMING_CONTROL = 9 +const IW_AUTH_PRIVACY_INVOKED = 10 +const IW_AUTH_CIPHER_GROUP_MGMT = 11 +const IW_AUTH_MFP = 12 + +/* IW_AUTH_WPA_VERSION values (bit field) */ +const IW_AUTH_WPA_VERSION_DISABLED = 0x00000001 +const IW_AUTH_WPA_VERSION_WPA = 0x00000002 +const IW_AUTH_WPA_VERSION_WPA2 = 0x00000004 + +/* IW_AUTH_PAIRWISE_CIPHER, IW_AUTH_GROUP_CIPHER, and IW_AUTH_CIPHER_GROUP_MGMT + * values (bit field) */ +const IW_AUTH_CIPHER_NONE = 0x00000001 +const IW_AUTH_CIPHER_WEP40 = 0x00000002 +const IW_AUTH_CIPHER_TKIP = 0x00000004 +const IW_AUTH_CIPHER_CCMP = 0x00000008 +const IW_AUTH_CIPHER_WEP104 = 0x00000010 +const IW_AUTH_CIPHER_AES_CMAC = 0x00000020 + +/* IW_AUTH_KEY_MGMT values (bit field) */ +const IW_AUTH_KEY_MGMT_802_1X = 1 +const IW_AUTH_KEY_MGMT_PSK = 2 + +/* IW_AUTH_80211_AUTH_ALG values (bit field) */ +const IW_AUTH_ALG_OPEN_SYSTEM = 0x00000001 +const IW_AUTH_ALG_SHARED_KEY = 0x00000002 +const IW_AUTH_ALG_LEAP = 0x00000004 + +/* IW_AUTH_ROAMING_CONTROL values */ +const IW_AUTH_ROAMING_ENABLE = 0 /* driver/firmware based roaming */ +const IW_AUTH_ROAMING_DISABLE = 1 /* user space program used for roaming + * control */ + +/* IW_AUTH_MFP (management frame protection) values */ +const IW_AUTH_MFP_DISABLED = 0 /* MFP disabled */ +const IW_AUTH_MFP_OPTIONAL = 1 /* MFP optional */ +const IW_AUTH_MFP_REQUIRED = 2 /* MFP required */ + +/* SIOCSIWENCODEEXT definitions */ +const IW_ENCODE_SEQ_MAX_SIZE = 8 + +/* struct iw_encode_ext ->alg */ +const IW_ENCODE_ALG_NONE = 0 +const IW_ENCODE_ALG_WEP = 1 +const IW_ENCODE_ALG_TKIP = 2 +const IW_ENCODE_ALG_CCMP = 3 +const IW_ENCODE_ALG_PMK = 4 +const IW_ENCODE_ALG_AES_CMAC = 5 + +/* struct iw_encode_ext ->ext_flags */ +const IW_ENCODE_EXT_TX_SEQ_VALID = 0x00000001 +const IW_ENCODE_EXT_RX_SEQ_VALID = 0x00000002 +const IW_ENCODE_EXT_GROUP_KEY = 0x00000004 +const IW_ENCODE_EXT_SET_TX_KEY = 0x00000008 + +/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */ +const IW_MICFAILURE_KEY_ID = 0x00000003 /* Key ID 0..3 */ +const IW_MICFAILURE_GROUP = 0x00000004 +const IW_MICFAILURE_PAIRWISE = 0x00000008 +const IW_MICFAILURE_STAKEY = 0x00000010 +const IW_MICFAILURE_COUNT = 0x00000060 /* 1 or 2 (0 = count not supported) + */ + +/* Bit field values for enc_capa in struct iw_range */ +const IW_ENC_CAPA_WPA = 0x00000001 +const IW_ENC_CAPA_WPA2 = 0x00000002 +const IW_ENC_CAPA_CIPHER_TKIP = 0x00000004 +const IW_ENC_CAPA_CIPHER_CCMP = 0x00000008 +const IW_ENC_CAPA_4WAY_HANDSHAKE = 0x00000010 + +/* Event capability macros - in (struct iw_range *)->event_capa + * Because we have more than 32 possible events, we use an array of + * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ +func IW_EVENT_CAPA_BASE(cmd uint32) uint32 { + if cmd >= SIOCIWFIRSTPRIV { + return cmd - SIOCIWFIRSTPRIV + 0x60 + } + return cmd - SIOCIWFIRST +} +func IW_EVENT_CAPA_INDEX(cmd uint32) uint32 { + return IW_EVENT_CAPA_BASE(cmd) >> 5 +} +func IW_EVENT_CAPA_MASK(cmd uint32) uint32 { + return (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) +} + +/* Event capability constants - event autogenerated by the kernel + * This list is valid for most 802.11 devices, customise as needed... */ +var IW_EVENT_CAPA_K_0 = (IW_EVENT_CAPA_MASK(0x8B04) | IW_EVENT_CAPA_MASK(0x8B06) | IW_EVENT_CAPA_MASK(0x8B1A)) +var IW_EVENT_CAPA_K_1 = (IW_EVENT_CAPA_MASK(0x8B2A)) + +/* "Easy" macro to set events in iw_range (less efficient) */ +func IW_EVENT_CAPA_SET(event_capa []uint32, cmd uint32) { + event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd) +} + +func IW_EVENT_CAPA_SET_KERNEL(event_capa []uint32) { + event_capa[0] |= IW_EVENT_CAPA_K_0 + event_capa[1] |= IW_EVENT_CAPA_K_1 +} + +/****************************** TYPES ******************************/ + +/* --------------------------- SUBTYPES --------------------------- */ +/* + * Generic format for most parameters that fit in an int + */ +type iw_param struct { + value int32 /* The value of the parameter itself */ + fixed uint8 /* Hardware should not use auto select */ + disabled uint8 /* Disable the feature */ + flags uint16 /* Various specifc flags (if any) */ +} + +/* + * For all data larger than 16 octets, we need to use a + * pointer to memory allocated in user space. + */ +type iw_point struct { + pointer unsafe.Pointer /* Pointer to the data (in user space) */ + length uint16 /* number of fields or size in bytes */ + flags uint16 /* Optional params */ +} + +/* + * A frequency + * For numbers lower than 10^9, we encode the number in 'm' and + * set 'e' to 0 + * For number greater than 10^9, we divide it by the lowest power + * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... + * The power of 10 is in 'e', the result of the division is in 'm'. + */ +type iw_freq struct { + m int32 /* Mantissa */ + e int16 /* Exponent */ + i uint8 /* List index (when in range struct) */ + flags uint8 /* Flags (fixed/auto) */ +} + +/* + * Quality of the link + */ +type iw_quality struct { + qual uint8 /* link quality (%retries, SNR, + %missed beacons or better...) */ + level uint8 /* signal level (dBm) */ + noise uint8 /* noise level (dBm) */ + updated uint8 /* Flags to know if updated */ +} + +/* + * Packet discarded in the wireless adapter due to + * "wireless" specific problems... + * Note : the list of counter and statistics in net_device_stats + * is already pretty exhaustive, and you should use that first. + * This is only additional stats... + */ +type iw_discarded struct { + nwid uint32 /* Rx : Wrong nwid/essid */ + code uint32 /* Rx : Unable to code/decode (WEP) */ + fragment uint32 /* Rx : Can't perform MAC reassembly */ + retries uint32 /* Tx : Max MAC retries num reached */ + misc uint32 /* Others cases */ +} + +/* + * Packet/Time period missed in the wireless adapter due to + * "wireless" specific problems... + */ +type iw_missed struct { + beacon uint32 /* Missed beacons/superframe */ +} + +type sockaddr []byte + +/* + * Quality range (for spy threshold) + */ +type iw_thrspy struct { + addr sockaddr /* Source address (hw/mac) */ + qual iw_quality /* Quality of the link */ + low iw_quality /* Low threshold */ + high iw_quality /* High threshold */ +} + +/* + * Optional data for scan request + * + * Note: these optional parameters are controlling parameters for the + * scanning behavior, these do not apply to getting scan results + * (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and + * provide a merged results with all BSSes even if the previous scan + * request limited scanning to a subset, e.g., by specifying an SSID. + * Especially, scan results are required to include an entry for the + * current BSS if the driver is in Managed mode and associated with an AP. + */ +type iw_scan_req struct { + scan_type uint8 /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */ + essid_len uint8 + num_channels uint8 /* num entries in channel_list uint8 + * 0 = scan all allowed channels */ + flags uint8 /* reserved as padding uint8 use zero, this may + * be used in the future for adding flags + * to request different scan behavior */ + bssid sockaddr /* ff:ff:ff:ff:ff:ff for broadcast BSSID or + * individual address of a specific BSS */ + + /* + * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using + * the current ESSID. This allows scan requests for specific ESSID + * without having to change the current ESSID and potentially breaking + * the current association. + */ + essid [IW_ESSID_MAX_SIZE]uint8 + /* + * Optional parameters for changing the default scanning behavior. + * These are based on the MLME-SCAN.request from IEEE Std 802.11. + * TU is 1.024 ms. If these are set to 0, driver is expected to use + * reasonable default values. min_channel_time defines the time that + * will be used to wait for the first reply on each channel. If no + * replies are received, next channel will be scanned after this. If + * replies are received, total time waited on the channel is defined by + * max_channel_time. + */ + min_channel_time uint32 /* in TU */ + max_channel_time uint32 /* in TU */ + + channel_list [IW_MAX_FREQUENCIES]iw_freq +} + +/* ------------------------- WPA SUPPORT ------------------------- */ + +/* + * Extended data structure for get/set encoding (this is used with + * SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_* + * flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and + * only the data contents changes (key data -> this structure, including + * key data). + * + * If the new key is the first group key, it will be set as the default + * TX key. Otherwise, default TX key index is only changed if + * IW_ENCODE_EXT_SET_TX_KEY flag is set. + * + * Key will be changed with SIOCSIWENCODEEXT in all cases except for + * special "change TX key index" operation which is indicated by setting + * key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY. + * + * tx_seq/rx_seq are only used when respective + * IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal + * TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start + * TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally + * used only by an Authenticator (AP or an IBSS station) to get the + * current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and + * RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for + * debugging/testing. + */ +type iw_encode_ext struct { + ext_flags uint32 /* IW_ENCODE_EXT_* */ + tx_seq [IW_ENCODE_SEQ_MAX_SIZE]uint8 /* LSB first */ + rx_seq [IW_ENCODE_SEQ_MAX_SIZE]uint8 /* LSB first */ + addr sockaddr /* ff:ff:ff:ff:ff:ff for broadcast/multicast + * (group) keys or unicast address for + * individual keys */ + alg uint16 /* IW_ENCODE_ALG_* */ + key_len uint16 + key []uint8 +} + +/* SIOCSIWMLME data */ +type iw_mlme struct { + cmd uint16 /* IW_MLME_* */ + reason_code uint16 + addr sockaddr +} + +/* SIOCSIWPMKSA data */ +const IW_PMKSA_ADD = 1 +const IW_PMKSA_REMOVE = 2 +const IW_PMKSA_FLUSH = 3 + +const IW_PMKID_LEN = 16 + +type iw_pmksa struct { + cmd uint32 /* IW_PMKSA_* */ + bssid sockaddr + pmkid [IW_PMKID_LEN]uint8 +} + +/* IWEVMICHAELMICFAILURE data */ +type iw_michaelmicfailure struct { + flags uint32 + src_addr sockaddr + tsc [IW_ENCODE_SEQ_MAX_SIZE]uint8 /* LSB first */ +} + +/* IWEVPMKIDCAND data */ +const IW_PMKID_CAND_PREAUTH = 0x00000001 /* RNS pre-authentication enabled */ +type iw_pmkid_cand struct { + flags uint32 /* IW_PMKID_CAND_* */ + index uint32 /* the smaller the index, the higher the + * priority */ + bssid sockaddr +} + +/* ------------------------ WIRELESS STATS ------------------------ */ +/* + * Wireless statistics (used for /proc/net/wireless) + */ +type iw_statistics struct { + status uint16 /* Status + * - device dependent for now */ + + qual iw_quality /* Quality of the link + * (instant/mean/max) */ + discard iw_quality /* Packet discarded counts */ + miss iw_quality /* Packet missed counts */ +} + +/* ------------------------ IOCTL REQUEST ------------------------ */ +/* + * This structure defines the payload of an ioctl, and is used + * below. + * + * Note that this structure should fit on the memory footprint + * of iwreq (which is the same as ifreq), which mean a max size of + * 16 octets = 128 bits. Warning, pointers might be 64 bits wide... + * You should check this when increasing the structures defined + * above in this file... + * +union iwreq_data { + /* Config - generic * + char name[IFNAMSIZ]; + /* Name : used to verify the presence of wireless extensions. + * Name of the protocol/provider... * + + iw_point essid; /* Extended network name * + iw_param nwid; /* network id (or domain - the cell) * + iw_freq freq; /* frequency or channel : + * 0-1000 = channel + * > 1000 = frequency in Hz * + + iw_param sens; /* signal level threshold * + iw_param bitrate; /* default bit rate * + iw_param txpower; /* default transmit power * + iw_param rts; /* RTS threshold threshold * + iw_param frag; /* Fragmentation threshold * +mode uint32 /* Operation mode * + iw_param retry; /* Retry limits & lifetime * + + iw_point encoding; /* Encoding stuff : tokens * + iw_param power; /* PM duration/timeout * + iw_quality qual; /* Quality part of statistics * + + sockaddr ap_addr; /* Access point address * + sockaddr addr; /* Destination address (hw/mac) * + + iw_param param; /* Other small parameters * + iw_point data; /* Other large parameters * +}; + +/* + * The structure to exchange data for ioctl. + * This structure is the same as 'struct ifreq', but (re)defined for + * convenience... + * Do I need to remind you about structure size (32 octets) ? +*/ +type iwreq struct { + //union + //{ + // char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */ + // } ifr_ifrn; + + /* Data part (defined just above) * + union iwreq_data u; + */ +} + +/* -------------------------- IOCTL DATA -------------------------- */ +/* + * For those ioctl which want to exchange mode data that what could + * fit in the above structure... + */ + +/* + * Range of parameters + */ + +type IWRange struct { + /* Informative stuff (to choose between different interface) */ + throughput uint32 /* To give an idea... */ + /* In theory this value should be the maximum benchmarked + * TCP/IP throughput, because with most of these devices the + * bit rate is meaningless (overhead an co) to estimate how + * fast the connection will go and pick the fastest one. + * I suggest people to play with Netperf or any benchmark... + */ + + /* NWID (or domain id) */ + min_nwid uint32 /* Minimal NWID we are able to set */ + max_nwid uint32 /* Maximal NWID we are able to set */ + + /* Old Frequency (backward compat - moved lower ) */ + old_num_channels uint16 + old_num_frequency uint8 + + /* Scan capabilities */ + scan_capa uint8 /* IW_SCAN_CAPA_* bit field */ + + /* Wireless event capability bitmasks */ + event_capa [6]uint32 + + /* signal level threshold range */ + sensitivity int32 + + /* Quality of link & SNR stuff */ + /* Quality range (link, level, noise) + * If the quality is absolute, it will be in the range [0 ; max_qual], + * if the quality is dBm, it will be in the range [max_qual ; 0]. + * Don't forget that we use 8 bit arithmetics... */ + max_qual iw_quality /* Quality of the link */ + /* This should contain the average/typical values of the quality + * indicator. This should be the threshold between a "good" and + * a "bad" link (example : monitor going from green to orange). + * Currently, user space apps like quality monitors don't have any + * way to calibrate the measurement. With this, they can split + * the range between 0 and max_qual in different quality level + * (using a geometric subdivision centered on the average). + * I expect that people doing the user space apps will feedback + * us on which value we need to put in each driver... */ + avg_qual iw_quality /* Quality of the link */ + + /* Rates */ + num_bitrates uint8 /* Number of entries in the list */ + bitrate [IW_MAX_BITRATES]int32 /* list, in bps */ + + /* RTS threshold */ + min_rts int32 /* Minimal RTS threshold */ + max_rts int32 /* Maximal RTS threshold */ + + /* Frag threshold */ + min_frag int32 /* Minimal frag threshold */ + max_frag int32 /* Maximal frag threshold */ + + /* Power Management duration & timeout */ + min_pmp int32 /* Minimal PM period */ + max_pmp int32 /* Maximal PM period */ + min_pmt int32 /* Minimal PM timeout */ + max_pmt int32 /* Maximal PM timeout */ + pmp_flags uint16 /* How to decode max/min PM period */ + pmt_flags uint16 /* How to decode max/min PM timeout */ + pm_capa uint16 /* What PM options are supported */ + + /* Encoder stuff */ + encoding_size [IW_MAX_ENCODING_SIZES]uint16 /* Different token sizes */ + num_encoding_sizes uint8 /* Number of entry in the list */ + max_encoding_tokens uint8 /* Max number of tokens */ + /* For drivers that need a "login/passwd" form */ + encoding_login_index uint8 /* token index for login token */ + + /* Transmit power */ + txpower_capa uint16 /* What options are supported */ + num_txpower uint8 /* Number of entries in the list */ + txpower [IW_MAX_TXPOWER]int32 /* list, in bps */ + + /* Wireless Extension version info */ + we_version_compiled uint8 /* Must be WIRELESS_EXT */ + we_version_source uint8 /* Last update of source */ + + /* Retry limits and lifetime */ + retry_capa uint16 /* What retry options are supported */ + retry_flags uint16 /* How to decode max/min retry limit */ + r_time_flags uint16 /* How to decode max/min retry life */ + min_retry int32 /* Minimal number of retries */ + max_retry int32 /* Maximal number of retries */ + min_r_time int32 /* Minimal retry lifetime */ + max_r_time int32 /* Maximal retry lifetime */ + + /* Frequency */ + num_channels uint16 /* Number of channels [0; num - 1] */ + num_frequency uint8 /* Number of entry in the list */ + freq [IW_MAX_FREQUENCIES]iw_freq /* list */ + /* Note : this frequency list doesn't need to fit channel numbers, + * because each entry contain its channel index */ + + enc_capa uint32 /* IW_ENC_CAPA_* bit field */ +} + +/* + * Private ioctl interface information + */ +const IFNAMSIZ = 16 + +type iw_priv_args struct { + cmd uint32 /* Number of the ioctl to issue */ + set_args uint16 /* Type and number of args */ + get_args uint16 /* Type and number of args */ + name [IFNAMSIZ]byte /* Name of the extension */ +} + +/* ----------------------- WIRELESS EVENTS ----------------------- */ +/* + * Wireless events are carried through the rtnetlink socket to user + * space. They are encapsulated in the IFLA_WIRELESS field of + * a RTM_NEWLINK message. + */ + +/* + * A Wireless Event. Contains basically the same data as the ioctl... + */ +type iw_event struct { + len uint16 /* Real length of this stuff */ + cmd uint16 /* Wireless IOCTL */ + //union iwreq_data u; /* IOCTL fixed payload */ +} + +// stupid sizeof tricks for the inevitable binary interface. +/* Size of the Event prefix (including padding and alignement junk) * +const IW_EV_LCP_LEN = (sizeof(struct iw_event) - sizeof(union iwreq_data)) +/* Size of the various events * +const IW_EV_CHAR_LEN = (IW_EV_LCP_LEN + IFNAMSIZ) +const IW_EV_UINT_LEN = (IW_EV_LCP_LEN + sizeof(uint32)) +const IW_EV_FREQ_LEN = (IW_EV_LCP_LEN + sizeof(struct iw_freq)) +const IW_EV_PARAM_LEN = (IW_EV_LCP_LEN + sizeof(struct iw_param)) +const IW_EV_ADDR_LEN = (IW_EV_LCP_LEN + sizeof(struct sockaddr)) +const IW_EV_QUAL_LEN = (IW_EV_LCP_LEN + sizeof(struct iw_quality)) + +/* iw_point events are special. First, the payload (extra data) come at + * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second, + * we omit the pointer, so start at an offset. * +const IW_EV_POINT_OFF = (((char *) &(((struct iw_point *) NULL)->length)) - (char *) NULL) +const IW_EV_POINT_LEN = (IW_EV_LCP_LEN + sizeof(struct iw_point) - IW_EV_POINT_OFF) + + +/* Size of the Event prefix when packed in stream */ +const IW_EV_LCP_PK_LEN = (4) + +/* Size of the various events when packed in stream * +const IW_EV_CHAR_PK_LEN = (IW_EV_LCP_PK_LEN + IFNAMSIZ) +const IW_EV_UINT_PK_LEN = (IW_EV_LCP_PK_LEN + sizeof(uint32)) +const IW_EV_FREQ_PK_LEN = (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq)) +const IW_EV_PARAM_PK_LEN = (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) +const IW_EV_ADDR_PK_LEN = (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) +const IW_EV_QUAL_PK_LEN = (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) +*/ +const IW_EV_POINT_PK_LEN = (IW_EV_LCP_PK_LEN + 4) diff --git a/nichrome/pkg/wpa/passphrase/passphrase.go b/nichrome/pkg/wpa/passphrase/passphrase.go new file mode 100644 index 000000000..7617196e5 --- /dev/null +++ b/nichrome/pkg/wpa/passphrase/passphrase.go @@ -0,0 +1,48 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package passphrase + +import ( + "crypto/sha1" + "encoding/hex" + "fmt" + + "golang.org/x/crypto/pbkdf2" +) + +const ( + MinPassLen = 8 + MaxPassLen = 63 + ResultFormat = `network={ + ssid="%s" + #psk="%s" + psk=%s +} +` +) + +func errorCheck(essid string, pass string) error { + if len(pass) < MinPassLen || len(pass) > MaxPassLen { + return fmt.Errorf("Passphrase must be 8..63 characters") + } + if len(essid) == 0 { + return fmt.Errorf("essid cannot be empty") + } + return nil +} + +func Run(essid string, pass string) ([]byte, error) { + if err := errorCheck(essid, pass); err != nil { + return nil, err + } + + // There is a possible security bug here because the salt is the essid which is + // static and shared across access points. Thus this salt is not sufficiently random. + // This issue has been reported to the responsible parties. Since this matches the + // current implementation of wpa_passphrase.c, this will maintain until further notice. + pskBinary := pbkdf2.Key([]byte(pass), []byte(essid), 4096, 32, sha1.New) + pskHexString := hex.EncodeToString(pskBinary) + return []byte(fmt.Sprintf(ResultFormat, essid, pass, pskHexString)), nil +} diff --git a/nichrome/pkg/wpa/passphrase/passphrase_test.go b/nichrome/pkg/wpa/passphrase/passphrase_test.go new file mode 100644 index 000000000..dcee75400 --- /dev/null +++ b/nichrome/pkg/wpa/passphrase/passphrase_test.go @@ -0,0 +1,71 @@ +// Copyright 2018 the u-root Authors. All rights reserved +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package passphrase + +import ( + "fmt" + "reflect" + "testing" +) + +type RunTestCase struct { + name string + essid string + pass string + out string + err error +} + +var ( + essidStub = "stub" + shortPass = "aaaaaaa" // 7 chars + longPass = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" // 64 chars + validPass = "aaaaaaaaaaaaaaaa" // 16 chars + correctOutput = `network={ + ssid="stub" + #psk="aaaaaaaaaaaaaaaa" + psk=e270ba95a72c6d922e902f65dfa23315f7ba43b69debc75167254acd778f2fe9 +} +` + runTestCases = []RunTestCase{ + { + name: "No essid", + essid: "", + pass: validPass, + out: "", + err: fmt.Errorf("essid cannot be empty"), + }, + { + name: "pass length is less than 8 chars", + essid: essidStub, + pass: shortPass, + out: "", + err: fmt.Errorf("Passphrase must be 8..63 characters"), + }, + { + name: "pass length is more than 63 chars", + essid: essidStub, + pass: longPass, + out: "", + err: fmt.Errorf("Passphrase must be 8..63 characters"), + }, + { + name: "Correct Input", + essid: essidStub, + pass: validPass, + out: correctOutput, + err: nil, + }, + } +) + +func TestRun(t *testing.T) { + for _, test := range runTestCases { + out, err := Run(test.essid, test.pass) + if !reflect.DeepEqual(err, test.err) || string(out) != test.out { + t.Errorf("TEST %s\ngot:[%v, %v]\nwant:[%v, %v]", test.name, err, string(out), test.err, string(test.out)) + } + } +} diff --git a/nichrome/rootfs/etc/asound.conf b/nichrome/rootfs/etc/asound.conf new file mode 100644 index 000000000..4112055d4 --- /dev/null +++ b/nichrome/rootfs/etc/asound.conf @@ -0,0 +1,6 @@ +pcm.!default { + type hw + card 0 + device 3 +} + diff --git a/nichrome/rootfs/etc/group b/nichrome/rootfs/etc/group new file mode 100644 index 000000000..fea6c3e06 --- /dev/null +++ b/nichrome/rootfs/etc/group @@ -0,0 +1 @@ +staff::1:root,user diff --git a/nichrome/rootfs/lib/ld-2.17.so b/nichrome/rootfs/lib/ld-2.17.so new file mode 100755 index 000000000..1398643ac Binary files /dev/null and b/nichrome/rootfs/lib/ld-2.17.so differ diff --git a/nichrome/rootfs/lib/ld-2.24.so b/nichrome/rootfs/lib/ld-2.24.so new file mode 100755 index 000000000..0bd81a2ef Binary files /dev/null and b/nichrome/rootfs/lib/ld-2.24.so differ diff --git a/nichrome/rootfs/lib/ld-linux-x86-64.so.2 b/nichrome/rootfs/lib/ld-linux-x86-64.so.2 new file mode 120000 index 000000000..6b1a56f03 --- /dev/null +++ b/nichrome/rootfs/lib/ld-linux-x86-64.so.2 @@ -0,0 +1 @@ +ld-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libanl-2.24.so b/nichrome/rootfs/lib/libanl-2.24.so new file mode 100755 index 000000000..91968f7f9 Binary files /dev/null and b/nichrome/rootfs/lib/libanl-2.24.so differ diff --git a/nichrome/rootfs/lib/libanl.so.1 b/nichrome/rootfs/lib/libanl.so.1 new file mode 120000 index 000000000..8dc3b3602 --- /dev/null +++ b/nichrome/rootfs/lib/libanl.so.1 @@ -0,0 +1 @@ +libanl-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libblkid.so.1 b/nichrome/rootfs/lib/libblkid.so.1 new file mode 120000 index 000000000..e4f69c72c --- /dev/null +++ b/nichrome/rootfs/lib/libblkid.so.1 @@ -0,0 +1 @@ +libblkid.so.1.1.0 \ No newline at end of file diff --git a/nichrome/rootfs/lib/libblkid.so.1.1.0 b/nichrome/rootfs/lib/libblkid.so.1.1.0 new file mode 100755 index 000000000..cfd20b5b5 Binary files /dev/null and b/nichrome/rootfs/lib/libblkid.so.1.1.0 differ diff --git a/nichrome/rootfs/lib/libc-2.17.so b/nichrome/rootfs/lib/libc-2.17.so new file mode 100755 index 000000000..2bb449627 Binary files /dev/null and b/nichrome/rootfs/lib/libc-2.17.so differ diff --git a/nichrome/rootfs/lib/libc-2.24.so b/nichrome/rootfs/lib/libc-2.24.so new file mode 100755 index 000000000..39f5b3441 Binary files /dev/null and b/nichrome/rootfs/lib/libc-2.24.so differ diff --git a/nichrome/rootfs/lib/libc.so.6 b/nichrome/rootfs/lib/libc.so.6 new file mode 120000 index 000000000..77d3c6de5 --- /dev/null +++ b/nichrome/rootfs/lib/libc.so.6 @@ -0,0 +1 @@ +libc-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libcom_err.so.2 b/nichrome/rootfs/lib/libcom_err.so.2 new file mode 120000 index 000000000..e989efb0b --- /dev/null +++ b/nichrome/rootfs/lib/libcom_err.so.2 @@ -0,0 +1 @@ +libcom_err.so.2.1 \ No newline at end of file diff --git a/nichrome/rootfs/lib/libcom_err.so.2.1 b/nichrome/rootfs/lib/libcom_err.so.2.1 new file mode 100755 index 000000000..e3c8cf34c Binary files /dev/null and b/nichrome/rootfs/lib/libcom_err.so.2.1 differ diff --git a/nichrome/rootfs/lib/libcrypt-2.24.so b/nichrome/rootfs/lib/libcrypt-2.24.so new file mode 100755 index 000000000..935d473b2 Binary files /dev/null and b/nichrome/rootfs/lib/libcrypt-2.24.so differ diff --git a/nichrome/rootfs/lib/libcrypt.so.1 b/nichrome/rootfs/lib/libcrypt.so.1 new file mode 120000 index 000000000..1adb36c5d --- /dev/null +++ b/nichrome/rootfs/lib/libcrypt.so.1 @@ -0,0 +1 @@ +libcrypt-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libdl-2.17.so b/nichrome/rootfs/lib/libdl-2.17.so new file mode 100755 index 000000000..694ecf8bd Binary files /dev/null and b/nichrome/rootfs/lib/libdl-2.17.so differ diff --git a/nichrome/rootfs/lib/libdl-2.24.so b/nichrome/rootfs/lib/libdl-2.24.so new file mode 100755 index 000000000..8afc4ea2b Binary files /dev/null and b/nichrome/rootfs/lib/libdl-2.24.so differ diff --git a/nichrome/rootfs/lib/libdl.so.2 b/nichrome/rootfs/lib/libdl.so.2 new file mode 120000 index 000000000..5b0e60612 --- /dev/null +++ b/nichrome/rootfs/lib/libdl.so.2 @@ -0,0 +1 @@ +libdl-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libe2p.so.2 b/nichrome/rootfs/lib/libe2p.so.2 new file mode 120000 index 000000000..177bc5cb1 --- /dev/null +++ b/nichrome/rootfs/lib/libe2p.so.2 @@ -0,0 +1 @@ +libe2p.so.2.3 \ No newline at end of file diff --git a/nichrome/rootfs/lib/libe2p.so.2.3 b/nichrome/rootfs/lib/libe2p.so.2.3 new file mode 100755 index 000000000..a4dbcbb42 Binary files /dev/null and b/nichrome/rootfs/lib/libe2p.so.2.3 differ diff --git a/nichrome/rootfs/lib/libext2fs.so.2 b/nichrome/rootfs/lib/libext2fs.so.2 new file mode 120000 index 000000000..60d5fb9ff --- /dev/null +++ b/nichrome/rootfs/lib/libext2fs.so.2 @@ -0,0 +1 @@ +libext2fs.so.2.4 \ No newline at end of file diff --git a/nichrome/rootfs/lib/libext2fs.so.2.4 b/nichrome/rootfs/lib/libext2fs.so.2.4 new file mode 100755 index 000000000..76378ddad Binary files /dev/null and b/nichrome/rootfs/lib/libext2fs.so.2.4 differ diff --git a/nichrome/rootfs/lib/libm-2.24.so b/nichrome/rootfs/lib/libm-2.24.so new file mode 100755 index 000000000..48412cbba Binary files /dev/null and b/nichrome/rootfs/lib/libm-2.24.so differ diff --git a/nichrome/rootfs/lib/libm.so.6 b/nichrome/rootfs/lib/libm.so.6 new file mode 120000 index 000000000..c3a11f38d --- /dev/null +++ b/nichrome/rootfs/lib/libm.so.6 @@ -0,0 +1 @@ +libm-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libnsl-2.24.so b/nichrome/rootfs/lib/libnsl-2.24.so new file mode 100755 index 000000000..98147dfdb Binary files /dev/null and b/nichrome/rootfs/lib/libnsl-2.24.so differ diff --git a/nichrome/rootfs/lib/libnsl.so.1 b/nichrome/rootfs/lib/libnsl.so.1 new file mode 120000 index 000000000..2287f72ee --- /dev/null +++ b/nichrome/rootfs/lib/libnsl.so.1 @@ -0,0 +1 @@ +libnsl-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libnss_compat-2.17.so b/nichrome/rootfs/lib/libnss_compat-2.17.so new file mode 100755 index 000000000..4073f72c3 Binary files /dev/null and b/nichrome/rootfs/lib/libnss_compat-2.17.so differ diff --git a/nichrome/rootfs/lib/libnss_compat-2.24.so b/nichrome/rootfs/lib/libnss_compat-2.24.so new file mode 100755 index 000000000..14480162e Binary files /dev/null and b/nichrome/rootfs/lib/libnss_compat-2.24.so differ diff --git a/nichrome/rootfs/lib/libnss_compat.so.2 b/nichrome/rootfs/lib/libnss_compat.so.2 new file mode 120000 index 000000000..fd755dc39 --- /dev/null +++ b/nichrome/rootfs/lib/libnss_compat.so.2 @@ -0,0 +1 @@ +libnss_compat-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libnss_dns-2.17.so b/nichrome/rootfs/lib/libnss_dns-2.17.so new file mode 100755 index 000000000..c3a78ccd9 Binary files /dev/null and b/nichrome/rootfs/lib/libnss_dns-2.17.so differ diff --git a/nichrome/rootfs/lib/libnss_dns-2.24.so b/nichrome/rootfs/lib/libnss_dns-2.24.so new file mode 100755 index 000000000..8f89a8276 Binary files /dev/null and b/nichrome/rootfs/lib/libnss_dns-2.24.so differ diff --git a/nichrome/rootfs/lib/libnss_dns.so.2 b/nichrome/rootfs/lib/libnss_dns.so.2 new file mode 120000 index 000000000..662a31a81 --- /dev/null +++ b/nichrome/rootfs/lib/libnss_dns.so.2 @@ -0,0 +1 @@ +libnss_dns-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libnss_files-2.17.so b/nichrome/rootfs/lib/libnss_files-2.17.so new file mode 100755 index 000000000..a1d68771e Binary files /dev/null and b/nichrome/rootfs/lib/libnss_files-2.17.so differ diff --git a/nichrome/rootfs/lib/libnss_files-2.24.so b/nichrome/rootfs/lib/libnss_files-2.24.so new file mode 100755 index 000000000..f15e7e5f9 Binary files /dev/null and b/nichrome/rootfs/lib/libnss_files-2.24.so differ diff --git a/nichrome/rootfs/lib/libnss_files.so.2 b/nichrome/rootfs/lib/libnss_files.so.2 new file mode 120000 index 000000000..225033d71 --- /dev/null +++ b/nichrome/rootfs/lib/libnss_files.so.2 @@ -0,0 +1 @@ +libnss_files-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libpthread-2.17.so b/nichrome/rootfs/lib/libpthread-2.17.so new file mode 100755 index 000000000..c881b362c Binary files /dev/null and b/nichrome/rootfs/lib/libpthread-2.17.so differ diff --git a/nichrome/rootfs/lib/libpthread-2.24.so b/nichrome/rootfs/lib/libpthread-2.24.so new file mode 100755 index 000000000..82caa63ff Binary files /dev/null and b/nichrome/rootfs/lib/libpthread-2.24.so differ diff --git a/nichrome/rootfs/lib/libpthread.so.0 b/nichrome/rootfs/lib/libpthread.so.0 new file mode 120000 index 000000000..b195df275 --- /dev/null +++ b/nichrome/rootfs/lib/libpthread.so.0 @@ -0,0 +1 @@ +libpthread-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libresolv-2.24.so b/nichrome/rootfs/lib/libresolv-2.24.so new file mode 100755 index 000000000..6371925e1 Binary files /dev/null and b/nichrome/rootfs/lib/libresolv-2.24.so differ diff --git a/nichrome/rootfs/lib/libresolv.so.2 b/nichrome/rootfs/lib/libresolv.so.2 new file mode 120000 index 000000000..6a4db655d --- /dev/null +++ b/nichrome/rootfs/lib/libresolv.so.2 @@ -0,0 +1 @@ +libresolv-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/librt-2.17.so b/nichrome/rootfs/lib/librt-2.17.so new file mode 100755 index 000000000..981750894 Binary files /dev/null and b/nichrome/rootfs/lib/librt-2.17.so differ diff --git a/nichrome/rootfs/lib/librt-2.24.so b/nichrome/rootfs/lib/librt-2.24.so new file mode 100755 index 000000000..b0844e681 Binary files /dev/null and b/nichrome/rootfs/lib/librt-2.24.so differ diff --git a/nichrome/rootfs/lib/librt.so.1 b/nichrome/rootfs/lib/librt.so.1 new file mode 120000 index 000000000..dffcece8b --- /dev/null +++ b/nichrome/rootfs/lib/librt.so.1 @@ -0,0 +1 @@ +librt-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libutil-2.24.so b/nichrome/rootfs/lib/libutil-2.24.so new file mode 100755 index 000000000..c8b1c1b92 Binary files /dev/null and b/nichrome/rootfs/lib/libutil-2.24.so differ diff --git a/nichrome/rootfs/lib/libutil.so.1 b/nichrome/rootfs/lib/libutil.so.1 new file mode 120000 index 000000000..e08b86f19 --- /dev/null +++ b/nichrome/rootfs/lib/libutil.so.1 @@ -0,0 +1 @@ +libutil-2.24.so \ No newline at end of file diff --git a/nichrome/rootfs/lib/libuuid.so.1 b/nichrome/rootfs/lib/libuuid.so.1 new file mode 120000 index 000000000..774fbfec2 --- /dev/null +++ b/nichrome/rootfs/lib/libuuid.so.1 @@ -0,0 +1 @@ +libuuid.so.1.3.0 \ No newline at end of file diff --git a/nichrome/rootfs/lib/libuuid.so.1.3.0 b/nichrome/rootfs/lib/libuuid.so.1.3.0 new file mode 100755 index 000000000..2fb40f1b1 Binary files /dev/null and b/nichrome/rootfs/lib/libuuid.so.1.3.0 differ diff --git a/nichrome/rootfs/lib/udev/firmware.sh b/nichrome/rootfs/lib/udev/firmware.sh new file mode 100755 index 000000000..d90164345 --- /dev/null +++ b/nichrome/rootfs/lib/udev/firmware.sh @@ -0,0 +1,27 @@ +#!/bin/sh -e + +FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware" + +err() { + echo "$@" >&2 + if [ -x /usr/bin/logger ]; then + /usr/bin/logger -t "${0##*/}[$$]" "$@" + fi +} + +if [ ! -e /sys$DEVPATH/loading ]; then + err "udev firmware loader misses sysfs directory" + exit 1 +fi + +for DIR in $FIRMWARE_DIRS; do + [ -e "$DIR/$FIRMWARE" ] || continue + echo 1 > /sys$DEVPATH/loading + cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data + echo 0 > /sys$DEVPATH/loading + exit 0 +done + +echo -1 > /sys$DEVPATH/loading +err "Cannot find firmware file '$FIRMWARE'" +exit 1 diff --git a/nichrome/rootfs/lib/udev/pcmcia-check-broken-cis b/nichrome/rootfs/lib/udev/pcmcia-check-broken-cis new file mode 100755 index 000000000..c47063090 Binary files /dev/null and b/nichrome/rootfs/lib/udev/pcmcia-check-broken-cis differ diff --git a/nichrome/rootfs/lib/udev/pcmcia-socket-startup b/nichrome/rootfs/lib/udev/pcmcia-socket-startup new file mode 100755 index 000000000..dc4b17835 Binary files /dev/null and b/nichrome/rootfs/lib/udev/pcmcia-socket-startup differ diff --git a/nichrome/rootfs/lib/x86_64-linux-gnu/libc.so.6 b/nichrome/rootfs/lib/x86_64-linux-gnu/libc.so.6 new file mode 100755 index 000000000..c45a753fd Binary files /dev/null and b/nichrome/rootfs/lib/x86_64-linux-gnu/libc.so.6 differ diff --git a/nichrome/rootfs/lib/x86_64-linux-gnu/libm.so.6 b/nichrome/rootfs/lib/x86_64-linux-gnu/libm.so.6 new file mode 100644 index 000000000..9a15b1c82 Binary files /dev/null and b/nichrome/rootfs/lib/x86_64-linux-gnu/libm.so.6 differ diff --git a/nichrome/rootfs/usr/lib/libanl.so b/nichrome/rootfs/usr/lib/libanl.so new file mode 120000 index 000000000..1aa73a4ba --- /dev/null +++ b/nichrome/rootfs/usr/lib/libanl.so @@ -0,0 +1 @@ +../../lib/libanl.so.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libblkid.so b/nichrome/rootfs/usr/lib/libblkid.so new file mode 120000 index 000000000..b567a5e43 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libblkid.so @@ -0,0 +1 @@ +../../lib/libblkid.so.1.1.0 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libcom_err.so b/nichrome/rootfs/usr/lib/libcom_err.so new file mode 120000 index 000000000..7f20c97fb --- /dev/null +++ b/nichrome/rootfs/usr/lib/libcom_err.so @@ -0,0 +1 @@ +/lib/libcom_err.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libcrypt.so b/nichrome/rootfs/usr/lib/libcrypt.so new file mode 120000 index 000000000..f2c4c80f7 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libcrypt.so @@ -0,0 +1 @@ +../../lib/libcrypt.so.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libdl.so b/nichrome/rootfs/usr/lib/libdl.so new file mode 120000 index 000000000..7afa95af6 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libdl.so @@ -0,0 +1 @@ +../../lib/libdl.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libe2p.so b/nichrome/rootfs/usr/lib/libe2p.so new file mode 120000 index 000000000..241a46d0c --- /dev/null +++ b/nichrome/rootfs/usr/lib/libe2p.so @@ -0,0 +1 @@ +/lib/libe2p.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libext2fs.so b/nichrome/rootfs/usr/lib/libext2fs.so new file mode 120000 index 000000000..f015752f6 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libext2fs.so @@ -0,0 +1 @@ +/lib/libext2fs.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libfuse.so.2 b/nichrome/rootfs/usr/lib/libfuse.so.2 new file mode 100644 index 000000000..005de8829 Binary files /dev/null and b/nichrome/rootfs/usr/lib/libfuse.so.2 differ diff --git a/nichrome/rootfs/usr/lib/libgcc_s.so b/nichrome/rootfs/usr/lib/libgcc_s.so new file mode 100644 index 000000000..c8e92242f --- /dev/null +++ b/nichrome/rootfs/usr/lib/libgcc_s.so @@ -0,0 +1,4 @@ +/* GNU ld script + Use the shared library, but some functions are only in + the static library. */ +GROUP ( libgcc_s.so.1 -lgcc ) diff --git a/nichrome/rootfs/usr/lib/libgcc_s.so.1 b/nichrome/rootfs/usr/lib/libgcc_s.so.1 new file mode 100644 index 000000000..14f25745f Binary files /dev/null and b/nichrome/rootfs/usr/lib/libgcc_s.so.1 differ diff --git a/nichrome/rootfs/usr/lib/libnsl.so b/nichrome/rootfs/usr/lib/libnsl.so new file mode 120000 index 000000000..37b57e4e5 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libnsl.so @@ -0,0 +1 @@ +../../lib/libnsl.so.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libnss_compat.so b/nichrome/rootfs/usr/lib/libnss_compat.so new file mode 120000 index 000000000..88fb049cd --- /dev/null +++ b/nichrome/rootfs/usr/lib/libnss_compat.so @@ -0,0 +1 @@ +../../lib/libnss_compat.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libnss_dns.so b/nichrome/rootfs/usr/lib/libnss_dns.so new file mode 120000 index 000000000..350021a2d --- /dev/null +++ b/nichrome/rootfs/usr/lib/libnss_dns.so @@ -0,0 +1 @@ +../../lib/libnss_dns.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libnss_files.so b/nichrome/rootfs/usr/lib/libnss_files.so new file mode 120000 index 000000000..0d5d219d0 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libnss_files.so @@ -0,0 +1 @@ +../../lib/libnss_files.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libresolv.so b/nichrome/rootfs/usr/lib/libresolv.so new file mode 120000 index 000000000..c1959f955 --- /dev/null +++ b/nichrome/rootfs/usr/lib/libresolv.so @@ -0,0 +1 @@ +../../lib/libresolv.so.2 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/librt.so b/nichrome/rootfs/usr/lib/librt.so new file mode 120000 index 000000000..75d37e95f --- /dev/null +++ b/nichrome/rootfs/usr/lib/librt.so @@ -0,0 +1 @@ +../../lib/librt.so.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libstdc++.so b/nichrome/rootfs/usr/lib/libstdc++.so new file mode 120000 index 000000000..4217476cb --- /dev/null +++ b/nichrome/rootfs/usr/lib/libstdc++.so @@ -0,0 +1 @@ +libstdc++.so.6.0.22 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libstdc++.so.6 b/nichrome/rootfs/usr/lib/libstdc++.so.6 new file mode 120000 index 000000000..4217476cb --- /dev/null +++ b/nichrome/rootfs/usr/lib/libstdc++.so.6 @@ -0,0 +1 @@ +libstdc++.so.6.0.22 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libstdc++.so.6.0.22 b/nichrome/rootfs/usr/lib/libstdc++.so.6.0.22 new file mode 100755 index 000000000..3f0e8b73e Binary files /dev/null and b/nichrome/rootfs/usr/lib/libstdc++.so.6.0.22 differ diff --git a/nichrome/rootfs/usr/lib/libsudo_noexec.so b/nichrome/rootfs/usr/lib/libsudo_noexec.so new file mode 120000 index 000000000..1f882bc4b --- /dev/null +++ b/nichrome/rootfs/usr/lib/libsudo_noexec.so @@ -0,0 +1 @@ +sudo_noexec.so \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libsysfs.so b/nichrome/rootfs/usr/lib/libsysfs.so new file mode 120000 index 000000000..c1a12d2ea --- /dev/null +++ b/nichrome/rootfs/usr/lib/libsysfs.so @@ -0,0 +1 @@ +libsysfs.so.2.0.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libsysfs.so.2 b/nichrome/rootfs/usr/lib/libsysfs.so.2 new file mode 120000 index 000000000..c1a12d2ea --- /dev/null +++ b/nichrome/rootfs/usr/lib/libsysfs.so.2 @@ -0,0 +1 @@ +libsysfs.so.2.0.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libsysfs.so.2.0.1 b/nichrome/rootfs/usr/lib/libsysfs.so.2.0.1 new file mode 100755 index 000000000..7f71f22ed Binary files /dev/null and b/nichrome/rootfs/usr/lib/libsysfs.so.2.0.1 differ diff --git a/nichrome/rootfs/usr/lib/libutil.so b/nichrome/rootfs/usr/lib/libutil.so new file mode 120000 index 000000000..2d450b0fa --- /dev/null +++ b/nichrome/rootfs/usr/lib/libutil.so @@ -0,0 +1 @@ +../../lib/libutil.so.1 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libuuid.so b/nichrome/rootfs/usr/lib/libuuid.so new file mode 120000 index 000000000..464fe3d9b --- /dev/null +++ b/nichrome/rootfs/usr/lib/libuuid.so @@ -0,0 +1 @@ +../../lib/libuuid.so.1.3.0 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libz.so b/nichrome/rootfs/usr/lib/libz.so new file mode 120000 index 000000000..2bfad1b2a --- /dev/null +++ b/nichrome/rootfs/usr/lib/libz.so @@ -0,0 +1 @@ +libz.so.1.2.8 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libz.so.1 b/nichrome/rootfs/usr/lib/libz.so.1 new file mode 120000 index 000000000..2bfad1b2a --- /dev/null +++ b/nichrome/rootfs/usr/lib/libz.so.1 @@ -0,0 +1 @@ +libz.so.1.2.8 \ No newline at end of file diff --git a/nichrome/rootfs/usr/lib/libz.so.1.2.8 b/nichrome/rootfs/usr/lib/libz.so.1.2.8 new file mode 100755 index 000000000..c5205a34e Binary files /dev/null and b/nichrome/rootfs/usr/lib/libz.so.1.2.8 differ diff --git a/nichrome/rootfs/usr/sound.sh b/nichrome/rootfs/usr/sound.sh new file mode 100755 index 000000000..a529ccbe2 --- /dev/null +++ b/nichrome/rootfs/usr/sound.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Use this script to back up your /etc and /tcz directories to the stateful +# partition on your local hard drive. Makes testing sound configuration easier. +# It assumes you have installed the three main ALSA tcz packages already. + +# make sure the first arg is only save or load +if [ -n $1 ] && ([ $1 = "save" ] || [ $1 = "load" ]); then + # if the mount directory does not exist, make it + if [ ! -d /mnt ]; then + mkdir mnt + fi + # if the mount directory is empy, mount partition 1 to it + if [ -z "$(ls -a /mnt)" ]; then + mount -t ext4 /dev/mmcblk*p1 /mnt/ + fi + # if the user requested to save, save + if [ $1 = "save" ]; then + cp -r /tcz /mnt + cp -r /etc /mnt + # if the user requested to load, load and install alsa tcz packages. + elif [ $1 = "load" ]; then + cp -r /mnt/tcz / + cp -r /mnt/etc / + tcz -i alsa-config alsa-plugins alsa + fi + # otherwise, print usage +else + echo "Usage: ./usr/sound.sh [save load]" +fi diff --git a/nichrome/rootfs/usr/user.cpio b/nichrome/rootfs/usr/user.cpio new file mode 100644 index 000000000..f8e85732c Binary files /dev/null and b/nichrome/rootfs/usr/user.cpio differ diff --git a/nichrome/scripts/.gitignore b/nichrome/scripts/.gitignore new file mode 100644 index 000000000..567609b12 --- /dev/null +++ b/nichrome/scripts/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/nichrome/scripts/base_image_util.sh b/nichrome/scripts/base_image_util.sh new file mode 100755 index 000000000..e6c87e5a9 --- /dev/null +++ b/nichrome/scripts/base_image_util.sh @@ -0,0 +1,286 @@ +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +. "toolchain_utils.sh" || exit 1 +. "common.sh" || exit 1 +CHROMEOS_MASTER_CONFIG_FILE="${BOARD_ROOT}/usr/share/chromeos-config/config.dtb" +BUILD_DIR="build" +BUILD_LIBRARY_DIR="." +SCRIPTS_DIR="." +echo "HERE" +. "${BUILD_LIBRARY_DIR}/disk_layout_util.sh" || exit 1 +echo "HERE" +. "${BUILD_LIBRARY_DIR}/mount_gpt_util.sh" || exit 1 +echo "HERE" +. "${BUILD_LIBRARY_DIR}/build_image_util.sh" || exit 1 +echo "HERE" + + +check_full_disk() { + local prev_ret=$? + + # Disable die on error. + set +e + + # See if we ran out of space. Only show if we errored out via a trap. + if [[ ${prev_ret} -ne 0 ]]; then + local df=$(df -B 1M "${root_fs_dir}") + if [[ ${df} == *100%* ]]; then + error "Here are the biggest [partially-]extracted files (by disk usage):" + # Send final output to stderr to match `error` behavior. + sudo find "${root_fs_dir}" -xdev -type f -printf '%b %P\n' | \ + awk '$1 > 16 { $1 = $1 * 512; print }' | sort -n | tail -100 1>&2 + error "Target image has run out of space:" + error "${df}" + fi + fi + + # Turn die on error back on. + set -e +} + +zero_free_space() { + local fs_mount_point=$1 + + if ! mountpoint -q "${fs_mount_point}"; then + info "Not zeroing freespace in ${fs_mount_point} since it isn't a mounted" \ + "filesystem. This is normal for squashfs and ubifs partitions." + return 0 + fi + + info "Zeroing freespace in ${fs_mount_point}" + # dd is a silly thing and will produce a "No space left on device" message + # that cannot be turned off and is confusing to unsuspecting victims. + info "${fs_mount_point}/filler" + ( sudo dd if=/dev/zero of="${fs_mount_point}/filler" bs=4096 conv=fdatasync \ + status=noxfer || true ) 2>&1 | grep -v "No space left on device" + sudo rm "${fs_mount_point}/filler" +} + +# create_dev_install_lists updates package lists used by +# chromeos-base/dev-install +create_dev_install_lists() { + local root_fs_dir=$1 + + info "Building dev-install package lists" + + local pkgs=( + portage + virtual/target-os + virtual/target-os-dev + virtual/target-os-test + ) + + local pkgs_out=$(mktemp -d) + + for pkg in "${pkgs[@]}" ; do + emerge-${BOARD} --color n --pretend --quiet --emptytree \ + --root-deps=rdeps ${pkg} | \ + egrep -o ' [[:alnum:]-]+/[^[:space:]/]+\b' | \ + tr -d ' ' | \ + sort > "${pkgs_out}/${pkg##*/}.packages" + local _pipestatus=${PIPESTATUS[*]} + [[ ${_pipestatus// } -eq 0 ]] || error "\`emerge-${BOARD} ${pkg}\` failed" + done + + # bootstrap = portage - target-os + comm -13 "${pkgs_out}/target-os.packages" \ + "${pkgs_out}/portage.packages" > "${pkgs_out}/bootstrap.packages" + + # chromeos-base = target-os + portage - virtuals + sort -u "${pkgs_out}/target-os.packages" "${pkgs_out}/portage.packages" \ + | grep -v "virtual/" \ + > "${pkgs_out}/chromeos-base.packages" + + # package.installable = target-os-dev + target-os-test - target-os + virtuals + comm -23 <(cat "${pkgs_out}/target-os-dev.packages" \ + "${pkgs_out}/target-os-test.packages" | sort) \ + "${pkgs_out}/target-os.packages" \ + > "${pkgs_out}/package.installable" + grep "virtual/" "${pkgs_out}/target-os.packages" \ + >> "${pkgs_out}/package.installable" + + # Add dhcp to the list of packages installed since its installation will not + # complete (can not add dhcp group since /etc is not writeable). Bootstrap it + # instead. + grep "net-misc/dhcp-" "${pkgs_out}/target-os-dev.packages" \ + >> "${pkgs_out}/chromeos-base.packages" || true + grep "net-misc/dhcp-" "${pkgs_out}/target-os-dev.packages" \ + >> "${pkgs_out}/bootstrap.packages" || true + + sudo mkdir -p \ + "${root_fs_dir}/usr/share/dev-install/portage/make.profile/package.provided" + sudo cp "${pkgs_out}/bootstrap.packages" \ + "${root_fs_dir}/usr/share/dev-install/portage" + sudo cp "${pkgs_out}/package.installable" \ + "${root_fs_dir}/usr/share/dev-install/portage/make.profile" + sudo cp "${pkgs_out}/chromeos-base.packages" \ + "${root_fs_dir}/usr/share/dev-install/portage/make.profile/package.provided" + + rm -r "${pkgs_out}" +} + +install_libc() { + root_fs_dir="$1" + # We need to install libc manually from the cross toolchain. + # TODO: Improve this? It would be ideal to use emerge to do this. + libc_version="$(get_variable "${BOARD_ROOT}/${SYSROOT_SETTINGS_FILE}" \ + "LIBC_VERSION")" + PKGDIR="/var/lib/portage/pkgs" + local libc_atom="cross-${CHOST}/glibc-${libc_version}" + LIBC_PATH="${PKGDIR}/${libc_atom}.tbz2" + + if [[ ! -e ${LIBC_PATH} ]]; then + sudo emerge --nodeps -gf "=${libc_atom}" + fi + + # Strip out files we don't need in the final image at runtime. + local libc_excludes=( + # Compile-time headers. + 'usr/include' 'sys-include' + # Link-time objects. + '*.[ao]' + # Debug commands not used by normal runtime code. + 'usr/bin/'{getent,ldd} + # LD_PRELOAD objects for debugging. + 'lib*/lib'{memusage,pcprofile,SegFault}.so 'usr/lib*/audit' + # We only use files & dns with nsswitch, so throw away the others. + 'lib*/libnss_'{compat,db,hesiod,nis,nisplus}'*.so*' + # This is only for very old packages which we don't have. + 'lib*/libBrokenLocale*.so*' + ) + pbzip2 -dc --ignore-trailing-garbage=1 "${LIBC_PATH}" | \ + sudo tar xpf - -C "${root_fs_dir}" ./usr/${CHOST} \ + --strip-components=3 "${libc_excludes[@]/#/--exclude=}" +} + +create_base_image() { + local image_name=$1 + local rootfs_verification_enabled=$2 + local bootcache_enabled=$3 + local output_dev=$4 + local image_type="usb" + + BUILD_DIR="build" + check_valid_layout "base" + check_valid_layout "${image_type}" + + echo "Using image type ${image_type}" + get_disk_layout_path + echo "Using disk layout ${DISK_LAYOUT_PATH}" + + mkdir -p "$BUILD_DIR" + + root_fs_dir="${BUILD_DIR}/rootfs" + stateful_fs_dir="${BUILD_DIR}/stateful" + esp_fs_dir="${BUILD_DIR}/esp" + + mkdir "${root_fs_dir}" "${stateful_fs_dir}" "${esp_fs_dir}" + echo "Building GPT IMAGE" + build_gpt_image "${output_dev}" "${image_type}" + + echo "Mounting GPT IMAGE" + mount_image "${output_dev}" "${root_fs_dir}" \ + "${stateful_fs_dir}" "${esp_fs_dir}" + + echo "Df- h command" + df -h "${root_fs_dir}" + + # Create symlinks so that /usr/local/usr based directories are symlinked to + # /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc. + + # INSTALL KERNEL ON PARTITION 2 + + local kernel_partition="2" + sudo dd if=kernels/linux.bin of=${output_dev}${kernel_partition} + + "${VBOOT_SIGNING_DIR}"/insert_container_publickey.sh \ + "${root_fs_dir}" \ + "${VBOOT_DEVKEYS_DIR}"/cros-oci-container-pub.pem + + + "${GCLIENT_ROOT}/chromite/bin/cros_set_lsb_release" \ + --sysroot="${root_fs_dir}" \ + --board="${BOARD}" \ + "${model_flags[@]}" \ + ${builder_path} \ + --version_string="${CHROMEOS_VERSION_STRING}" \ + --auserver="${CHROMEOS_VERSION_AUSERVER}" \ + --devserver="${CHROMEOS_VERSION_DEVSERVER}" \ + ${official_flag} \ + --buildbot_build="${BUILDBOT_BUILD:-"N/A"}" \ + --track="${CHROMEOS_VERSION_TRACK:-"developer-build"}" \ + --branch_number="${CHROMEOS_BRANCH}" \ + --build_number="${CHROMEOS_BUILD}" \ + --chrome_milestone="${CHROME_BRANCH}" \ + --patch_number="${CHROMEOS_PATCH}" \ + "${arc_flags[@]}" + + # Set /etc/os-release on the image. + # Note: fields in /etc/os-release can come from different places: + # * /etc/os-release itself with docrashid + # * /etc/os-release.d for fields created with do_osrelease_field + sudo "${GCLIENT_ROOT}/chromite/bin/cros_generate_os_release" \ + --root="${root_fs_dir}" \ + --version="${CHROME_BRANCH}" \ + --build_id="${CHROMEOS_VERSION_STRING}" + + # Create the boot.desc file which stores the build-time configuration + # information needed for making the image bootable after creation with + # cros_make_image_bootable. + create_boot_desc "${image_type}" + + # Write out the GPT creation script. + # This MUST be done before writing bootloader templates else we'll break + # the hash on the root FS. + write_partition_script "${image_type}" \ + "${root_fs_dir}/${PARTITION_SCRIPT_PATH}" + sudo chown root:root "${root_fs_dir}/${PARTITION_SCRIPT_PATH}" + + # Populates the root filesystem with legacy bootloader templates + # appropriate for the platform. The autoupdater and installer will + # use those templates to update the legacy boot partition (12/ESP) + # on update. + # (This script does not populate vmlinuz.A and .B needed by syslinux.) + # Factory install shims may be booted from USB by legacy EFI BIOS, which does + # not support verified boot yet (see create_legacy_bootloader_templates.sh) + # so rootfs verification is disabled if we are building with --factory_install + local enable_rootfs_verification= + if [[ ${rootfs_verification_enabled} -eq ${FLAGS_TRUE} ]]; then + enable_rootfs_verification="--enable_rootfs_verification" + fi + local enable_bootcache= + if [[ ${bootcache_enabled} -eq ${FLAGS_TRUE} ]]; then + enable_bootcache="--enable_bootcache" + fi + + create_legacy_bootloader_templates.sh \ + --arch=${ARCH} \ + --board=${BOARD} \ + --image_type="${image_type}" \ + --to="${root_fs_dir}"/boot \ + --boot_args="${FLAGS_boot_args}" \ + --enable_serial="${FLAGS_enable_serial}" \ + --loglevel="${FLAGS_loglevel}" \ + ${enable_rootfs_verification} \ + ${enable_bootcache} + + + + # Zero rootfs free space to make it more compressible so auto-update + # payloads become smaller + zero_free_space "${root_fs_dir}" + + unmount_image + trap - EXIT + + USE_DEV_KEYS="--use_dev_keys" + + if [[ ${skip_kernelblock_install} -ne 1 ]]; then + # Place flags before positional args. + ${SCRIPTS_DIR}/bin/cros_make_image_bootable "${BUILD_DIR}" \ + ${output_dev} ${USE_DEV_KEYS} --adjust_part="${FLAGS_adjust_part}" + fi +} +create_base_image $1 $2 $3 $4 diff --git a/nichrome/scripts/bin/cros_get_chrome_version b/nichrome/scripts/bin/cros_get_chrome_version new file mode 100755 index 000000000..80267c552 --- /dev/null +++ b/nichrome/scripts/bin/cros_get_chrome_version @@ -0,0 +1,45 @@ +#!/bin/bash + +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Returns the version of Chrome running on a remote machine. + +# --- BEGIN COMMON.SH BOILERPLATE --- +# Load common CrOS utilities. Inside the chroot this file is installed in +# /usr/lib/crosutils. Outside the chroot we find it relative to the script's +# location. +find_common_sh() { + local common_paths=("$(dirname "$(readlink -f "$0")")/.." /usr/lib/crosutils) + local path + + SCRIPT_ROOT="${common_paths[0]}" + for path in "${common_paths[@]}"; do + if [ -r "${path}/common.sh" ]; then + SCRIPT_ROOT="${path}" + break + fi + done +} + +find_common_sh +. "${SCRIPT_ROOT}/common.sh" || exit 1 +# --- END COMMON.SH BOILERPLATE --- + +. "${SCRIPT_ROOT}/remote_access.sh" || exit 1 + +FLAGS "$@" || exit 1 + +switch_to_strict_mode + +# TMP necessary for remote_access_init. +TMP=$(mktemp -d /tmp/cros_check_chrome_version.XXXX) +trap "rm -rf ${TMP}" EXIT + +remote_access_init &> /dev/null + +remote_sh "/opt/google/chrome/chrome --version" +CHROME_VERSION=$(echo ${REMOTE_OUT} | \ + sed 's/.* \([0-9]\+.[0-9]\+.[0-9]\+.[0-9]\+\).*/\1/') +echo "${CHROME_VERSION}" diff --git a/nichrome/scripts/bin/cros_make_image_bootable b/nichrome/scripts/bin/cros_make_image_bootable new file mode 100755 index 000000000..aeb5f4b41 --- /dev/null +++ b/nichrome/scripts/bin/cros_make_image_bootable @@ -0,0 +1,448 @@ +#!/bin/bash +# +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Script which ensures that a given image has an up-to-date +# kernel partition, rootfs integrity hashes, and legacy bootloader configs. + +# --- BEGIN COMMON.SH BOILERPLATE --- +# Load common CrOS utilities. Inside the chroot this file is installed in +# /usr/lib/crosutils. Outside the chroot we find it relative to the script's +# location. +find_common_sh() { + local common_paths=("$(dirname "$(readlink -f "$0")")/.." /usr/lib/crosutils) + local path + + SCRIPT_ROOT="${common_paths[0]}" + for path in "${common_paths[@]}"; do + if [ -r "${path}/common.sh" ]; then + SCRIPT_ROOT="${path}" + break + fi + done +} + +find_common_sh +. "${SCRIPT_ROOT}/common.sh" || exit 1 +# --- END COMMON.SH BOILERPLATE --- + +# Need to be inside the chroot to load chromeos-common.sh + +# Load functions and constants for chromeos-install +. chromeos-common.sh || exit 1 +. "build_image_util.sh" || exit 1 +. "disk_layout_util.sh" || exit 1 +. "mount_gpt_util.sh" || exit 1 + +switch_to_strict_mode + +if [ $# -lt 2 ]; then + echo "Usage: ${0} /PATH/TO/IMAGE IMAGE.BIN [shflags overrides]" + exit 1 +fi + +IMAGE_DIR="$(readlink -f "${1}")" +IMAGE="${2}" +shift +shift +FLAG_OVERRIDES=( "$@" ) + +if get_boot_desc "${IMAGE_DIR}/boot.desc"; then + info "Boot-time configuration for ${IMAGE_DIR}:" + for flag in "${boot_desc_flags[@]}"; do + info " ${flag}" + done +else + warn "Falling back to command line parsing." +fi + +if [ ! -r "${IMAGE}" ]; then + die "${IMAGE} cannot be read!" +fi + + +set +e + +# Now parse the build settings from ${OUTPUT_DIR}/boot.desc +DEFINE_string adjust_part "" \ + "Adjustments to apply to the partition table" +DEFINE_string board "${DEFAULT_BOARD}" \ + "Board we're building for." +DEFINE_string image_type "base" \ + "Type of image we're building for (base/factory_install)." +DEFINE_string output_dir "/tmp" \ + "Directory to place output in." +DEFINE_string image "chromiumos_base.img" \ + "Full path to the chromiumos image to make bootable." +DEFINE_string arch "x86" \ + "Architecture to make bootable for: arm, mips, x86, or amd64" +DEFINE_boolean cleanup_dirs ${FLAGS_TRUE} \ + "Whether the mount dirs should be removed on completion." + +DEFINE_string boot_args "noinitrd" \ + "Additional boot arguments to pass to the commandline" + +DEFINE_integer rootfs_size 720 \ + "rootfs filesystem size in MBs." +# ceil(0.1 * rootfs_size) is a good minimum. +DEFINE_integer rootfs_hash_pad 8 \ + "MBs reserved at the end of the rootfs image." + +DEFINE_string rootfs_hash "/tmp/rootfs.hash" \ + "Path where the rootfs hash should be stored." +# TODO(taysom): when we turn on boot cache, both verification and +# bootcache should have their default be FLAGS_TRUE. +DEFINE_boolean enable_rootfs_verification ${FLAGS_TRUE} \ + "Default all bootloaders to NOT use kernel-based root fs integrity checking." +DEFINE_boolean enable_bootcache ${FLAGS_FALSE} \ + "Default all bootloaders to NOT use bootcache." +DEFINE_integer verity_error_behavior 3 \ + "Kernel verified boot error behavior (0: I/O errors, 1: reboot, 2: nothing)" +DEFINE_integer verity_max_ios -1 \ + "Number of outstanding I/O operations dm-verity caps at." +DEFINE_string verity_algorithm "sha1" \ + "Cryptographic hash algorithm used for kernel vboot." +DEFINE_string verity_salt "" \ + "Salt for rootfs hash tree." + +DEFINE_string keys_dir "${VBOOT_DEVKEYS_DIR}" \ + "Directory containing the signing keys." + +DEFINE_string rootfs_mountpoint "/tmp/rootfs" \ + "Path where the rootfs can be safely mounted" +DEFINE_string statefulfs_mountpoint "/tmp/statefulfs" \ + "Path where the statefulfs can be safely mounted" +DEFINE_string espfs_mountpoint "/tmp/espfs" \ + "Path where the espfs can be safely mounted" + +DEFINE_boolean use_dev_keys ${FLAGS_FALSE} \ + "Use developer keys for signing. (Default: false)" + +DEFINE_boolean fsck_rootfs ${FLAGS_FALSE} \ + "Check integrity of the rootfs on the modified image." + +# TODO(pkumar): Remove once known that no images are using this flag +DEFINE_boolean crosbug12352_arm_kernel_signing ${FLAGS_FALSE} \ + "This flag is deprecated but the bots still need parse old images." + +# TODO(sosa): Remove once known images no longer use this in their config. +DEFINE_string arm_extra_bootargs "" "DEPRECATED FLAG. Do not use." + +DEFINE_boolean force_developer_mode ${FLAGS_FALSE} \ + "Add cros_debug to boot args." + +DEFINE_string enable_serial "" \ + "Enable serial port for printks. Example values: ttyS0" +DEFINE_integer loglevel 7 \ + "The loglevel to add to the kernel command line." + +# Parse the boot.desc and any overrides +set -- "${boot_desc_flags[@]}" "${FLAG_OVERRIDES[@]}" +FLAGS "${@}" || exit 1 + +[ -z "${FLAGS_verity_salt}" ] && FLAGS_verity_salt=$(make_salt) + +# Only now can we die on error. shflags functions leak non-zero error codes, +# so will die prematurely if 'switch_to_strict_mode' is specified before now. +switch_to_strict_mode -u + +append_boot_flag() { + local file="$1" + local pattern="$2" + local base_pattern="$3" + + [ -f "${file}" ] || return ${FLAGS_TRUE} + grep -wq "${pattern}" "${file}" && return ${FLAGS_TRUE} + sudo sed -i "s/\b${base_pattern}\b/& ${pattern}/g" "${file}" +} + +check_kernel_size() { + local kernel_image_size="$1" + local kernel_part="$2" + local kernel_slot="$3" + local kernel_partition_size=$(get_partition_size ${FLAGS_image_type} \ + ${kernel_part}) + local kernel_partition_size_90=$(( kernel_partition_size * 90 / 100 )) + info "Kernel partition ${kernel_slot} size is ${kernel_partition_size} bytes." + if [[ ${kernel_image_size} -gt ${kernel_partition_size} ]]; then + die "Kernel image won't fit in partition ${kernel_slot}!" + elif [[ ${kernel_image_size} -gt ${kernel_partition_size_90} ]]; then + warn "Kernel partition ${kernel_slot} is more than 90% full!" + fi +} + +build_img() { + local image_name="$1" + local root_dev="$2" + local root_dev_size="$3" + local keyblock="$4" + local private="$5" + local public="$6" + local vblock=${7:-""} + + # Default to non-verified + local enable_rootfs_verification_flag=--noenable_rootfs_verification + if [[ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]]; then + enable_rootfs_verification_flag=--enable_rootfs_verification + fi + local enable_bootcache_flag=--noenable_bootcache + if [[ ${FLAGS_enable_bootcache} -eq ${FLAGS_TRUE} ]]; then + enable_bootcache_flag=--enable_bootcache + fi + + if [[ -n "${vblock}" ]]; then + vblock=--hd_vblock="${FLAGS_output_dir}/${vblock}" + fi + + ./build_kernel_image.sh \ + --board="${FLAGS_board}" \ + --arch="${FLAGS_arch}" \ + --to="${FLAGS_output_dir}/${image_name}" \ + --vmlinuz="${FLAGS_rootfs_mountpoint}/boot/vmlinuz" \ + --working_dir="${FLAGS_output_dir}" \ + --boot_args="${FLAGS_boot_args}" \ + --keep_work \ + --rootfs_image=${root_dev} \ + --rootfs_image_size=${root_dev_size} \ + --rootfs_hash=${FLAGS_rootfs_hash} \ + --verity_hash_alg=${FLAGS_verity_algorithm} \ + --verity_max_ios=${FLAGS_verity_max_ios} \ + --verity_error_behavior=${FLAGS_verity_error_behavior} \ + --verity_salt=${FLAGS_verity_salt} \ + --keys_dir="${FLAGS_keys_dir}" \ + --keyblock="${keyblock}" \ + --private="${private}" \ + --public="${public}" \ + --enable_serial="${FLAGS_enable_serial}" \ + ${vblock} \ + ${enable_rootfs_verification_flag} \ + ${enable_bootcache_flag} +} + +make_image_bootable() { + local image="$1" + + # Update legacy boot config templates (in rootfs) before rootfs is locked. + # This is required because postinst will copy new legacy boot configurations + # from rootfs partition instead of modifying existing entries in EFI + # partition. + if [ ${FLAGS_force_developer_mode} -eq ${FLAGS_TRUE} ]; then + trap "unmount_image ; die 'cros_make_image_bootable failed.'" EXIT + mount_image "${image}" "${FLAGS_rootfs_mountpoint}" \ + "${FLAGS_statefulfs_mountpoint}" "" "" + + append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/root.A.cfg" \ + "cros_debug" "cros_legacy" + append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/root.B.cfg" \ + "cros_debug" "cros_legacy" + append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/usb.A.cfg" \ + "cros_debug" "cros_legacy" + append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/efi/boot/grub.cfg" \ + "cros_debug" "cros_efi" + + unmount_image + trap - EXIT + fi + + # Make the filesystem un-mountable as read-write. + # mount_gpt_image.sh will undo this as needed. + # TODO(wad) make sure there is parity in the signing scripts. + if [ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]; then + # TODO(wad) this would be a good place to reset any other ext2 metadata. + warn "Disabling r/w mount of the root filesystem" + local rootfs_offset="$(partoffset ${image} 3)" + disable_rw_mount "${image}" "$(( rootfs_offset * 512 ))" + fi + + trap "unmount_image ; die 'cros_make_image_bootable failed.'" EXIT + mount_image "${image}" "${FLAGS_rootfs_mountpoint}" \ + "${FLAGS_statefulfs_mountpoint}" "" "--safe" + + # Newer `mount` will decode the filename backing the loop device, + # so we need to dig deeper and find the answer ourselves. + root_dev=$(awk -v mnt="${FLAGS_rootfs_mountpoint}" \ + '$2 == mnt { print $1 }' /proc/mounts) + if [[ -z "${root_dev}" ]]; then + # If the read-only rootfs is not mounted via the kernel using a real block + # device and we need to create one here. So far, all the filesystems we + # use in the rootfs can be mounted read-only by the kernel (including + # squashfs) so we just exit if that's the case. + die "Didn't find the rootfs block device device after mounting it." + fi + + # We sign the image with the recovery_key, because this is what goes onto the + # USB key. We can only boot from the USB drive in recovery mode. + # For dev install shim, we need to use the installer keyblock instead of + # the recovery keyblock because of the difference in flags. + local keyblock + if [ ${FLAGS_use_dev_keys} -eq ${FLAGS_TRUE} ]; then + keyblock=installer_kernel.keyblock + info "DEBUG: use dev install keyblock" + else + keyblock=recovery_kernel.keyblock + info "DEBUG: use recovery keyblock" + fi + + if [ ${FLAGS_force_developer_mode} -eq ${FLAGS_TRUE} ]; then + FLAGS_boot_args="${FLAGS_boot_args} cros_debug" + fi + + # Builds the kernel partition image. + local partition_num_root_a="$(get_layout_partition_number \ + "${FLAGS_image_type}" ROOT-A)" + local rootfs_fs_size=$(get_filesystem_size "${FLAGS_image_type}" \ + "${partition_num_root_a}") + #build_img "vmlinuz.image" "${root_dev}" "${rootfs_fs_size}" "${keyblock}" \ + # "recovery_kernel_data_key.vbprivk" "recovery_key.vbpubk" + #build_img "hd_vmlinuz.image" "${root_dev}" "${rootfs_fs_size}" \ + # "kernel.keyblock" "kernel_data_key.vbprivk" "kernel_subkey.vbpubk" \ + # "vmlinuz_hd.vblock" + + # Check the size of kernel image and issue warning when image size is + # near the limit. + local kernel_image_size_A=$(stat -c '%s' kernels/linux.bin) + info "Kernel image A size is ${kernel_image_size_A} bytes." + local kernel_image_size_B=$(stat -c '%s' kernels/linux.bin) + info "Kernel image B size is ${kernel_image_size_B} bytes." + local partition_num_kern_a="$(get_layout_partition_number \ + "${FLAGS_image_type}" KERN-A)" + check_kernel_size ${kernel_image_size_A} ${partition_num_kern_a} A + local partition_num_kern_b="$(get_layout_partition_number \ + "${FLAGS_image_type}" KERN-B)" + check_kernel_size ${kernel_image_size_B} ${partition_num_kern_b} B + +# local rootfs_hash_size=$(stat -c '%s' ${FLAGS_rootfs_hash}) +# local rootfs_partition_size=$(get_partition_size ${FLAGS_image_type} \ +# ${partition_num_root_a}) +# local rootfs_hash_pad=$(( rootfs_partition_size - rootfs_fs_size )) +# info "Appending rootfs.hash (${rootfs_hash_size} bytes) to the root fs" +# if [[ ${rootfs_hash_size} -gt ${rootfs_hash_pad} ]] +# then +# die "rootfs_partition_size - rootfs_fs_size is less than the needed " \ +# "rootfs_hash_size (${rootfs_hash_size}), update your disk layout " \ +# "configuration" +# fi +# # Unfortunately, mount_gpt_image uses mount and not losetup to create the +# # loop devices. This means that they are not the correct size. We have to +# # write directly to the image to append the hash tree data. +# local hash_offset="$(partoffset ${image} ${partition_num_root_a})" +# hash_offset=$((hash_offset + (${rootfs_fs_size} / 512))) +# sudo dd bs=512 \ +# seek=${hash_offset} \ +# if="${FLAGS_rootfs_hash}" \ +# of="${image}" \ +# conv=notrunc \ +# status=none +# +# # Move the verification block needed for the hard disk install to the +# # stateful partition. Mount stateful fs, copy file, and umount fs. +# # In original CL: http://codereview.chromium.org/2868044, this was done in +# # create_base_image(). However, it could break the build if it is a clean +# # build because vmlinuz_hd.vblock hasn't been created by build_kernel_image.sh +# # In some builds that don't use vboot to verify the kernel, this file might +# # not get created as part of the build, so only copy them if they were. +# if [ -f "${FLAGS_output_dir}/vmlinuz_hd.vblock" ]; then +# sudo cp "${FLAGS_output_dir}/vmlinuz_hd.vblock" \ +# "${FLAGS_statefulfs_mountpoint}" +# fi + + # Install the kernel to both slots A and B so there will always be a regular + # kernel in slot B on recovery and non-recovery images. + local koffset="$(partoffset ${image} ${partition_num_kern_a})" + sudo dd if="kernels/linux.bin" of="${image}" \ + conv=notrunc bs=512 seek=${koffset} status=none + koffset="$(partoffset ${image} ${partition_num_kern_b})" + sudo dd if="kernels/linux.bin" of="${image}" \ + conv=notrunc bs=512 seek=${koffset} status=none + + # Update the bootloaders. The EFI system partition will be updated. +# local kernel_part= +# +# # We should update the esp in place in the image. +# local bootloader_to="${image}" +# local partition_num_efi_system="$(get_layout_partition_number \ +# "${FLAGS_image_type}" EFI-SYSTEM)" +# local esp_offset="$(partoffset ${image} ${partition_num_efi_system})" +# esp_offset=$((esp_offset * 512)) # sectors to bytes +# local esp_size="$(partsize ${image} ${partition_num_efi_system})" +# esp_size=$((esp_size * 512)) # sectors to bytes +# local bootloader_to_flags="--to_offset=${esp_offset} --to_size=${esp_size}" +# +# if [[ "${FLAGS_arch}" = "x86" || "${FLAGS_arch}" = "amd64" ]]; then +# # Use the kernel partition to acquire configuration flags. +# kernel_part="--kernel_partition='${FLAGS_output_dir}/vmlinuz.image'" +# # Install syslinux on the EFI System Partition. +# kernel_part="${kernel_part} --install_syslinux" +# elif [[ "${FLAGS_arch}" = "arm" || "${FLAGS_arch}" = "mips" ]]; then +# # These flags are not used for ARM / MIPS update_bootloaders.sh +# kernel_part="" +# fi +# +# if [[ ${esp_size} -gt 0 ]]; then +# # Update EFI partition +# ./update_bootloaders.sh \ +# --arch="${FLAGS_arch}" \ +# --image_type="${FLAGS_image_type}" \ +# --to="${bootloader_to}" \ +# --from="${FLAGS_rootfs_mountpoint}"/boot \ +# --vmlinuz="${FLAGS_rootfs_mountpoint}"/boot/vmlinuz \ +# ${bootloader_to_flags} \ +# ${kernel_part} +# fi +# +# # We don't need to keep these files around anymore. +# sudo rm -f "${FLAGS_rootfs_hash}" "${FLAGS_output_dir}/vmlinuz.image" \ +# "${FLAGS_output_dir}/hd_vmlinuz.image" \ +# "${FLAGS_output_dir}/vmlinuz_hd.vblock" +# + unmount_image + trap - EXIT +} + +verify_image_rootfs() { + local image=$1 + local partition_num_root_a="$(get_layout_partition_number \ + "${FLAGS_image_type}" ROOT-A)" + local rootfs_offset="$(partoffset ${image} ${partition_num_root_a})" + + local rootfs_tmp_file=$(mktemp) + trap "rm ${rootfs_tmp_file}" EXIT + sudo dd if="${image}" of="${rootfs_tmp_file}" bs=512 skip="${rootfs_offset}" \ + status=none + + # This flips the read-only compatibility flag, so that + # e2fsck does not complain about unknown file system capabilities. + enable_rw_mount "${rootfs_tmp_file}" + info "Running e2fsck to check root file system for errors" + sudo e2fsck -fn "${rootfs_tmp_file}" || + die "Root file system has errors, please ensure boot.desc and/or \ +command line parameters are correct" +} + +# Store output and temporary files next to image. +FLAGS_output_dir="${IMAGE_DIR}" +FLAGS_rootfs_hash="${IMAGE_DIR}/rootfs.hash" +FLAGS_rootfs_mountpoint="${IMAGE_DIR}/rootfs_dir" +FLAGS_statefulfs_mountpoint="${IMAGE_DIR}/stateful_dir" +FLAGS_espfs_mountpoint="${IMAGE_DIR}/esp" + +# Create the directories if they don't exist. +mkdir -p ${FLAGS_rootfs_mountpoint} +mkdir -p ${FLAGS_statefulfs_mountpoint} +mkdir -p ${FLAGS_espfs_mountpoint} + +make_image_bootable "${IMAGE}" +if type -p board_make_image_bootable; then + board_make_image_bootable "${IMAGE}" +fi +if [ ${FLAGS_fsck_rootfs} -eq ${FLAGS_TRUE} ]; then + verify_image_rootfs "${IMAGE}" +fi + +if [ ${FLAGS_cleanup_dirs} -eq ${FLAGS_TRUE} ]; then + rmdir ${FLAGS_rootfs_mountpoint} + rmdir ${FLAGS_statefulfs_mountpoint} + rmdir ${FLAGS_espfs_mountpoint} +fi diff --git a/nichrome/scripts/bin/cros_start_vm b/nichrome/scripts/bin/cros_start_vm new file mode 100755 index 000000000..ffb9f59ae --- /dev/null +++ b/nichrome/scripts/bin/cros_start_vm @@ -0,0 +1,36 @@ +#!/bin/bash + +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Simple wrapper script to start a vm using the vm lib. +. "$(dirname "$0")/../common.sh" || exit 1 + +. "${SCRIPTS_DIR}/lib/cros_vm_lib.sh" || die "Unable to load cros_vm_lib.sh" +. "${SCRIPTS_DIR}/lib/cros_vm_constants.sh" || \ + die "Unable to load cros_vm_constants.sh" + +DEFINE_string board "${DEFAULT_BOARD}" \ + "Board for VM image (unnecessary if path given)" +DEFINE_string image_path "" "Full path of the VM image" + +set -e + +# Parse command line. +FLAGS "$@" || exit 1 +eval set -- "${FLAGS_ARGV}" + +# Use latest if not specified. +if [ -z "${FLAGS_image_path}" ]; then + LATEST_IMAGE="$(${SCRIPTS_DIR}/get_latest_image.sh \ + --board=${FLAGS_board})/${DEFAULT_QEMU_IMAGE}" + info "Using latest vm image ${LATEST_IMAGE}" + FLAGS_image_path=${LATEST_IMAGE} +fi + +[ -e "${FLAGS_image_path}" ] || die "Image ${FLAGS_image_path} does not exist." + +start_kvm "${FLAGS_image_path}" "${FLAGS_board}" + +echo "ssh root@localhost -p ${FLAGS_ssh_port} -o StrictHostKeyChecking=no" diff --git a/nichrome/scripts/bin/cros_stop_vm b/nichrome/scripts/bin/cros_stop_vm new file mode 100755 index 000000000..7811bee50 --- /dev/null +++ b/nichrome/scripts/bin/cros_stop_vm @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Simple wrapper script to stop a vm specified from a pid file. +. "$(dirname "$0")/../common.sh" || exit 1 + +. "${SCRIPTS_DIR}/lib/cros_vm_lib.sh" || die "Unable to load cros_vm_lib.sh" + +set -e + +# Parse command line. +FLAGS "$@" || exit 1 +eval set -- "${FLAGS_ARGV}" + +# Requires pid file to be set. +if [ -z "${FLAGS_kvm_pid}" ]; then + die "Must specify file with pid of kvm to kill." +fi + +KVM_PID_FILE="${FLAGS_kvm_pid}" +stop_kvm diff --git a/nichrome/scripts/bin/proxy-gw b/nichrome/scripts/bin/proxy-gw new file mode 100755 index 000000000..19fe3da6b --- /dev/null +++ b/nichrome/scripts/bin/proxy-gw @@ -0,0 +1,63 @@ +#!/bin/bash +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# $1 = hostname, $2 = port +# +# Use socat to connect to the specified host and port via one of the proxies +# defined in the environment, if the target host does not appear in the +# no_proxy environment variable. + +DEST_HOST="$1" +DEST_PORT="$2" + +# Determine whether the destination host is in the "no_proxy" list. +use_proxy="true" +GLOBIGNORE="*" +for a_host in ${no_proxy//,/ } ; do + case "${a_host}" in + "*") # A "*" matches all hosts. + use_proxy="false" + break + ;; + .*) # Items of the form ".some.fqdn" imply match-at-end. + if [[ "${DEST_HOST}" == *"${a_host}" ]]; then + use_proxy="false" + break + fi + ;; + ${DEST_HOST}) # Items of the form "some.fqdn" imply exact-match. + use_proxy="false" + break + ;; + esac +done + +if [[ -n "${all_proxy}" ]]; then + PROXY="${all_proxy}" + TYPE=SOCKS4 + PORT_ATTR=socksport +elif [[ -n "${https_proxy}" ]]; then + PROXY="${https_proxy}" + TYPE=PROXY + PORT_ATTR=proxyport +elif [[ -n "${http_proxy}" ]]; then + PROXY="${http_proxy}" + TYPE=PROXY + PORT_ATTR=proxyport +else + use_proxy="false" +fi + +if [[ "${use_proxy}" == "true" ]]; then + PROXY="${PROXY#*://}" + PROXY="${PROXY%%/*}" + PROXY_HOST="${PROXY%%:*}" + PROXY_PORT="${PROXY##*:}" + PARMS="${PROXY_HOST}:${DEST_HOST}:${DEST_PORT},${PORT_ATTR}=${PROXY_PORT}" + socat_args=( "${TYPE}:${PARMS}" ) +else + socat_args=( TCP:"${DEST_HOST}":"${DEST_PORT}" ) +fi +exec socat STDIO "${socat_args[@]}" diff --git a/nichrome/scripts/board_options.sh b/nichrome/scripts/board_options.sh new file mode 100755 index 000000000..50f6243fa --- /dev/null +++ b/nichrome/scripts/board_options.sh @@ -0,0 +1,25 @@ +# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +if [[ -z "${FLAGS_board}" ]]; then + if [[ -z "${SRC_IMAGE}" ]]; then + die "--board or SRC_IMAGE are required." + fi + + # If --board is not set, get the board name from the image. + FLAGS_board="$( + . "${BUILD_LIBRARY_DIR}/mount_gpt_util.sh" + get_board_from_image "${SRC_IMAGE}" + )" +fi + +BOARD="${FLAGS_board}" +BOARD_ROOT="/build/${BOARD}" + +if [[ ! -d "${BOARD_ROOT}" ]]; then + die_notrace "The board has not been set up: ${BOARD}" +fi + +# What cross-build are we targeting? +. "${BOARD_ROOT}/etc/make.conf.board_setup" diff --git a/nichrome/scripts/build_image_util.sh b/nichrome/scripts/build_image_util.sh new file mode 100755 index 000000000..9dd17e9d5 --- /dev/null +++ b/nichrome/scripts/build_image_util.sh @@ -0,0 +1,326 @@ +# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Shell library for functions and initialization private to +# build_image, and not specific to any particular kind of image. +# +# TODO(jrbarnette): There's nothing holding this code together in +# one file aside from its lack of anywhere else to go. Probably, +# this file should get broken up or otherwise reorganized. + +# Use canonical path since some tools (e.g. mount) do not like symlinks. +# Append build attempt to output directory. +IMAGE_SUBDIR="R${CHROME_BRANCH}" +if [ -z "${FLAGS_version}" ]; then + IMAGE_SUBDIR="${IMAGE_SUBDIR}-${CHROMEOS_VERSION_STRING}-a\ +${FLAGS_build_attempt}" +else + IMAGE_SUBDIR="${IMAGE_SUBDIR}-${FLAGS_version}" +fi + +if [ -n "${FLAGS_output_suffix}" ]; then + IMAGE_SUBDIR="${IMAGE_SUBDIR}-${FLAGS_output_suffix}" +fi + +BUILD_DIR="${FLAGS_build_root}/${BOARD}/${IMAGE_SUBDIR}" +OUTPUT_DIR="${FLAGS_output_root}/${BOARD}/${IMAGE_SUBDIR}" +OUTSIDE_OUTPUT_DIR="../build/images/${BOARD}/${IMAGE_SUBDIR}" +IMAGES_TO_BUILD= + +EMERGE_BOARD_CMD="$GCLIENT_ROOT/chromite/bin/parallel_emerge" +EMERGE_BOARD_CMD="$EMERGE_BOARD_CMD --board=$BOARD" + +export INSTALL_MASK="${DEFAULT_INSTALL_MASK}" + +if [[ $FLAGS_jobs -ne -1 ]]; then + EMERGE_JOBS="--jobs=$FLAGS_jobs" +fi + +# Populates list of IMAGES_TO_BUILD from args passed in. +# Arguments should be the shortnames of images we want to build. +get_images_to_build() { + local image_to_build + for image_to_build in $*; do + # Shflags leaves "'"s around ARGV. + case ${image_to_build} in + \'base\' ) + IMAGES_TO_BUILD="${IMAGES_TO_BUILD} ${CHROMEOS_BASE_IMAGE_NAME}" + ;; + \'dev\' ) + IMAGES_TO_BUILD="${IMAGES_TO_BUILD} ${CHROMEOS_DEVELOPER_IMAGE_NAME}" + ;; + \'test\' ) + IMAGES_TO_BUILD="${IMAGES_TO_BUILD} ${CHROMEOS_TEST_IMAGE_NAME}" + ;; + \'factory_install\' ) + IMAGES_TO_BUILD="${IMAGES_TO_BUILD} \ + ${CHROMEOS_FACTORY_INSTALL_SHIM_NAME}" + ;; + * ) + die "${image_to_build} is not an image specification." + ;; + esac + done + + # Set default if none specified. + if [ -z "${IMAGES_TO_BUILD}" ]; then + IMAGES_TO_BUILD=${CHROMEOS_DEVELOPER_IMAGE_NAME} + fi + + info "The following images will be built ${IMAGES_TO_BUILD}." +} + +# Look at flags to determine which image types we should build. +parse_build_image_args() { + get_images_to_build ${FLAGS_ARGV} + if should_build_image ${CHROMEOS_BASE_IMAGE_NAME} \ + ${CHROMEOS_DEVELOPER_IMAGE_NAME} ${CHROMEOS_TEST_IMAGE_NAME} && \ + should_build_image ${CHROMEOS_FACTORY_INSTALL_SHIM_NAME}; then + die_notrace \ + "Can't build ${CHROMEOS_FACTORY_INSTALL_SHIM_NAME} with any other" \ + "image." + fi + if should_build_image ${CHROMEOS_FACTORY_INSTALL_SHIM_NAME}; then + # For factory, force rootfs verification and bootcache off + FLAGS_enable_rootfs_verification=${FLAGS_FALSE} + FLAGS_enable_bootcache=${FLAGS_FALSE} + FLAGS_bootcache_use_board_default=${FLAGS_FALSE} + fi +} + +check_blacklist() { + info "Verifying that the base image does not contain a blacklisted package." + info "Generating list of packages for ${BASE_PACKAGE}." + local package_blacklist_file="${BUILD_LIBRARY_DIR}/chromeos_blacklist" + if [ ! -e "${package_blacklist_file}" ]; then + warn "Missing blacklist file." + return + fi + local blacklisted_packages=$(${SCRIPTS_DIR}/get_package_list \ + --board="${BOARD}" "${BASE_PACKAGE}" \ + | grep -x -f "${package_blacklist_file}") + if [ -n "${blacklisted_packages}" ]; then + die "Blacklisted packages found: ${blacklisted_packages}." + fi + info "No blacklisted packages found." +} + +make_salt() { + # It is not important that the salt be cryptographically strong; it just needs + # to be different for each release. The purpose of the salt is just to ensure + # that if someone collides a block in one release, they can't reuse it in + # future releases. + xxd -l 32 -p -c 32 /dev/urandom +} + +# Create a boot.desc file containing flags used to create this image. +# The format is a bit fragile -- make sure get_boot_desc parses it back. +create_boot_desc() { + local image_type=$1 + + local enable_rootfs_verification_flag="" + if [[ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]]; then + enable_rootfs_verification_flag="--enable_rootfs_verification" + fi + local enable_bootcache_flag="" + if [[ ${FLAGS_enable_bootcache} -eq ${FLAGS_TRUE} ]]; then + enable_bootcache_flag=--enable_bootcache + fi + + [ -z "${FLAGS_verity_salt}" ] && FLAGS_verity_salt=$(make_salt) + cat < ${BUILD_DIR}/boot.desc + --board=${BOARD} + --image_type=${image_type} + --arch="${ARCH}" + --keys_dir="${VBOOT_DEVKEYS_DIR}" + --boot_args="${FLAGS_boot_args}" + --nocleanup_dirs + --verity_algorithm=sha1 + --enable_serial="${FLAGS_enable_serial}" + --loglevel="${FLAGS_loglevel}" + ${enable_rootfs_verification_flag} + ${enable_bootcache_flag} +EOF +} + +# Extract flags saved in boot.desc and return it via the boot_desc_flags array. +get_boot_desc() { + local boot_desc_file=$1 + local line + + if [[ ! -r ${boot_desc_file} ]]; then + warn "${boot_desc_file}: cannot be read" + return 1 + fi + + # Do not mark this local as it is the return value. + boot_desc_flags=() + while read line; do + if [[ -z ${line} ]]; then + continue + fi + + # Hand extract the quotes to deal with random content in the value. + # e.g. When you pass --boot_args="foo=\"\$bar'" to build_image, we write it + # out in the file as --boot_args="foo="$bar'" which is a parse error if we + # tried to eval it directly. + line=$(echo "${line}" | sed -r \ + -e 's:^\s+::;s:\s+$::' -e "s:^(--[^=]+=)([\"'])(.*)\2$:\1\3:") + boot_desc_flags+=( "${line}" ) + done <"${boot_desc_file}" +} + +# Utility function for moving the build directory to the output root. +move_image() { + local source="$1" + local destination="$2" + # If the output_root isn't the same as the build_root, move the resulting + # image to the correct place in output_root. + if [[ "${source}" != "${destination}" ]]; then + info "Moving the image to: ${destination}." + mkdir -p "${destination}" + mv "${source}"/* "${destination}" + rmdir "${source}" + fi +} + +delete_prompt() { + echo "An error occurred in your build so your latest output directory" \ + "is invalid." + + # Only prompt if both stdin and stdout are a tty. If either is not a tty, + # then the user may not be present, so we shouldn't bother prompting. + if [ -t 0 -a -t 1 -a "${USER}" != 'chrome-bot' ]; then + read -p "Would you like to delete the output directory (y/N)? " SURE + SURE="${SURE:0:1}" # Get just the first character. + else + SURE="y" + echo "Running in non-interactive mode so deleting output directory." + fi + if [ "${SURE}" == "y" ] ; then + sudo rm -rf "${BUILD_DIR}" + echo "Deleted ${BUILD_DIR}" + else + move_image "${BUILD_DIR}" "${OUTPUT_DIR}" + echo "Not deleting ${OUTPUT_DIR}." + fi +} + +# Basic command to emerge binary packages into the target image. +# Arguments to this command are passed as addition options/arguments +# to the basic emerge command. +emerge_to_image() { + sudo -E ${EMERGE_BOARD_CMD} --root-deps=rdeps --usepkgonly -v \ + "$@" ${EMERGE_JOBS} +} + +# Create the /etc/shadow file with all the right entries. +SHARED_USER_NAME="chronos" +SHARED_USER_PASSWD_FILE="/etc/shared_user_passwd.txt" +setup_etc_shadow() { + local root=$1 + local shadow="${root}/etc/shadow" + local passwd="${root}/etc/passwd" + local line + local cmds + + # Remove the file completely so we know it is fully initialized + # with the correct permissions. Note: we're just making it writable + # here to simplify scripting; permission fixing happens at the end. + cmds=( + "rm -f '${shadow}'" + "install -m 666 /dev/null '${shadow}'" + ) + sudo_multi "${cmds[@]}" + + # Create shadow entries for all accounts in /etc/passwd that says + # they expect it. Otherwise, pam will not let people even log in + # via ssh keyauth. http://crbug.com/361864 + while read -r line; do + local acct=$(cut -d: -f1 <<<"${line}") + local pass=$(cut -d: -f2 <<<"${line}") + + # For the special shared user account, load the shared user password + # if one has been set. + if [[ ${acct} == "${SHARED_USER_NAME}" && + -e "${SHARED_USER_PASSWD_FILE}" ]]; then + pass=$(<"${SHARED_USER_PASSWD_FILE}") + fi + + case ${pass} in + # Login is disabled -> do nothing. + '!') ;; + # Password will be set later by tools. + '*') ;; + # Password is shadowed. + 'x') + echo "${acct}:*:::::::" >> "${shadow}" + ;; + # Password is set directly. + *) + echo "${acct}:${pass}:::::::" >> "${shadow}" + ;; + esac + done <"${passwd}" + + # Now make the settings sane. + cmds=( + "chown 0:0 '${shadow}'" + "chmod 600 '${shadow}'" + ) + sudo_multi "${cmds[@]}" +} + +# ldconfig cannot generate caches for non-native arches. +# Use qemu & the native ldconfig to work around that. +# http://crbug.com/378377 +run_ldconfig() { + local root_fs_dir=$1 + case ${ARCH} in + arm) + sudo qemu-arm "${root_fs_dir}"/sbin/ldconfig -r "${root_fs_dir}";; + mips) + sudo qemu-mipsel "${root_fs_dir}"/sbin/ldconfig -r "${root_fs_dir}";; + x86|amd64) + sudo ldconfig -r "${root_fs_dir}";; + *) + die "Unable to run ldconfig for ARCH ${ARCH}" + esac +} + +# Runs "depmod" to recalculate the kernel module dependencies. +# Args: +# board_root: root of the build output for the board +# root_fs_dir: target root file system mount point +run_depmod() { + local board_root="$1" + local root_fs_dir="$2" + + local root_fs_modules_path="${root_fs_dir}/lib/modules" + if [[ ! -d "${root_fs_modules_path}" ]]; then + return + fi + + local kernel_path + for kernel_path in "${root_fs_modules_path}/"*; do + local kernel_release="$(basename ${kernel_path})" + local kernel_out_dir="${board_root}/lib/modules/${kernel_release}/build" + local system_map="${kernel_out_dir}/System.map" + + if [[ -r "${system_map}" ]]; then + sudo depmod -ae -F "${system_map}" -b "${root_fs_dir}" "${kernel_release}" + fi + done +} + +# Newer udev versions do not pay attention to individual *.hwdb files +# but require up to date /etc/udev/hwdb.bin. Let's [re]generate it as +# part of build process. +# +# Since hwdb is a generic "key/value database based on modalias strings" +# the version of udevadm found on the host should suffice. +run_udevadm_hwdb() { + local root_fs_dir="$1" + sudo udevadm hwdb --update -r "${root_fs_dir}" +} diff --git a/nichrome/scripts/cgpt b/nichrome/scripts/cgpt new file mode 100755 index 000000000..13cc4e357 Binary files /dev/null and b/nichrome/scripts/cgpt differ diff --git a/nichrome/scripts/cgpt.py b/nichrome/scripts/cgpt.py new file mode 100755 index 000000000..5f00937b3 --- /dev/null +++ b/nichrome/scripts/cgpt.py @@ -0,0 +1,1558 @@ +#!/usr/bin/env python2 +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Parse and operate based on disk layout files.""" + +from __future__ import print_function + +import argparse +import copy +import json +import math +import os +import re +import sys + + +class ConfigNotFound(Exception): + """Config Not Found""" + +class PartitionNotFound(Exception): + """Partition Not Found""" + +class InvalidLayout(Exception): + """Invalid Layout""" + +class InvalidAdjustment(Exception): + """Invalid Adjustment""" + +class InvalidSize(Exception): + """Invalid Size""" + +class ConflictingOptions(Exception): + """Conflicting Options""" + +class ConflictingPartitionOrder(Exception): + """The partition order in the parent and child layout don't match.""" + +class MismatchedRootfsFormat(Exception): + """Rootfs partitions in different formats""" + +class MismatchedRootfsBlocks(Exception): + """Rootfs partitions have different numbers of reserved erase blocks""" + +class MissingEraseBlockField(Exception): + """Partition has reserved erase blocks but not other fields needed""" + +class ExcessFailureProbability(Exception): + """Chances are high that the partition will have too many bad blocks""" + +class UnalignedPartition(Exception): + """Partition size does not divide erase block size""" + +class ExpandNandImpossible(Exception): + """Partition is raw NAND and marked with the incompatible expand feature""" + +class ExcessPartitionSize(Exception): + """Partitions sum to more than the size of the whole device""" + +COMMON_LAYOUT = 'common' +BASE_LAYOUT = 'base' +# Blocks of the partition entry array. +SIZE_OF_PARTITION_ENTRY_ARRAY = 32 +SIZE_OF_PMBR = 1 +SIZE_OF_GPT_HEADER = 1 + + +def ParseHumanNumber(operand): + """Parse a human friendly number + + This handles things like 4GiB and 4MB and such. See the usage string for + full details on all the formats supported. + + Args: + operand: The number to parse (may be an int or string) + + Returns: + An integer + """ + operand = str(operand) + negative = -1 if operand.startswith('-') else 1 + if negative == -1: + operand = operand[1:] + operand_digits = re.sub(r'\D', r'', operand) + + size_factor = block_factor = 1 + suffix = operand[len(operand_digits):].strip() + if suffix: + size_factors = {'B': 0, 'K': 1, 'M': 2, 'G': 3, 'T': 4,} + try: + size_factor = size_factors[suffix[0].upper()] + except KeyError: + raise InvalidAdjustment('Unknown size type %s' % suffix) + if size_factor == 0 and len(suffix) > 1: + raise InvalidAdjustment('Unknown size type %s' % suffix) + block_factors = {'': 1024, 'B': 1000, 'IB': 1024,} + try: + block_factor = block_factors[suffix[1:].upper()] + except KeyError: + raise InvalidAdjustment('Unknown size type %s' % suffix) + + return int(operand_digits) * pow(block_factor, size_factor) * negative + + +def ProduceHumanNumber(number): + """A simple reverse of ParseHumanNumber, converting a number to human form. + + Args: + number: A number (int) to be converted to human form. + + Returns: + A string, such as "1 KiB", that satisfies the condition + ParseHumanNumber(ProduceHumanNumber(i)) == i. + """ + scales = [ + (2**40, 'Ti'), + (10**12, 'T'), + (2**30, 'Gi'), + (10**9, 'G'), + (2**20, 'Mi'), + (10**6, 'M'), + (2**10, 'Ki'), + (10**3, 'K') + ] + for denom, suffix in scales: + if (number % denom) == 0: + return '%d %sB' % (number // denom, suffix) + return str(number) + + +def ParseRelativeNumber(max_number, number): + """Return the number that is relative to |max_number| by |number| + + We support three forms: + 90% - |number| is a percentage of |max_number| + 100 - |number| is the answer already (and |max_number| is ignored) + -90 - |number| is subtracted from |max_number| + + Args: + max_number: The limit to use when |number| is negative or a percent + number: The (possibly relative) number to parse (may be an int or string) + """ + max_number = int(max_number) + number = str(number) + if number.endswith('%'): + percent = float(number[:-1]) / 100 + return int(max_number * percent) + else: + number = ParseHumanNumber(number) + if number < 0: + return max_number + number + else: + return number + + +def _ApplyLayoutOverrides(layout_to_override, layout): + """Applies |layout| overrides on to |layout_to_override|. + + First add missing partition from layout to layout_to_override. + Then, update partitions in layout_to_override with layout information. + """ + # First check that all the partitions defined in both layouts are defined in + # the same order in each layout. Otherwise, the order in which they end up + # in the merged layout doesn't match what the user sees in the child layout. + common_nums = set.intersection( + {part['num'] for part in layout_to_override if 'num' in part}, + {part['num'] for part in layout if 'num' in part}) + layout_to_override_order = [part['num'] for part in layout_to_override + if part.get('num') in common_nums] + layout_order = [part['num'] for part in layout + if part.get('num') in common_nums] + if layout_order != layout_to_override_order: + raise ConflictingPartitionOrder( + 'Layouts share partitions %s but they are in different order: ' + 'layout_to_override: %s, layout: %s' % ( + sorted(common_nums), + [part.get('num') for part in layout_to_override], + [part.get('num') for part in layout])) + + # Merge layouts with the partitions in the same order they are in both + # layouts. + part_index = 0 + for part_to_apply in layout: + num = part_to_apply.get('num') + + if part_index == len(layout_to_override): + # The part_to_apply is past the list of partitions to override, this + # means that is a new partition added at the end. + # Need of deepcopy, in case we change layout later. + layout_to_override.append(copy.deepcopy(part_to_apply)) + elif layout_to_override[part_index].get('num') is None and num is None: + # Allow modifying gaps after a partition. + # TODO(deymo): Drop support for "gap" partitions and use alignment + # instead. + layout_to_override[part_index].update(part_to_apply) + elif num in common_nums: + while layout_to_override[part_index].get('num') != num: + part_index += 1 + layout_to_override[part_index].update(part_to_apply) + else: + # Need of deepcopy, in case we change layout later. + layout_to_override.insert(part_index, copy.deepcopy(part_to_apply)) + part_index += 1 + + +def LoadJSONWithComments(filename): + """Loads a JSON file ignoring lines with comments. + + RFC 7159 doesn't allow comments on the file JSON format. This functions loads + a JSON file removing all the comment lines. A comment line is any line + starting with # and optionally indented with whitespaces. Note that inline + comments are not supported. + + Args: + filename: The input filename. + + Returns: + The parsed JSON object. + """ + regex = re.compile(r'^\s*#.*') + with open(filename) as f: + source = ''.join(regex.sub('', line) for line in f) + return json.loads(source) + + +def _LoadStackedPartitionConfig(filename): + """Loads a partition table and its possible parent tables. + + This does very little validation. It's just enough to walk all of the parent + files and merges them with the current config. Overall validation is left to + the caller. + + Args: + filename: Filename to load into object. + + Returns: + Object containing disk layout configuration + """ + if not os.path.exists(filename): + raise ConfigNotFound('Partition config %s was not found!' % filename) + config = LoadJSONWithComments(filename) + + # Let's first apply our new configs onto base. + common_layout = config['layouts'].setdefault(COMMON_LAYOUT, []) + for layout_name, layout in config['layouts'].iteritems(): + # Don't apply on yourself. + if layout_name == COMMON_LAYOUT or layout_name == '_comment': + continue + + # Need to copy a list of dicts so make a deep copy. + working_layout = copy.deepcopy(common_layout) + _ApplyLayoutOverrides(working_layout, layout) + config['layouts'][layout_name] = working_layout + + dirname = os.path.dirname(filename) + # Now let's inherit the values from all our parents. + for parent in config.get('parent', '').split(): + parent_filename = os.path.join(dirname, parent) + if not os.path.exists(parent_filename): + # Try loading the parent file from the cgpt.py directory (global config). + parent_filename = os.path.join(os.path.join(os.path.dirname(__file__), + parent)) + parent_config = _LoadStackedPartitionConfig(parent_filename) + + # First if the parent is missing any fields the new config has, fill them + # in. + for key in config.keys(): + if key == 'parent': + continue + elif key == 'metadata': + # We handle this especially to allow for inner metadata fields to be + # added / modified. + parent_config.setdefault(key, {}) + parent_config[key].update(config[key]) + else: + parent_config.setdefault(key, config[key]) + + # The overrides work by taking the parent_config, apply the new config + # layout info, and return the resulting config which is stored in the parent + # config. + + # So there's an issue where an inheriting layout file may contain new + # layouts not previously defined in the parent layout. Since we are + # building these layout files based on the parent configs and overriding + # new values, we first add the new layouts not previously defined in the + # parent config using a copy of the base layout from that parent config. + parent_layouts = set(parent_config['layouts']) + config_layouts = set(config['layouts']) + new_layouts = config_layouts - parent_layouts + + # Actually add the copy. Use a copy such that each is unique. + parent_cmn_layout = parent_config['layouts'].setdefault(COMMON_LAYOUT, []) + for layout_name in new_layouts: + parent_config['layouts'][layout_name] = copy.deepcopy(parent_cmn_layout) + + # Iterate through each layout in the parent config and apply the new layout. + common_layout = config['layouts'].setdefault(COMMON_LAYOUT, []) + for layout_name, parent_layout in parent_config['layouts'].iteritems(): + if layout_name == '_comment': + continue + + layout_override = config['layouts'].setdefault(layout_name, []) + if layout_name != COMMON_LAYOUT: + _ApplyLayoutOverrides(parent_layout, common_layout) + + _ApplyLayoutOverrides(parent_layout, layout_override) + + config = parent_config + + config.pop('parent', None) + return config + + +def LoadPartitionConfig(filename): + """Loads a partition tables configuration file into a Python object. + + Args: + filename: Filename to load into object + + Returns: + Object containing disk layout configuration + """ + + valid_keys = set(('_comment', 'metadata', 'layouts', 'parent')) + valid_layout_keys = set(( + '_comment', 'num', 'blocks', 'block_size', 'fs_blocks', 'fs_block_size', + 'uuid', 'label', 'format', 'fs_format', 'type', 'features', + 'size', 'fs_size', 'fs_options', 'erase_block_size', 'hybrid_mbr', + 'reserved_erase_blocks', 'max_bad_erase_blocks', 'external_gpt', + 'page_size', 'size_min', 'fs_size_min')) + valid_features = set(('expand',)) + + config = _LoadStackedPartitionConfig(filename) + try: + metadata = config['metadata'] + for key in ('block_size', 'fs_block_size'): + metadata[key] = ParseHumanNumber(metadata[key]) + + unknown_keys = set(config.keys()) - valid_keys + if unknown_keys: + raise InvalidLayout('Unknown items: %r' % unknown_keys) + + if len(config['layouts']) <= 0: + raise InvalidLayout('Missing "layouts" entries') + + if not BASE_LAYOUT in config['layouts'].keys(): + raise InvalidLayout('Missing "base" config in "layouts"') + + for layout_name, layout in config['layouts'].iteritems(): + if layout_name == '_comment': + continue + + for part in layout: + unknown_keys = set(part.keys()) - valid_layout_keys + if unknown_keys: + raise InvalidLayout('Unknown items in layout %s: %r' % + (layout_name, unknown_keys)) + + if part.get('num') == 'metadata' and 'type' not in part: + part['type'] = 'blank' + + if part['type'] != 'blank': + for s in ('num', 'label'): + if not s in part: + raise InvalidLayout('Layout "%s" missing "%s"' % (layout_name, s)) + + if 'size' in part: + if 'blocks' in part: + raise ConflictingOptions( + '%s: Conflicting settings are used. ' + 'Found section sets both \'blocks\' and \'size\'.' % + part['label']) + part['bytes'] = ParseHumanNumber(part['size']) + if 'size_min' in part: + size_min = ParseHumanNumber(part['size_min']) + if part['bytes'] < size_min: + part['bytes'] = size_min + part['blocks'] = part['bytes'] / metadata['block_size'] + + if part['bytes'] % metadata['block_size'] != 0: + raise InvalidSize( + 'Size: "%s" (%s bytes) is not an even number of block_size: %s' + % (part['size'], part['bytes'], metadata['block_size'])) + + if 'fs_size' in part: + part['fs_bytes'] = ParseHumanNumber(part['fs_size']) + if 'fs_size_min' in part: + fs_size_min = ParseHumanNumber(part['fs_size_min']) + if part['fs_bytes'] < fs_size_min: + part['fs_bytes'] = fs_size_min + if part['fs_bytes'] <= 0: + raise InvalidSize( + 'File system size "%s" must be positive' % + part['fs_size']) + if part['fs_bytes'] > part['bytes']: + raise InvalidSize( + 'Filesystem may not be larger than partition: %s %s: %d > %d' % + (layout_name, part['label'], part['fs_bytes'], part['bytes'])) + if part['fs_bytes'] % metadata['fs_block_size'] != 0: + raise InvalidSize( + 'File system size: "%s" (%s bytes) is not an even number of ' + 'fs blocks: %s' % + (part['fs_size'], part['fs_bytes'], metadata['fs_block_size'])) + if part.get('format') == 'ubi': + part_meta = GetMetadataPartition(layout) + page_size = ParseHumanNumber(part_meta['page_size']) + eb_size = ParseHumanNumber(part_meta['erase_block_size']) + ubi_eb_size = eb_size - 2 * page_size + if (part['fs_bytes'] % ubi_eb_size) != 0: + # Trim fs_bytes to multiple of UBI eraseblock size. + fs_bytes = part['fs_bytes'] - (part['fs_bytes'] % ubi_eb_size) + raise InvalidSize( + 'File system size: "%s" (%d bytes) is not a multiple of UBI ' + 'erase block size (%d). Please set "fs_size" to "%s" in the ' + '"common" layout instead.' % + (part['fs_size'], part['fs_bytes'], ubi_eb_size, + ProduceHumanNumber(fs_bytes))) + + if 'blocks' in part: + part['blocks'] = ParseHumanNumber(part['blocks']) + part['bytes'] = part['blocks'] * metadata['block_size'] + + if 'fs_blocks' in part: + max_fs_blocks = part['bytes'] / metadata['fs_block_size'] + part['fs_blocks'] = ParseRelativeNumber(max_fs_blocks, + part['fs_blocks']) + part['fs_bytes'] = part['fs_blocks'] * metadata['fs_block_size'] + + if part['fs_bytes'] > part['bytes']: + raise InvalidLayout( + 'Filesystem may not be larger than partition: %s %s: %d > %d' % + (layout_name, part['label'], part['fs_bytes'], part['bytes'])) + if 'erase_block_size' in part: + part['erase_block_size'] = ParseHumanNumber(part['erase_block_size']) + if 'page_size' in part: + part['page_size'] = ParseHumanNumber(part['page_size']) + + part.setdefault('features', []) + unknown_features = set(part['features']) - valid_features + if unknown_features: + raise InvalidLayout('%s: Unknown features: %s' % + (part['label'], unknown_features)) + except KeyError as e: + raise InvalidLayout('Layout is missing required entries: %s' % e) + + return config + + +def _GetPrimaryEntryArrayLBA(config): + """Return the start LBA of the primary partition entry array. + + Normally this comes after the primary GPT header but can be adjusted by + setting the "primary_entry_array_lba" key under "metadata" in the config. + + Args: + config: The config dictionary. + + Returns: + The position of the primary partition entry array. + """ + + pmbr_and_header_size = SIZE_OF_PMBR + SIZE_OF_GPT_HEADER + entry_array = config['metadata'].get('primary_entry_array_lba', + pmbr_and_header_size) + if entry_array < pmbr_and_header_size: + raise InvalidLayout('Primary entry array (%d) must be at least %d.' % + entry_array, pmbr_and_header_size) + return entry_array + + +def _HasBadEraseBlocks(partitions): + return 'max_bad_erase_blocks' in GetMetadataPartition(partitions) + + +def _HasExternalGpt(partitions): + return GetMetadataPartition(partitions).get('external_gpt', False) + + +def _GetStartSector(config, partitions): + """Return the first usable location (LBA) for partitions. + + This value is the first LBA after the PMBR, the primary GPT header, and + partition entry array. + + We round it up to 64 to maintain the same layout as before in the normal (no + padding between the primary GPT header and its partition entry array) case. + + Args: + config: The config dictionary. + partitions: List of partitions to process + + Returns: + A suitable LBA for partitions, at least 64. + """ + + if _HasExternalGpt(partitions): + # If the GPT is external, then the offset of the partitions' actual data + # will be 0, and we don't need to make space at the beginning for the GPT. + return 0 + else: + entry_array = _GetPrimaryEntryArrayLBA(config) + start_sector = max(entry_array + SIZE_OF_PARTITION_ENTRY_ARRAY, 64) + return start_sector + + +def GetTableTotals(config, partitions): + """Calculates total sizes/counts for a partition table. + + Args: + config: Partition configuration file object + partitions: List of partitions to process + + Returns: + Dict containing totals data + """ + + start_sector = _GetStartSector(config, partitions) + ret = { + 'expand_count': 0, + 'expand_min': 0, + 'block_count': start_sector * config['metadata']['block_size'] + } + + # Total up the size of all non-expanding partitions to get the minimum + # required disk size. + for partition in partitions: + if partition.get('num') == 'metadata': + continue + if 'expand' in partition['features']: + ret['expand_count'] += 1 + ret['expand_min'] += partition['blocks'] + else: + ret['block_count'] += partition['blocks'] + + # At present, only one expanding partition is permitted. + # Whilst it'd be possible to have two, we don't need this yet + # and it complicates things, so it's been left out for now. + if ret['expand_count'] > 1: + raise InvalidLayout('1 expand partition allowed, %d requested' + % ret['expand_count']) + + ret['min_disk_size'] = ret['block_count'] + ret['expand_min'] + + return ret + + +def GetPartitionTable(options, config, image_type): + """Generates requested image_type layout from a layout configuration. + + This loads the base table and then overlays the requested layout over + the base layout. + + Args: + options: Flags passed to the script + config: Partition configuration file object + image_type: Type of image eg base/test/dev/factory_install + + Returns: + Object representing a selected partition table + """ + + # We make a deep copy so that changes to the dictionaries in this list do not + # persist across calls. + partitions = copy.deepcopy(config['layouts'][image_type]) + metadata = config['metadata'] + + # Convert fs_options to a string. + for partition in partitions: + fs_options = partition.get('fs_options', '') + if isinstance(fs_options, dict): + fs_format = partition.get('fs_format') + fs_options = fs_options.get(fs_format, '') + elif not isinstance(fs_options, basestring): + raise InvalidLayout('Partition number %s: fs_format must be a string or ' + 'dict, not %s' % (partition.get('num'), + type(fs_options))) + if '"' in fs_options or "'" in fs_options: + raise InvalidLayout('Partition number %s: fs_format cannot have quotes' % + partition.get('num')) + partition['fs_options'] = fs_options + + for adjustment_str in options.adjust_part.split(): + adjustment = adjustment_str.split(':') + if len(adjustment) < 2: + raise InvalidAdjustment('Adjustment "%s" is incomplete' % adjustment_str) + + label = adjustment[0] + operator = adjustment[1][0] + operand = adjustment[1][1:] + ApplyPartitionAdjustment(partitions, metadata, label, operator, operand) + + return partitions + + +def ApplyPartitionAdjustment(partitions, metadata, label, operator, operand): + """Applies an adjustment to a partition specified by label + + Args: + partitions: Partition table to modify + metadata: Partition table metadata + label: The label of the partition to adjust + operator: Type of adjustment (+/-/=) + operand: How much to adjust by + """ + + partition = GetPartitionByLabel(partitions, label) + + operand_bytes = ParseHumanNumber(operand) + if operand_bytes % metadata['block_size'] == 0: + operand_blocks = operand_bytes / metadata['block_size'] + else: + raise InvalidAdjustment('Adjustment size %s not divisible by block size %s' + % (operand_bytes, metadata['block_size'])) + + if operator == '+': + partition['blocks'] += operand_blocks + partition['bytes'] += operand_bytes + elif operator == '-': + partition['blocks'] -= operand_blocks + partition['bytes'] -= operand_bytes + elif operator == '=': + partition['blocks'] = operand_blocks + partition['bytes'] = operand_bytes + else: + raise ValueError('unknown operator %s' % operator) + + if partition['type'] == 'rootfs': + # If we're adjusting a rootFS partition, we assume the full partition size + # specified is being used for the filesytem, minus the space reserved for + # the hashpad. + partition['fs_bytes'] = partition['bytes'] + partition['fs_blocks'] = partition['fs_bytes'] / metadata['fs_block_size'] + partition['blocks'] = int(partition['blocks'] * 1.15) + partition['bytes'] = partition['blocks'] * metadata['block_size'] + + +def GetPartitionTableFromConfig(options, layout_filename, image_type): + """Loads a partition table and returns a given partition table type + + Args: + options: Flags passed to the script + layout_filename: The filename to load tables from + image_type: The type of partition table to return + """ + + config = LoadPartitionConfig(layout_filename) + partitions = GetPartitionTable(options, config, image_type) + + return partitions + + +def GetScriptShell(): + """Loads and returns the skeleton script for our output script. + + Returns: + A string containing the skeleton script + """ + + script_shell_path = os.path.join(os.path.dirname(__file__), 'cgpt_shell.sh') + with open(script_shell_path, 'r') as f: + script_shell = ''.join(f.readlines()) + + # Before we return, insert the path to this tool so somebody reading the + # script later can tell where it was generated. + script_shell = script_shell.replace('@SCRIPT_GENERATOR@', script_shell_path) + + return script_shell + + +def GetFullPartitionSize(partition, metadata): + """Get the size of the partition including metadata/reserved space in bytes. + + The partition only has to be bigger for raw NAND devices. Formula: + - Add UBI per-block metadata (2 pages) if partition is UBI + - Round up to erase block size + - Add UBI per-partition metadata (4 blocks) if partition is UBI + - Add reserved erase blocks + """ + + erase_block_size = metadata.get('erase_block_size', 0) + size = partition['bytes'] + + if erase_block_size == 0: + return size + + # See "Flash space overhead" in + # http://www.linux-mtd.infradead.org/doc/ubi.html + # for overhead calculations. + is_ubi = partition.get('format') == 'ubi' + reserved_erase_blocks = partition.get('reserved_erase_blocks', 0) + page_size = metadata.get('page_size', 0) + + if is_ubi: + ubi_block_size = erase_block_size - 2 * page_size + erase_blocks = (size + ubi_block_size - 1) // ubi_block_size + size += erase_blocks * 2 * page_size + + erase_blocks = (size + erase_block_size - 1) // erase_block_size + size = erase_blocks * erase_block_size + + if is_ubi: + size += erase_block_size * 4 + + size += reserved_erase_blocks * erase_block_size + return size + + +def WriteLayoutFunction(options, sfile, func, image_type, config): + """Writes a shell script function to write out a given partition table. + + Args: + options: Flags passed to the script + sfile: File handle we're writing to + func: function of the layout: + for removable storage device: 'partition', + for the fixed storage device: 'base' + image_type: Type of image eg base/test/dev/factory_install + config: Partition configuration file object + """ + + partitions = GetPartitionTable(options, config, image_type) + metadata = GetMetadataPartition(partitions) + partition_totals = GetTableTotals(config, partitions) + + lines = [ + 'write_%s_table() {' % func, + ] + + if _HasExternalGpt(partitions): + # Read GPT from device to get size, then wipe it out and operate + # on GPT in tmpfs. We don't rely on cgpt's ability to deal + # directly with the GPT on SPI NOR flash because rewriting the + # table so many times would take a long time (>30min). + # Also, wiping out the previous GPT with create_image won't work + # for NAND and there's no equivalent via cgpt. + lines += [ + 'gptfile=$(mktemp)', + 'flashrom -r -iRW_GPT:${gptfile}', + 'gptsize=$(stat ${gptfile} --format %s)', + 'dd if=/dev/zero of=${gptfile} bs=${gptsize} count=1', + 'target="-D %d ${gptfile}"' % metadata['bytes'], + ] + else: + lines += [ + 'local target="$1"', + 'create_image "${target}" %d %s' % ( + partition_totals['min_disk_size'], + config['metadata']['block_size']), + ] + + # ${target} is referenced unquoted because it may expand into multiple + # arguments in the case of NAND + lines += [ + 'local curr=%d' % _GetStartSector(config, partitions), + '# Create the GPT headers and tables. Pad the primary ones.', + './cgpt create -p %d ${target}' % (_GetPrimaryEntryArrayLBA(config) - + (SIZE_OF_PMBR + SIZE_OF_GPT_HEADER)), + ] + + metadata = GetMetadataPartition(partitions) + # Pass 1: Set up the expanding partition size. + for partition in partitions: + if partition.get('num') == 'metadata': + continue + partition['var'] = (GetFullPartitionSize(partition, metadata) / + config['metadata']['block_size']) + + if (partition.get('type') != 'blank' and partition['num'] == 1 and + 'expand' in partition['features']): + lines += [ + 'local stateful_size=%s' % partition['blocks'], + 'if [ -b "${target}" ]; then', + ' stateful_size=$(( $(numsectors "${target}") - %d))' % ( + partition_totals['block_count']), + 'fi', + ': $(( stateful_size -= (stateful_size %% %d) ))' % ( + config['metadata']['fs_block_size']), + ] + partition['var'] = '${stateful_size}' + + # Pass 2: Write out all the cgpt add commands. + for partition in partitions: + if partition.get('num') == 'metadata': + continue + if partition['type'] != 'blank': + lines += [ + './cgpt add -i %d -b ${curr} -s %s -t %s -l "%s" ${target}' % ( + partition['num'], str(partition['var']), partition['type'], + partition['label']), + ] + + # Increment the curr counter ready for the next partition. + if partition['var'] != 0 and partition.get('num') != 'metadata': + lines += [ + ': $(( curr += %s ))' % partition['var'], + ] + + # Set default priorities and retry counter on kernel partitions. + tries = 15 + prio = 15 + # The order of partition numbers in this loop matters. + # Make sure partition #2 is the first one, since it will be marked as + # default bootable partition. + for partition in GetPartitionsByType(partitions, 'kernel'): + lines += [ + './cgpt add -i %s -S 0 -T %i -P %i ${target}' % + (partition['num'], tries, prio) + ] + prio = 0 + # When not writing 'base' function, make sure the other partitions are + # marked as non-bootable (retry count == 0), since the USB layout + # doesn't have any valid data in slots B & C. But with base function, + # called by chromeos-install script, the KERNEL A partition is replicated + # into both slots A & B, so we should leave both bootable for error + # recovery in this case. + if func != 'base': + tries = 0 + + efi_partitions = GetPartitionsByType(partitions, 'efi') + if efi_partitions: + lines += [ + './cgpt boot -p -b $2 -i %d ${target}' % efi_partitions[0]['num'], + './cgpt add -i %s -B 1 ${target}' % efi_partitions[0]['num'], + ] + else: + # Provide a PMBR all the time for boot loaders (like u-boot) + # that expect one to always be there. + lines += [ + './cgpt boot -p -b $2 ${target}', + ] + + if metadata.get('hybrid_mbr'): + lines += ['install_hybrid_mbr ${target}'] + lines += ['./cgpt show ${target}'] + + if _HasExternalGpt(partitions): + lines += ['flashrom -w -iRW_GPT:${gptfile} --fast-verify'] + + sfile.write('%s\n}\n' % '\n '.join(lines)) + + +def WritePartitionSizesFunction(options, sfile, func, image_type, config): + """Writes out the partition size variable that can be extracted by a caller. + + Args: + options: Flags passed to the script + sfile: File handle we're writing to + func: function of the layout: + for removable storage device: 'partition', + for the fixed storage device: 'base' + image_type: Type of image eg base/test/dev/factory_install + config: Partition configuration file object + """ + func_name = 'load_%s_vars' % func + lines = [ + '%s() {' % func_name, + 'DEFAULT_ROOTDEV="%s"' % config['metadata'].get('rootdev_%s' % func, ''), + ] + + partitions = GetPartitionTable(options, config, image_type) + for partition in partitions: + if partition.get('num') == 'metadata': + continue + for key in ('label', 'num'): + if key in partition: + shell_label = str(partition[key]).replace('-', '_').upper() + part_bytes = partition['bytes'] + reserved_ebs = partition.get('reserved_erase_blocks', 0) + fs_bytes = partition.get('fs_bytes', part_bytes) + part_format = partition.get('format', '') + fs_format = partition.get('fs_format', '') + fs_options = partition.get('fs_options', '') + partition_num = partition.get('num', '') + lines += [ + 'PARTITION_SIZE_%s=%s' % (shell_label, part_bytes), + ' RESERVED_EBS_%s=%s' % (shell_label, reserved_ebs), + ' DATA_SIZE_%s=%s' % (shell_label, fs_bytes), + ' FORMAT_%s=%s' % (shell_label, part_format), + ' FS_FORMAT_%s=%s' % (shell_label, fs_format), + ' FS_OPTIONS_%s="%s"' % (shell_label, fs_options), + ' PARTITION_NUM_%s="%s"' % (shell_label, partition_num), + ] + + sfile.write('%s\n}\n' % '\n '.join(lines)) + + +def GetPartitionByNumber(partitions, num): + """Given a partition table and number returns the partition object. + + Args: + partitions: List of partitions to search in + num: Number of partition to find + + Returns: + An object for the selected partition + """ + for partition in partitions: + if partition.get('num') == int(num): + return partition + + raise PartitionNotFound('Partition %s not found' % num) + + +def GetPartitionsByType(partitions, typename): + """Given a partition table and type returns the partitions of the type. + + Partitions are sorted in num order. + + Args: + partitions: List of partitions to search in + typename: The type of partitions to select + + Returns: + A list of partitions of the type + """ + out = [] + for partition in partitions: + if partition.get('type') == typename: + out.append(partition) + return sorted(out, key=lambda partition: partition.get('num')) + + +def GetMetadataPartition(partitions): + """Given a partition table returns the metadata partition object. + + Args: + partitions: List of partitions to search in + + Returns: + An object for the metadata partition + """ + for partition in partitions: + if partition.get('num') == 'metadata': + return partition + + return {} + + +def GetPartitionByLabel(partitions, label): + """Given a partition table and label returns the partition object. + + Args: + partitions: List of partitions to search in + label: Label of partition to find + + Returns: + An object for the selected partition + """ + for partition in partitions: + if 'label' not in partition: + continue + if partition['label'] == label: + return partition + + raise PartitionNotFound('Partition "%s" not found' % label) + + +def WritePartitionScript(options, image_type, layout_filename, sfilename): + """Writes a shell script with functions for the base and requested layouts. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + sfilename: Filename to write the finished script to + """ + config = LoadPartitionConfig(layout_filename) + + with open(sfilename, 'w') as f: + script_shell = GetScriptShell() + f.write(script_shell) + + for func, layout in (('base', BASE_LAYOUT), ('partition', image_type)): + WriteLayoutFunction(options, f, func, layout, config) + WritePartitionSizesFunction(options, f, func, layout, config) + + # TODO: Backwards compat. Should be killed off once we update + # cros_generate_update_payload to use the new code. + partitions = GetPartitionTable(options, config, BASE_LAYOUT) + partition = GetPartitionByLabel(partitions, 'ROOT-A') + f.write('ROOTFS_PARTITION_SIZE=%s\n' % (partition['bytes'],)) + + +def GetBlockSize(_options, layout_filename): + """Returns the partition table block size. + + Args: + options: Flags passed to the script + layout_filename: Path to partition configuration file + + Returns: + Block size of all partitions in the layout + """ + + config = LoadPartitionConfig(layout_filename) + return config['metadata']['block_size'] + + +def GetFilesystemBlockSize(_options, layout_filename): + """Returns the filesystem block size. + + This is used for all partitions in the table that have filesystems. + + Args: + options: Flags passed to the script + layout_filename: Path to partition configuration file + + Returns: + Block size of all filesystems in the layout + """ + + config = LoadPartitionConfig(layout_filename) + return config['metadata']['fs_block_size'] + + +def GetImageTypes(_options, layout_filename): + """Returns a list of all the image types in the layout. + + Args: + options: Flags passed to the script + layout_filename: Path to partition configuration file + + Returns: + List of all image types + """ + + config = LoadPartitionConfig(layout_filename) + return ' '.join(config['layouts'].keys()) + + +def GetType(options, image_type, layout_filename, num): + """Returns the type of a given partition for a given layout. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Type of the specified partition. + """ + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + return partition.get('type') + + +def GetPartitions(options, image_type, layout_filename): + """Returns the partition numbers for the image_type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + + Returns: + A space delimited string of partition numbers. + """ + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + return ' '.join(str(p['num']) for p in partitions + if 'num' in p and p['num'] != 'metadata') + + +def GetUUID(options, image_type, layout_filename, num): + """Returns the filesystem UUID of a given partition for a given layout type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + UUID of specified partition. Defaults to random if not set. + """ + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + return partition.get('uuid', 'random') + + +def GetPartitionSize(options, image_type, layout_filename, num): + """Returns the partition size of a given partition for a given layout type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Size of selected partition in bytes + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + return partition['bytes'] + + +def GetFilesystemFormat(options, image_type, layout_filename, num): + """Returns the filesystem format of a given partition for a given layout type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Format of the selected partition's filesystem + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + return partition.get('fs_format') + + +def GetFormat(options, image_type, layout_filename, num): + """Returns the format of a given partition for a given layout type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Format of the selected partition's filesystem + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + return partition.get('format') + + +def GetFilesystemOptions(options, image_type, layout_filename, num): + """Returns the filesystem options of a given partition and layout type. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + The selected partition's filesystem options + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + return partition.get('fs_options') + + +def GetFilesystemSize(options, image_type, layout_filename, num): + """Returns the filesystem size of a given partition for a given layout type. + + If no filesystem size is specified, returns the partition size. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Size of selected partition filesystem in bytes + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + if 'fs_bytes' in partition: + return partition['fs_bytes'] + else: + return partition['bytes'] + + +def GetLabel(options, image_type, layout_filename, num): + """Returns the label for a given partition. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Label of selected partition, or 'UNTITLED' if none specified + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + + if 'label' in partition: + return partition['label'] + else: + return 'UNTITLED' + + +def GetNumber(options, image_type, layout_filename, label): + """Returns the partition number of a given label. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + label: Number of the partition you want to read from + + Returns: + The number of the partition corresponding to the label. + """ + + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByLabel(partitions, label) + return partition['num'] + + +def GetReservedEraseBlocks(options, image_type, layout_filename, num): + """Returns the number of erase blocks reserved in the partition. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + num: Number of the partition you want to read from + + Returns: + Number of reserved erase blocks + """ + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + partition = GetPartitionByNumber(partitions, num) + if 'reserved_erase_blocks' in partition: + return partition['reserved_erase_blocks'] + else: + return 0 + + +def DoDebugOutput(options, image_type, layout_filename): + """Prints out a human readable disk layout in on-disk order. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + """ + config = LoadPartitionConfig(layout_filename) + partitions = GetPartitionTable(options, config, image_type) + + label_len = max([len(x['label']) for x in partitions if 'label' in x]) + type_len = max([len(x['type']) for x in partitions if 'type' in x]) + + msg = 'num:%4s label:%-*s type:%-*s size:%-10s fs_size:%-10s features:%s' + + # Print out non-layout options first. + print('Config Data') + metadata_msg = 'field:%-14s value:%s' + for key in config.keys(): + if key not in ('layouts', '_comment'): + print(metadata_msg % (key, config[key])) + + print('\n%s Layout Data' % image_type.upper()) + for partition in partitions: + if partition.get('num') == 'metadata': + continue + + size = ProduceHumanNumber(partition['bytes']) + if 'fs_bytes' in partition.iterkeys(): + fs_size = ProduceHumanNumber(partition['fs_bytes']) + else: + fs_size = 'auto' + + print(msg % ( + partition.get('num', 'auto'), + label_len, + partition.get('label', ''), + type_len, + partition.get('type', ''), + size, + fs_size, + partition.get('features', []), + )) + + +def CheckRootfsPartitionsMatch(partitions): + """Checks that rootfs partitions are substitutable with each other. + + This function asserts that either all rootfs partitions are in the same format + or none have a format, and it asserts that have the same number of reserved + erase blocks. + """ + partition_format = None + reserved_erase_blocks = -1 + for partition in partitions: + if partition.get('type') == 'rootfs': + new_format = partition.get('format', '') + new_reserved_erase_blocks = partition.get('reserved_erase_blocks', 0) + + if partition_format is None: + partition_format = new_format + reserved_erase_blocks = new_reserved_erase_blocks + + if new_format != partition_format: + raise MismatchedRootfsFormat( + 'mismatched rootfs formats: "%s" and "%s"' % + (partition_format, new_format)) + + if reserved_erase_blocks != new_reserved_erase_blocks: + raise MismatchedRootfsBlocks( + 'mismatched rootfs reserved erase block counts: %s and %s' % + (reserved_erase_blocks, new_reserved_erase_blocks)) + + +def Combinations(n, k): + """Calculate the binomial coefficient, i.e., "n choose k" + + This calculates the number of ways that k items can be chosen from + a set of size n. For example, if there are n blocks and k of them + are bad, then this returns the number of ways that the bad blocks + can be distributed over the device. + See http://en.wikipedia.org/wiki/Binomial_coefficient + + For convenience to the caller, this function allows impossible cases + as input and returns 0 for them. + """ + if k < 0 or n < k: + return 0 + return math.factorial(n) / (math.factorial(k) * math.factorial(n - k)) + + +def CheckReservedEraseBlocks(partitions): + """Checks that the reserved_erase_blocks in each partition is good. + + This function checks that a reasonable value was given for the reserved + erase block count. In particular, it checks that there's a less than + 1 in 100k probability that, if the manufacturer's maximum bad erase + block count is met, and assuming bad blocks are uniformly randomly + distributed, then more bad blocks will fall in this partition than are + reserved. Smaller partitions need a larger reserve percentage. + + We take the number of reserved blocks as a parameter in disk_layout.json + rather than just calculating the value so that it can be tweaked + explicitly along with others in squeezing the image onto flash. But + we check it so that users have an easy method for determining what's + acceptable--just try out a new value and do ./build_image. + """ + for partition in partitions: + if ('reserved_erase_blocks' in partition or + partition.get('format') in ('ubi', 'nand')): + if partition.get('bytes', 0) == 0: + continue + metadata = GetMetadataPartition(partitions) + if (not _HasBadEraseBlocks(partitions) + or 'reserved_erase_blocks' not in partition + or 'bytes' not in metadata + or 'erase_block_size' not in metadata + or 'page_size' not in metadata): + raise MissingEraseBlockField( + 'unable to check if partition %s will have too many bad blocks due ' + 'to missing metadata field' % partition['label']) + + reserved = partition['reserved_erase_blocks'] + erase_block_size = metadata['erase_block_size'] + device_erase_blocks = metadata['bytes'] / erase_block_size + device_bad_blocks = metadata['max_bad_erase_blocks'] + distributions = Combinations(device_erase_blocks, device_bad_blocks) + partition_erase_blocks = partition['bytes'] / erase_block_size + # The idea is to calculate the number of ways that there could be reserved + # or more bad blocks inside the partition, assuming that there are + # device_bad_blocks in the device in total (the worst case). To get the + # probability, we divide this count by the total number of ways that the + # bad blocks can be distributed on the whole device. To find the first + # number, we sum over increasing values for the count of bad blocks within + # the partition the number of ways that those bad blocks can be inside the + # partition, multiplied by the number of ways that the remaining blocks + # can be distributed outside of the partition. + ways_for_failure = sum( + Combinations(partition_erase_blocks, partition_bad_blocks) * + Combinations(device_erase_blocks - partition_erase_blocks, + device_bad_blocks - partition_bad_blocks) + for partition_bad_blocks + in range(reserved + 1, device_bad_blocks + 1)) + probability = (1.0 * ways_for_failure) / distributions + if probability > 0.00001: + raise ExcessFailureProbability('excessive probability %f of too many ' + 'bad blocks in partition %s' + % (probability, partition['label'])) + + +def CheckSimpleNandProperties(partitions): + """Checks that NAND partitions are erase-block-aligned and not expand""" + if not _HasBadEraseBlocks(partitions): + return + metadata = GetMetadataPartition(partitions) + for partition in partitions: + erase_block_size = metadata['erase_block_size'] + if partition['bytes'] % erase_block_size != 0: + raise UnalignedPartition( + 'partition size %s does not divide erase block size %s' % + (partition['bytes'], erase_block_size)) + if 'expand' in partition['features']: + raise ExpandNandImpossible( + 'expand partitions may not be used with raw NAND') + + +def CheckTotalSize(partitions): + """Checks that the sum size of all partitions fits within the device""" + metadata = GetMetadataPartition(partitions) + if 'bytes' not in metadata: + return + capacity = metadata['bytes'] + total = sum(GetFullPartitionSize(partition, metadata) + for partition in partitions if partition.get('num') != 'metadata') + if total > capacity: + raise ExcessPartitionSize('capacity = %d, total=%d' % (capacity, total)) + + +def Validate(options, image_type, layout_filename): + """Validates a layout file, used before reading sizes to check for errors. + + Args: + options: Flags passed to the script + image_type: Type of image eg base/test/dev/factory_install + layout_filename: Path to partition configuration file + """ + partitions = GetPartitionTableFromConfig(options, layout_filename, image_type) + CheckRootfsPartitionsMatch(partitions) + CheckTotalSize(partitions) + CheckSimpleNandProperties(partitions) + CheckReservedEraseBlocks(partitions) + + +def main(argv): + action_map = { + 'write': { + 'usage': ['', '', ''], + 'func': WritePartitionScript, + }, + 'readblocksize': { + 'usage': [''], + 'func': GetBlockSize, + }, + 'readfsblocksize': { + 'usage': [''], + 'func': GetFilesystemBlockSize, + }, + 'readpartsize': { + 'usage': ['', '', ''], + 'func': GetPartitionSize, + }, + 'readformat': { + 'usage': ['', '', ''], + 'func': GetFormat, + }, + 'readfsformat': { + 'usage': ['', '', ''], + 'func': GetFilesystemFormat, + }, + 'readfssize': { + 'usage': ['', '', ''], + 'func': GetFilesystemSize, + }, + 'readimagetypes': { + 'usage': [''], + 'func': GetImageTypes, + }, + 'readfsoptions': { + 'usage': ['', '', ''], + 'func': GetFilesystemOptions, + }, + 'readlabel': { + 'usage': ['', '', ''], + 'func': GetLabel, + }, + 'readnumber': { + 'usage': ['', '', ''], + 'func': GetNumber, + }, + 'readreservederaseblocks': { + 'usage': ['', '', ''], + 'func': GetReservedEraseBlocks, + }, + 'readtype': { + 'usage': ['', '', ''], + 'func': GetType, + }, + 'readpartitionnums': { + 'usage': ['', ''], + 'func': GetPartitions, + }, + 'readuuid': { + 'usage': ['', '', ''], + 'func': GetUUID, + }, + 'debug': { + 'usage': ['', ''], + 'func': DoDebugOutput, + }, + 'validate': { + 'usage': ['', ''], + 'func': Validate, + }, + } + + usage = """%(prog)s [options] + +For information on the JSON format, see: + http://dev.chromium.org/chromium-os/developer-guide/disk-layout-format + +The --adjust_part flag takes arguments like: +