Skip to content

Commit

Permalink
Fix bug where &crop=x1,y1,x2,y2 values are not adjusted for decoder p…
Browse files Browse the repository at this point in the history
…re-shrinking
  • Loading branch information
lilith committed Jul 4, 2020
1 parent ae6f1bf commit 696fea2
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 51 deletions.
2 changes: 1 addition & 1 deletion imageflow_core/src/clients/stateless.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ impl LibClient {
fn get_image_info_inner(context: &mut Context, bytes: &[u8])
-> std::result::Result<s::ImageInfo, FlowError> {
context.add_input_bytes(0, bytes).map_err(|e| e.at(here!()))?;
Ok(context.get_image_info(0).map_err(|e| e.at(here!()))?)
Ok(context.get_unscaled_image_info(0).map_err(|e| e.at(here!()))?)

}
pub fn get_image_info(&mut self, bytes: &[u8])
Expand Down
6 changes: 4 additions & 2 deletions imageflow_core/src/codecs/gif/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ impl Decoder for GifDecoder {
Ok(())
}


fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>{
self.get_unscaled_image_info(c)
}
fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
Ok(s::ImageInfo {
frame_decodes_into: s::PixelFormat::Bgra32,
image_width: i32::from(self.reader.width()),
Expand Down
7 changes: 5 additions & 2 deletions imageflow_core/src/codecs/jpeg_decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,11 @@ impl Decoder for JpegDecoder {
Ok(())
}

fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>{
self.get_unscaled_image_info(c)
}

fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {

self.decoder.read_info()?;
let info = self.decoder.info().expect("error handling not yet implemented for jpeg");
Expand Down Expand Up @@ -77,7 +80,7 @@ impl Decoder for JpegDecoder {
fn read_frame(&mut self, c: &Context) -> Result<*mut BitmapBgra> {

if self.width.is_none() {
let _ = self.get_image_info(c)?;
let _ = self.get_scaled_image_info(c)?;
}
let pixels = self.decoder.decode()?;

Expand Down
6 changes: 5 additions & 1 deletion imageflow_core/src/codecs/libpng_decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@ impl Decoder for LibPngDecoder {
Ok(())
}

fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>{
self.get_unscaled_image_info(c)
}

fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
let (w,h,fmt) = self.decoder.get_info()?;

Ok(s::ImageInfo {
Expand Down
3 changes: 2 additions & 1 deletion imageflow_core/src/codecs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ pub trait DecoderFactory{
}
pub trait Decoder : Any{
fn initialize(&mut self, c: &Context) -> Result<()>;
fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>;
fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>;
fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo>;
fn get_exif_rotation_flag(&mut self, c: &Context) -> Result<Option<i32>>;
fn tell_decoder(&mut self, c: &Context, tell: s::DecoderCommand) -> Result<()>;
fn read_frame(&mut self, c: &Context) -> Result<*mut BitmapBgra>;
Expand Down
19 changes: 18 additions & 1 deletion imageflow_core/src/codecs/mozjpeg_decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,20 @@ impl Decoder for MozJpegDecoder {
Ok(())
}

fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {

fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
let (w,h) = self.decoder.get_original_size()?;

Ok(s::ImageInfo {
frame_decodes_into: s::PixelFormat::Bgr32,
image_width: w as i32,
image_height: h as i32,
preferred_mime_type: "image/jpeg".to_owned(),
preferred_extension: "jpg".to_owned()
})
}

fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
let (w,h) = self.decoder.get_final_size()?;

Ok(s::ImageInfo {
Expand Down Expand Up @@ -231,6 +244,10 @@ impl MzDec{
self.apply_downscaling();
Ok((self.w, self.h))
}
fn get_original_size(&mut self) -> Result<(u32,u32)>{
self.read_header()?;
Ok((self.original_width, self.original_height))
}

fn get_exif_rotation_flag(&mut self) -> Result<Option<i32>>{
self.read_header()?;
Expand Down
42 changes: 30 additions & 12 deletions imageflow_core/src/codecs/webp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ impl WebPDecoder {
})
}

pub fn ensure_data_buffered(&mut self, c: &Context) -> Result<()>{
fn ensure_data_buffered(&mut self) -> Result<()>{
if self.bytes.is_none() {
let mut bytes = Vec::with_capacity(2048);
let _ = self.io.read_to_end(&mut bytes).map_err(|e| FlowError::from_decoder(e));
Expand Down Expand Up @@ -73,17 +73,9 @@ impl WebPDecoder {
self.input_height()
}
}
}


impl Decoder for WebPDecoder {
fn initialize(&mut self, c: &Context) -> Result<()> {
Ok(())
}


fn get_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
self.ensure_data_buffered(c)?;
fn ensure_features_read(&mut self) -> Result<()>{
self.ensure_data_buffered()?;
if !self.features_read {
let buf = &self.bytes.as_ref().unwrap(); //Cannot fail after ensure_data_buffered
let len = buf.len();
Expand All @@ -95,6 +87,32 @@ impl Decoder for WebPDecoder {
}
self.features_read = true;
}
Ok(())
}
}


impl Decoder for WebPDecoder {
fn initialize(&mut self, c: &Context) -> Result<()> {
Ok(())
}


fn get_scaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
self.ensure_features_read()?;

Ok(s::ImageInfo {
frame_decodes_into: s::PixelFormat::Bgra32,
image_width: self.output_width().unwrap(),
image_height: self.output_height().unwrap(),
preferred_mime_type: "image/webp".to_owned(),
preferred_extension: "webp".to_owned()
})
}

fn get_unscaled_image_info(&mut self, c: &Context) -> Result<s::ImageInfo> {
self.ensure_features_read()?;

Ok(s::ImageInfo {
frame_decodes_into: s::PixelFormat::Bgra32,
image_width: self.input_width().unwrap(),
Expand All @@ -119,7 +137,7 @@ impl Decoder for WebPDecoder {
}

fn read_frame(&mut self, c: &Context) -> Result<*mut BitmapBgra> {
let _ = self.get_image_info(c)?;
let _ = self.get_scaled_image_info(c)?;

unsafe {
let w = self.output_width().unwrap();
Expand Down
8 changes: 5 additions & 3 deletions imageflow_core/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,12 @@ impl Context {
}


pub fn get_image_info(&mut self, io_id: i32) -> Result<s::ImageInfo> {
self.get_codec(io_id).map_err(|e| e.at(here!()))?.get_decoder().map_err(|e| e.at(here!()))?.get_image_info(self).map_err(|e| e.at(here!()))
pub fn get_unscaled_image_info(&mut self, io_id: i32) -> Result<s::ImageInfo> {
self.get_codec(io_id).map_err(|e| e.at(here!()))?.get_decoder().map_err(|e| e.at(here!()))?.get_unscaled_image_info(self).map_err(|e| e.at(here!()))
}
pub fn get_scaled_image_info(&mut self, io_id: i32) -> Result<s::ImageInfo> {
self.get_codec(io_id).map_err(|e| e.at(here!()))?.get_decoder().map_err(|e| e.at(here!()))?.get_scaled_image_info(self).map_err(|e| e.at(here!()))
}

pub fn tell_decoder(&mut self, io_id: i32, tell: s::DecoderCommand) -> Result<()> {
self.get_codec(io_id).map_err(|e| e.at(here!()))?.get_decoder().map_err(|e| e.at(here!()))?.tell_decoder(self, tell).map_err(|e| e.at(here!()))
}
Expand Down
8 changes: 6 additions & 2 deletions imageflow_core/src/context_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,15 @@ fn create_context_router() -> MethodRouter<'static, Context> {
}));
r.add_responder("v0.1/get_image_info",
Box::new(move |context: &mut Context, data: s::GetImageInfo001| {
Ok(s::ResponsePayload::ImageInfo(context.get_image_info(data.io_id).map_err(|e| e.at(here!()))?))
Ok(s::ResponsePayload::ImageInfo(context.get_unscaled_image_info(data.io_id).map_err(|e| e.at(here!()))?))
}));
r.add_responder("v1/get_image_info",
Box::new(move |context: &mut Context, data: s::GetImageInfo001| {
Ok(s::ResponsePayload::ImageInfo(context.get_image_info(data.io_id).map_err(|e| e.at(here!()))?))
Ok(s::ResponsePayload::ImageInfo(context.get_unscaled_image_info(data.io_id).map_err(|e| e.at(here!()))?))
}));
r.add_responder("v1/get_scaled_image_info",
Box::new(move |context: &mut Context, data: s::GetImageInfo001| {
Ok(s::ResponsePayload::ImageInfo(context.get_scaled_image_info(data.io_id).map_err(|e| e.at(here!()))?))
}));
r.add_responder("v0.1/tell_decoder",
Box::new(move |context: &mut Context, data: s::TellDecoder001| {
Expand Down
2 changes: 1 addition & 1 deletion imageflow_core/src/flow/nodes/codecs_and_pointer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fn decoder_get_io_id(params: &NodeParams) -> Result<i32> {
}
fn decoder_estimate(ctx: &mut OpCtxMut, ix: NodeIndex) -> Result<FrameEstimate> {
let io_id = decoder_get_io_id(&ctx.weight(ix).params).map_err(|e| e.at(here!()))?;
let frame_info = ctx.job.get_image_info(io_id).map_err(|e| e.at(here!()))?;
let frame_info = ctx.job.get_scaled_image_info(io_id).map_err(|e| e.at(here!()))?;

Ok(FrameEstimate::Some(FrameInfo {
fmt: frame_info.frame_decodes_into,
Expand Down
20 changes: 16 additions & 4 deletions imageflow_core/src/flow/nodes/constrain.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::internal_prelude::*;
use imageflow_riapi::sizing::{Layout, AspectRatio, LayoutError};
use imageflow_types::ConstraintMode;
use imageflow_types::{ConstraintMode, ImageInfo};

pub static CONSTRAIN: ConstrainDef = ConstrainDef{};
pub static COMMAND_STRING: CommandStringDef = CommandStringDef{};
Expand All @@ -12,7 +12,7 @@ pub static EXPANDING_COMMAND_STRING: CommandStringPartiallyExpandedDef = Command
fn get_decoder_mime(ctx: &mut OpCtxMut, ix: NodeIndex) -> Result<Option<String>>{
let decoders = ctx.get_decoder_io_ids_and_indexes(ix);
if let Some((io_id, _)) = decoders.first(){
Ok(Some(ctx.c.get_codec(*io_id)?.get_decoder()?.get_image_info(ctx.c)?.preferred_mime_type))
Ok(Some(ctx.job.get_unscaled_image_info(*io_id)?.preferred_mime_type))
}
else{
Ok(None)
Expand All @@ -22,6 +22,15 @@ fn get_decoder_mime(ctx: &mut OpCtxMut, ix: NodeIndex) -> Result<Option<String>>

fn get_expand(ctx: &mut OpCtxMut, ix: NodeIndex) -> Result<::imageflow_riapi::ir4::Ir4Expand>{
let input = ctx.first_parent_frame_info_some(ix).ok_or_else(|| nerror!(crate::ErrorKind::InvalidNodeConnections, "CommandString node requires that its parent nodes be perfectly estimable"))?;

let mut image_info: Option<ImageInfo> = None;
if let Some((io_id, decoder_ix)) = ctx.get_decoder_io_ids_and_indexes(ix).first(){
image_info = Some(ctx.job.get_unscaled_image_info(*io_id).map_err(|e| e.at(here!()))?);

}



let params = &ctx.weight(ix).params;
if let NodeParams::Json(s::Node::CommandString{ref kind, ref value, ref decode, ref encode, ref watermarks}) =
*params {
Expand All @@ -36,7 +45,10 @@ fn get_expand(ctx: &mut OpCtxMut, ix: NodeIndex) -> Result<::imageflow_riapi::ir
h: input.h,
fmt: input.fmt,
original_mime: get_decoder_mime(ctx,ix)?
}
},
reference_width: image_info.as_ref().map(|i| i.image_width).unwrap_or(input.w),
reference_height: image_info.as_ref().map(|i| i.image_height).unwrap_or(input.h),

})
}
}
Expand Down Expand Up @@ -206,7 +218,7 @@ impl NodeDef for CommandStringDef{
decode_id: Some(d_id),
encode_id: None,
watermarks,
}.get_decode_node().unwrap();
}.get_decode_node_without_commands().unwrap();
ctx.replace_node(ix, vec![
Node::from(decode_node),
Node::n(&EXPANDING_COMMAND_STRING, params)
Expand Down
2 changes: 1 addition & 1 deletion imageflow_core/src/flow/nodes/watermark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ impl NodeDefOneInputExpand for WatermarkDef {
canvas_color: None
};

let watermark_info = ctx.job.get_image_info(watermark.io_id).map_err(|e| e.at(here!()))?;
let watermark_info = ctx.job.get_scaled_image_info(watermark.io_id).map_err(|e| e.at(here!()))?;

let constraint_results = imageflow_riapi::ir4::process_constraint(watermark_info.image_width, watermark_info.image_height, &constraint).unwrap(); //TODO: fix unwrap

Expand Down
2 changes: 1 addition & 1 deletion imageflow_core/tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,7 @@ pub fn test_with_callback(checksum_name: &str, input: IoTestEnum, callback: fn(&
unsafe {
IoTestTranslator{}.add(&mut context, 0, input).unwrap();

let image_info = context.get_image_info(0).unwrap();
let image_info = context.get_unscaled_image_info(0).unwrap();

let (tell_decoder, mut steps): (Option<imageflow_types::DecoderCommand>, Vec<Node>) = callback(&image_info);

Expand Down
16 changes: 16 additions & 0 deletions imageflow_core/tests/visuals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,22 @@ fn decode_cmyk_jpeg() {

}

#[test]
fn test_crop_with_preshrink() {
let matched = compare(Some(IoTestEnum::Url("https://resizer-images.s3.amazonaws.com/private/cropissue.jpg".to_owned())), 500,
"crop_with_preshrink", POPULATE_CHECKSUMS, DEBUG_GRAPH, vec![
Node::CommandString{
kind: CommandStringKind::ImageResizer4,
value: "w=170&h=220&mode=crop&scale=both&crop=449,0,-472,0".to_owned(),
decode: Some(0),
encode: None,
watermarks: None
}
]
);
assert!(matched);

}

#[test]
fn webp_lossless_alpha_decode_and_scale() {
Expand Down
1 change: 1 addition & 0 deletions imageflow_core/tests/visuals/checksums.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
"WatermarkSmall": "09BF9877BE2CB36AC_0DE3336C466C67DD9",
"WhiteBalanceNight": "0D84206BD2DD308DA_05C9231C6124D62A8",
"cmyk_decode": "00C5CD1E1ADF2628A_0D58EB335590501F3",
"crop_with_preshrink": "04FF87FFA9A645517_09D5B46DC8E13B7B4",
"encode_frymire": "07FC2C05A26B49BF1.png",
"encode_gradients": "00D10466A8552DCF6.png",
"encode_marsRGB": "07800DDF0E598E7E4.png",
Expand Down
Loading

1 comment on commit 696fea2

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New misspellings found, please review:

  • AAI
  • AAv
  • abcdefghijklmnopqrstuvwxyz
  • abcefgijklnopqstuwxyz
  • ABDEFGIJKMNOPRSTUWXY
  • abh
  • ABz
  • acsp
  • ADBE
  • adhlpv
  • Agik
  • Ahv
  • Ahx
  • aiu
  • aj
  • ALV
  • AMh
  • AOu
  • apc
  • Aqh
  • Aqo
  • asts
  • astv
  • ASw
  • asx
  • atpa
  • auz
  • Avl
  • Avq
  • AVtu
  • AXy
  • AZu
  • Bbse
  • bbu
  • BCDEFHIJLMOPRSUWXZ
  • bclg
  • BCw
  • bdb
  • bdfhjmoqtvy
  • bdg
  • BEv
  • Bfx
  • bga
  • bgc
  • bh
  • bhx
  • bj
  • bja
  • bjd
  • Bjx
  • Bpl
  • bpn
  • bq
  • Brv
  • bs'hx
  • Bsn
  • btk
  • Btn
  • bup
  • Bvk
  • bw
  • Bwk
  • BXiy
  • BXn
  • BXp
  • Byj
  • byx
  • Bzx
  • cdb
  • Cdl
  • ceo
  • cfo
  • Cfx
  • Cgx
  • CHl
  • cj
  • cjg
  • cjm
  • ckd
  • CKF
  • CMV
  • cn
  • Cnll
  • cprt
  • Cpw
  • Cqo
  • Cqz
  • crm
  • Csv
  • ctj
  • CUDIE
  • curv
  • Cvk
  • cw
  • cwh
  • CWZ
  • Cxj
  • CXm
  • Cxq
  • cz
  • czc
  • dagx
  • Dcq
  • DCt
  • Dde
  • Ded
  • DFq
  • Dfx
  • Dfz
  • DGD
  • dhb
  • DLN
  • dmd
  • DMy
  • DNv
  • Dpb
  • dpe
  • Dpo
  • dq
  • dqg
  • Dqn
  • dqq
  • DQx
  • drf
  • drh
  • Drn
  • Drp
  • drv
  • dsh
  • Dte
  • dto
  • dtt
  • dv
  • dvj
  • Dvx
  • Dw
  • Dwj
  • Dwl
  • dwp
  • DWR
  • DXc
  • DXd
  • dxeff
  • Dxl
  • dzx
  • dzy
  • EAC
  • eay
  • EBy
  • Ecg
  • ECK
  • edf
  • edl
  • Edx
  • edy
  • Eev
  • Eex
  • efy
  • ega
  • ei
  • EIl
  • ein
  • ej
  • Ejvi
  • ek
  • EKz
  • Elu
  • elz
  • emn
  • empr
  • Eou
  • epd
  • Epl
  • Epn
  • Epo
  • eqn
  • Erp
  • ERq
  • ERz
  • ESbr
  • ESz
  • EUE
  • ev
  • evh
  • Evk
  • eyx
  • Eyz
  • ez
  • ezl
  • ezm
  • ezx
  • ezy
  • fdv
  • fdw
  • FFo
  • fft
  • FGX
  • FIk
  • fj
  • fja
  • fje
  • fk
  • FKw
  • FNTY
  • fnz
  • Fok
  • FOv
  • FOz
  • fq
  • FQm
  • Ftgw
  • FTx
  • Fudqv
  • fuh
  • ful
  • Fup
  • FWi
  • FWJ
  • Fwz
  • fx
  • fxc
  • Fxl
  • FXZ
  • fzy
  • gamt
  • GAq
  • GCK
  • GDgb
  • gf
  • Gfn
  • Gfo
  • gfp
  • GFpq
  • GFy
  • Gfz
  • gg
  • gh
  • GHa
  • GHU
  • gj
  • gk
  • Gku
  • GPsl
  • gq
  • Gqb
  • Gqq
  • GRAYXYZ
  • GSp
  • gtu
  • guh
  • gw
  • GWB
  • Gwf
  • gwh
  • gwj
  • gwl
  • gwr
  • Gxl
  • GXR
  • Gxw
  • gyy
  • Gzk
  • HCn
  • hcv
  • hdn
  • HErq
  • Hfswce
  • hga
  • HGP
  • hh
  • HHX
  • Hio
  • Hiy
  • hj
  • hja
  • HJh
  • hk
  • HKH
  • Hlu
  • HMu
  • hn
  • hnq
  • Hpb
  • hpty
  • hqc
  • Hrrc
  • hso
  • hu
  • hul
  • hwa
  • Hwf
  • HWK
  • hx
  • hxk
  • Hxl
  • hyt
  • hz
  • Hzjl
  • hzp
  • hzz
  • I'f
  • I'j
  • I'z
  • ial
  • ibn
  • ibu
  • ICroq
  • icu
  • IEx
  • IEz
  • ig
  • IGH
  • igj
  • igt
  • IGx
  • ih
  • Ihd
  • IHk
  • Ihx
  • iiv
  • ij
  • IKD
  • Iku
  • Ilq
  • imyfi
  • ina
  • ine
  • inq
  • ipj
  • IPQ
  • IQl
  • Iqp
  • IRx
  • ISf
  • Isj
  • isq
  • ITq
  • ITy
  • iu
  • iuf
  • IUK
  • iuna
  • iuom
  • ivg
  • Ivx
  • iwg
  • IXD
  • ixr
  • iy
  • IYE
  • iyz
  • iz
  • IZj
  • IZl
  • izy
  • jb
  • JBm
  • JBr
  • jc
  • jcd
  • jd
  • JDm
  • JDn
  • Jdots
  • je
  • jf
  • JGA
  • JGI
  • JGp
  • jh
  • ji
  • JIq
  • jj
  • Jje
  • jk
  • jl
  • jlz
  • jm
  • jmy
  • jn
  • jofu
  • jp
  • jpa
  • jrt
  • jtd
  • ju
  • juu
  • jvf
  • Jvr
  • jw
  • jwd
  • Jwh
  • jwo
  • jwqu
  • jx
  • jxd
  • jxv
  • jy
  • JYro
  • Jyw
  • jz
  • kbd
  • KBx
  • Kcj
  • KCZ
  • kd
  • KDc
  • Kdj
  • ke
  • Kej
  • kf
  • kfg
  • KFp
  • KGA
  • kgh
  • kgw
  • kh
  • kht
  • khw
  • Kib
  • kj
  • kk
  • kkw
  • kmxh
  • knc
  • knd
  • koe
  • koj
  • Kpq
  • kpz
  • kq
  • kqk
  • KQu
  • Ksh
  • KSK
  • KSu
  • Ktj
  • ku
  • Kuq
  • KVct
  • kvjcb
  • KVl
  • Kvt
  • kvu
  • Kwq
  • KWw
  • kx
  • kxa
  • kxr
  • KXx
  • Kyo
  • kz
  • kzf
  • kzl
  • kzr
  • kzt
  • lck
  • LCr
  • LDc
  • lfr
  • Lgdo
  • lii
  • lj
  • ljf
  • ljz
  • lk
  • Llu
  • Lly
  • Lmgw
  • lmw
  • LNi
  • lq
  • Lqu
  • LQZu
  • LRM
  • Lrx
  • LSU
  • Lsw
  • lti
  • ltq
  • ltv
  • Luj
  • luq
  • Lvh
  • Lvq
  • lvqi
  • lw
  • LWa
  • lwb
  • Lxm
  • lxr
  • lxy
  • LYfrc
  • Lyo
  • lyp
  • Lyr
  • lzv
  • MAa
  • Mbz
  • Mdy
  • MDZ
  • meeh
  • mfep
  • mft
  • mgnqozp
  • mgp
  • MGv
  • mj
  • Mje
  • MJM
  • MJn
  • mju
  • mky
  • mlq
  • Mly
  • MMqc
  • Mmrr
  • mmv
  • MNh
  • mnl
  • mnn
  • MNr
  • mntr
  • Mox
  • mpy
  • mq
  • Mqu
  • MRM
  • msv
  • mthuk
  • MUe
  • Muu
  • MVj
  • Mvq
  • Mwae
  • MWLo
  • MXm
  • myf
  • MYw
  • Mzd
  • mzf
  • Mzk
  • mzo
  • MZp
  • MZY
  • NAz
  • nbk
  • NCd
  • NCOYPo
  • Ncq
  • Ncz
  • Nda
  • ndq
  • ndv
  • nem
  • nf
  • NGi
  • nh
  • NHj
  • nic
  • NJl
  • nk
  • nkn
  • NLL
  • nlx
  • nly
  • NMw
  • nn
  • NNg
  • nnu
  • Nnw
  • Nou
  • npc
  • npm
  • Npw
  • npy
  • nq
  • Nqw
  • nrc
  • NRF
  • ntv
  • Nuh
  • Nui
  • Nuqpr
  • nvb
  • Nvr
  • nw
  • Nwy
  • nx
  • NXt
  • NXv
  • Nyo
  • nz
  • nzd
  • oa
  • oan
  • Oax
  • OBC
  • obh
  • Obx
  • OCb
  • odl
  • odn
  • oea
  • ogt
  • oha
  • ohf
  • oi
  • OIj
  • OIO
  • OIv
  • oj
  • onm
  • onw
  • oo
  • OOtzw
  • oou
  • OPG
  • opx
  • Opy
  • oq
  • Oqv
  • orp
  • osekz
  • OSr
  • Oti
  • ou
  • ov
  • OVJ
  • ovp
  • Ovr
  • ovt
  • Ovu
  • owb
  • OXd
  • OXl
  • oyd
  • Oyk
  • OYl
  • oyz
  • OZQ
  • pai
  • paj
  • pb
  • Pcp
  • Pcq
  • PCv
  • Pdg
  • Pekg
  • pgu
  • pj
  • PJGEDDDEFGKQZh
  • pjl
  • pjv
  • pkm
  • Pkr
  • PKW
  • PLk
  • Plmf
  • pmq
  • Pmw
  • pn
  • PNT
  • PNv
  • pnw
  • Pov
  • Ppk
  • PPx
  • prtr
  • Psr
  • psx
  • ptn
  • PTw
  • puxzb
  • pv
  • pve
  • pw
  • pxj
  • Pyo
  • pz
  • PZc
  • pzf
  • Pzn
  • Pzw
  • qb
  • qc
  • qcl
  • qcq
  • QCT
  • qcz
  • qd
  • qdce
  • Qdd
  • qdt
  • QEh
  • qf
  • qg
  • Qhw
  • qi
  • qia
  • Qiew
  • QIk
  • qiu
  • qj
  • QJt
  • QJu
  • qk
  • qkx
  • qlr
  • Qlyf
  • qmy
  • QMZ
  • QNi
  • QNO
  • QNq
  • qo
  • QOh
  • qpk
  • QPn
  • QPQ
  • Qpw
  • qq
  • qrb
  • qrz
  • qtw
  • Qtz
  • QUq
  • quz
  • qvw
  • qw
  • qx
  • QXm
  • QXr
  • qxt
  • QYc
  • qz
  • qzt
  • Qzu
  • QZy
  • raa
  • Rcg
  • Rdg
  • rdq
  • rdr
  • reu
  • rgf
  • rhy
  • RIr
  • rj
  • rja
  • RJi
  • RJj
  • rjw
  • Rjx
  • rk
  • rl
  • rlk
  • RMH
  • Rmz
  • RNO
  • rnvgkbtgw
  • rnx
  • rp
  • Rpb
  • RPi
  • rq
  • RQl
  • RQnwx
  • rqz
  • rr
  • RSn
  • rso
  • RSt
  • RSv
  • RTx
  • RTy
  • ru
  • ruu
  • rv
  • rx
  • rxh
  • rxq
  • ryj
  • Ryo
  • rz
  • RZr
  • Sahp
  • sbb
  • Scy
  • sdr
  • sfq
  • sfx
  • SGIMQV
  • sgw
  • shq
  • SIa
  • sj
  • skd
  • SKf
  • sle
  • SLFv
  • SNH
  • Soj
  • SPg
  • spv
  • ssb
  • ssj
  • stz
  • sug
  • Sut
  • svr
  • swh
  • SXj
  • SXp
  • sxr
  • szb
  • TBT
  • tcprt
  • TCq
  • Tdbt
  • tdg
  • Tdu
  • Tdx
  • tep
  • tev
  • tf
  • tgx
  • TIY
  • tj
  • TJa
  • tl
  • TMb
  • TMFb
  • TNc
  • Tnw
  • Tpc
  • TPe
  • Tpp
  • tpt
  • tq
  • tqr
  • Tqy
  • TRC
  • tru
  • tsc
  • tsw
  • ttf
  • TTn
  • ttrht
  • ttz
  • TUk
  • tw
  • TXm
  • ty
  • tz
  • TZp
  • tzq
  • ua
  • UAi
  • ub
  • uco
  • UCX
  • UCZ
  • ud
  • UDu
  • ue
  • uenf
  • UEt
  • uf
  • ufn
  • UFx
  • UGD
  • Ugi
  • UGl
  • Uhv
  • Uhz
  • Uiu
  • UIv
  • Uiw
  • uj
  • UJY
  • ul
  • uma
  • un'ytu
  • Unz
  • uo
  • uob
  • uop
  • Uoy
  • uq
  • uqi
  • Uqm
  • uqprw
  • uqr
  • urq
  • usy
  • uu
  • UUJ
  • Uuq
  • uur
  • Uuu
  • uv
  • uvg
  • UVr
  • uvz
  • uw
  • uwc
  • uwd
  • UXj
  • uy
  • UYL
  • uz
  • vai
  • vbg
  • vca
  • ve
  • VEm
  • vf
  • vfd
  • VFv
  • VFw
  • vfy
  • Vfz
  • vgf
  • vgh
  • vgn
  • vgo
  • vh
  • Vib
  • VIQ
  • vj
  • Vjv
  • vk
  • VKa
  • VKC
  • vkr
  • vkz
  • vm
  • vnq
  • VNw
  • Vnz
  • vod
  • Voy
  • vpc
  • Vpg
  • VPo
  • Vpw
  • vq
  • VQKFA
  • VQLHC
  • vqligfgkpz
  • Vrv
  • vrz
  • vsf
  • vst
  • VTe
  • vtw
  • vu
  • VUAq
  • Vut
  • vuy
  • Vvt
  • vvy
  • vw
  • vwa
  • Vwh
  • VWq
  • VXa
  • vxg
  • vxk
  • vxv
  • VYD
  • Vyg
  • VYM
  • vz
  • wce
  • wdf
  • WDW
  • wff
  • WFl
  • WFx
  • WGr
  • WGtf
  • whc
  • whj
  • whp
  • Wht
  • WIJ
  • WIv
  • wj
  • Wjg
  • wjz
  • wkdi
  • Wlyk
  • wn
  • Wnftx
  • WOi
  • WOr
  • wp
  • WPi
  • wpn
  • WPz
  • wq
  • Wqc
  • Wql
  • wqlhda
  • WQXCY
  • wqy
  • WSb
  • wsr
  • Wsv
  • Wtm
  • Wto
  • Wtp
  • wtpe
  • wtpt
  • wtu
  • wu
  • wuq
  • WUtd
  • wv
  • wvg
  • ww
  • WWe
  • Wwv
  • WXg
  • wyb
  • WYF
  • Wyk
  • Wyqm
  • wz
  • xa
  • xax
  • xaz
  • xb
  • xbe
  • xbi
  • XCw
  • XDK
  • xe
  • xea
  • xem
  • xg
  • xgg
  • Xgz
  • xh
  • xhu
  • XIe
  • xik
  • Xim
  • xj
  • Xje
  • xjr
  • xk
  • xkn
  • xl
  • XLE
  • xm
  • xnd
  • xnx
  • xo
  • xpi
  • XPq
  • xpu
  • xq
  • XQj
  • xrj
  • Xrz
  • xt
  • xto
  • Xtp
  • xtpkhffh
  • xtplhe
  • XTt
  • XTV
  • xtyh
  • XUb
  • XUc
  • xv
  • Xvh
  • Xvj
  • xvtrsux
  • xwv
  • XYv
  • xz
  • Xzf
  • xzl
  • Xzy
  • Xzz
  • yb
  • ybi
  • yc
  • YCJ
  • ydb
  • ydj
  • ydk
  • Ydn
  • yf
  • YFc
  • yfr
  • yg
  • ygl
  • yh
  • Yhq
  • YIC
  • Yie
  • yil
  • yio
  • YIZ
  • yj
  • yk
  • ykk
  • yl
  • yla
  • ymbm
  • ymd
  • ymm
  • yof
  • YOh
  • yp
  • ypk
  • YPp
  • yq
  • Yqq
  • yru
  • Yrz
  • ytn
  • YTV
  • yu
  • YUb
  • YUQOLJHGFHKPYf
  • Yuz
  • yv
  • yw
  • ywb
  • Ywo
  • Ywv
  • yx
  • Yxj
  • YXWWY
  • yy
  • YYu
  • yz
  • Yzu
  • zaw
  • zb
  • zbp
  • zbtu
  • zc
  • Zcx
  • Zcy
  • zdm
  • zdu
  • ze
  • zf
  • ZFa
  • ZFe
  • ZFu
  • ZFx
  • zg
  • zgb
  • zgv
  • zh
  • Zhq
  • zht
  • zi
  • Zie
  • ZIX
  • zj
  • ZJi
  • zk
  • zki
  • zkr
  • ZKY
  • zl
  • zlr
  • zm
  • zml
  • zmr
  • zp
  • zpe
  • ZPg
  • zq
  • zqh
  • zqm
  • zrf
  • ZRk
  • zrn
  • zrw
  • zse
  • zsg
  • ZSOKHFDCBABCGNYi
  • ZSy
  • zt
  • Ztm
  • ZTN
  • ZTO
  • Zturp
  • Zuh
  • zuly
  • Zuy
  • zv
  • zvw
  • ZVZ
  • zw
  • Zwkca
  • zwn
  • Zwv
  • zx
  • zy
  • ZYi
  • zym
  • ZYqx
  • ZYt
  • Zyu
  • zyv
  • zz
  • ZZd
  • ZZg
To accept these changes, run the following commands
remove_obsolete_words=$(mktemp)
echo '#!/usr/bin/perl -ni
my $re=join "|", qw('"
ansii
benchmarkee
binwrite
bytepp
bytesize
castps
cleanpath
cmarker
coderay
coord
coverity
decompressor
dirs
divisorx
downcase
DRB
drmike
EHa
elsif
EOI
eprofile
eventmachine
executables
extname
Exy
falsey
federico
flowhq
fsevent
gdk
gemspec
GETJOCTET
gmail
gtk
GUINT
hexdigest
HPROFILE
Ilib
inotify
insertf
iprofile
JOCTET
JPOOL
jruby
Jv
JWRN
keepalive
lcs
leth
LGPL
MESSAGEBOX
Minitest
mmc
mtime
Mz
Nailgun
nathanael
nathanaeljones
ncpu
nokogiri
optparse
outputsize
portile
ramdisk
rcov
redhat
REGEXPS
rspec
RTEST
Rubocop
rubyforge
rvm
SDK
shortname
Shoulda
simd
Sqr
SZ
TESTUNIT
tls
TMC
tmpfs
toolkits
unpackhi
unpacklo
WIDTHx
winmgmts
Wx
zedzone
zucchi
"');
next if /^($re)(?:$| .*)/;
print;' > $remove_obsolete_words
chmod +x $remove_obsolete_words
for file in .github/actions/spell-check/whitelist/0859c3bf2abc4d7651115c782f331a3c80710361.txt .github/actions/spell-check/whitelist/1e65a9a670e8cc12661ef255598f4f50bcfec736.txt .github/actions/spell-check/whitelist/54b3b066a6b4654f7e7a02e49e56a1b3c1c76c25.txt .github/actions/spell-check/whitelist/5ae660e58f0dca219d9dd5801aeffa0e4ad6e8fa.txt .github/actions/spell-check/whitelist/618f622b0f99f2500bd3dc383f7a2cef48b72e76.txt .github/actions/spell-check/whitelist/6a296fb5e9634a56210e3203f82a4aa8d5687b4b.txt .github/actions/spell-check/whitelist/c5b95641888e2ab165141518065246c44002e236.txt .github/actions/spell-check/whitelist/e4840f3eb751a28d6a885096045c6f437a5e7000.txt .github/actions/spell-check/whitelist/whitelist.txt; do $remove_obsolete_words $file; done
rm $remove_obsolete_words
(
echo "
AAI
AAv
abcdefghijklmnopqrstuvwxyz
abcefgijklnopqstuwxyz
ABDEFGIJKMNOPRSTUWXY
abh
ABz
acsp
ADBE
adhlpv
Agik
Ahv
Ahx
aiu
aj
ALV
AMh
AOu
apc
Aqh
Aqo
asts
astv
ASw
asx
atpa
auz
Avl
Avq
AVtu
AXy
AZu
Bbse
bbu
BCDEFHIJLMOPRSUWXZ
bclg
BCw
bdb
bdfhjmoqtvy
bdg
BEv
Bfx
bga
bgc
bh
bhx
bj
bja
bjd
Bjx
Bpl
bpn
bq
Brv
bs'hx
Bsn
btk
Btn
bup
Bvk
bw
Bwk
BXiy
BXn
BXp
Byj
byx
Bzx
cdb
Cdl
ceo
cfo
Cfx
Cgx
CHl
cj
cjg
cjm
ckd
CKF
CMV
cn
Cnll
cprt
Cpw
Cqo
Cqz
crm
Csv
ctj
CUDIE
curv
Cvk
cw
cwh
CWZ
Cxj
CXm
Cxq
cz
czc
dagx
Dcq
DCt
Dde
Ded
DFq
Dfx
Dfz
DGD
dhb
DLN
dmd
DMy
DNv
Dpb
dpe
Dpo
dq
dqg
Dqn
dqq
DQx
drf
drh
Drn
Drp
drv
dsh
Dte
dto
dtt
dv
dvj
Dvx
Dw
Dwj
Dwl
dwp
DWR
DXc
DXd
dxeff
Dxl
dzx
dzy
EAC
eay
EBy
Ecg
ECK
edf
edl
Edx
edy
Eev
Eex
efy
ega
eha
ei
EIl
ein
ej
Ejvi
ek
EKz
Elu
elz
emn
empr
Eou
epd
Epl
Epn
Epo
eqn
Erp
ERq
ERz
ESbr
ESz
EUE
ev
evh
Evk
exy
eyx
Eyz
ez
ezl
ezm
ezx
ezy
fdv
fdw
FFo
fft
FGX
FIk
fj
fja
fje
fk
FKw
FNTY
fnz
Fok
FOv
FOz
fq
FQm
Ftgw
FTx
Fudqv
fuh
ful
Fup
FWi
FWJ
Fwz
fx
fxc
Fxl
FXZ
fzy
gamt
GAq
GCK
GDgb
gf
Gfn
Gfo
gfp
GFpq
GFy
Gfz
gg
gh
GHa
GHU
gj
gk
Gku
GPsl
gq
Gqb
Gqq
GRAYXYZ
GSp
gtu
guh
gw
GWB
Gwf
gwh
gwj
gwl
gwr
Gxl
GXR
Gxw
gyy
Gzk
HCn
hcv
hdn
HErq
Hfswce
hga
HGP
hh
HHX
Hio
Hiy
hj
hja
HJh
hk
HKH
Hlu
HMu
hn
hnq
Hpb
hpty
hqc
Hrrc
hso
hu
hul
hwa
Hwf
HWK
hx
hxk
Hxl
hyt
hz
Hzjl
hzp
hzz
I'f
I'j
I'z
ial
ibn
ibu
ICroq
icu
IEx
IEz
ig
IGH
igj
igt
IGx
ih
Ihd
IHk
Ihx
iiv
ij
IKD
Iku
Ilq
imyfi
ina
ine
inq
ipj
IPQ
IQl
Iqp
IRx
ISf
Isj
isq
ITq
ITy
iu
iuf
IUK
iuna
iuom
ivg
Ivx
iwg
IXD
ixr
iy
IYE
iyz
iz
IZj
IZl
izy
jb
JBm
JBr
jc
jcd
jd
JDm
JDn
Jdots
je
jf
JGA
JGI
JGp
jh
ji
JIq
jj
Jje
jk
jl
jlz
jm
jmy
jn
jofu
jp
jpa
jrt
jtd
ju
juu
jv
jvf
Jvr
jw
jwd
Jwh
jwo
jwqu
jx
jxd
jxv
jy
JYro
Jyw
jz
kbd
KBx
Kcj
KCZ
kd
KDc
Kdj
ke
Kej
kf
kfg
KFp
KGA
kgh
kgw
kh
kht
khw
Kib
kj
kk
kkw
kmxh
knc
knd
koe
koj
Kpq
kpz
kq
kqk
KQu
Ksh
KSK
KSu
Ktj
ku
Kuq
KVct
kvjcb
KVl
Kvt
kvu
Kwq
KWw
kx
kxa
kxr
KXx
Kyo
kz
kzf
kzl
kzr
kzt
lck
LCr
LDc
lfr
Lgdo
lii
lj
ljf
ljz
lk
Llu
Lly
Lmgw
lmw
LNi
lq
Lqu
LQZu
LRM
Lrx
LSU
Lsw
lti
ltq
ltv
Luj
luq
Lvh
Lvq
lvqi
lw
LWa
lwb
Lxm
lxr
lxy
LYfrc
Lyo
lyp
Lyr
lzv
MAa
Mbz
Mdy
MDZ
meeh
mfep
mft
mgnqozp
mgp
MGv
mj
Mje
MJM
MJn
mju
mky
mlq
Mly
MMqc
Mmrr
mmv
MNh
mnl
mnn
MNr
mntr
Mox
mpy
mq
Mqu
MRM
msv
mthuk
MUe
Muu
MVj
Mvq
Mwae
MWLo
MXm
myf
MYw
mz
Mzd
mzf
Mzk
mzo
MZp
MZY
NAz
nbk
NCd
NCOYPo
Ncq
Ncz
Nda
ndq
ndv
nem
nf
NGi
nh
NHj
nic
NJl
nk
nkn
NLL
nlx
nly
NMw
nn
NNg
nnu
Nnw
Nou
npc
npm
Npw
npy
nq
Nqw
nrc
NRF
ntv
Nuh
Nui
Nuqpr
nvb
Nvr
nw
Nwy
nx
NXt
NXv
Nyo
nz
nzd
oa
oan
Oax
OBC
obh
Obx
OCb
odl
odn
oea
ogt
oha
ohf
oi
OIj
OIO
OIv
oj
onm
onw
oo
OOtzw
oou
OPG
opx
Opy
oq
Oqv
orp
osekz
OSr
Oti
ou
ov
OVJ
ovp
Ovr
ovt
Ovu
owb
OXd
OXl
oyd
Oyk
OYl
oyz
OZQ
pai
paj
pb
Pcp
Pcq
PCv
Pdg
Pekg
pgu
pj
PJGEDDDEFGKQZh
pjl
pjv
pkm
Pkr
PKW
PLk
Plmf
pmq
Pmw
pn
PNT
PNv
pnw
Pov
Ppk
PPx
prtr
Psr
psx
ptn
PTw
puxzb
pv
pve
pw
pxj
Pyo
pz
PZc
pzf
Pzn
Pzw
qb
qc
qcl
qcq
QCT
qcz
qd
qdce
Qdd
qdt
QEh
qf
qg
Qhw
qi
qia
Qiew
QIk
qiu
qj
QJt
QJu
qk
qkx
qlr
Qlyf
qmy
QMZ
QNi
QNO
QNq
qo
QOh
qpk
QPn
QPQ
Qpw
qq
qrb
qrz
qtw
Qtz
QUq
quz
qvw
qw
qx
QXm
QXr
qxt
QYc
qz
qzt
Qzu
QZy
raa
Rcg
Rdg
rdq
rdr
reu
rgf
rhy
RIr
rj
rja
RJi
RJj
rjw
Rjx
rk
rl
rlk
RMH
Rmz
RNO
rnvgkbtgw
rnx
rp
Rpb
RPi
rq
RQl
RQnwx
rqz
rr
RSn
rso
RSt
RSv
RTx
RTy
ru
ruu
rv
rx
rxh
rxq
ryj
Ryo
rz
RZr
Sahp
sbb
Scy
sdr
sfq
sfx
SGIMQV
sgw
shq
SIa
sj
skd
SKf
sle
SLFv
SNH
Soj
SPg
spv
ssb
ssj
stz
sug
Sut
svr
swh
SXj
SXp
sxr
sz
szb
TBT
tcprt
TCq
Tdbt
tdg
Tdu
Tdx
tep
tev
tf
tgx
TIY
tj
TJa
tl
TMb
tmc
TMFb
TNc
Tnw
Tpc
TPe
Tpp
tpt
tq
tqr
Tqy
TRC
tru
tsc
tsw
ttf
TTn
ttrht
ttz
TUk
tw
TXm
ty
tz
TZp
tzq
ua
UAi
ub
uco
UCX
UCZ
ud
UDu
ue
uenf
UEt
uf
ufn
UFx
UGD
Ugi
UGl
Uhv
Uhz
Uiu
UIv
Uiw
uj
UJY
ul
uma
un'ytu
Unz
uo
uob
uop
Uoy
uq
uqi
Uqm
uqprw
uqr
urq
usy
uu
UUJ
Uuq
uur
Uuu
uv
uvg
UVr
uvz
uw
uwc
uwd
UXj
uy
UYL
uz
vai
vbg
vca
ve
VEm
vf
vfd
VFv
VFw
vfy
Vfz
vgf
vgh
vgn
vgo
vh
Vib
VIQ
vj
Vjv
vk
VKa
VKC
vkr
vkz
vm
vnq
VNw
Vnz
vod
Voy
vpc
Vpg
VPo
Vpw
vq
VQKFA
VQLHC
vqligfgkpz
Vrv
vrz
vsf
vst
VTe
vtw
vu
VUAq
Vut
vuy
Vvt
vvy
vw
vwa
Vwh
VWq
VXa
vxg
vxk
vxv
VYD
Vyg
VYM
vz
wce
wdf
WDW
wff
WFl
WFx
WGr
WGtf
whc
whj
whp
Wht
WIJ
WIv
wj
Wjg
wjz
wkdi
Wlyk
wn
Wnftx
WOi
WOr
wp
WPi
wpn
WPz
wq
Wqc
Wql
wqlhda
WQXCY
wqy
WSb
wsr
Wsv
Wtm
Wto
Wtp
wtpe
wtpt
wtu
wu
wuq
WUtd
wv
wvg
ww
WWe
Wwv
wx
WXg
wyb
WYF
Wyk
Wyqm
wz
xa
xax
xaz
xb
xbe
xbi
XCw
XDK
xe
xea
xem
xg
xgg
Xgz
xh
xhu
XIe
xik
Xim
xj
Xje
xjr
xk
xkn
xl
XLE
xm
xnd
xnx
xo
xpi
XPq
xpu
xq
XQj
xrj
Xrz
xt
xto
Xtp
xtpkhffh
xtplhe
XTt
XTV
xtyh
XUb
XUc
xv
Xvh
Xvj
xvtrsux
xwv
XYv
xz
Xzf
xzl
Xzy
Xzz
yb
ybi
yc
YCJ
ydb
ydj
ydk
Ydn
yf
YFc
yfr
yg
ygl
yh
Yhq
YIC
Yie
yil
yio
YIZ
yj
yk
ykk
yl
yla
ymbm
ymd
ymm
yof
YOh
yp
ypk
YPp
yq
Yqq
yru
Yrz
ytn
YTV
yu
YUb
YUQOLJHGFHKPYf
Yuz
yv
yw
ywb
Ywo
Ywv
yx
Yxj
YXWWY
yy
YYu
yz
Yzu
zaw
zb
zbp
zbtu
zc
Zcx
Zcy
zdm
zdu
ze
zf
ZFa
ZFe
ZFu
ZFx
zg
zgb
zgv
zh
Zhq
zht
zi
Zie
ZIX
zj
ZJi
zk
zki
zkr
ZKY
zl
zlr
zm
zml
zmr
zp
zpe
ZPg
zq
zqh
zqm
zrf
ZRk
zrn
zrw
zse
zsg
ZSOKHFDCBABCGNYi
ZSy
zt
Ztm
ZTN
ZTO
Zturp
Zuh
zuly
Zuy
zv
zvw
ZVZ
zw
Zwkca
zwn
Zwv
zx
zy
ZYi
zym
ZYqx
ZYt
Zyu
zyv
zz
ZZd
ZZg
"
) | sort -u -f | perl -ne 'next unless /./; print' > new_whitelist.txt && mv new_whitelist.txt '.github/actions/spell-check/whitelist/696fea2036d3439dd6969570caef9b87cbc76db9.txt'
✏️ Contributor please read this
  • You can probably just add items into .github/actions/spell-check/whitelist/whitelist.txt.
  • If you need to use a specific token in one place and it shouldn't generally be used, you can
    add an item in .github/actions/spell-check/patterns.txt.

⚠️ Reviewers

At present, the action that triggered this message will not show its ❌ in this PR unless the branch is within this repository.
Thus, you should make sure that this comment has been addressed before merging this PR.

Please sign in to comment.